brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.0 KiB · 12b4184 Raw
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