244 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=dse -S | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"5 6 7define void @test2(ptr noalias %P) {8; CHECK-LABEL: @test2(9; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]10; CHECK: bb1:11; CHECK-NEXT: br label [[BB3:%.*]]12; CHECK: bb2:13; CHECK-NEXT: br label [[BB3]]14; CHECK: bb3:15; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 416; CHECK-NEXT: ret void17;18 store i32 1, ptr %P19 br i1 true, label %bb1, label %bb220bb1:21 br label %bb322bb2:23 br label %bb324bb3:25 store i32 0, ptr %P26 ret void27}28 29define void @test3(ptr noalias %P) {30; CHECK-LABEL: @test3(31; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 432; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]33; CHECK: bb1:34; CHECK-NEXT: br label [[BB3:%.*]]35; CHECK: bb2:36; CHECK-NEXT: store i32 1, ptr [[P]], align 437; CHECK-NEXT: br label [[BB3]]38; CHECK: bb3:39; CHECK-NEXT: ret void40;41 store i32 0, ptr %P42 br i1 true, label %bb1, label %bb243bb1:44 br label %bb345bb2:46 store i32 1, ptr %P47 br label %bb348bb3:49 ret void50}51 52 53define void @test7(ptr noalias %P, ptr noalias %Q) {54; CHECK-LABEL: @test7(55; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]56; CHECK: bb1:57; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[P:%.*]], align 458; CHECK-NEXT: br label [[BB3:%.*]]59; CHECK: bb2:60; CHECK-NEXT: br label [[BB3]]61; CHECK: bb3:62; CHECK-NEXT: store i32 0, ptr [[Q:%.*]], align 463; CHECK-NEXT: store i32 0, ptr [[P]], align 464; CHECK-NEXT: ret void65;66 store i32 1, ptr %Q67 br i1 true, label %bb1, label %bb268bb1:69 load i32, ptr %P70 br label %bb371bb2:72 br label %bb373bb3:74 store i32 0, ptr %Q75 store i32 0, ptr %P76 ret void77}78 79define i32 @test22(ptr %P, ptr noalias %Q, ptr %R) {80; CHECK-LABEL: @test22(81; CHECK-NEXT: store i32 2, ptr [[P:%.*]], align 482; CHECK-NEXT: store i32 3, ptr [[Q:%.*]], align 483; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[R:%.*]], align 484; CHECK-NEXT: ret i32 [[L]]85;86 store i32 1, ptr %Q87 store i32 2, ptr %P88 store i32 3, ptr %Q89 %l = load i32, ptr %R90 ret i32 %l91}92 93define void @test9(ptr noalias %P) {94; CHECK-LABEL: @test9(95; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 496; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]97; CHECK: bb1:98; CHECK-NEXT: br label [[BB3:%.*]]99; CHECK: bb2:100; CHECK-NEXT: ret void101; CHECK: bb3:102; CHECK-NEXT: store i32 1, ptr [[P]], align 4103; CHECK-NEXT: ret void104;105 store i32 0, ptr %P106 br i1 true, label %bb1, label %bb2107bb1:108 br label %bb3109bb2:110 ret void111bb3:112 store i32 1, ptr %P113 ret void114}115 116; We cannot eliminate `store i32 0, ptr %P`, as it is read by the later load.117; Make sure that we check the uses of `store i32 1, ptr %P.1 which does not118; alias %P. Note that uses point to the *first* def that may alias.119define void @overlapping_read(ptr %P) {120; CHECK-LABEL: @overlapping_read(121; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4122; CHECK-NEXT: [[P_1:%.*]] = getelementptr i32, ptr [[P]], i32 1123; CHECK-NEXT: store i32 1, ptr [[P_1]], align 4124; CHECK-NEXT: [[LV:%.*]] = load i64, ptr [[P]], align 8125; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]126; CHECK: bb1:127; CHECK-NEXT: br label [[BB3:%.*]]128; CHECK: bb2:129; CHECK-NEXT: br label [[BB3]]130; CHECK: bb3:131; CHECK-NEXT: store i32 2, ptr [[P]], align 4132; CHECK-NEXT: ret void133;134 store i32 0, ptr %P135 %P.1 = getelementptr i32, ptr %P, i32 1136 store i32 1, ptr %P.1137 138 %lv = load i64, ptr %P139 br i1 true, label %bb1, label %bb2140bb1:141 br label %bb3142bb2:143 br label %bb3144bb3:145 store i32 2, ptr %P146 ret void147}148 149define void @test10(ptr %P) {150; CHECK-LABEL: @test10(151; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4152; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]153; CHECK: bb1:154; CHECK-NEXT: store i32 1, ptr [[P]], align 4155; CHECK-NEXT: br label [[BB3:%.*]]156; CHECK: bb2:157; CHECK-NEXT: ret void158; CHECK: bb3:159; CHECK-NEXT: ret void160;161 store i32 0, ptr %P162 br i1 true, label %bb1, label %bb2163bb1:164 store i32 1, ptr %P165 br label %bb3166bb2:167 ret void168bb3:169 ret void170}171 172 173define void @test11() {174; CHECK-LABEL: @test11(175; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]176; CHECK: bb1:177; CHECK-NEXT: br label [[BB3:%.*]]178; CHECK: bb2:179; CHECK-NEXT: ret void180; CHECK: bb3:181; CHECK-NEXT: ret void182;183 %P = alloca i32184 store i32 0, ptr %P185 br i1 true, label %bb1, label %bb2186bb1:187 store i32 0, ptr %P188 br label %bb3189bb2:190 ret void191bb3:192 ret void193}194 195 196define void @test12(ptr %P) {197; CHECK-LABEL: @test12(198; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]199; CHECK: bb1:200; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4201; CHECK-NEXT: br label [[BB3:%.*]]202; CHECK: bb2:203; CHECK-NEXT: store i32 1, ptr [[P]], align 4204; CHECK-NEXT: ret void205; CHECK: bb3:206; CHECK-NEXT: ret void207;208 store i32 0, ptr %P209 br i1 true, label %bb1, label %bb2210bb1:211 store i32 1, ptr %P212 br label %bb3213bb2:214 store i32 1, ptr %P215 ret void216bb3:217 ret void218}219 220 221define void @test13(ptr %P) {222; CHECK-LABEL: @test13(223; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]224; CHECK: bb1:225; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4226; CHECK-NEXT: br label [[BB3:%.*]]227; CHECK: bb2:228; CHECK-NEXT: store i32 1, ptr [[P]], align 4229; CHECK-NEXT: br label [[BB3]]230; CHECK: bb3:231; CHECK-NEXT: ret void232;233 store i32 0, ptr %P234 br i1 true, label %bb1, label %bb2235bb1:236 store i32 1, ptr %P237 br label %bb3238bb2:239 store i32 1, ptr %P240 br label %bb3241bb3:242 ret void243}244