[llvm] 22b6844 - [PredicateInfo] Add more and/or tests (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 18 13:15:59 PST 2021


Author: Nikita Popov
Date: 2021-01-18T22:15:35+01:00
New Revision: 22b68440e1647e16b5ee24b924986207173c02d1

URL: https://github.com/llvm/llvm-project/commit/22b68440e1647e16b5ee24b924986207173c02d1
DIFF: https://github.com/llvm/llvm-project/commit/22b68440e1647e16b5ee24b924986207173c02d1.diff

LOG: [PredicateInfo] Add more and/or tests (NFC)

Added: 
    

Modified: 
    llvm/test/Transforms/Util/PredicateInfo/testandor.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/Util/PredicateInfo/testandor.ll b/llvm/test/Transforms/Util/PredicateInfo/testandor.ll
index 4697c9d3e059..a3d8e78b5283 100644
--- a/llvm/test/Transforms/Util/PredicateInfo/testandor.ll
+++ b/llvm/test/Transforms/Util/PredicateInfo/testandor.ll
@@ -283,3 +283,568 @@ nope:
   call void @foo(i1 %a)
   ret void
 }
+
+define void @test_and_chain(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @test_and_chain(
+; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[AND2:%.*]] = and i1 [[AND1]], [[C:%.*]]
+; CHECK-NEXT:    br i1 [[AND2]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[AND1]])
+; CHECK-NEXT:    call void @foo(i1 [[AND2]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[AND1]])
+; CHECK-NEXT:    call void @foo(i1 [[AND2]])
+; CHECK-NEXT:    ret void
+;
+  %and1 = and i1 %a, %b
+  %and2 = and i1 %and1, %c
+  br i1 %and2, label %if, label %else
+
+if:
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %and1)
+  call void @foo(i1 %and2)
+  ret void
+
+else:
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %and1)
+  call void @foo(i1 %and2)
+  ret void
+}
+
+define void @test_or_chain(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @test_or_chain(
+; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[OR2:%.*]] = or i1 [[OR1]], [[C:%.*]]
+; CHECK-NEXT:    br i1 [[OR2]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[OR1]])
+; CHECK-NEXT:    call void @foo(i1 [[OR2]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[OR1]])
+; CHECK-NEXT:    call void @foo(i1 [[OR2]])
+; CHECK-NEXT:    ret void
+;
+  %or1 = or i1 %a, %b
+  %or2 = or i1 %or1, %c
+  br i1 %or2, label %if, label %else
+
+if:
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %or1)
+  call void @foo(i1 %or2)
+  ret void
+
+else:
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %or1)
+  call void @foo(i1 %or2)
+  ret void
+}
+
+define void @test_and_or_mixed(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @test_and_or_mixed(
+; CHECK-NEXT:    [[OR:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[AND:%.*]] = and i1 [[OR]], [[C:%.*]]
+; CHECK-NEXT:    br i1 [[AND]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[OR]])
+; CHECK-NEXT:    call void @foo(i1 [[AND]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[OR]])
+; CHECK-NEXT:    call void @foo(i1 [[AND]])
+; CHECK-NEXT:    ret void
+;
+  %or = or i1 %a, %b
+  %and = and i1 %or, %c
+  br i1 %and, label %if, label %else
+
+if:
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %or)
+  call void @foo(i1 %and)
+  ret void
+
+else:
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %or)
+  call void @foo(i1 %and)
+  ret void
+}
+
+define void @test_deep_and_chain(i1 %a1) {
+; CHECK-LABEL: @test_deep_and_chain(
+; CHECK-NEXT:    [[A2:%.*]] = and i1 [[A1:%.*]], true
+; CHECK-NEXT:    [[A3:%.*]] = and i1 [[A2]], true
+; CHECK-NEXT:    [[A4:%.*]] = and i1 [[A3]], true
+; CHECK-NEXT:    [[A5:%.*]] = and i1 [[A4]], true
+; CHECK-NEXT:    [[A6:%.*]] = and i1 [[A5]], true
+; CHECK-NEXT:    [[A7:%.*]] = and i1 [[A6]], true
+; CHECK-NEXT:    [[A8:%.*]] = and i1 [[A7]], true
+; CHECK-NEXT:    [[A9:%.*]] = and i1 [[A8]], true
+; CHECK-NEXT:    [[A10:%.*]] = and i1 [[A9]], true
+; CHECK-NEXT:    [[A11:%.*]] = and i1 [[A10]], true
+; CHECK-NEXT:    [[A12:%.*]] = and i1 [[A11]], true
+; CHECK-NEXT:    [[A13:%.*]] = and i1 [[A12]], true
+; CHECK-NEXT:    [[A14:%.*]] = and i1 [[A13]], true
+; CHECK-NEXT:    [[A15:%.*]] = and i1 [[A14]], true
+; CHECK-NEXT:    br i1 [[A15]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+;
+  %a2 = and i1 %a1, true
+  %a3 = and i1 %a2, true
+  %a4 = and i1 %a3, true
+  %a5 = and i1 %a4, true
+  %a6 = and i1 %a5, true
+  %a7 = and i1 %a6, true
+  %a8 = and i1 %a7, true
+  %a9 = and i1 %a8, true
+  %a10 = and i1 %a9, true
+  %a11 = and i1 %a10, true
+  %a12 = and i1 %a11, true
+  %a13 = and i1 %a12, true
+  %a14 = and i1 %a13, true
+  %a15 = and i1 %a14, true
+  br i1 %a15, label %if, label %else
+
+if:
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+
+else:
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+}
+
+define void @test_deep_and_tree(i1 %a1) {
+; CHECK-LABEL: @test_deep_and_tree(
+; CHECK-NEXT:    [[A2:%.*]] = and i1 [[A1:%.*]], [[A1]]
+; CHECK-NEXT:    [[A3:%.*]] = and i1 [[A2]], [[A2]]
+; CHECK-NEXT:    [[A4:%.*]] = and i1 [[A3]], [[A3]]
+; CHECK-NEXT:    [[A5:%.*]] = and i1 [[A4]], [[A4]]
+; CHECK-NEXT:    [[A6:%.*]] = and i1 [[A5]], [[A5]]
+; CHECK-NEXT:    [[A7:%.*]] = and i1 [[A6]], [[A6]]
+; CHECK-NEXT:    [[A8:%.*]] = and i1 [[A7]], [[A7]]
+; CHECK-NEXT:    [[A9:%.*]] = and i1 [[A8]], [[A8]]
+; CHECK-NEXT:    [[A10:%.*]] = and i1 [[A9]], [[A9]]
+; CHECK-NEXT:    [[A11:%.*]] = and i1 [[A10]], [[A10]]
+; CHECK-NEXT:    [[A12:%.*]] = and i1 [[A11]], [[A11]]
+; CHECK-NEXT:    [[A13:%.*]] = and i1 [[A12]], [[A12]]
+; CHECK-NEXT:    [[A14:%.*]] = and i1 [[A13]], [[A13]]
+; CHECK-NEXT:    [[A15:%.*]] = and i1 [[A14]], [[A14]]
+; CHECK-NEXT:    br i1 [[A15]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+;
+  %a2 = and i1 %a1, %a1
+  %a3 = and i1 %a2, %a2
+  %a4 = and i1 %a3, %a3
+  %a5 = and i1 %a4, %a4
+  %a6 = and i1 %a5, %a5
+  %a7 = and i1 %a6, %a6
+  %a8 = and i1 %a7, %a7
+  %a9 = and i1 %a8, %a8
+  %a10 = and i1 %a9, %a9
+  %a11 = and i1 %a10, %a10
+  %a12 = and i1 %a11, %a11
+  %a13 = and i1 %a12, %a12
+  %a14 = and i1 %a13, %a13
+  %a15 = and i1 %a14, %a14
+  br i1 %a15, label %if, label %else
+
+if:
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+
+else:
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+}
+
+define void @test_deep_or_tree(i1 %a1) {
+; CHECK-LABEL: @test_deep_or_tree(
+; CHECK-NEXT:    [[A2:%.*]] = or i1 [[A1:%.*]], [[A1]]
+; CHECK-NEXT:    [[A3:%.*]] = or i1 [[A2]], [[A2]]
+; CHECK-NEXT:    [[A4:%.*]] = or i1 [[A3]], [[A3]]
+; CHECK-NEXT:    [[A5:%.*]] = or i1 [[A4]], [[A4]]
+; CHECK-NEXT:    [[A6:%.*]] = or i1 [[A5]], [[A5]]
+; CHECK-NEXT:    [[A7:%.*]] = or i1 [[A6]], [[A6]]
+; CHECK-NEXT:    [[A8:%.*]] = or i1 [[A7]], [[A7]]
+; CHECK-NEXT:    [[A9:%.*]] = or i1 [[A8]], [[A8]]
+; CHECK-NEXT:    [[A10:%.*]] = or i1 [[A9]], [[A9]]
+; CHECK-NEXT:    [[A11:%.*]] = or i1 [[A10]], [[A10]]
+; CHECK-NEXT:    [[A12:%.*]] = or i1 [[A11]], [[A11]]
+; CHECK-NEXT:    [[A13:%.*]] = or i1 [[A12]], [[A12]]
+; CHECK-NEXT:    [[A14:%.*]] = or i1 [[A13]], [[A13]]
+; CHECK-NEXT:    [[A15:%.*]] = or i1 [[A14]], [[A14]]
+; CHECK-NEXT:    br i1 [[A15]], label [[IF:%.*]], label [[ELSE:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+; CHECK:       else:
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+;
+  %a2 = or i1 %a1, %a1
+  %a3 = or i1 %a2, %a2
+  %a4 = or i1 %a3, %a3
+  %a5 = or i1 %a4, %a4
+  %a6 = or i1 %a5, %a5
+  %a7 = or i1 %a6, %a6
+  %a8 = or i1 %a7, %a7
+  %a9 = or i1 %a8, %a8
+  %a10 = or i1 %a9, %a9
+  %a11 = or i1 %a10, %a10
+  %a12 = or i1 %a11, %a11
+  %a13 = or i1 %a12, %a12
+  %a14 = or i1 %a13, %a13
+  %a15 = or i1 %a14, %a14
+  br i1 %a15, label %if, label %else
+
+if:
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+
+else:
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+}
+
+define void @test_assume_and_chain(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @test_assume_and_chain(
+; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[AND2:%.*]] = and i1 [[AND1]], [[C:%.*]]
+; CHECK-NEXT:    call void @llvm.assume(i1 [[AND2]])
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[AND1]])
+; CHECK-NEXT:    call void @foo(i1 [[AND2]])
+; CHECK-NEXT:    ret void
+;
+  %and1 = and i1 %a, %b
+  %and2 = and i1 %and1, %c
+  call void @llvm.assume(i1 %and2)
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %and1)
+  call void @foo(i1 %and2)
+  ret void
+}
+
+define void @test_assume_or_chain(i1 %a, i1 %b, i1 %c) {
+; CHECK-LABEL: @test_assume_or_chain(
+; CHECK-NEXT:    [[OR1:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[OR2:%.*]] = or i1 [[OR1]], [[C:%.*]]
+; CHECK-NEXT:    call void @llvm.assume(i1 [[OR2]])
+; CHECK-NEXT:    call void @foo(i1 [[A]])
+; CHECK-NEXT:    call void @foo(i1 [[B]])
+; CHECK-NEXT:    call void @foo(i1 [[C]])
+; CHECK-NEXT:    call void @foo(i1 [[OR1]])
+; CHECK-NEXT:    call void @foo(i1 [[OR2]])
+; CHECK-NEXT:    ret void
+;
+  %or1 = or i1 %a, %b
+  %or2 = or i1 %or1, %c
+  call void @llvm.assume(i1 %or2)
+  call void @foo(i1 %a)
+  call void @foo(i1 %b)
+  call void @foo(i1 %c)
+  call void @foo(i1 %or1)
+  call void @foo(i1 %or2)
+  ret void
+}
+
+define void @test_assume_deep_and_tree(i1 %a1) {
+; CHECK-LABEL: @test_assume_deep_and_tree(
+; CHECK-NEXT:    [[A2:%.*]] = and i1 [[A1:%.*]], [[A1]]
+; CHECK-NEXT:    [[A3:%.*]] = and i1 [[A2]], [[A2]]
+; CHECK-NEXT:    [[A4:%.*]] = and i1 [[A3]], [[A3]]
+; CHECK-NEXT:    [[A5:%.*]] = and i1 [[A4]], [[A4]]
+; CHECK-NEXT:    [[A6:%.*]] = and i1 [[A5]], [[A5]]
+; CHECK-NEXT:    [[A7:%.*]] = and i1 [[A6]], [[A6]]
+; CHECK-NEXT:    [[A8:%.*]] = and i1 [[A7]], [[A7]]
+; CHECK-NEXT:    [[A9:%.*]] = and i1 [[A8]], [[A8]]
+; CHECK-NEXT:    [[A10:%.*]] = and i1 [[A9]], [[A9]]
+; CHECK-NEXT:    [[A11:%.*]] = and i1 [[A10]], [[A10]]
+; CHECK-NEXT:    [[A12:%.*]] = and i1 [[A11]], [[A11]]
+; CHECK-NEXT:    [[A13:%.*]] = and i1 [[A12]], [[A12]]
+; CHECK-NEXT:    [[A14:%.*]] = and i1 [[A13]], [[A13]]
+; CHECK-NEXT:    [[A15:%.*]] = and i1 [[A14]], [[A14]]
+; CHECK-NEXT:    call void @llvm.assume(i1 [[A15]])
+; CHECK-NEXT:    call void @foo(i1 [[A1]])
+; CHECK-NEXT:    call void @foo(i1 [[A2]])
+; CHECK-NEXT:    call void @foo(i1 [[A3]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A4]])
+; CHECK-NEXT:    call void @foo(i1 [[A5]])
+; CHECK-NEXT:    call void @foo(i1 [[A6]])
+; CHECK-NEXT:    call void @foo(i1 [[A7]])
+; CHECK-NEXT:    call void @foo(i1 [[A8]])
+; CHECK-NEXT:    call void @foo(i1 [[A9]])
+; CHECK-NEXT:    call void @foo(i1 [[A10]])
+; CHECK-NEXT:    call void @foo(i1 [[A11]])
+; CHECK-NEXT:    call void @foo(i1 [[A12]])
+; CHECK-NEXT:    call void @foo(i1 [[A13]])
+; CHECK-NEXT:    call void @foo(i1 [[A14]])
+; CHECK-NEXT:    call void @foo(i1 [[A15]])
+; CHECK-NEXT:    ret void
+;
+  %a2 = and i1 %a1, %a1
+  %a3 = and i1 %a2, %a2
+  %a4 = and i1 %a3, %a3
+  %a5 = and i1 %a4, %a4
+  %a6 = and i1 %a5, %a5
+  %a7 = and i1 %a6, %a6
+  %a8 = and i1 %a7, %a7
+  %a9 = and i1 %a8, %a8
+  %a10 = and i1 %a9, %a9
+  %a11 = and i1 %a10, %a10
+  %a12 = and i1 %a11, %a11
+  %a13 = and i1 %a12, %a12
+  %a14 = and i1 %a13, %a13
+  %a15 = and i1 %a14, %a14
+  call void @llvm.assume(i1 %a15)
+  call void @foo(i1 %a1)
+  call void @foo(i1 %a2)
+  call void @foo(i1 %a3)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a4)
+  call void @foo(i1 %a5)
+  call void @foo(i1 %a6)
+  call void @foo(i1 %a7)
+  call void @foo(i1 %a8)
+  call void @foo(i1 %a9)
+  call void @foo(i1 %a10)
+  call void @foo(i1 %a11)
+  call void @foo(i1 %a12)
+  call void @foo(i1 %a13)
+  call void @foo(i1 %a14)
+  call void @foo(i1 %a15)
+  ret void
+}


        


More information about the llvm-commits mailing list