; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s define i1 @test_imply_not1(i32 %depth) { ; CHECK-LABEL: define i1 @test_imply_not1( ; CHECK-SAME: i32 [[DEPTH:%.*]]) { ; CHECK-NEXT: [[CMP1_NOT1:%.*]] = icmp eq i32 [[DEPTH]], 16 ; CHECK-NEXT: call void @use(i1 [[CMP1_NOT1]]) ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[DEPTH]], 8 ; CHECK-NEXT: call void @use(i1 [[CMP2]]) ; CHECK-NEXT: br i1 [[CMP1_NOT1]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]] ; CHECK: if.then: ; CHECK-NEXT: call void @func1() ; CHECK-NEXT: unreachable ; CHECK: if.else: ; CHECK-NEXT: call void @func2() ; CHECK-NEXT: unreachable ; %cmp1 = icmp eq i32 %depth, 16 call void @use(i1 %cmp1) %cmp2 = icmp slt i32 %depth, 8 call void @use(i1 %cmp2) %cmp.not = xor i1 %cmp1, true %brmerge = or i1 %cmp2, %cmp.not br i1 %brmerge, label %if.then, label %if.else if.then: call void @func1() unreachable if.else: call void @func2() unreachable } define i1 @test_imply_not2(i32 %a, i1 %cmp2) { ; CHECK-LABEL: define i1 @test_imply_not2( ; CHECK-SAME: i32 [[A:%.*]], i1 [[CMP2:%.*]]) { ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[A]], 0 ; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]] ; CHECK-NEXT: ret i1 [[BRMERGE]] ; %cmp1 = icmp eq i32 %a, 0 %or.cond = select i1 %cmp1, i1 %cmp2, i1 false %cmp.not = xor i1 %cmp1, true %brmerge = or i1 %or.cond, %cmp.not ret i1 %brmerge } define i1 @test_imply_not3(i32 %a, i32 %b, i1 %cond) { ; CHECK-LABEL: define i1 @test_imply_not3( ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i1 [[COND:%.*]]) { ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A]], [[B]] ; CHECK-NEXT: call void @use(i1 [[CMP1]]) ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]] ; CHECK-NEXT: [[AND:%.*]] = select i1 [[CMP2]], i1 [[COND]], i1 false ; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp eq i32 %a, %b call void @use(i1 %cmp1) %cmp2 = icmp slt i32 %a, %b %cmp.not = xor i1 %cmp1, true %sel = select i1 %cmp.not, i1 %cond, i1 false %and = and i1 %cmp2, %sel ret i1 %and } declare void @func1() declare void @func2() declare void @use(i1)