1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=ipsccp < %s | FileCheck %s 3 4; Test that information about the true/false value of conditions themselves 5; is also used, not information implied by comparisions. 6 7define i32 @switch(i32 %x) { 8; CHECK-LABEL: @switch( 9; CHECK-NEXT: switch i32 [[X:%.*]], label [[CASE_DEFAULT:%.*]] [ 10; CHECK-NEXT: i32 0, label [[CASE_0:%.*]] 11; CHECK-NEXT: i32 2, label [[CASE_2:%.*]] 12; CHECK-NEXT: ] 13; CHECK: case.0: 14; CHECK-NEXT: br label [[END:%.*]] 15; CHECK: case.2: 16; CHECK-NEXT: br label [[END]] 17; CHECK: case.default: 18; CHECK-NEXT: br label [[END]] 19; CHECK: end: 20; CHECK-NEXT: ret i32 1 21; 22 switch i32 %x, label %case.default [ 23 i32 0, label %case.0 24 i32 2, label %case.2 25 ] 26 27case.0: 28 %add = add i32 %x, 1 29 br label %end 30 31case.2: 32 %sub = sub i32 %x, 1 33 br label %end 34 35case.default: 36 br label %end 37 38end: 39 %phi = phi i32 [ %add, %case.0 ], [ %sub, %case.2 ], [ 1, %case.default] 40 ret i32 %phi 41} 42 43define i1 @assume(i32 %x) { 44; CHECK-LABEL: @assume( 45; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0 46; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) 47; CHECK-NEXT: ret i1 true 48; 49 %cmp = icmp sge i32 %x, 0 50 call void @llvm.assume(i1 %cmp) 51 ret i1 %cmp 52} 53 54define i32 @branch(i32 %x) { 55; CHECK-LABEL: @branch( 56; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0 57; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_THEN2:%.*]] 58; CHECK: if.then1: 59; CHECK-NEXT: br label [[IF2_THEN1:%.*]] 60; CHECK: if2.then1: 61; CHECK-NEXT: br label [[IF2_END:%.*]] 62; CHECK: if2.end: 63; CHECK-NEXT: ret i32 0 64; CHECK: if.then2: 65; CHECK-NEXT: br label [[IF3_THEN2:%.*]] 66; CHECK: if3.then2: 67; CHECK-NEXT: br label [[IF3_END:%.*]] 68; CHECK: if3.end: 69; CHECK-NEXT: ret i32 1 70; 71 %cmp = icmp sge i32 %x, 0 72 br i1 %cmp, label %if.then1, label %if.then2 73 74if.then1: 75 br i1 %cmp, label %if2.then1, label %if2.then2 76 77if2.then1: 78 br label %if2.end 79 80if2.then2: 81 br label %if2.end 82 83if2.end: 84 %phi = phi i32 [ 0, %if2.then1 ], [ 1, %if2.then2 ] 85 ret i32 %phi 86 87if.then2: 88 br i1 %cmp, label %if3.then1, label %if3.then2 89 90if3.then1: 91 br label %if3.end 92 93if3.then2: 94 br label %if3.end 95 96if3.end: 97 %phi2 = phi i32 [ 0, %if3.then1 ], [ 1, %if3.then2 ] 98 ret i32 %phi2 99} 100 101define void @pr46814(i32 %a) { 102; CHECK-LABEL: @pr46814( 103; CHECK-NEXT: [[C1:%.*]] = icmp uge i32 [[A:%.*]], 10 104; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[A]], 20 105; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1]], [[C2]] 106; CHECK-NEXT: br i1 [[C3]], label [[IF_1:%.*]], label [[EXIT:%.*]] 107; CHECK: if.1: 108; CHECK-NEXT: br label [[IF_2:%.*]] 109; CHECK: if.2: 110; CHECK-NEXT: br i1 true, label [[EXIT]], label [[EXIT]] 111; CHECK: exit: 112; CHECK-NEXT: ret void 113; 114 %c1 = icmp uge i32 %a, 10 115 %c2 = icmp ult i32 %a, 20 116 %c3 = and i1 %c1, %c2 117 br i1 %c3, label %if.1, label %exit 118 119if.1: 120 br i1 %c3, label %if.2, label %exit 121 122if.2: 123 br i1 %c3, label %exit, label %exit 124 125exit: 126 ret void 127} 128 129declare void @llvm.assume(i1) 130