Skip to content

Commit 4a956bf

Browse files
#53 Test case for bug
1 parent 4508ad8 commit 4a956bf

File tree

1 file changed

+313
-1
lines changed

1 file changed

+313
-1
lines changed

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

Lines changed: 313 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@ func foo(len: Int,val: Int,x: Int,y: Int)->[Int]
824824
L1:
825825
""", result);
826826
}
827+
827828
@Test
828829
public void testSSA19()
829830
{
@@ -888,5 +889,316 @@ func bug(N: Int)
888889
L9:
889890
goto L1
890891
L1:
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

Comments
 (0)