200 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 @test4(ptr noalias %P) {8; CHECK-LABEL: @test4(9; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 410; 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 415; CHECK-NEXT: br label [[BB3]]16; CHECK: bb3:17; CHECK-NEXT: store i32 1, ptr [[P]], align 418; CHECK-NEXT: ret void19;20 store i32 0, ptr %P21 br i1 true, label %bb1, label %bb222bb1:23 br label %bb324bb2:25 %x = load i32, ptr %P26 br label %bb327bb3:28 store i32 1, ptr %P29 ret void30}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 441; CHECK-NEXT: ret void42;43 br i1 true, label %bb1, label %bb244bb1:45 store i32 1, ptr %P46 br label %bb347bb2:48 store i32 1, ptr %P49 br label %bb350bb3:51 store i32 0, ptr %P52 ret void53}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 462; CHECK-NEXT: br label [[BB3]]63; CHECK: bb3:64; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 465; CHECK-NEXT: ret void66;67 br i1 true, label %bb1, label %bb268bb1:69 store i32 1, ptr %P70 br label %bb371bb2:72 store i32 1, ptr %Q73 br label %bb374bb3:75 store i32 0, ptr %P76 ret void77}78 79define void @test10(ptr noalias %P) {80; CHECK-LABEL: @test10(81; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 482; 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 void89;90 store i32 0, ptr %P91 br i1 true, label %bb1, label %bb292bb1:93 br label %bb394bb2:95 br label %bb396bb3:97 store i8 1, ptr %P98 ret void99}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 4123; CHECK-NEXT: br label [[BB8]]124; CHECK: bb6:125; CHECK-NEXT: store i32 1, ptr [[PTR]], align 4126; CHECK-NEXT: br label [[BB8]]127; CHECK: bb7:128; CHECK-NEXT: store i32 2, ptr [[PTR]], align 4129; 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 %bb1136 137bb1: ; preds = %bb138 br i1 %c2, label %bb2, label %bb3139 140bb2: ; preds = %bb1141 store i32 -1, ptr %Ptr, align 4142 br label %bb3143 144bb3: ; preds = %bb2, %bb1, %bb145 br label %bb4146 147bb4: ; preds = %bb8, %bb3148 switch i32 %v1, label %bb8 [149 i32 0, label %bb5150 i32 1, label %bb6151 i32 2, label %bb7152 ]153 154bb5: ; preds = %bb4155 store i32 0, ptr %Ptr, align 4156 br label %bb8157 158bb6: ; preds = %bb4159 store i32 1, ptr %Ptr, align 4160 br label %bb8161 162bb7: ; preds = %bb4163 store i32 2, ptr %Ptr, align 4164 br label %bb8165 166bb8: ; preds = %bb7, %bb6, %bb5, %bb4167 br label %bb4168}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() #0180; CHECK-NEXT: br label [[EXIT]]181; CHECK: exit:182; CHECK-NEXT: store ptr null, ptr [[PTR_1:%.*]], align 8183; CHECK-NEXT: tail call void @fn2_test11() #0184; CHECK-NEXT: ret void185;186entry:187 br i1 %c, label %if.then, label %exit188 189if.then: ; preds = %entry190 tail call void @fn2_test11() #1191 br label %exit192 193exit:194 store ptr null, ptr %ptr.1, align 8195 tail call void @fn2_test11() #1196 ret void197}198 199attributes #1 = { nounwind }200