70 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @test_imply_not1(i32 %depth) {5; CHECK-LABEL: define i1 @test_imply_not1(6; CHECK-SAME: i32 [[DEPTH:%.*]]) {7; CHECK-NEXT: [[CMP1_NOT1:%.*]] = icmp eq i32 [[DEPTH]], 168; CHECK-NEXT: call void @use(i1 [[CMP1_NOT1]])9; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[DEPTH]], 810; CHECK-NEXT: call void @use(i1 [[CMP2]])11; CHECK-NEXT: br i1 [[CMP1_NOT1]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]12; CHECK: if.then:13; CHECK-NEXT: call void @func1()14; CHECK-NEXT: unreachable15; CHECK: if.else:16; CHECK-NEXT: call void @func2()17; CHECK-NEXT: unreachable18;19 %cmp1 = icmp eq i32 %depth, 1620 call void @use(i1 %cmp1)21 %cmp2 = icmp slt i32 %depth, 822 call void @use(i1 %cmp2)23 %cmp.not = xor i1 %cmp1, true24 %brmerge = or i1 %cmp2, %cmp.not25 br i1 %brmerge, label %if.then, label %if.else26if.then:27 call void @func1()28 unreachable29 30if.else:31 call void @func2()32 unreachable33}34 35define i1 @test_imply_not2(i32 %a, i1 %cmp2) {36; CHECK-LABEL: define i1 @test_imply_not2(37; CHECK-SAME: i32 [[A:%.*]], i1 [[CMP2:%.*]]) {38; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[A]], 039; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]]40; CHECK-NEXT: ret i1 [[BRMERGE]]41;42 %cmp1 = icmp eq i32 %a, 043 %or.cond = select i1 %cmp1, i1 %cmp2, i1 false44 %cmp.not = xor i1 %cmp1, true45 %brmerge = or i1 %or.cond, %cmp.not46 ret i1 %brmerge47}48 49define i1 @test_imply_not3(i32 %a, i32 %b, i1 %cond) {50; CHECK-LABEL: define i1 @test_imply_not3(51; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i1 [[COND:%.*]]) {52; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A]], [[B]]53; CHECK-NEXT: call void @use(i1 [[CMP1]])54; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]55; CHECK-NEXT: [[AND:%.*]] = select i1 [[CMP2]], i1 [[COND]], i1 false56; CHECK-NEXT: ret i1 [[AND]]57;58 %cmp1 = icmp eq i32 %a, %b59 call void @use(i1 %cmp1)60 %cmp2 = icmp slt i32 %a, %b61 %cmp.not = xor i1 %cmp1, true62 %sel = select i1 %cmp.not, i1 %cond, i1 false63 %and = and i1 %cmp2, %sel64 ret i1 %and65}66 67declare void @func1()68declare void @func2()69declare void @use(i1)70