了解Luajit SNAP IR指令

时间:2017-09-24 13:44:53

标签: lua luajit

我试图在我的luajit代码中跟踪一些寄存器合并过于复杂的 NYI。从IR中可以看出NYI发生时的快照非常充实。我的尝试是向后追踪并找出导致快照填满的原因。

首先,我希望了解SNAP系列提供的信息。例如,在下面的SNAP行中:

> local x = 1.2 for i=1,1e3 do x = x * -3 end
---- TRACE 1 start stdin:1
0006  MULVN    0   0   1  ; -3
0007  FORL     1 => 0006
---- TRACE 1 IR
....              SNAP   #0   [ ---- ]
0001 rbp      int SLOAD  #2    CI
0002 xmm7  >  num SLOAD  #1    T
0003 xmm7   + num MUL    0002  -3  
0004 rbp    + int ADD    0001  +1  
....              SNAP   #1   [ ---- 0003 ]
0005       >  int LE     0004  +1000
....              SNAP   #2   [ ---- 0003 0004 ---- ---- 0004 ]
0006 ------------ LOOP ------------
0007 xmm7   + num MUL    0003  -3  
0008 rbp    + int ADD    0004  +1  
....              SNAP   #3   [ ---- 0007 ]
0009       >  int LE     0008  +1000
0010 rbp      int PHI    0004  0008
0011 xmm7     num PHI    0003  0007

如果我的理解是正确的,在第一个快照中,第二个位置由IR写在0003。根据{{​​1}}的IR参数,我猜0003 (这是一个内存位置吗?)0002

我不明白的是,在第二个快照行(IR x之后)第3和第6个位置由IR 0005修改。那怎么样?

现在,如何在上面的IR中跟踪快照位置中存在哪些变量?例如:in 0004

SNAP #7 [ ---- 0007 ](旗帜)的第二个参数又表示什么? SLOAD等等......我也看到[I, CI, CRI, T, PI, PRI, R, RI]第二个参数为空。

1 个答案:

答案 0 :(得分:1)

Peter Cawley在以下帖子中的luajit邮件列表中对此进行了广泛的回答

https://www.freelists.org/post/luajit/Understanding-SNAP