1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S < %s -instcombine | FileCheck %s 3; RUN: opt -S < %s -passes=instcombine | FileCheck %s 4 5; TODO: Simplify to "ret cond". 6define i1 @test_direct_implication(i1 %cond) { 7; CHECK-LABEL: @test_direct_implication( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 10; CHECK: if.true: 11; CHECK-NEXT: br label [[MERGE:%.*]] 12; CHECK: if.false: 13; CHECK-NEXT: br label [[MERGE]] 14; CHECK: merge: 15; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[IF_TRUE]] ], [ false, [[IF_FALSE]] ] 16; CHECK-NEXT: ret i1 [[RET]] 17; 18entry: 19 br i1 %cond, label %if.true, label %if.false 20 21if.true: 22 br label %merge 23 24if.false: 25 br label %merge 26 27merge: 28 %ret = phi i1 [true, %if.true], [false, %if.false] 29 ret i1 %ret 30} 31 32; TODO: Simplify to "ret !cond". 33define i1 @test_inverted_implication(i1 %cond) { 34; CHECK-LABEL: @test_inverted_implication( 35; CHECK-NEXT: entry: 36; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 37; CHECK: if.true: 38; CHECK-NEXT: br label [[MERGE:%.*]] 39; CHECK: if.false: 40; CHECK-NEXT: br label [[MERGE]] 41; CHECK: merge: 42; CHECK-NEXT: [[RET:%.*]] = phi i1 [ false, [[IF_TRUE]] ], [ true, [[IF_FALSE]] ] 43; CHECK-NEXT: ret i1 [[RET]] 44; 45entry: 46 br i1 %cond, label %if.true, label %if.false 47 48if.true: 49 br label %merge 50 51if.false: 52 br label %merge 53 54merge: 55 %ret = phi i1 [false, %if.true], [true, %if.false] 56 ret i1 %ret 57} 58 59; TODO: Simplify to "ret cond". 60define i1 @test_direct_implication_complex_cfg(i1 %cond, i32 %cnt1) { 61; CHECK-LABEL: @test_direct_implication_complex_cfg( 62; CHECK-NEXT: entry: 63; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 64; CHECK: if.true: 65; CHECK-NEXT: br label [[LOOP1:%.*]] 66; CHECK: loop1: 67; CHECK-NEXT: [[IV1:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[IV1_NEXT:%.*]], [[LOOP1]] ] 68; CHECK-NEXT: [[IV1_NEXT]] = add i32 [[IV1]], 1 69; CHECK-NEXT: [[LOOP_COND_1:%.*]] = icmp slt i32 [[IV1_NEXT]], [[CNT1:%.*]] 70; CHECK-NEXT: br i1 [[LOOP_COND_1]], label [[LOOP1]], label [[IF_TRUE_END:%.*]] 71; CHECK: if.true.end: 72; CHECK-NEXT: br label [[MERGE:%.*]] 73; CHECK: if.false: 74; CHECK-NEXT: br label [[MERGE]] 75; CHECK: merge: 76; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[IF_TRUE_END]] ], [ false, [[IF_FALSE]] ] 77; CHECK-NEXT: ret i1 [[RET]] 78; 79entry: 80 br i1 %cond, label %if.true, label %if.false 81 82if.true: 83 br label %loop1 84 85loop1: 86 %iv1 = phi i32 [0, %if.true], [%iv1.next, %loop1] 87 %iv1.next = add i32 %iv1, 1 88 %loop.cond.1 = icmp slt i32 %iv1.next, %cnt1 89 br i1 %loop.cond.1, label %loop1, label %if.true.end 90 91if.true.end: 92 br label %merge 93 94if.false: 95 br label %merge 96 97merge: 98 %ret = phi i1 [true, %if.true.end], [false, %if.false] 99 ret i1 %ret 100} 101 102; TODO: Simplify to "ret !cond". 103define i1 @test_inverted_implication_complex_cfg(i1 %cond, i32 %cnt1) { 104; CHECK-LABEL: @test_inverted_implication_complex_cfg( 105; CHECK-NEXT: entry: 106; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 107; CHECK: if.true: 108; CHECK-NEXT: br label [[LOOP1:%.*]] 109; CHECK: loop1: 110; CHECK-NEXT: [[IV1:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[IV1_NEXT:%.*]], [[LOOP1]] ] 111; CHECK-NEXT: [[IV1_NEXT]] = add i32 [[IV1]], 1 112; CHECK-NEXT: [[LOOP_COND_1:%.*]] = icmp slt i32 [[IV1_NEXT]], [[CNT1:%.*]] 113; CHECK-NEXT: br i1 [[LOOP_COND_1]], label [[LOOP1]], label [[IF_TRUE_END:%.*]] 114; CHECK: if.true.end: 115; CHECK-NEXT: br label [[MERGE:%.*]] 116; CHECK: if.false: 117; CHECK-NEXT: br label [[MERGE]] 118; CHECK: merge: 119; CHECK-NEXT: [[RET:%.*]] = phi i1 [ false, [[IF_TRUE_END]] ], [ true, [[IF_FALSE]] ] 120; CHECK-NEXT: ret i1 [[RET]] 121; 122entry: 123 br i1 %cond, label %if.true, label %if.false 124 125if.true: 126 br label %loop1 127 128loop1: 129 %iv1 = phi i32 [0, %if.true], [%iv1.next, %loop1] 130 %iv1.next = add i32 %iv1, 1 131 %loop.cond.1 = icmp slt i32 %iv1.next, %cnt1 132 br i1 %loop.cond.1, label %loop1, label %if.true.end 133 134if.true.end: 135 br label %merge 136 137if.false: 138 br label %merge 139 140merge: 141 %ret = phi i1 [false, %if.true.end], [true, %if.false] 142 ret i1 %ret 143} 144