理解Luajit SNAP IR指令

Understanding Luajit SNAP IR instruction

我试图在我的 luajit 代码中追踪一些 register coalescing too complex 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。根据 0003 处的 IR 参数,我猜 0002 (这是一个内存位置吗?)x

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

现在,我如何追踪哪些变量出现在 above IR 的快照位置?例如:在 SNAP #7 [ ---- 0007 ].

另外,SLOAD(标志)的第二个参数表示什么? [I, CI, CRI, T, PI, PRI, R, RI] 等等...我也看到 SLOAD 第二个参数为空。

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

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