File tree Expand file tree Collapse file tree 3 files changed +256
-7
lines changed
main/java/com/compilerprogramming/ezlang/compiler
test/java/com/compilerprogramming/ezlang/compiler Expand file tree Collapse file tree 3 files changed +256
-7
lines changed Original file line number Diff line number Diff line change @@ -185,8 +185,9 @@ void search(BasicBlock block) {
185
185
}
186
186
// Pop stacks for defs
187
187
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 ();
190
191
stacks [reg .nonSSAId ()].pop ();
191
192
}
192
193
}
Original file line number Diff line number Diff line change @@ -606,6 +606,111 @@ func main()->Int
606
606
""" , result );
607
607
}
608
608
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
+
609
714
@ Test
610
715
public void testSSA17 () {
611
716
String src = """
@@ -737,6 +842,51 @@ func bug(N: Int)
737
842
}
738
843
""" ;
739
844
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 ); }
742
892
}
Original file line number Diff line number Diff line change @@ -2279,7 +2279,7 @@ else if (i > j)
2279
2279
%t5_0 = i_1==j_2
2280
2280
if %t5_0 goto L8 else goto L9
2281
2281
L8:
2282
- %t6_0 = a_4 +i_1
2282
+ %t6_0 = a_2 +i_1
2283
2283
%t7_0 = %t6_0+j_2
2284
2284
a_5 = %t7_0
2285
2285
goto L10
@@ -2330,7 +2330,7 @@ else if (i > j)
2330
2330
%t5_0 = i_1==j_2
2331
2331
if %t5_0 goto L8 else goto L9
2332
2332
L8:
2333
- %t6_0 = a_4 +i_1
2333
+ %t6_0 = a_2 +i_1
2334
2334
%t7_0 = %t6_0+j_2
2335
2335
a_5 = %t7_0
2336
2336
a_6 = a_5
@@ -3081,6 +3081,104 @@ func bug(N: Int)
3081
3081
}
3082
3082
""" ;
3083
3083
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 );
3085
3183
}
3086
3184
}
You can’t perform that action at this time.
0 commit comments