Skip to content

Commit 87312a4

Browse files
Fix bug popping SSA names from stack during SSA rename - Phi instructions were missed
1 parent 5ab969b commit 87312a4

File tree

3 files changed

+256
-7
lines changed

3 files changed

+256
-7
lines changed

optvm/src/main/java/com/compilerprogramming/ezlang/compiler/EnterSSA.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,9 @@ void search(BasicBlock block) {
185185
}
186186
// Pop stacks for defs
187187
for (Instruction i: block.instructions) {
188-
if (i.definesVar()) {
189-
var reg = i.def();
188+
// Phis don't answer to definesVar() or def()
189+
if (i.definesVar() || i instanceof Instruction.Phi) {
190+
var reg = i instanceof Instruction.Phi phi ? phi.value() : i.def();
190191
stacks[reg.nonSSAId()].pop();
191192
}
192193
}

optvm/src/test/java/com/compilerprogramming/ezlang/compiler/TestIncrementalSSA.java

Lines changed: 152 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,111 @@ func main()->Int
606606
""", result);
607607
}
608608

609+
@Test
610+
public void testSSA11() {
611+
String src = """
612+
func main()->Int {
613+
var a = 0
614+
var i = 0
615+
var j = 0
616+
while (i < 3) {
617+
j = 0
618+
while (j < 3) {
619+
if (i == j)
620+
a = a + i + j
621+
else if (i > j)
622+
a = a - 1
623+
j = j + 1
624+
}
625+
i = i + 1
626+
}
627+
return a
628+
}
629+
""";
630+
String result = compileSrc(src);
631+
Assert.assertEquals("""
632+
func main()->Int
633+
Reg #0 a 0
634+
Reg #1 i 1
635+
Reg #2 j 2
636+
Reg #3 %t3 3
637+
Reg #4 i_1 1
638+
Reg #5 j_1 2
639+
Reg #6 %t6 6
640+
Reg #7 j_2 2
641+
Reg #8 %t8 8
642+
Reg #9 i_2 1
643+
Reg #10 %t10 10
644+
Reg #11 a_1 0
645+
Reg #12 %t12 12
646+
Reg #13 a_2 0
647+
Reg #14 %t14 14
648+
Reg #15 %t15 15
649+
Reg #16 a_3 0
650+
Reg #17 %t17 17
651+
Reg #18 j_3 2
652+
Reg #19 j_4 2
653+
Reg #20 j_5 2
654+
Reg #21 a_4 0
655+
Reg #22 a_5 0
656+
Reg #23 a_6 0
657+
Reg #24 i_3 1
658+
Reg #25 i_4 1
659+
Reg #26 %t26 26
660+
Reg #27 i_5 1
661+
L0:
662+
a = 0
663+
i = 0
664+
j = 0
665+
goto L2
666+
L2:
667+
a_4 = phi(a, a_1)
668+
i_1 = phi(i, i_5)
669+
%t3 = i_1<3
670+
if %t3 goto L3 else goto L4
671+
L3:
672+
j_1 = 0
673+
goto L5
674+
L5:
675+
a_1 = phi(a_4, a_5)
676+
j_2 = phi(j_1, j_5)
677+
%t6 = j_2<3
678+
if %t6 goto L6 else goto L7
679+
L6:
680+
%t8 = i_1==j_2
681+
if %t8 goto L8 else goto L9
682+
L8:
683+
%t10 = a_1+i_1
684+
%t12 = %t10+j_2
685+
a_2 = %t12
686+
goto L10
687+
L10:
688+
a_5 = phi(a_2, a_6)
689+
%t17 = j_2+1
690+
j_5 = %t17
691+
goto L5
692+
L9:
693+
%t14 = i_1>j_2
694+
if %t14 goto L11 else goto L12
695+
L11:
696+
%t15 = a_1-1
697+
a_3 = %t15
698+
goto L12
699+
L12:
700+
a_6 = phi(a_1, a_3)
701+
goto L10
702+
L7:
703+
%t26 = i_2+1
704+
i_5 = %t26
705+
goto L2
706+
L4:
707+
ret a_4
708+
goto L1
709+
L1:
710+
""", result);
711+
}
712+
713+
609714
@Test
610715
public void testSSA17() {
611716
String src = """
@@ -737,6 +842,51 @@ func bug(N: Int)
737842
}
738843
""";
739844
String result = compileSrc(src);
740-
System.out.println(result);
741-
}
845+
Assert.assertEquals("""
846+
func bug(N: Int)
847+
Reg #0 N 0
848+
Reg #1 p 1
849+
Reg #2 %t2 2
850+
Reg #3 p_1 1
851+
Reg #4 N_1 0
852+
Reg #5 %t5 5
853+
Reg #6 p_2 1
854+
Reg #7 N_2 0
855+
Reg #8 p_3 1
856+
Reg #9 %t9 9
857+
Reg #10 p_4 1
858+
Reg #11 N_3 0
859+
Reg #12 %t12 12
860+
Reg #13 p_5 1
861+
L0:
862+
arg N
863+
p = 2
864+
goto L2
865+
L2:
866+
p_1 = phi(p, p_3)
867+
%t2 = p_1<N
868+
if %t2 goto L3 else goto L4
869+
L3:
870+
if p_1 goto L5 else goto L6
871+
L5:
872+
%t5 = p_1+1
873+
p_2 = %t5
874+
goto L6
875+
L6:
876+
p_3 = phi(p_1, p_2)
877+
goto L2
878+
L4:
879+
goto L7
880+
L7:
881+
p_4 = phi(p_1, p_5)
882+
%t9 = p_4<N_1
883+
if %t9 goto L8 else goto L9
884+
L8:
885+
%t12 = p_4+1
886+
p_5 = %t12
887+
goto L7
888+
L9:
889+
goto L1
890+
L1:
891+
""", result); }
742892
}

optvm/src/test/java/com/compilerprogramming/ezlang/compiler/TestSSATransform.java

Lines changed: 101 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,7 +2279,7 @@ else if (i > j)
22792279
%t5_0 = i_1==j_2
22802280
if %t5_0 goto L8 else goto L9
22812281
L8:
2282-
%t6_0 = a_4+i_1
2282+
%t6_0 = a_2+i_1
22832283
%t7_0 = %t6_0+j_2
22842284
a_5 = %t7_0
22852285
goto L10
@@ -2330,7 +2330,7 @@ else if (i > j)
23302330
%t5_0 = i_1==j_2
23312331
if %t5_0 goto L8 else goto L9
23322332
L8:
2333-
%t6_0 = a_4+i_1
2333+
%t6_0 = a_2+i_1
23342334
%t7_0 = %t6_0+j_2
23352335
a_5 = %t7_0
23362336
a_6 = a_5
@@ -3081,6 +3081,104 @@ func bug(N: Int)
30813081
}
30823082
""";
30833083
String result = compileSrc(src);
3084-
System.out.println(result);
3084+
Assert.assertEquals("""
3085+
func bug
3086+
Before SSA
3087+
==========
3088+
L0:
3089+
arg N
3090+
p = 2
3091+
goto L2
3092+
L2:
3093+
%t2 = p<N
3094+
if %t2 goto L3 else goto L4
3095+
L3:
3096+
if p goto L5 else goto L6
3097+
L5:
3098+
%t3 = p+1
3099+
p = %t3
3100+
goto L6
3101+
L6:
3102+
goto L2
3103+
L4:
3104+
goto L7
3105+
L7:
3106+
%t4 = p<N
3107+
if %t4 goto L8 else goto L9
3108+
L8:
3109+
%t5 = p+1
3110+
p = %t5
3111+
goto L7
3112+
L9:
3113+
goto L1
3114+
L1:
3115+
After SSA
3116+
=========
3117+
L0:
3118+
arg N_0
3119+
p_0 = 2
3120+
goto L2
3121+
L2:
3122+
p_1 = phi(p_0, p_5)
3123+
%t2_0 = p_1<N_0
3124+
if %t2_0 goto L3 else goto L4
3125+
L3:
3126+
if p_1 goto L5 else goto L6
3127+
L5:
3128+
%t3_0 = p_1+1
3129+
p_4 = %t3_0
3130+
goto L6
3131+
L6:
3132+
p_5 = phi(p_1, p_4)
3133+
goto L2
3134+
L4:
3135+
goto L7
3136+
L7:
3137+
p_2 = phi(p_1, p_3)
3138+
%t4_0 = p_2<N_0
3139+
if %t4_0 goto L8 else goto L9
3140+
L8:
3141+
%t5_0 = p_2+1
3142+
p_3 = %t5_0
3143+
goto L7
3144+
L9:
3145+
goto L1
3146+
L1:
3147+
After exiting SSA
3148+
=================
3149+
L0:
3150+
arg N_0
3151+
p_0 = 2
3152+
p_1 = p_0
3153+
goto L2
3154+
L2:
3155+
%t2_0 = p_1<N_0
3156+
if %t2_0 goto L3 else goto L4
3157+
L3:
3158+
p_5 = p_1
3159+
if p_1 goto L5 else goto L6
3160+
L5:
3161+
%t3_0 = p_1+1
3162+
p_4 = %t3_0
3163+
p_5 = p_4
3164+
goto L6
3165+
L6:
3166+
p_1 = p_5
3167+
goto L2
3168+
L4:
3169+
p_2 = p_1
3170+
goto L7
3171+
L7:
3172+
%t4_0 = p_2<N_0
3173+
if %t4_0 goto L8 else goto L9
3174+
L8:
3175+
%t5_0 = p_2+1
3176+
p_3 = %t5_0
3177+
p_2 = p_3
3178+
goto L7
3179+
L9:
3180+
goto L1
3181+
L1:
3182+
""", result);
30853183
}
30863184
}

0 commit comments

Comments
 (0)