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) {
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 }
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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
22812281L8:
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
23322332L8:
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}
You can’t perform that action at this time.
0 commit comments