Skip to content

Instantly share code, notes, and snippets.

@dogbert17
Created November 16, 2018 13:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dogbert17/e4bb34ba9eac39f880a7aa3e1054ec47 to your computer and use it in GitHub Desktop.
Save dogbert17/e4bb34ba9eac39f880a7aa3e1054ec47 to your computer and use it in GitHub Desktop.
The broken frame
dogbert@dogbert-VirtualBox ~/repos/rakudo $ cat spesh-3226.txt
Specialization of 'BUILD' (cuid: 62)
Before:
Spesh of 'BUILD' (cuid: 62, file: /home/dogbert/repos/rakudo/install/bin/../share/nqp/lib/MAST/Nodes.nqp:763)
BB 0 (0x7f60c8f8ef40):
line: 763 (pc 0)
Instructions:
no_op
Successors: 1
Predecessors:
Dominance children: 1
BB 1 (0x7f60c8f8efc8):
line: 763 (pc 0)
Instructions:
null r0(1)
null r1(1)
null r3(1)
null r4(1)
null r5(1)
null r6(1)
null r7(1)
checkarity liti16(6), liti16(6)
param_rp_o r0(2), liti16(0)
param_rp_o r1(2), liti16(1)
param_rp_i r9(1), liti16(2)
trunc_i32 r2(1), r9(1)
param_rp_o r3(2), liti16(3)
param_rp_o r4(2), liti16(4)
param_rp_o r5(2), liti16(5)
paramnamesused
[Annotation: INS Deopt One (idx 0 -> pc 56; line 764)]
[Annotation: Logged (bytecode offset 50)]
[Annotation: Line Number: /home/dogbert/repos/rakudo/install/bin/../share/nqp/lib/MAST/Nodes.nqp:763]
decont r6(2), r0(2)
Successors: 2
Predecessors: 0
Dominance children: 2
BB 2 (0x7f60c8f8f028):
line: 764 (pc 56)
Instructions:
wval r7(2), liti16(0), liti16(83) (P6opaque: SubBuffer)
bindattr_o r6(2), r7(2), lits($!bytecode), r1(2), liti16(0)
[Annotation: INS Deopt One (idx 1 -> pc 84; line 765)]
[Annotation: Logged (bytecode offset 78)]
decont r7(3), r0(2)
Successors: 3
Predecessors: 1
Dominance children: 3
BB 3 (0x7f60c8f8f088):
line: 765 (pc 84)
Instructions:
wval r6(3), liti16(0), liti16(83) (P6opaque: SubBuffer)
extend_i32 r8(1), r2(1)
bindattr_i r7(3), r6(3), lits($!annotations-offset), r8(1), liti16(1)
[Annotation: INS Deopt One (idx 2 -> pc 118; line 766)]
[Annotation: Logged (bytecode offset 112)]
decont r6(4), r0(2)
Successors: 4
Predecessors: 2
Dominance children: 4
BB 4 (0x7f60c8f8f0e8):
line: 766 (pc 118)
Instructions:
wval r7(4), liti16(0), liti16(83) (P6opaque: SubBuffer)
bindattr_o r6(4), r7(4), lits(%!labels), r3(2), liti16(3)
[Annotation: INS Deopt One (idx 3 -> pc 146; line 767)]
[Annotation: Logged (bytecode offset 140)]
decont r7(5), r0(2)
Successors: 5
Predecessors: 3
Dominance children: 5
BB 5 (0x7f60c8f8f148):
line: 767 (pc 146)
Instructions:
wval r6(5), liti16(0), liti16(83) (P6opaque: SubBuffer)
bindattr_o r7(5), r6(5), lits(@!label-fixups), r4(2), liti16(4)
[Annotation: INS Deopt One (idx 4 -> pc 174; line 768)]
[Annotation: Logged (bytecode offset 168)]
decont r6(6), r0(2)
Successors: 6
Predecessors: 4
Dominance children: 6
BB 6 (0x7f60c8f8f1a8):
line: 768 (pc 174)
Instructions:
wval r7(6), liti16(0), liti16(83) (P6opaque: SubBuffer)
bindattr_o r6(6), r7(6), lits(@!handlers), r5(2), liti16(5)
return_o r5(2)
Successors:
Predecessors: 5
Dominance children:
Facts:
r0(0): usages=0, flags=0
r0(1): usages=0, flags=0
r0(2): usages=0, flags=0
r1(0): usages=0, flags=0
r1(1): usages=0, flags=0
r1(2): usages=0, flags=0
r2(0): usages=0, flags=0
r2(1): usages=0, flags=0
r3(0): usages=0, flags=0
r3(1): usages=0, flags=0
r3(2): usages=0, flags=0
r4(0): usages=0, flags=0
r4(1): usages=0, flags=0
r4(2): usages=0, flags=0
r5(0): usages=0, flags=0
r5(1): usages=0, flags=0
r5(2): usages=0, flags=0
r6(0): usages=0, flags=0
r6(1): usages=0, flags=0
r6(2): usages=0, flags=0
r6(3): usages=0, flags=0
r6(4): usages=0, flags=0
r6(5): usages=0, flags=0
r6(6): usages=0, flags=0
r7(0): usages=0, flags=0
r7(1): usages=0, flags=0
r7(2): usages=0, flags=0
r7(3): usages=0, flags=0
r7(4): usages=0, flags=0
r7(5): usages=0, flags=0
r7(6): usages=0, flags=0
r8(0): usages=0, flags=0
r8(1): usages=0, flags=0
r9(0): usages=0, flags=0
r9(1): usages=0, flags=0
Frame size: 346 bytes
JIT: Starting dump of JIT expression tree
=========================================
digraph {
n_0002 [label="LOCAL"];
n_0004 [label="ADDR(0)"];
n_0004 -> n_0002;
n_0012 [label="TC"];
n_0014 [label="ADDR(432)"];
n_0014 -> n_0012;
n_0018 [label="LOAD(8)"];
n_0018 -> n_0014;
n_0022 [label="ADDR(96)"];
n_0022 -> n_0018;
n_0026 [label="LOAD(8)"];
n_0026 -> n_0022;
n_0008 [label="CONST(0, 2)"];
n_0030 [label="IDX(8)"];
n_0030 -> n_0026;
n_0030 -> n_0008;
n_0035 [label="LOAD(8)"];
n_0035 -> n_0030;
n_0410 [label="STORE(8)"];
n_0410 -> n_0004;
n_0410 -> n_0035;
n_0039 [label="LOCAL"];
n_0041 [label="ADDR(8)"];
n_0041 -> n_0039;
n_0049 [label="TC"];
n_0051 [label="ADDR(432)"];
n_0051 -> n_0049;
n_0055 [label="LOAD(8)"];
n_0055 -> n_0051;
n_0059 [label="ADDR(96)"];
n_0059 -> n_0055;
n_0063 [label="LOAD(8)"];
n_0063 -> n_0059;
n_0045 [label="CONST(1, 2)"];
n_0067 [label="IDX(8)"];
n_0067 -> n_0063;
n_0067 -> n_0045;
n_0072 [label="LOAD(8)"];
n_0072 -> n_0067;
n_0415 [label="STORE(8)"];
n_0415 -> n_0041;
n_0415 -> n_0072;
n_0076 [label="LOCAL"];
n_0078 [label="ADDR(72)"];
n_0078 -> n_0076;
n_0086 [label="TC"];
n_0088 [label="ADDR(432)"];
n_0088 -> n_0086;
n_0092 [label="LOAD(8)"];
n_0092 -> n_0088;
n_0096 [label="ADDR(96)"];
n_0096 -> n_0092;
n_0100 [label="LOAD(8)"];
n_0100 -> n_0096;
n_0082 [label="CONST(2, 2)"];
n_0104 [label="IDX(8)"];
n_0104 -> n_0100;
n_0104 -> n_0082;
n_0109 [label="LOAD(8)"];
n_0109 -> n_0104;
n_0450 [label="STORE(8)"];
n_0450 -> n_0078;
n_0450 -> n_0109;
n_0113 [label="LOCAL"];
n_0115 [label="ADDR(16)"];
n_0115 -> n_0113;
n_0119 [label="UCAST(4, 8)"];
n_0119 -> n_0109;
n_0420 [label="STORE(8)"];
n_0420 -> n_0115;
n_0420 -> n_0119;
n_0124 [label="LOCAL"];
n_0126 [label="ADDR(24)"];
n_0126 -> n_0124;
n_0134 [label="TC"];
n_0136 [label="ADDR(432)"];
n_0136 -> n_0134;
n_0140 [label="LOAD(8)"];
n_0140 -> n_0136;
n_0144 [label="ADDR(96)"];
n_0144 -> n_0140;
n_0148 [label="LOAD(8)"];
n_0148 -> n_0144;
n_0130 [label="CONST(3, 2)"];
n_0152 [label="IDX(8)"];
n_0152 -> n_0148;
n_0152 -> n_0130;
n_0157 [label="LOAD(8)"];
n_0157 -> n_0152;
n_0425 [label="STORE(8)"];
n_0425 -> n_0126;
n_0425 -> n_0157;
n_0161 [label="LOCAL"];
n_0163 [label="ADDR(32)"];
n_0163 -> n_0161;
n_0171 [label="TC"];
n_0173 [label="ADDR(432)"];
n_0173 -> n_0171;
n_0177 [label="LOAD(8)"];
n_0177 -> n_0173;
n_0181 [label="ADDR(96)"];
n_0181 -> n_0177;
n_0185 [label="LOAD(8)"];
n_0185 -> n_0181;
n_0167 [label="CONST(4, 2)"];
n_0189 [label="IDX(8)"];
n_0189 -> n_0185;
n_0189 -> n_0167;
n_0194 [label="LOAD(8)"];
n_0194 -> n_0189;
n_0430 [label="STORE(8)"];
n_0430 -> n_0163;
n_0430 -> n_0194;
n_0198 [label="LOCAL"];
n_0200 [label="ADDR(40)"];
n_0200 -> n_0198;
n_0208 [label="TC"];
n_0210 [label="ADDR(432)"];
n_0210 -> n_0208;
n_0214 [label="LOAD(8)"];
n_0214 -> n_0210;
n_0218 [label="ADDR(96)"];
n_0218 -> n_0214;
n_0222 [label="LOAD(8)"];
n_0222 -> n_0218;
n_0204 [label="CONST(5, 2)"];
n_0226 [label="IDX(8)"];
n_0226 -> n_0222;
n_0226 -> n_0204;
n_0231 [label="LOAD(8)"];
n_0231 -> n_0226;
n_0435 [label="STORE(8)"];
n_0435 -> n_0200;
n_0435 -> n_0231;
n_0241 [label="COPY"];
n_0241 -> n_0035;
n_0248 [label="ADDR(24)"];
n_0248 -> n_0241;
n_0252 [label="LOAD(8)"];
n_0252 -> n_0248;
n_0256 [label="DISCARD"];
n_0256 -> n_0252;
n_0259 [label="NZ"];
n_0259 -> n_0252;
n_0262 [label="ADDR(24)"];
n_0262 -> n_0241;
n_0266 [label="IF"];
n_0266 -> n_0259;
n_0266 -> n_0252;
n_0266 -> n_0262;
n_0271 [label="DO"];
n_0271 -> n_0256;
n_0271 -> n_0266;
n_0244 [label="CONST(8, 2)"];
n_0275 [label="ADD"];
n_0275 -> n_0271;
n_0275 -> n_0244;
n_0279 [label="STORE(8)"];
n_0279 -> n_0275;
n_0279 -> n_0072;
n_0284 [label="ADDR(12)"];
n_0284 -> n_0241;
n_0288 [label="LOAD(2)"];
n_0288 -> n_0284;
n_0292 [label="CONST(16, 2)"];
n_0296 [label="AND"];
n_0296 -> n_0288;
n_0296 -> n_0292;
n_0300 [label="NZ"];
n_0300 -> n_0296;
n_0303 [label="NZ"];
n_0303 -> n_0072;
n_0306 [label="ADDR(12)"];
n_0306 -> n_0072;
n_0310 [label="LOAD(2)"];
n_0310 -> n_0306;
n_0314 [label="CONST(16, 2)"];
n_0318 [label="AND"];
n_0318 -> n_0310;
n_0318 -> n_0314;
n_0322 [label="ZR"];
n_0322 -> n_0318;
n_0325 [label="ALL"];
n_0325 -> n_0300;
n_0325 -> n_0303;
n_0325 -> n_0322;
n_0330 [label="CONST_PTR(0)"];
n_0333 [label="TC"];
n_0335 [label="CARG(0)"];
n_0335 -> n_0333;
n_0339 [label="CARG(0)"];
n_0339 -> n_0241;
n_0343 [label="CARG(0)"];
n_0343 -> n_0072;
n_0347 [label="ARGLIST"];
n_0347 -> n_0335;
n_0347 -> n_0339;
n_0347 -> n_0343;
n_0352 [label="CALLV"];
n_0352 -> n_0330;
n_0352 -> n_0347;
n_0356 [label="WHEN"];
n_0356 -> n_0325;
n_0356 -> n_0352;
n_0360 [label="DOV"];
n_0360 -> n_0279;
n_0360 -> n_0356;
n_0364 [label="LOCAL"];
n_0366 [label="ADDR(56)"];
n_0366 -> n_0364;
n_0370 [label="COPY"];
n_0370 -> n_0035;
n_0445 [label="STORE(8)"];
n_0445 -> n_0366;
n_0445 -> n_0370;
n_0373 [label="LOCAL"];
n_0375 [label="ADDR(48)"];
n_0375 -> n_0373;
n_0383 [label="TC"];
n_0385 [label="ADDR(432)"];
n_0385 -> n_0383;
n_0389 [label="LOAD(8)"];
n_0389 -> n_0385;
n_0393 [label="ADDR(120)"];
n_0393 -> n_0389;
n_0397 [label="LOAD(8)"];
n_0397 -> n_0393;
n_0379 [label="CONST(0, 2)"];
n_0401 [label="IDX(8)"];
n_0401 -> n_0397;
n_0401 -> n_0379;
n_0406 [label="LOAD(8)"];
n_0406 -> n_0401;
n_0440 [label="STORE(8)"];
n_0440 -> n_0375;
n_0440 -> n_0406;
}
End dump of JIT expression tree
===============================
JIT: Starting tile list log
===========================
Block{0} [0-50)
0: (local)
1: (tc)
2: (load (addr reg $ofs) $size)
3: (load (addr reg $ofs) $size)
4: (const $val $size)
5: (load (idx reg reg $scale) $size)
6: (store (addr reg $ofs) reg $size)
7: (local)
8: (tc)
9: (load (addr reg $ofs) $size)
10: (load (addr reg $ofs) $size)
11: (const $val $size)
12: (load (idx reg reg $scale) $size)
13: (store (addr reg $ofs) reg $size)
14: (local)
15: (tc)
16: (load (addr reg $ofs) $size)
17: (load (addr reg $ofs) $size)
18: (const $val $size)
19: (load (idx reg reg $scale) $size)
20: (store (addr reg $ofs) reg $size)
21: (local)
22: (ucast reg $to_size $from_size)
23: (store (addr reg $ofs) reg $size)
24: (local)
25: (tc)
26: (load (addr reg $ofs) $size)
27: (load (addr reg $ofs) $size)
28: (const $val $size)
29: (load (idx reg reg $scale) $size)
30: (store (addr reg $ofs) reg $size)
31: (local)
32: (tc)
33: (load (addr reg $ofs) $size)
34: (load (addr reg $ofs) $size)
35: (const $val $size)
36: (load (idx reg reg $scale) $size)
37: (store (addr reg $ofs) reg $size)
38: (local)
39: (tc)
40: (load (addr reg $ofs) $size)
41: (load (addr reg $ofs) $size)
42: (const $val $size)
43: (load (idx reg reg $scale) $size)
44: (store (addr reg $ofs) reg $size)
45: (copy reg)
46: (load (addr reg $ofs) $size)
47: (discard reg)
48: (nz (load (addr reg $ofs) $size))
49: (conditional-branch: fail)
-> { 1, 2 }
Block{1} [50-51)
50: (branch :after)
-> { 3 }
Block{2} [51-53)
51: (label :fail)
52: (addr reg $ofs)
-> { 3 }
Block{3} [53-60)
53: (branch :after)
54: (if flag reg)
55: (do void reg)
56: (add reg (const $val $size))
57: (store reg reg $size)
58: (nz (and (load (addr reg $ofs) $size) (const $val $size)))
59: (conditional-branch :fail)
-> { 4, 7 }
Block{4} [60-62)
60: (nz (load (idx reg reg $scl) $size))
61: (conditional-branch :fail)
-> { 5, 7 }
Block{5} [62-64)
62: (zr (and (load (addr reg $ofs) $size) (const $val $size)))
63: (conditional-branch :fail)
-> { 6, 7 }
Block{6} [64-68)
64: (all flag)
65: (tc)
66: (arglist (carg reg))
67: (callv (const_ptr $ptr) c_args)
-> { 7 }
Block{7} [68-81)
68: (label :fail)
69: (when flag void)
70: (dov void void)
71: (local)
72: (copy reg)
73: (store (addr reg $ofs) reg $size)
74: (local)
75: (tc)
76: (load (addr reg $ofs) $size)
77: (load (addr reg $ofs) $size)
78: (const $val $size)
79: (load (idx reg reg $scale) $size)
80: (store (addr reg $ofs) reg $size)
-> {}
End of tile list log
====================
After:
Spesh of 'BUILD' (cuid: 62, file: /home/dogbert/repos/rakudo/install/bin/../share/nqp/lib/MAST/Nodes.nqp:763)
Callsite 0xc6cfd0 (6 args, 6 pos)
Positional flags: obj, obj, int, obj, obj, obj
BB 0 (0x7f60c8f8ef40):
line: 763 (pc 0)
Instructions:
no_op
Successors: 1
Predecessors:
Dominance children: 1
BB 1 (0x7f60c8f8efc8):
line: 763 (pc 0)
Instructions:
sp_getarg_o r0(2), liti16(0) # start of exprjit tree
sp_getarg_o r1(2), liti16(1)
sp_getarg_i r9(1), liti16(2)
trunc_i32 r2(1), r9(1)
sp_getarg_o r3(2), liti16(3)
sp_getarg_o r4(2), liti16(4)
sp_getarg_o r5(2), liti16(5)
[Annotation: INS Deopt One (idx 0 -> pc 56; line 764)]
[Annotation: Logged (bytecode offset 50)]
[Annotation: Line Number: /home/dogbert/repos/rakudo/install/bin/../share/nqp/lib/MAST/Nodes.nqp:763]
set r6(2), r0(2)
sp_p6obind_o r6(2), liti16(8), r1(2) # bindattr_o of '$!bytecode' in SubBuffer
[Annotation: INS Deopt One (idx 1 -> pc 84; line 765)]
[Annotation: Logged (bytecode offset 78)]
set r7(3), r0(2)
sp_getspeshslot r6(3), sslot(0)
extend_i32 r8(1), r2(1) # expr bail: Cannot get template for: extend_i32
bindattr_i r7(3), r6(3), lits($!annotations-offset), r8(1), liti16(1) # JIT: not devirtualized (concreteness not sure)
[Annotation: INS Deopt One (idx 2 -> pc 118; line 766)]
[Annotation: Logged (bytecode offset 112)]
set r6(4), r0(2)
sp_p6obind_o r6(4), liti16(24), r3(2) # bindattr_o of '%!labels' in SubBuffer
[Annotation: INS Deopt One (idx 3 -> pc 146; line 767)]
[Annotation: Logged (bytecode offset 140)]
set r7(5), r0(2)
sp_p6obind_o r7(5), liti16(32), r4(2) # bindattr_o of '@!label-fixups' in SubBuffer
[Annotation: INS Deopt One (idx 4 -> pc 174; line 768)]
[Annotation: Logged (bytecode offset 168)]
set r6(6), r0(2)
sp_p6obind_o r6(6), liti16(40), r5(2) # bindattr_o of '@!handlers' in SubBuffer
return_o r5(2)
Successors:
Predecessors: 0
Dominance children: 2
Facts:
r0(0): usages=0, flags=0
r0(1): usages=0, flags=0 DeadWriter
r0(2): usages=5, flags=9 KnTyp Concr (type: SubBuffer)
r1(0): usages=0, flags=0
r1(1): usages=0, flags=0 DeadWriter
r1(2): usages=1, flags=9 KnTyp Concr (type: MAST::Bytecode)
r2(0): usages=0, flags=0
r2(1): usages=1, flags=0
r3(0): usages=0, flags=0
r3(1): usages=0, flags=0 DeadWriter
r3(2): usages=1, flags=9 KnTyp Concr (type: BOOTHash)
r4(0): usages=0, flags=0
r4(1): usages=0, flags=0 DeadWriter
r4(2): usages=1, flags=9 KnTyp Concr (type: BOOTIntArray)
r5(0): usages=0, flags=0
r5(1): usages=0, flags=0 DeadWriter
r5(2): usages=2, flags=9 KnTyp Concr (type: NQPArray)
r6(0): usages=0, flags=0
r6(1): usages=0, flags=0 DeadWriter
r6(2): usages=1, flags=9 KnTyp Concr (type: SubBuffer)
r6(3): usages=1, flags=19 KnTyp KnVal TyObj (type: SubBuffer)
r6(4): usages=1, flags=9 KnTyp Concr (type: SubBuffer)
r6(5): usages=0, flags=19 KnTyp KnVal TyObj DeadWriter (type: SubBuffer)
r6(6): usages=1, flags=9 KnTyp Concr (type: SubBuffer)
r7(0): usages=0, flags=0
r7(1): usages=0, flags=0 DeadWriter
r7(2): usages=0, flags=19 KnTyp KnVal TyObj DeadWriter (type: SubBuffer)
r7(3): usages=1, flags=9 KnTyp Concr (type: SubBuffer)
r7(4): usages=0, flags=19 KnTyp KnVal TyObj DeadWriter (type: SubBuffer)
r7(5): usages=1, flags=9 KnTyp Concr (type: SubBuffer)
r7(6): usages=0, flags=19 KnTyp KnVal TyObj DeadWriter (type: SubBuffer)
r8(0): usages=0, flags=0
r8(1): usages=1, flags=0
r9(0): usages=0, flags=0
r9(1): usages=1, flags=0
Spesh slots:
0 = Type Object (SubBuffer)
Frame size: 206 bytes
Specialization took 14us (total 240us)
JIT was successful and compilation took 223us
Bytecode size: 859 byte
========
Latest guard tree for 'BUILD' (cuid: 62, file: /home/dogbert/repos/rakudo/install/bin/../share/nqp/lib/MAST/Nodes.nqp:763)
0: CALLSITE 0xc6cfd0 | Y: 1, N: 0
1: LOAD ARG 0 | Y: 2
2: STABLE CONC SubBuffer | Y: 3, N: 0
3: LOAD ARG 1 | Y: 4
4: STABLE CONC MAST::Bytecode | Y: 5, N: 0
5: LOAD ARG 3 | Y: 6
6: STABLE CONC BOOTHash | Y: 7, N: 0
7: LOAD ARG 4 | Y: 8
8: STABLE CONC BOOTIntArray | Y: 9, N: 0
9: LOAD ARG 5 | Y: 10
10: STABLE CONC NQPArray | Y: 11, N: 0
11: RESULT 0
========
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment