brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 89b3164 Raw
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