brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.7 KiB · de311fb Raw
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