理解 Luajit SNAP IR 指令

我正在尝试追踪我的 luajit 代码中一些复杂的寄存器合并问题。从 IR 中可以看出当出现问题时的快照非常完整。我的尝试是向后追踪并找出是什么导致了快照被填满。

首先,我想了解 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 处写入的。根据 IR 在 0003 处的参数,我猜测 0002 (这是一个内存位置吗?)x

我不理解的是,在第二个快照行(在 IR 0005 后)中,第 3 个和第 6 个位置是由 IR 在 0004 处修改的。这是怎么回事?

现在,我怎样才能追踪哪些变量存在于以上 IR 的快照位置中呢?例如:在 SNAP #7 [ ---- 0007 ] 中。

另外,SLOAD 的第二个参数(标志)表示什么?[ I,CI,CRI,T,PI,PRI,R,RI ]等等...我还见过带有空第二个参数的 SLOAD

点赞
用户2807939
用户2807939

这个问题已经在以下的 luajit 邮件列表中被 Peter Cawley 广泛回答了:

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

2017-12-08 06:20:23