1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -basic-aa -dse -S | FileCheck %s 3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 5 6 7define void @test2(i32* 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, i32* [[P:%.*]], align 4 16; CHECK-NEXT: ret void 17; 18 store i32 1, i32* %P 19 br i1 true, label %bb1, label %bb2 20bb1: 21 br label %bb3 22bb2: 23 br label %bb3 24bb3: 25 store i32 0, i32* %P 26 ret void 27} 28 29define void @test3(i32* noalias %P) { 30; CHECK-LABEL: @test3( 31; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 32; 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 0, i32* [[P]], align 4 37; CHECK-NEXT: br label [[BB3]] 38; CHECK: bb3: 39; CHECK-NEXT: ret void 40; 41 store i32 0, i32* %P 42 br i1 true, label %bb1, label %bb2 43bb1: 44 br label %bb3 45bb2: 46 store i32 0, i32* %P 47 br label %bb3 48bb3: 49 ret void 50} 51 52 53define void @test7(i32* noalias %P, i32* 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, i32* [[P:%.*]], align 4 58; CHECK-NEXT: br label [[BB3:%.*]] 59; CHECK: bb2: 60; CHECK-NEXT: br label [[BB3]] 61; CHECK: bb3: 62; CHECK-NEXT: store i32 0, i32* [[Q:%.*]], align 4 63; CHECK-NEXT: store i32 0, i32* [[P]], align 4 64; CHECK-NEXT: ret void 65; 66 store i32 1, i32* %Q 67 br i1 true, label %bb1, label %bb2 68bb1: 69 load i32, i32* %P 70 br label %bb3 71bb2: 72 br label %bb3 73bb3: 74 store i32 0, i32* %Q 75 store i32 0, i32* %P 76 ret void 77} 78 79define i32 @test22(i32* %P, i32* noalias %Q, i32* %R) { 80; CHECK-LABEL: @test22( 81; CHECK-NEXT: store i32 2, i32* [[P:%.*]], align 4 82; CHECK-NEXT: store i32 3, i32* [[Q:%.*]], align 4 83; CHECK-NEXT: [[L:%.*]] = load i32, i32* [[R:%.*]], align 4 84; CHECK-NEXT: ret i32 [[L]] 85; 86 store i32 1, i32* %Q 87 store i32 2, i32* %P 88 store i32 3, i32* %Q 89 %l = load i32, i32* %R 90 ret i32 %l 91} 92 93define void @test9(i32* noalias %P) { 94; CHECK-LABEL: @test9( 95; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 96; 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 void 101; CHECK: bb3: 102; CHECK-NEXT: store i32 0, i32* [[P]], align 4 103; CHECK-NEXT: ret void 104; 105 store i32 0, i32* %P 106 br i1 true, label %bb1, label %bb2 107bb1: 108 br label %bb3 109bb2: 110 ret void 111bb3: 112 store i32 0, i32* %P 113 ret void 114} 115 116; We cannot eliminate `store i32 0, i32* %P`, as it is read by the later load. 117; Make sure that we check the uses of `store i32 1, i32* %P.1 which does not 118; alias %P. Note that uses point to the *first* def that may alias. 119define void @overlapping_read(i32* %P) { 120; CHECK-LABEL: @overlapping_read( 121; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 122; CHECK-NEXT: [[P_1:%.*]] = getelementptr i32, i32* [[P]], i32 1 123; CHECK-NEXT: store i32 1, i32* [[P_1]], align 4 124; CHECK-NEXT: [[P_64:%.*]] = bitcast i32* [[P]] to i64* 125; CHECK-NEXT: [[LV:%.*]] = load i64, i64* [[P_64]], align 8 126; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 127; CHECK: bb1: 128; CHECK-NEXT: br label [[BB3:%.*]] 129; CHECK: bb2: 130; CHECK-NEXT: br label [[BB3]] 131; CHECK: bb3: 132; CHECK-NEXT: store i32 2, i32* [[P]], align 4 133; CHECK-NEXT: ret void 134; 135 store i32 0, i32* %P 136 %P.1 = getelementptr i32, i32* %P, i32 1 137 store i32 1, i32* %P.1 138 139 %P.64 = bitcast i32* %P to i64* 140 %lv = load i64, i64* %P.64 141 br i1 true, label %bb1, label %bb2 142bb1: 143 br label %bb3 144bb2: 145 br label %bb3 146bb3: 147 store i32 2, i32* %P 148 ret void 149} 150 151define void @test10(i32* %P) { 152; CHECK-LABEL: @test10( 153; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 154; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 155; CHECK: bb1: 156; CHECK-NEXT: store i32 0, i32* [[P]], align 4 157; CHECK-NEXT: br label [[BB3:%.*]] 158; CHECK: bb2: 159; CHECK-NEXT: ret void 160; CHECK: bb3: 161; CHECK-NEXT: ret void 162; 163 store i32 0, i32* %P 164 br i1 true, label %bb1, label %bb2 165bb1: 166 store i32 0, i32* %P 167 br label %bb3 168bb2: 169 ret void 170bb3: 171 ret void 172} 173 174 175define void @test11() { 176; CHECK-LABEL: @test11( 177; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 178; CHECK: bb1: 179; CHECK-NEXT: br label [[BB3:%.*]] 180; CHECK: bb2: 181; CHECK-NEXT: ret void 182; CHECK: bb3: 183; CHECK-NEXT: ret void 184; 185 %P = alloca i32 186 store i32 0, i32* %P 187 br i1 true, label %bb1, label %bb2 188bb1: 189 store i32 0, i32* %P 190 br label %bb3 191bb2: 192 ret void 193bb3: 194 ret void 195} 196 197 198define void @test12(i32* %P) { 199; CHECK-LABEL: @test12( 200; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 201; CHECK: bb1: 202; CHECK-NEXT: store i32 1, i32* [[P:%.*]], align 4 203; CHECK-NEXT: br label [[BB3:%.*]] 204; CHECK: bb2: 205; CHECK-NEXT: store i32 1, i32* [[P]], align 4 206; CHECK-NEXT: ret void 207; CHECK: bb3: 208; CHECK-NEXT: ret void 209; 210 store i32 0, i32* %P 211 br i1 true, label %bb1, label %bb2 212bb1: 213 store i32 1, i32* %P 214 br label %bb3 215bb2: 216 store i32 1, i32* %P 217 ret void 218bb3: 219 ret void 220} 221 222 223define void @test13(i32* %P) { 224; CHECK-LABEL: @test13( 225; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 226; CHECK: bb1: 227; CHECK-NEXT: store i32 1, i32* [[P:%.*]], align 4 228; CHECK-NEXT: br label [[BB3:%.*]] 229; CHECK: bb2: 230; CHECK-NEXT: store i32 1, i32* [[P]], align 4 231; CHECK-NEXT: br label [[BB3]] 232; CHECK: bb3: 233; CHECK-NEXT: ret void 234; 235 store i32 0, i32* %P 236 br i1 true, label %bb1, label %bb2 237bb1: 238 store i32 1, i32* %P 239 br label %bb3 240bb2: 241 store i32 1, i32* %P 242 br label %bb3 243bb3: 244 ret void 245} 246