315 lines · plain
1; RUN: opt < %s -passes=gvn -S | FileCheck %s2 3 %struct.anon = type { ptr, i32, i32, [3 x i32], ptr, ptr, ptr }4@debug = external constant i32 ; <ptr> [#uses=0]5@counters = external constant i32 ; <ptr> [#uses=1]6@trialx = external global [17 x i32] ; <ptr> [#uses=1]7@dummy1 = external global [7 x i32] ; <ptr> [#uses=0]8@dummy2 = external global [4 x i32] ; <ptr> [#uses=0]9@unacceptable = external global i32 ; <ptr> [#uses=0]10@isa = external global [13 x %struct.anon] ; <ptr> [#uses=3]11@.str = external constant [4 x i8] ; <ptr> [#uses=0]12@.str1 = external constant [3 x i8] ; <ptr> [#uses=0]13@.str2 = external constant [1 x i8] ; <ptr> [#uses=0]14@.str3 = external constant [4 x i8] ; <ptr> [#uses=0]15@.str4 = external constant [3 x i8] ; <ptr> [#uses=0]16@.str5 = external constant [4 x i8] ; <ptr> [#uses=0]17@.str6 = external constant [2 x i8] ; <ptr> [#uses=0]18@.str7 = external constant [4 x i8] ; <ptr> [#uses=0]19@.str8 = external constant [4 x i8] ; <ptr> [#uses=0]20@.str9 = external constant [4 x i8] ; <ptr> [#uses=0]21@.str10 = external constant [4 x i8] ; <ptr> [#uses=0]22@.str11 = external constant [2 x i8] ; <ptr> [#uses=0]23@.str12 = external constant [4 x i8] ; <ptr> [#uses=0]24@.str13 = external constant [2 x i8] ; <ptr> [#uses=0]25@.str14 = external constant [5 x i8] ; <ptr> [#uses=0]26@.str15 = external constant [5 x i8] ; <ptr> [#uses=0]27@.str16 = external constant [4 x i8] ; <ptr> [#uses=0]28@.str17 = external constant [4 x i8] ; <ptr> [#uses=0]29@.str18 = external constant [3 x i8] ; <ptr> [#uses=0]30@.str19 = external constant [4 x i8] ; <ptr> [#uses=0]31@.str20 = external constant [4 x i8] ; <ptr> [#uses=0]32@.str21 = external constant [4 x i8] ; <ptr> [#uses=0]33@.str22 = external constant [4 x i8] ; <ptr> [#uses=0]34@.str23 = external constant [5 x i8] ; <ptr> [#uses=0]35@.str24 = external constant [4 x i8] ; <ptr> [#uses=0]36@.str25 = external constant [6 x i8] ; <ptr> [#uses=0]37@.str26 = external constant [5 x i8] ; <ptr> [#uses=0]38@.str27 = external constant [6 x i8] ; <ptr> [#uses=0]39@r = external global [17 x i32] ; <ptr> [#uses=0]40@.str28 = external constant [3 x i8] ; <ptr> [#uses=0]41@.str29 = external constant [5 x i8] ; <ptr> [#uses=0]42@pgm = external global [5 x { i32, [3 x i32] }] ; <ptr> [#uses=4]43@.str30 = external constant [3 x i8] ; <ptr> [#uses=0]44@.str31 = external constant [13 x i8] ; <ptr> [#uses=0]45@.str32 = external constant [3 x i8] ; <ptr> [#uses=0]46@.str33 = external constant [4 x i8] ; <ptr> [#uses=0]47@.str34 = external constant [20 x i8] ; <ptr> [#uses=0]48@numi = external global i32 ; <ptr> [#uses=7]49@.str35 = external constant [10 x i8] ; <ptr> [#uses=0]50@counter = external global [5 x i32] ; <ptr> [#uses=2]51@itrialx.2510 = external global i32 ; <ptr> [#uses=0]52@.str36 = external constant [43 x i8] ; <ptr> [#uses=0]53@.str37 = external constant [42 x i8] ; <ptr> [#uses=0]54@corr_result = external global i32 ; <ptr> [#uses=0]55@.str38 = external constant [3 x i8] ; <ptr> [#uses=0]56@.str39 = external constant [5 x i8] ; <ptr> [#uses=0]57@.str40 = external constant [47 x i8] ; <ptr> [#uses=0]58@correct_result = external global [17 x i32] ; <ptr> [#uses=1]59@.str41 = external constant [46 x i8] ; <ptr> [#uses=0]60@.str42 = external constant [32 x i8] ; <ptr> [#uses=0]61@.str43 = external constant [44 x i8] ; <ptr> [#uses=1]62@.str44 = external constant [21 x i8] ; <ptr> [#uses=1]63@.str45 = external constant [12 x i8] ; <ptr> [#uses=1]64@.str46 = external constant [5 x i8] ; <ptr> [#uses=1]65@.str47 = external constant [12 x i8] ; <ptr> [#uses=1]66 67declare i32 @neg(i32, i32, i32)68 69declare i32 @Not(i32, i32, i32)70 71declare i32 @pop(i32, i32, i32)72 73declare i32 @nlz(i32, i32, i32)74 75declare i32 @rev(i32, i32, i32)76 77declare i32 @add(i32, i32, i32)78 79declare i32 @sub(i32, i32, i32)80 81declare i32 @mul(i32, i32, i32)82 83declare i32 @divide(i32, i32, i32)84 85declare i32 @divu(i32, i32, i32)86 87declare i32 @And(i32, i32, i32)88 89declare i32 @Or(i32, i32, i32)90 91declare i32 @Xor(i32, i32, i32)92 93declare i32 @rotl(i32, i32, i32)94 95declare i32 @shl(i32, i32, i32)96 97declare i32 @shr(i32, i32, i32)98 99declare i32 @shrs(i32, i32, i32)100 101declare i32 @cmpeq(i32, i32, i32)102 103declare i32 @cmplt(i32, i32, i32)104 105declare i32 @cmpltu(i32, i32, i32)106 107declare i32 @seleq(i32, i32, i32)108 109declare i32 @sellt(i32, i32, i32)110 111declare i32 @selle(i32, i32, i32)112 113declare void @print_expr(i32)114 115declare i32 @printf(ptr, ...)116 117declare i32 @putchar(i32)118 119declare void @print_pgm()120 121declare void @simulate_one_instruction(i32)122 123declare i32 @check(i32)124 125declare i32 @puts(ptr)126 127declare void @fix_operands(i32)128 129declare void @abort()130 131declare i32 @increment()132 133declare i32 @search()134 135define i32 @main(i32 %argc, ptr %argv) {136entry:137 %argc_addr = alloca i32 ; <ptr> [#uses=1]138 %argv_addr = alloca ptr ; <ptr> [#uses=1]139 %retval = alloca i32, align 4 ; <ptr> [#uses=2]140 %tmp = alloca i32, align 4 ; <ptr> [#uses=2]141 %i = alloca i32, align 4 ; <ptr> [#uses=21]142 %num_sol = alloca i32, align 4 ; <ptr> [#uses=4]143 %total = alloca i32, align 4 ; <ptr> [#uses=4]144 %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]145 store i32 %argc, ptr %argc_addr146 store ptr %argv, ptr %argv_addr147 store i32 0, ptr %num_sol148 store i32 1, ptr @numi149 br label %bb91150 151bb: ; preds = %cond_next97152 %tmp1 = load i32, ptr @numi ; <i32> [#uses=1]153 %tmp2 = getelementptr [44 x i8], ptr @.str43, i32 0, i32 0 ; <ptr> [#uses=1]154 %tmp3 = call i32 (ptr, ...) @printf( ptr %tmp2, i32 %tmp1 ) ; <i32> [#uses=0]155 store i32 0, ptr %i156 br label %bb13157 158bb4: ; preds = %bb13159 %tmp5 = load i32, ptr %i ; <i32> [#uses=1]160 %tmp6 = load i32, ptr %i ; <i32> [#uses=1]161 %tmp7 = getelementptr [17 x i32], ptr @trialx, i32 0, i32 %tmp6 ; <ptr> [#uses=1]162 %tmp8 = load i32, ptr %tmp7 ; <i32> [#uses=1]163 %tmp9 = call i32 @userfun( i32 %tmp8 ) ; <i32> [#uses=1]164 %tmp10 = getelementptr [17 x i32], ptr @correct_result, i32 0, i32 %tmp5 ; <ptr> [#uses=1]165 store i32 %tmp9, ptr %tmp10166 %tmp11 = load i32, ptr %i ; <i32> [#uses=1]167 %tmp12 = add i32 %tmp11, 1 ; <i32> [#uses=1]168 store i32 %tmp12, ptr %i169 br label %bb13170 171bb13: ; preds = %bb4, %bb172 %tmp14 = load i32, ptr %i ; <i32> [#uses=1]173 %tmp15 = icmp sle i32 %tmp14, 16 ; <i1> [#uses=1]174 %tmp1516 = zext i1 %tmp15 to i32 ; <i32> [#uses=1]175 %toBool = icmp ne i32 %tmp1516, 0 ; <i1> [#uses=1]176 br i1 %toBool, label %bb4, label %bb17177 178bb17: ; preds = %bb13179 store i32 0, ptr %i180 br label %bb49181 182bb18: ; preds = %bb49183 %tmp19 = load i32, ptr %i ; <i32> [#uses=1]184 %tmp20 = getelementptr [5 x { i32, [3 x i32] }], ptr @pgm, i32 0, i32 %tmp19 ; <ptr> [#uses=1]185 %tmp21 = getelementptr { i32, [3 x i32] }, ptr %tmp20, i32 0, i32 0 ; <ptr> [#uses=1]186 store i32 0, ptr %tmp21187 %tmp22 = load i32, ptr %i ; <i32> [#uses=1]188 %tmp23 = getelementptr [13 x %struct.anon], ptr @isa, i32 0, i32 0 ; <ptr> [#uses=1]189 %tmp24 = getelementptr %struct.anon, ptr %tmp23, i32 0, i32 3 ; <ptr> [#uses=1]190 %tmp25 = getelementptr [3 x i32], ptr %tmp24, i32 0, i32 0 ; <ptr> [#uses=1]191 %tmp26 = load i32, ptr %tmp25 ; <i32> [#uses=1]192 %tmp27 = getelementptr [5 x { i32, [3 x i32] }], ptr @pgm, i32 0, i32 %tmp22 ; <ptr> [#uses=1]193 %tmp28 = getelementptr { i32, [3 x i32] }, ptr %tmp27, i32 0, i32 1 ; <ptr> [#uses=1]194 %tmp29 = getelementptr [3 x i32], ptr %tmp28, i32 0, i32 0 ; <ptr> [#uses=1]195 store i32 %tmp26, ptr %tmp29196 %tmp30 = load i32, ptr %i ; <i32> [#uses=1]197 %tmp31 = getelementptr [13 x %struct.anon], ptr @isa, i32 0, i32 0 ; <ptr> [#uses=1]198 %tmp32 = getelementptr %struct.anon, ptr %tmp31, i32 0, i32 3 ; <ptr> [#uses=1]199 %tmp33 = getelementptr [3 x i32], ptr %tmp32, i32 0, i32 1 ; <ptr> [#uses=1]200 %tmp34 = load i32, ptr %tmp33 ; <i32> [#uses=1]201 %tmp35 = getelementptr [5 x { i32, [3 x i32] }], ptr @pgm, i32 0, i32 %tmp30 ; <ptr> [#uses=1]202 %tmp36 = getelementptr { i32, [3 x i32] }, ptr %tmp35, i32 0, i32 1 ; <ptr> [#uses=1]203 %tmp37 = getelementptr [3 x i32], ptr %tmp36, i32 0, i32 1 ; <ptr> [#uses=1]204 store i32 %tmp34, ptr %tmp37205 %tmp38 = load i32, ptr %i ; <i32> [#uses=1]206 %tmp39 = getelementptr [13 x %struct.anon], ptr @isa, i32 0, i32 0 ; <ptr> [#uses=1]207 %tmp40 = getelementptr %struct.anon, ptr %tmp39, i32 0, i32 3 ; <ptr> [#uses=1]208 %tmp41 = getelementptr [3 x i32], ptr %tmp40, i32 0, i32 2 ; <ptr> [#uses=1]209 %tmp42 = load i32, ptr %tmp41 ; <i32> [#uses=1]210 %tmp43 = getelementptr [5 x { i32, [3 x i32] }], ptr @pgm, i32 0, i32 %tmp38 ; <ptr> [#uses=1]211 %tmp44 = getelementptr { i32, [3 x i32] }, ptr %tmp43, i32 0, i32 1 ; <ptr> [#uses=1]212 %tmp45 = getelementptr [3 x i32], ptr %tmp44, i32 0, i32 2 ; <ptr> [#uses=1]213 store i32 %tmp42, ptr %tmp45214 %tmp46 = load i32, ptr %i ; <i32> [#uses=1]215 call void @fix_operands( i32 %tmp46 )216 %tmp47 = load i32, ptr %i ; <i32> [#uses=1]217; CHECK: %tmp47 = phi i32 [ %tmp48, %bb18 ], [ 0, %bb17 ]218 %tmp48 = add i32 %tmp47, 1 ; <i32> [#uses=1]219 store i32 %tmp48, ptr %i220 br label %bb49221 222bb49: ; preds = %bb18, %bb17223 %tmp50 = load i32, ptr @numi ; <i32> [#uses=1]224 %tmp51 = load i32, ptr %i ; <i32> [#uses=1]225 %tmp52 = icmp slt i32 %tmp51, %tmp50 ; <i1> [#uses=1]226 %tmp5253 = zext i1 %tmp52 to i32 ; <i32> [#uses=1]227 %toBool54 = icmp ne i32 %tmp5253, 0 ; <i1> [#uses=1]228 br i1 %toBool54, label %bb18, label %bb55229 230bb55: ; preds = %bb49231 %tmp56 = call i32 @search( ) ; <i32> [#uses=1]232 store i32 %tmp56, ptr %num_sol233 %tmp57 = getelementptr [21 x i8], ptr @.str44, i32 0, i32 0 ; <ptr> [#uses=1]234 %tmp58 = load i32, ptr %num_sol ; <i32> [#uses=1]235 %tmp59 = call i32 (ptr, ...) @printf( ptr %tmp57, i32 %tmp58 ) ; <i32> [#uses=0]236 %tmp60 = load i32, ptr @counters ; <i32> [#uses=1]237 %tmp61 = icmp ne i32 %tmp60, 0 ; <i1> [#uses=1]238 %tmp6162 = zext i1 %tmp61 to i32 ; <i32> [#uses=1]239 %toBool63 = icmp ne i32 %tmp6162, 0 ; <i1> [#uses=1]240 br i1 %toBool63, label %cond_true, label %cond_next241 242cond_true: ; preds = %bb55243 store i32 0, ptr %total244 %tmp64 = getelementptr [12 x i8], ptr @.str45, i32 0, i32 0 ; <ptr> [#uses=1]245 %tmp65 = call i32 (ptr, ...) @printf( ptr %tmp64 ) ; <i32> [#uses=0]246 store i32 0, ptr %i247 br label %bb79248 249bb66: ; preds = %bb79250 %tmp67 = load i32, ptr %i ; <i32> [#uses=1]251 %tmp68 = getelementptr [5 x i32], ptr @counter, i32 0, i32 %tmp67 ; <ptr> [#uses=1]252 %tmp69 = load i32, ptr %tmp68 ; <i32> [#uses=1]253 %tmp70 = getelementptr [5 x i8], ptr @.str46, i32 0, i32 0 ; <ptr> [#uses=1]254 %tmp71 = call i32 (ptr, ...) @printf( ptr %tmp70, i32 %tmp69 ) ; <i32> [#uses=0]255 %tmp72 = load i32, ptr %i ; <i32> [#uses=1]256 %tmp73 = getelementptr [5 x i32], ptr @counter, i32 0, i32 %tmp72 ; <ptr> [#uses=1]257 %tmp74 = load i32, ptr %tmp73 ; <i32> [#uses=1]258 %tmp75 = load i32, ptr %total ; <i32> [#uses=1]259 %tmp76 = add i32 %tmp74, %tmp75 ; <i32> [#uses=1]260 store i32 %tmp76, ptr %total261 %tmp77 = load i32, ptr %i ; <i32> [#uses=1]262 %tmp78 = add i32 %tmp77, 1 ; <i32> [#uses=1]263 store i32 %tmp78, ptr %i264 br label %bb79265 266bb79: ; preds = %bb66, %cond_true267 %tmp80 = load i32, ptr @numi ; <i32> [#uses=1]268 %tmp81 = load i32, ptr %i ; <i32> [#uses=1]269 %tmp82 = icmp slt i32 %tmp81, %tmp80 ; <i1> [#uses=1]270 %tmp8283 = zext i1 %tmp82 to i32 ; <i32> [#uses=1]271 %toBool84 = icmp ne i32 %tmp8283, 0 ; <i1> [#uses=1]272 br i1 %toBool84, label %bb66, label %bb85273 274bb85: ; preds = %bb79275 %tmp86 = getelementptr [12 x i8], ptr @.str47, i32 0, i32 0 ; <ptr> [#uses=1]276 %tmp87 = load i32, ptr %total ; <i32> [#uses=1]277 %tmp88 = call i32 (ptr, ...) @printf( ptr %tmp86, i32 %tmp87 ) ; <i32> [#uses=0]278 br label %cond_next279 280cond_next: ; preds = %bb85, %bb55281 %tmp89 = load i32, ptr @numi ; <i32> [#uses=1]282 %tmp90 = add i32 %tmp89, 1 ; <i32> [#uses=1]283 store i32 %tmp90, ptr @numi284 br label %bb91285 286bb91: ; preds = %cond_next, %entry287 %tmp92 = load i32, ptr @numi ; <i32> [#uses=1]288 %tmp93 = icmp sgt i32 %tmp92, 5 ; <i1> [#uses=1]289 %tmp9394 = zext i1 %tmp93 to i32 ; <i32> [#uses=1]290 %toBool95 = icmp ne i32 %tmp9394, 0 ; <i1> [#uses=1]291 br i1 %toBool95, label %cond_true96, label %cond_next97292 293cond_true96: ; preds = %bb91294 br label %bb102295 296cond_next97: ; preds = %bb91297 %tmp98 = load i32, ptr %num_sol ; <i32> [#uses=1]298 %tmp99 = icmp eq i32 %tmp98, 0 ; <i1> [#uses=1]299 %tmp99100 = zext i1 %tmp99 to i32 ; <i32> [#uses=1]300 %toBool101 = icmp ne i32 %tmp99100, 0 ; <i1> [#uses=1]301 br i1 %toBool101, label %bb, label %bb102302 303bb102: ; preds = %cond_next97, %cond_true96304 store i32 0, ptr %tmp305 %tmp103 = load i32, ptr %tmp ; <i32> [#uses=1]306 store i32 %tmp103, ptr %retval307 br label %return308 309return: ; preds = %bb102310 %retval104 = load i32, ptr %retval ; <i32> [#uses=1]311 ret i32 %retval104312}313 314declare i32 @userfun(i32)315