196 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=dse -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6; Make sure we do not crash when we encounter unreachable blocks while checking7; if all paths to DomAccess go through a killing block.8define void @test(ptr %ptr, i1 %c.1, i1 %c.2, i1 %c.3) {9; CHECK-LABEL: @test(10; CHECK-NEXT: bb:11; CHECK-NEXT: br i1 [[C_1:%.*]], label [[BB27:%.*]], label [[BB53:%.*]]12; CHECK: bb10:13; CHECK-NEXT: br label [[BB43:%.*]]14; CHECK: bb22:15; CHECK-NEXT: br i1 [[C_2:%.*]], label [[BB22:%.*]], label [[BB53]]16; CHECK: bb27:17; CHECK-NEXT: br i1 [[C_3:%.*]], label [[BB38:%.*]], label [[BB39:%.*]]18; CHECK: bb38:19; CHECK-NEXT: store float 0.000000e+00, ptr [[PTR:%.*]], align 420; CHECK-NEXT: br label [[BB38]]21; CHECK: bb39:22; CHECK-NEXT: br i1 [[C_2]], label [[BB43]], label [[BB38]]23; CHECK: bb43:24; CHECK-NEXT: store float 0.000000e+00, ptr [[PTR]], align 425; CHECK-NEXT: br label [[BB50:%.*]]26; CHECK: bb50:27; CHECK-NEXT: br i1 [[C_3]], label [[BB27]], label [[BB53]]28; CHECK: bb53:29; CHECK-NEXT: br label [[BB53]]30;31bb:32 br i1 %c.1, label %bb27, label %bb5333 34bb10: ; No predecessors!35 br label %bb4336 37bb22: ; preds = %bb2238 br i1 %c.2, label %bb22, label %bb5339 40bb27: ; preds = %bb50, %bb41 br i1 %c.3, label %bb38, label %bb3942 43bb38: ; preds = %bb39, %bb38, %bb2744 store float 0.000000e+00, ptr %ptr, align 445 br label %bb3846 47bb39: ; preds = %bb2748 br i1 %c.2, label %bb43, label %bb3849 50bb43: ; preds = %bb39, %bb1051 store float 0.000000e+00, ptr %ptr, align 452 br label %bb5053 54bb50: ; preds = %bb4355 br i1 %c.3, label %bb27, label %bb5356 57bb53: ; preds = %bb53, %bb50, %bb22, %bb58 br label %bb5359}60 61declare void @exit()62 63define void @unreachable_exit_with_no_call(ptr noalias %ptr, i1 %c.1) {64; CHECK-LABEL: @unreachable_exit_with_no_call(65; CHECK-NEXT: entry:66; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]67; CHECK: if.then:68; CHECK-NEXT: unreachable69; CHECK: if.end:70; CHECK-NEXT: store i64 0, ptr [[PTR:%.*]], align 871; CHECK-NEXT: ret void72;73entry:74 store i64 1, ptr %ptr, align 875 br i1 %c.1, label %if.then, label %if.end76 77if.then:78 unreachable79 80if.end:81 store i64 0, ptr %ptr, align 882 ret void83}84 85; Test for PR53800.86define void @unreachable_exit_with_nounwind_call_pr53800(ptr noalias %ptr, i1 %c.1) {87; CHECK-LABEL: @unreachable_exit_with_nounwind_call_pr53800(88; CHECK-NEXT: entry:89; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]90; CHECK: if.then:91; CHECK-NEXT: tail call void @exit() #[[ATTR0:[0-9]+]]92; CHECK-NEXT: unreachable93; CHECK: if.end:94; CHECK-NEXT: store i64 0, ptr [[PTR:%.*]], align 895; CHECK-NEXT: ret void96;97entry:98 store i64 1, ptr %ptr, align 899 br i1 %c.1, label %if.then, label %if.end100 101if.then:102 tail call void @exit() nounwind103 unreachable104 105if.end:106 store i64 0, ptr %ptr, align 8107 ret void108}109 110; The call @exit may read %ptr as it is not marked as noalias111define void @unreachable_exit_and_call_may_read(ptr %ptr, i1 %c.1) {112; CHECK-LABEL: @unreachable_exit_and_call_may_read(113; CHECK-NEXT: entry:114; CHECK-NEXT: store i64 1, ptr [[PTR:%.*]], align 8115; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]116; CHECK: if.then:117; CHECK-NEXT: tail call void @exit() #[[ATTR0]]118; CHECK-NEXT: unreachable119; CHECK: if.end:120; CHECK-NEXT: store i64 0, ptr [[PTR]], align 8121; CHECK-NEXT: ret void122;123entry:124 store i64 1, ptr %ptr, align 8125 br i1 %c.1, label %if.then, label %if.end126 127if.then:128 tail call void @exit() nounwind129 unreachable130 131if.end:132 store i64 0, ptr %ptr, align 8133 ret void134}135 136define void @unreachable_exit_with_may_unwind_call(ptr noalias %ptr, i1 %c.1) {137; CHECK-LABEL: @unreachable_exit_with_may_unwind_call(138; CHECK-NEXT: entry:139; CHECK-NEXT: store i64 1, ptr [[PTR:%.*]], align 8140; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]141; CHECK: if.then:142; CHECK-NEXT: tail call void @exit()143; CHECK-NEXT: unreachable144; CHECK: if.end:145; CHECK-NEXT: store i64 0, ptr [[PTR]], align 8146; CHECK-NEXT: ret void147;148entry:149 store i64 1, ptr %ptr, align 8150 br i1 %c.1, label %if.then, label %if.end151 152if.then:153 tail call void @exit()154 unreachable155 156if.end:157 store i64 0, ptr %ptr, align 8158 ret void159}160 161; Cannot remove the store in entry, because it is not dead on the path to e.1162define void @unreachable_exit_but_another_exit(ptr noalias %ptr, i1 %c.1, i32 %s, i1 %c.2) {163; CHECK-LABEL: @unreachable_exit_but_another_exit(164; CHECK-NEXT: entry:165; CHECK-NEXT: store i64 1, ptr [[PTR:%.*]], align 8166; CHECK-NEXT: br i1 [[C_1:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]167; CHECK: if.then:168; CHECK-NEXT: br i1 [[C_2:%.*]], label [[E_0:%.*]], label [[E_1:%.*]]169; CHECK: e.0:170; CHECK-NEXT: tail call void @exit() #[[ATTR0]]171; CHECK-NEXT: unreachable172; CHECK: e.1:173; CHECK-NEXT: ret void174; CHECK: if.end:175; CHECK-NEXT: store i64 0, ptr [[PTR]], align 8176; CHECK-NEXT: ret void177;178entry:179 store i64 1, ptr %ptr, align 8180 br i1 %c.1, label %if.then, label %if.end181 182if.then:183 br i1 %c.2, label %e.0, label %e.1184 185e.0:186 tail call void @exit() nounwind187 unreachable188 189e.1:190 ret void191 192if.end:193 store i64 0, ptr %ptr, align 8194 ret void195}196