311 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=newgvn -S | FileCheck %s3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"4 5;; Function Attrs: nounwind ssp uwtable6;; We should eliminate the sub, and one of the phi nodes7define void @vnum_test1(ptr %data) {8; CHECK-LABEL: @vnum_test1(9; CHECK-NEXT: bb:10; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[DATA:%.*]], i64 311; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP]], align 412; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 413; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 414; CHECK-NEXT: br label [[BB4:%.*]]15; CHECK: bb4:16; CHECK-NEXT: [[M_0:%.*]] = phi i32 [ [[TMP3]], [[BB:%.*]] ], [ [[TMP15:%.*]], [[BB17:%.*]] ]17; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, [[BB]] ], [ [[TMP18:%.*]], [[BB17]] ]18; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[I_0]], [[TMP1]]19; CHECK-NEXT: br i1 [[TMP5]], label [[BB6:%.*]], label [[BB19:%.*]]20; CHECK: bb6:21; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 222; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 423; CHECK-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i6424; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 [[TMP9]]25; CHECK-NEXT: store i32 2, ptr [[TMP10]], align 426; CHECK-NEXT: store i32 0, ptr [[DATA]], align 427; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 128; CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 429; CHECK-NEXT: [[TMP15]] = add nsw i32 [[M_0]], [[TMP14]]30; CHECK-NEXT: br label [[BB17]]31; CHECK: bb17:32; CHECK-NEXT: [[TMP18]] = add nsw i32 [[I_0]], 133; CHECK-NEXT: br label [[BB4]]34; CHECK: bb19:35; CHECK-NEXT: ret void36;37bb:38 %tmp = getelementptr inbounds i32, ptr %data, i64 339 %tmp1 = load i32, ptr %tmp, align 440 %tmp2 = getelementptr inbounds i32, ptr %data, i64 441 %tmp3 = load i32, ptr %tmp2, align 442 br label %bb443 44bb4: ; preds = %bb17, %bb45 %m.0 = phi i32 [ %tmp3, %bb ], [ %tmp15, %bb17 ]46 %i.0 = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]47 %n.0 = phi i32 [ %tmp3, %bb ], [ %tmp16, %bb17 ]48 %tmp5 = icmp slt i32 %i.0, %tmp149 br i1 %tmp5, label %bb6, label %bb1950 51bb6: ; preds = %bb452 %tmp7 = getelementptr inbounds i32, ptr %data, i64 253 %tmp8 = load i32, ptr %tmp7, align 454 %tmp9 = sext i32 %tmp8 to i6455 %tmp10 = getelementptr inbounds i32, ptr %data, i64 %tmp956 store i32 2, ptr %tmp10, align 457 %tmp11 = sub nsw i32 %m.0, %n.058 store i32 %tmp11, ptr %data, align 459 %tmp13 = getelementptr inbounds i32, ptr %data, i64 160 %tmp14 = load i32, ptr %tmp13, align 461 %tmp15 = add nsw i32 %m.0, %tmp1462 %tmp16 = add nsw i32 %n.0, %tmp1463 br label %bb1764 65bb17: ; preds = %bb666 %tmp18 = add nsw i32 %i.0, 167 br label %bb468 69bb19: ; preds = %bb470 ret void71}72 73;; Function Attrs: nounwind ssp uwtable74;; We should eliminate the sub, one of the phi nodes, prove the store of the sub75;; and the load of data are equivalent, that the load always produces constant 0, and76;; delete the load replacing it with constant 0.77define i32 @vnum_test2(ptr %data) {78; CHECK-LABEL: @vnum_test2(79; CHECK-NEXT: bb:80; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[DATA:%.*]], i64 381; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP]], align 482; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 483; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 484; CHECK-NEXT: br label [[BB4:%.*]]85; CHECK: bb4:86; CHECK-NEXT: [[M_0:%.*]] = phi i32 [ [[TMP3]], [[BB:%.*]] ], [ [[TMP15:%.*]], [[BB19:%.*]] ]87; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, [[BB]] ], [ [[TMP20:%.*]], [[BB19]] ]88; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[I_0]], [[TMP1]]89; CHECK-NEXT: br i1 [[TMP5]], label [[BB6:%.*]], label [[BB21:%.*]]90; CHECK: bb6:91; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 292; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 493; CHECK-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i6494; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 [[TMP9]]95; CHECK-NEXT: store i32 2, ptr [[TMP10]], align 496; CHECK-NEXT: store i32 0, ptr [[DATA]], align 497; CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 198; CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 499; CHECK-NEXT: [[TMP15]] = add nsw i32 [[M_0]], [[TMP14]]100; CHECK-NEXT: br label [[BB19]]101; CHECK: bb19:102; CHECK-NEXT: [[TMP20]] = add nsw i32 [[I_0]], 1103; CHECK-NEXT: br label [[BB4]]104; CHECK: bb21:105; CHECK-NEXT: ret i32 0106;107bb:108 %tmp = getelementptr inbounds i32, ptr %data, i64 3109 %tmp1 = load i32, ptr %tmp, align 4110 %tmp2 = getelementptr inbounds i32, ptr %data, i64 4111 %tmp3 = load i32, ptr %tmp2, align 4112 br label %bb4113 114bb4: ; preds = %bb19, %bb115 %m.0 = phi i32 [ %tmp3, %bb ], [ %tmp15, %bb19 ]116 %n.0 = phi i32 [ %tmp3, %bb ], [ %tmp16, %bb19 ]117 %i.0 = phi i32 [ 0, %bb ], [ %tmp20, %bb19 ]118 %p.0 = phi i32 [ undef, %bb ], [ %tmp18, %bb19 ]119 %tmp5 = icmp slt i32 %i.0, %tmp1120 br i1 %tmp5, label %bb6, label %bb21121 122bb6: ; preds = %bb4123 %tmp7 = getelementptr inbounds i32, ptr %data, i64 2124 %tmp8 = load i32, ptr %tmp7, align 4125 %tmp9 = sext i32 %tmp8 to i64126 %tmp10 = getelementptr inbounds i32, ptr %data, i64 %tmp9127 store i32 2, ptr %tmp10, align 4128 %tmp11 = sub nsw i32 %m.0, %n.0129 store i32 %tmp11, ptr %data, align 4130 %tmp13 = getelementptr inbounds i32, ptr %data, i64 1131 %tmp14 = load i32, ptr %tmp13, align 4132 %tmp15 = add nsw i32 %m.0, %tmp14133 %tmp16 = add nsw i32 %n.0, %tmp14134 %tmp18 = load i32, ptr %data, align 4135 br label %bb19136 137bb19: ; preds = %bb6138 %tmp20 = add nsw i32 %i.0, 1139 br label %bb4140 141bb21: ; preds = %bb4142 ret i32 %p.0143}144 145; Function Attrs: nounwind ssp uwtable146;; Same as test 2, with a conditional store of m-n, so it has to also discover147;; that data ends up with the same value no matter what branch is taken.148define i32 @vnum_test3(ptr %data) {149; CHECK-LABEL: @vnum_test3(150; CHECK-NEXT: bb:151; CHECK-NEXT: [[TMP:%.*]] = getelementptr inbounds i32, ptr [[DATA:%.*]], i64 3152; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP]], align 4153; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 4154; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4155; CHECK-NEXT: br label [[BB4:%.*]]156; CHECK: bb4:157; CHECK-NEXT: [[N_0:%.*]] = phi i32 [ [[TMP3]], [[BB:%.*]] ], [ [[TMP19:%.*]], [[BB21:%.*]] ]158; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, [[BB]] ], [ [[TMP22:%.*]], [[BB21]] ]159; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[I_0]], [[TMP1]]160; CHECK-NEXT: br i1 [[TMP5]], label [[BB6:%.*]], label [[BB23:%.*]]161; CHECK: bb6:162; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 2163; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 5164; CHECK-NEXT: store i32 0, ptr [[TMP9]], align 4165; CHECK-NEXT: [[TMP10:%.*]] = icmp slt i32 [[I_0]], 30166; CHECK-NEXT: br i1 [[TMP10]], label [[BB11:%.*]], label [[BB14:%.*]]167; CHECK: bb11:168; CHECK-NEXT: br label [[BB14]]169; CHECK: bb14:170; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i32, ptr [[DATA]], i64 1171; CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4172; CHECK-NEXT: [[TMP19]] = add nsw i32 [[N_0]], [[TMP18]]173; CHECK-NEXT: br label [[BB21]]174; CHECK: bb21:175; CHECK-NEXT: [[TMP22]] = add nsw i32 [[I_0]], 1176; CHECK-NEXT: br label [[BB4]]177; CHECK: bb23:178; CHECK-NEXT: ret i32 0179;180bb:181 %tmp = getelementptr inbounds i32, ptr %data, i64 3182 %tmp1 = load i32, ptr %tmp, align 4183 %tmp2 = getelementptr inbounds i32, ptr %data, i64 4184 %tmp3 = load i32, ptr %tmp2, align 4185 br label %bb4186 187bb4: ; preds = %bb21, %bb188 %n.0 = phi i32 [ %tmp3, %bb ], [ %tmp20, %bb21 ]189 %m.0 = phi i32 [ %tmp3, %bb ], [ %tmp19, %bb21 ]190 %p.0 = phi i32 [ 0, %bb ], [ %tmp16, %bb21 ]191 %i.0 = phi i32 [ 0, %bb ], [ %tmp22, %bb21 ]192 %tmp5 = icmp slt i32 %i.0, %tmp1193 br i1 %tmp5, label %bb6, label %bb23194 195bb6: ; preds = %bb4196 %tmp7 = getelementptr inbounds i32, ptr %data, i64 2197 %tmp8 = load i32, ptr %tmp7, align 4198 %tmp9 = getelementptr inbounds i32, ptr %data, i64 5199 store i32 0, ptr %tmp9, align 4200 %tmp10 = icmp slt i32 %i.0, 30201 br i1 %tmp10, label %bb11, label %bb14202 203bb11: ; preds = %bb6204 %tmp12 = sub nsw i32 %m.0, %n.0205 %tmp13 = getelementptr inbounds i32, ptr %data, i64 5206 store i32 %tmp12, ptr %tmp13, align 4207 br label %bb14208 209bb14: ; preds = %bb11, %bb6210 %tmp15 = getelementptr inbounds i32, ptr %data, i64 5211 %tmp16 = load i32, ptr %tmp15, align 4212 %tmp17 = getelementptr inbounds i32, ptr %data, i64 1213 %tmp18 = load i32, ptr %tmp17, align 4214 %tmp19 = add nsw i32 %m.0, %tmp18215 %tmp20 = add nsw i32 %n.0, %tmp18216 br label %bb21217 218bb21: ; preds = %bb14219 %tmp22 = add nsw i32 %i.0, 1220 br label %bb4221 222bb23: ; preds = %bb4223 ret i32 %p.0224}225 226;; This is an irreducible test case that will cause a memoryphi node loop227;; in the two blocks.228;; It's equivalent to something like229;; *a = 0230;; if (<....>) goto loopmiddle231;; loopstart:232;; loopmiddle:233;; load *a234;; *a = 0235;; if (<....>) goto loopstart otherwise goto loopend236;; loopend:237;; load *a238;; add the results of the loads239;; return them240;;241;; Both loads should equal 0, but it requires being242;; completely optimistic about MemoryPhis, otherwise243;; we will not be able to see through the cycle.244define i8 @irreducible_memoryphi(ptr noalias %arg, ptr noalias %arg2, i1 %arg3) {245; CHECK-LABEL: @irreducible_memoryphi(246; CHECK-NEXT: bb:247; CHECK-NEXT: store i8 0, ptr [[ARG:%.*]], align 1248; CHECK-NEXT: br i1 [[ARG3:%.*]], label [[BB2:%.*]], label [[BB1:%.*]]249; CHECK: bb1:250; CHECK-NEXT: br label [[BB2]]251; CHECK: bb2:252; CHECK-NEXT: br i1 [[ARG3]], label [[BB1]], label [[BB3:%.*]]253; CHECK: bb3:254; CHECK-NEXT: ret i8 0255;256bb:257 store i8 0, ptr %arg258 br i1 %arg3, label %bb2, label %bb1259 260bb1: ; preds = %bb2, %bb261 br label %bb2262 263bb2: ; preds = %bb1, %bb264 %tmp2 = load i8, ptr %arg265 store i8 0, ptr %arg266 br i1 %arg3, label %bb1, label %bb3267 268bb3: ; preds = %bb2269 %tmp = load i8, ptr %arg270 %tmp3 = add i8 %tmp, %tmp2271 ret i8 %tmp3272}273;; This is an irreducible test case that will cause a phi node loop274;; in the two blocks275;;276;; It should return 0, but it requires being277;; completely optimistic about phis, otherwise278;; we will not be able to see through the cycle.279define i32 @irreducible_phi(i32 %arg, i1 %arg2) {280; CHECK-LABEL: @irreducible_phi(281; CHECK-NEXT: bb:282; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB2:%.*]], label [[BB1:%.*]]283; CHECK: bb1:284; CHECK-NEXT: br label [[BB2]]285; CHECK: bb2:286; CHECK-NEXT: br i1 [[ARG2]], label [[BB1]], label [[BB3:%.*]]287; CHECK: bb3:288; CHECK-NEXT: ret i32 0289;290bb:291 %tmp = add i32 0, %arg292 br i1 %arg2, label %bb2, label %bb1293 294bb1: ; preds = %bb2, %bb295 %phi1 = phi i32 [%tmp, %bb], [%phi2, %bb2]296 br label %bb2297 298bb2: ; preds = %bb1, %bb299 %phi2 = phi i32 [%tmp, %bb], [%phi1, %bb1]300 br i1 %arg2, label %bb1, label %bb3301 302bb3: ; preds = %bb2303 ; This should be zero304 %tmp3 = sub i32 %tmp, %phi2305 ret i32 %tmp3306}307 308!llvm.ident = !{!0, !0, !0}309 310!0 = !{!"Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)"}311