; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=ipsccp < %s | FileCheck %s ; Test that information about the true/false value of conditions themselves ; is also used, not information implied by comparisions. define i32 @switch(i32 %x) { ; CHECK-LABEL: @switch( ; CHECK-NEXT: switch i32 [[X:%.*]], label [[CASE_DEFAULT:%.*]] [ ; CHECK-NEXT: i32 0, label [[CASE_0:%.*]] ; CHECK-NEXT: i32 2, label [[CASE_2:%.*]] ; CHECK-NEXT: ] ; CHECK: case.0: ; CHECK-NEXT: br label [[END:%.*]] ; CHECK: case.2: ; CHECK-NEXT: br label [[END]] ; CHECK: case.default: ; CHECK-NEXT: br label [[END]] ; CHECK: end: ; CHECK-NEXT: ret i32 1 ; switch i32 %x, label %case.default [ i32 0, label %case.0 i32 2, label %case.2 ] case.0: %add = add i32 %x, 1 br label %end case.2: %sub = sub i32 %x, 1 br label %end case.default: br label %end end: %phi = phi i32 [ %add, %case.0 ], [ %sub, %case.2 ], [ 1, %case.default] ret i32 %phi } define i1 @assume(i32 %x) { ; CHECK-LABEL: @assume( ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0 ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) ; CHECK-NEXT: ret i1 true ; %cmp = icmp sge i32 %x, 0 call void @llvm.assume(i1 %cmp) ret i1 %cmp } define i32 @branch(i32 %x) { ; CHECK-LABEL: @branch( ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0 ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_THEN2:%.*]] ; CHECK: if.then1: ; CHECK-NEXT: br label [[IF2_THEN1:%.*]] ; CHECK: if2.then1: ; CHECK-NEXT: br label [[IF2_END:%.*]] ; CHECK: if2.end: ; CHECK-NEXT: ret i32 0 ; CHECK: if.then2: ; CHECK-NEXT: br label [[IF3_THEN2:%.*]] ; CHECK: if3.then2: ; CHECK-NEXT: br label [[IF3_END:%.*]] ; CHECK: if3.end: ; CHECK-NEXT: ret i32 1 ; %cmp = icmp sge i32 %x, 0 br i1 %cmp, label %if.then1, label %if.then2 if.then1: br i1 %cmp, label %if2.then1, label %if2.then2 if2.then1: br label %if2.end if2.then2: br label %if2.end if2.end: %phi = phi i32 [ 0, %if2.then1 ], [ 1, %if2.then2 ] ret i32 %phi if.then2: br i1 %cmp, label %if3.then1, label %if3.then2 if3.then1: br label %if3.end if3.then2: br label %if3.end if3.end: %phi2 = phi i32 [ 0, %if3.then1 ], [ 1, %if3.then2 ] ret i32 %phi2 } define void @pr46814(i32 %a) { ; CHECK-LABEL: @pr46814( ; CHECK-NEXT: [[C1:%.*]] = icmp uge i32 [[A:%.*]], 10 ; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[A]], 20 ; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1]], [[C2]] ; CHECK-NEXT: br i1 [[C3]], label [[IF_1:%.*]], label [[EXIT:%.*]] ; CHECK: if.1: ; CHECK-NEXT: br label [[IF_2:%.*]] ; CHECK: if.2: ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret void ; %c1 = icmp uge i32 %a, 10 %c2 = icmp ult i32 %a, 20 %c3 = and i1 %c1, %c2 br i1 %c3, label %if.1, label %exit if.1: br i1 %c3, label %if.2, label %exit if.2: br i1 %c3, label %exit, label %exit exit: ret void } declare void @llvm.assume(i1)