1; RUN: opt < %s -simplifycfg -S | FileCheck %s 2 3define void @test1(i1 %C, i1* %BP) { 4; CHECK-LABEL: @test1( 5; CHECK: entry: 6; CHECK-NEXT: ret void 7entry: 8 br i1 %C, label %T, label %F 9T: 10 store i1 %C, i1* %BP 11 unreachable 12F: 13 ret void 14} 15 16define void @test2() { 17; CHECK-LABEL: @test2( 18; CHECK: entry: 19; CHECK-NEXT: call void @test2() 20; CHECK-NEXT: ret void 21entry: 22 invoke void @test2( ) 23 to label %N unwind label %U 24U: 25 unreachable 26N: 27 ret void 28} 29 30define i32 @test3(i32 %v) { 31; CHECK-LABEL: @test3( 32; CHECK: entry: 33; CHECK-NEXT: [[CMP:%[A-Za-z0-9]+]] = icmp eq i32 %v, 2 34; CHECK-NEXT: select i1 [[CMP]], i32 2, i32 1 35; CHECK-NEXT: ret 36entry: 37 switch i32 %v, label %default [ 38 i32 1, label %U 39 i32 2, label %T 40 ] 41default: 42 ret i32 1 43U: 44 unreachable 45T: 46 ret i32 2 47} 48 49; PR9450 50define i32 @test4(i32 %v, i32 %w) { 51; CHECK: entry: 52; CHECK-NEXT: switch i32 %v, label %T [ 53; CHECK-NEXT: i32 3, label %V 54; CHECK-NEXT: i32 2, label %U 55; CHECK-NEXT: ] 56 57entry: 58 br label %SWITCH 59V: 60 ret i32 7 61SWITCH: 62 switch i32 %v, label %default [ 63 i32 1, label %T 64 i32 2, label %U 65 i32 3, label %V 66 ] 67default: 68 unreachable 69U: 70 ret i32 %w 71T: 72 ret i32 2 73} 74 75 76;; We can either convert the following control-flow to a select or remove the 77;; unreachable control flow because of the undef store of null. Make sure we do 78;; the latter. 79 80define void @test5(i1 %cond, i8* %ptr) { 81 82; CHECK-LABEL: test5 83; CHECK: entry: 84; CHECK-NOT: select 85; CHECK: store i8 2, i8* %ptr 86; CHECK: ret 87 88entry: 89 br i1 %cond, label %bb1, label %bb3 90 91bb3: 92 br label %bb2 93 94bb1: 95 br label %bb2 96 97bb2: 98 %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ] 99 store i8 2, i8* %ptr.2, align 8 100 ret void 101} 102 103; CHECK-LABEL: test6 104; CHECK: entry: 105; CHECK-NOT: select 106; CHECK: store i8 2, i8* %ptr 107; CHECK: ret 108 109define void @test6(i1 %cond, i8* %ptr) { 110entry: 111 br i1 %cond, label %bb1, label %bb2 112 113bb1: 114 br label %bb2 115 116bb2: 117 %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ] 118 store i8 2, i8* %ptr.2, align 8 119 ret void 120} 121