@@ -824,6 +824,7 @@ func foo(len: Int,val: Int,x: Int,y: Int)->[Int]
824
824
L1:
825
825
""" , result );
826
826
}
827
+
827
828
@ Test
828
829
public void testSSA19 ()
829
830
{
@@ -888,5 +889,316 @@ func bug(N: Int)
888
889
L9:
889
890
goto L1
890
891
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
+ }
892
1204
}
0 commit comments