【发布时间】:2018-03-05 13:37:09
【问题描述】:
我正在尝试在我的 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 写入。根据0003 的IR 参数,我猜0002 (这是一个内存位置吗?) 是x。
我不明白的是,在第二个快照行中(在 IR 0005 之后)第 3 和第 6 位由 IR 在0004 修改。怎么样?
现在,我如何追踪 IR 上方快照位置中存在哪些变量?例如:SNAP #7 [ ---- 0007 ].
SLOAD(标志)的第二个参数又是什么意思? [I, CI, CRI, T, PI, PRI, R, RI] 等...我还看到 SLOAD 第二个参数为空。
【问题讨论】: