理解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 邮件列表中的以下线程中对此进行了广泛回答
我试图在我的 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 邮件列表中的以下线程中对此进行了广泛回答