1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=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 @test4(ptr noalias %P) { 8; CHECK-LABEL: @test4( 9; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 10; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 11; CHECK: bb1: 12; CHECK-NEXT: br label [[BB3:%.*]] 13; CHECK: bb2: 14; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P]], align 4 15; CHECK-NEXT: br label [[BB3]] 16; CHECK: bb3: 17; CHECK-NEXT: store i32 1, ptr [[P]], align 4 18; CHECK-NEXT: ret void 19; 20 store i32 0, ptr %P 21 br i1 true, label %bb1, label %bb2 22bb1: 23 br label %bb3 24bb2: 25 %x = load i32, ptr %P 26 br label %bb3 27bb3: 28 store i32 1, ptr %P 29 ret void 30} 31 32define void @test5(ptr noalias %P) { 33; CHECK-LABEL: @test5( 34; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 35; CHECK: bb1: 36; CHECK-NEXT: br label [[BB3:%.*]] 37; CHECK: bb2: 38; CHECK-NEXT: br label [[BB3]] 39; CHECK: bb3: 40; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 41; CHECK-NEXT: ret void 42; 43 br i1 true, label %bb1, label %bb2 44bb1: 45 store i32 1, ptr %P 46 br label %bb3 47bb2: 48 store i32 1, ptr %P 49 br label %bb3 50bb3: 51 store i32 0, ptr %P 52 ret void 53} 54 55define void @test8(ptr %P, ptr %Q) { 56; CHECK-LABEL: @test8( 57; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 58; CHECK: bb1: 59; CHECK-NEXT: br label [[BB3:%.*]] 60; CHECK: bb2: 61; CHECK-NEXT: store i32 1, ptr [[Q:%.*]], align 4 62; CHECK-NEXT: br label [[BB3]] 63; CHECK: bb3: 64; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 65; CHECK-NEXT: ret void 66; 67 br i1 true, label %bb1, label %bb2 68bb1: 69 store i32 1, ptr %P 70 br label %bb3 71bb2: 72 store i32 1, ptr %Q 73 br label %bb3 74bb3: 75 store i32 0, ptr %P 76 ret void 77} 78 79define void @test10(ptr noalias %P) { 80; CHECK-LABEL: @test10( 81; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4 82; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]] 83; CHECK: bb1: 84; CHECK-NEXT: br label [[BB3:%.*]] 85; CHECK: bb2: 86; CHECK-NEXT: br label [[BB3]] 87; CHECK: bb3: 88; CHECK-NEXT: ret void 89; 90 store i32 0, ptr %P 91 br i1 true, label %bb1, label %bb2 92bb1: 93 br label %bb3 94bb2: 95 br label %bb3 96bb3: 97 store i8 1, ptr %P 98 ret void 99} 100 101declare void @hoge() 102 103; Check a function with a MemoryPhi with 3 incoming values. 104define void @widget(ptr %Ptr, i1 %c1, i1 %c2, i32 %v1, i32 %v2, i32 %v3) { 105; CHECK-LABEL: @widget( 106; CHECK-NEXT: bb: 107; CHECK-NEXT: tail call void @hoge() 108; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB3:%.*]], label [[BB1:%.*]] 109; CHECK: bb1: 110; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB2:%.*]], label [[BB3]] 111; CHECK: bb2: 112; CHECK-NEXT: br label [[BB3]] 113; CHECK: bb3: 114; CHECK-NEXT: br label [[BB4:%.*]] 115; CHECK: bb4: 116; CHECK-NEXT: switch i32 [[V1:%.*]], label [[BB8:%.*]] [ 117; CHECK-NEXT: i32 0, label [[BB5:%.*]] 118; CHECK-NEXT: i32 1, label [[BB6:%.*]] 119; CHECK-NEXT: i32 2, label [[BB7:%.*]] 120; CHECK-NEXT: ] 121; CHECK: bb5: 122; CHECK-NEXT: store i32 0, ptr [[PTR:%.*]], align 4 123; CHECK-NEXT: br label [[BB8]] 124; CHECK: bb6: 125; CHECK-NEXT: store i32 1, ptr [[PTR]], align 4 126; CHECK-NEXT: br label [[BB8]] 127; CHECK: bb7: 128; CHECK-NEXT: store i32 2, ptr [[PTR]], align 4 129; CHECK-NEXT: br label [[BB8]] 130; CHECK: bb8: 131; CHECK-NEXT: br label [[BB4]] 132; 133bb: 134 tail call void @hoge() 135 br i1 %c1, label %bb3, label %bb1 136 137bb1: ; preds = %bb 138 br i1 %c2, label %bb2, label %bb3 139 140bb2: ; preds = %bb1 141 store i32 -1, ptr %Ptr, align 4 142 br label %bb3 143 144bb3: ; preds = %bb2, %bb1, %bb 145 br label %bb4 146 147bb4: ; preds = %bb8, %bb3 148 switch i32 %v1, label %bb8 [ 149 i32 0, label %bb5 150 i32 1, label %bb6 151 i32 2, label %bb7 152 ] 153 154bb5: ; preds = %bb4 155 store i32 0, ptr %Ptr, align 4 156 br label %bb8 157 158bb6: ; preds = %bb4 159 store i32 1, ptr %Ptr, align 4 160 br label %bb8 161 162bb7: ; preds = %bb4 163 store i32 2, ptr %Ptr, align 4 164 br label %bb8 165 166bb8: ; preds = %bb7, %bb6, %bb5, %bb4 167 br label %bb4 168} 169 170 171declare void @fn1_test11() 172declare void @fn2_test11() 173 174define void @test11(i1 %c, ptr %ptr.1) { 175; CHECK-LABEL: @test11( 176; CHECK-NEXT: entry: 177; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]] 178; CHECK: if.then: 179; CHECK-NEXT: tail call void @fn2_test11() #0 180; CHECK-NEXT: br label [[EXIT]] 181; CHECK: exit: 182; CHECK-NEXT: store ptr null, ptr [[PTR_1:%.*]], align 8 183; CHECK-NEXT: tail call void @fn2_test11() #0 184; CHECK-NEXT: ret void 185; 186entry: 187 br i1 %c, label %if.then, label %exit 188 189if.then: ; preds = %entry 190 tail call void @fn2_test11() #1 191 br label %exit 192 193exit: 194 store ptr null, ptr %ptr.1, align 8 195 tail call void @fn2_test11() #1 196 ret void 197} 198 199attributes #1 = { nounwind } 200