@@ -824,6 +824,7 @@ func foo(len: Int,val: Int,x: Int,y: Int)->[Int]
824824L1:
825825""" , result );
826826 }
827+
827828 @ Test
828829 public void testSSA19 ()
829830 {
@@ -888,5 +889,316 @@ func bug(N: Int)
888889L9:
889890 goto L1
890891L1:
891- """ , result ); }
892+ """ , result );
893+ }
894+
895+ @ Test
896+ public void testSSA20 ()
897+ {
898+ String src = """
899+ func sieve(N: Int)->[Int]
900+ {
901+ // The main Sieve array
902+ var ary = new [Int]{len=N,value=0}
903+ // The primes less than N
904+ var primes = new [Int]{len=N/2,value=0}
905+ // Number of primes so far, searching at index p
906+ var nprimes = 0
907+ var p=2
908+ // Find primes while p^2 < N
909+ while( p*p < N ) {
910+ // skip marked non-primes
911+ while( ary[p] ) {
912+ p = p + 1
913+ }
914+ // p is now a prime
915+ primes[nprimes] = p
916+ nprimes = nprimes+1
917+ // Mark out the rest non-primes
918+ var i = p + p
919+ while( i < N ) {
920+ ary[i] = 1
921+ i = i + p
922+ }
923+ p = p + 1
924+ }
925+
926+ // Now just collect the remaining primes, no more marking
927+ while ( p < N ) {
928+ if( !ary[p] ) {
929+ primes[nprimes] = p
930+ nprimes = nprimes + 1
931+ }
932+ p = p + 1
933+ }
934+
935+ // Copy/shrink the result array
936+ var rez = new [Int]{len=nprimes,value=0}
937+ var j = 0
938+ while( j < nprimes ) {
939+ rez[j] = primes[j]
940+ j = j + 1
941+ }
942+ return rez
943+ }
944+ func eq(a: [Int], b: [Int], n: Int)->Int
945+ {
946+ var result = 1
947+ var i = 0
948+ while (i < n)
949+ {
950+ if (a[i] != b[i])
951+ {
952+ result = 0
953+ break
954+ }
955+ i = i + 1
956+ }
957+ return result
958+ }
959+
960+ func main()->Int
961+ {
962+ var rez = sieve(20)
963+ var expected = new [Int]{2,3,5,7,11,13,17,19}
964+ return eq(rez,expected,8)
965+ }
966+ """ ;
967+ String result = compileSrc (src );
968+ Assert .assertEquals ("""
969+ func sieve(N: Int)->[Int]
970+ Reg #0 N 0
971+ Reg #1 ary 1
972+ Reg #2 primes 2
973+ Reg #3 nprimes 3
974+ Reg #4 p 4
975+ Reg #5 rez 5
976+ Reg #6 j 6
977+ Reg #7 i 7
978+ Reg #8 %t8 8
979+ Reg #9 %t9 9
980+ Reg #10 %t10 10
981+ Reg #11 %t11 11
982+ Reg #12 p_1 4
983+ Reg #13 %t13 13
984+ Reg #14 N_1 0
985+ Reg #15 %t15 15
986+ Reg #16 ary_1 1
987+ Reg #17 p_2 4
988+ Reg #18 %t18 18
989+ Reg #19 p_3 4
990+ Reg #20 ary_2 1
991+ Reg #21 primes_1 2
992+ Reg #22 primes_2 2
993+ Reg #23 nprimes_1 3
994+ Reg #24 nprimes_2 3
995+ Reg #25 %t25 25
996+ Reg #26 nprimes_3 3
997+ Reg #27 %t27 27
998+ Reg #28 %t28 28
999+ Reg #29 i_1 7
1000+ Reg #30 N_2 0
1001+ Reg #31 ary_3 1
1002+ Reg #32 %t32 32
1003+ Reg #33 p_4 4
1004+ Reg #34 i_2 7
1005+ Reg #35 N_3 0
1006+ Reg #36 %t36 36
1007+ Reg #37 p_5 4
1008+ Reg #38 primes_3 2
1009+ Reg #39 nprimes_4 3
1010+ Reg #40 %t40 40
1011+ Reg #41 p_6 4
1012+ Reg #42 N_4 0
1013+ Reg #43 %t43 43
1014+ Reg #44 ary_4 1
1015+ Reg #45 %t45 45
1016+ Reg #46 primes_4 2
1017+ Reg #47 nprimes_5 3
1018+ Reg #48 %t48 48
1019+ Reg #49 nprimes_6 3
1020+ Reg #50 %t50 50
1021+ Reg #51 p_7 4
1022+ Reg #52 p_8 4
1023+ Reg #53 N_5 0
1024+ Reg #54 ary_5 1
1025+ Reg #55 primes_5 2
1026+ Reg #56 nprimes_7 3
1027+ Reg #57 %t57 57
1028+ Reg #58 %t58 58
1029+ Reg #59 j_1 6
1030+ Reg #60 nprimes_8 3
1031+ Reg #61 %t61 61
1032+ Reg #62 primes_6 2
1033+ Reg #63 rez_1 5
1034+ Reg #64 %t64 64
1035+ Reg #65 j_2 6
1036+ L0:
1037+ arg N
1038+ %t8 = New([Int], len=N, initValue=0)
1039+ ary = %t8
1040+ %t10 = N/2
1041+ %t9 = New([Int], len=%t10, initValue=0)
1042+ primes = %t9
1043+ nprimes = 0
1044+ p = 2
1045+ goto L2
1046+ L2:
1047+ nprimes_2 = phi(nprimes, nprimes_3)
1048+ ary_2 = phi(ary, ary_3)
1049+ N_1 = phi(N, N_2)
1050+ p_1 = phi(p, p_5)
1051+ %t11 = p_1*p_1
1052+ %t13 = %t11<N_1
1053+ if %t13 goto L3 else goto L4
1054+ L3:
1055+ goto L5
1056+ L5:
1057+ p_2 = phi(p_1, p_3)
1058+ %t15 = ary_2[p_2]
1059+ if %t15 goto L6 else goto L7
1060+ L6:
1061+ %t18 = p_2+1
1062+ p_3 = %t18
1063+ goto L5
1064+ L7:
1065+ primes[nprimes_2] = p_2
1066+ %t25 = nprimes_2+1
1067+ nprimes_3 = %t25
1068+ %t27 = p_2+p_2
1069+ i = %t27
1070+ goto L8
1071+ L8:
1072+ i_1 = phi(i, i_2)
1073+ %t28 = i_1<N_1
1074+ if %t28 goto L9 else goto L10
1075+ L9:
1076+ ary_1[i_1] = 1
1077+ %t32 = i_1+p_2
1078+ i_2 = %t32
1079+ goto L8
1080+ L10:
1081+ %t36 = p_4+1
1082+ p_5 = %t36
1083+ goto L2
1084+ L4:
1085+ goto L11
1086+ L11:
1087+ nprimes_5 = phi(nprimes_2, nprimes_7)
1088+ p_6 = phi(p_1, p_8)
1089+ %t40 = p_6<N_1
1090+ if %t40 goto L12 else goto L13
1091+ L12:
1092+ %t43 = ary_2[p_6]
1093+ %t45 = !%t43
1094+ if %t45 goto L14 else goto L15
1095+ L14:
1096+ primes_2[nprimes_5] = p_6
1097+ %t48 = nprimes_5+1
1098+ nprimes_6 = %t48
1099+ goto L15
1100+ L15:
1101+ nprimes_7 = phi(nprimes_5, nprimes_6)
1102+ %t50 = p_6+1
1103+ p_8 = %t50
1104+ goto L11
1105+ L13:
1106+ %t57 = New([Int], len=nprimes_5, initValue=0)
1107+ rez = %t57
1108+ j = 0
1109+ goto L16
1110+ L16:
1111+ j_1 = phi(j, j_2)
1112+ %t58 = j_1<nprimes_5
1113+ if %t58 goto L17 else goto L18
1114+ L17:
1115+ %t61 = primes_4[j_1]
1116+ rez[j_1] = %t61
1117+ %t64 = j_1+1
1118+ j_2 = %t64
1119+ goto L16
1120+ L18:
1121+ ret rez_1
1122+ goto L1
1123+ L1:
1124+ func eq(a: [Int],b: [Int],n: Int)->Int
1125+ Reg #0 a 0
1126+ Reg #1 b 1
1127+ Reg #2 n 2
1128+ Reg #3 result 3
1129+ Reg #4 i 4
1130+ Reg #5 %t5 5
1131+ Reg #6 i_1 4
1132+ Reg #7 n_1 2
1133+ Reg #8 %t8 8
1134+ Reg #9 a_1 0
1135+ Reg #10 %t10 10
1136+ Reg #11 b_1 1
1137+ Reg #12 %t12 12
1138+ Reg #13 result_1 3
1139+ Reg #14 %t14 14
1140+ Reg #15 i_2 4
1141+ Reg #16 result_2 3
1142+ Reg #17 result_3 3
1143+ L0:
1144+ arg a
1145+ arg b
1146+ arg n
1147+ result = 1
1148+ i = 0
1149+ goto L2
1150+ L2:
1151+ i_1 = phi(i, i_2)
1152+ %t5 = i_1<n
1153+ if %t5 goto L3 else goto L4
1154+ L3:
1155+ %t8 = a[i_1]
1156+ %t10 = b[i_1]
1157+ %t12 = %t8!=%t10
1158+ if %t12 goto L5 else goto L6
1159+ L5:
1160+ result_1 = 0
1161+ goto L4
1162+ L4:
1163+ result_2 = phi(result, result_1)
1164+ ret result_2
1165+ goto L1
1166+ L1:
1167+ L6:
1168+ %t14 = i_1+1
1169+ i_2 = %t14
1170+ goto L2
1171+ func main()->Int
1172+ Reg #0 rez 0
1173+ Reg #1 expected 1
1174+ Reg #2 %t2 2
1175+ Reg #3 %t3 3
1176+ Reg #4 %t4 4
1177+ Reg #5 %t5 5
1178+ Reg #6 %t6 6
1179+ Reg #7 %t7 7
1180+ Reg #8 %t8 8
1181+ L0:
1182+ %t2 = 20
1183+ %t3 = call sieve params %t2
1184+ rez = %t3
1185+ %t4 = New([Int], len=8)
1186+ %t4[0] = 2
1187+ %t4[1] = 3
1188+ %t4[2] = 5
1189+ %t4[3] = 7
1190+ %t4[4] = 11
1191+ %t4[5] = 13
1192+ %t4[6] = 17
1193+ %t4[7] = 19
1194+ expected = %t4
1195+ %t5 = rez
1196+ %t6 = expected
1197+ %t7 = 8
1198+ %t8 = call eq params %t5, %t6, %t7
1199+ ret %t8
1200+ goto L1
1201+ L1:
1202+ """ , result );
1203+ }
8921204}
0 commit comments