我试图在我的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]
第二个参数为空。
答案 0 :(得分:1)
Peter Cawley在以下帖子中的luajit邮件列表中对此进行了广泛的回答