diff options
author | Juneyoung Lee <aqjune@gmail.com> | 2020-12-28 08:32:45 +0900 |
---|---|---|
committer | Juneyoung Lee <aqjune@gmail.com> | 2020-12-28 08:32:45 +0900 |
commit | 860199dfbe60d78a7da6406622b635a2d4435db3 (patch) | |
tree | f0634ee12dd0bf5edfb194e3d183473d1045cc2a /llvm/unittests/Analysis/ValueTrackingTest.cpp | |
parent | 4ad41902e8c7481ccf3cdf6e618dfcd1e1fc10fc (diff) | |
download | llvm-860199dfbe60d78a7da6406622b635a2d4435db3.zip llvm-860199dfbe60d78a7da6406622b635a2d4435db3.tar.gz llvm-860199dfbe60d78a7da6406622b635a2d4435db3.tar.bz2 |
[ValueTracking] Use m_LogicalAnd/Or to look into conditions
This patch updates isImpliedCondition/isKnownNonZero to look into select form of
and/or as well.
See llvm.org/pr48353 and D93065 for more context
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D93845
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r-- | llvm/unittests/Analysis/ValueTrackingTest.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp index e9d53ef..8d24f52 100644 --- a/llvm/unittests/Analysis/ValueTrackingTest.cpp +++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp @@ -1033,6 +1033,30 @@ TEST_F(ValueTrackingTest, KnownNonZeroFromDomCond) { EXPECT_EQ(isKnownNonZero(A, DL, 0, &AC, CxtI2, &DT), false); } +TEST_F(ValueTrackingTest, KnownNonZeroFromDomCond2) { + parseAssembly(R"( + declare i8* @f_i8() + define void @test(i1 %c) { + %A = call i8* @f_i8() + %B = call i8* @f_i8() + %c1 = icmp ne i8* %A, null + %cond = select i1 %c, i1 %c1, i1 false + br i1 %cond, label %T, label %Q + T: + %CxtI = add i32 0, 0 + ret void + Q: + %CxtI2 = add i32 0, 0 + ret void + } + )"); + AssumptionCache AC(*F); + DominatorTree DT(*F); + DataLayout DL = M->getDataLayout(); + EXPECT_EQ(isKnownNonZero(A, DL, 0, &AC, CxtI, &DT), true); + EXPECT_EQ(isKnownNonZero(A, DL, 0, &AC, CxtI2, &DT), false); +} + TEST_F(ValueTrackingTest, IsImpliedConditionAnd) { parseAssembly(R"( define void @test(i32 %x, i32 %y) { @@ -1052,6 +1076,25 @@ TEST_F(ValueTrackingTest, IsImpliedConditionAnd) { EXPECT_EQ(isImpliedCondition(A, A4, DL), None); } +TEST_F(ValueTrackingTest, IsImpliedConditionAnd2) { + parseAssembly(R"( + define void @test(i32 %x, i32 %y) { + %c1 = icmp ult i32 %x, 10 + %c2 = icmp ult i32 %y, 15 + %A = select i1 %c1, i1 %c2, i1 false + ; x < 10 /\ y < 15 + %A2 = icmp ult i32 %x, 20 + %A3 = icmp uge i32 %y, 20 + %A4 = icmp ult i32 %x, 5 + ret void + } + )"); + DataLayout DL = M->getDataLayout(); + EXPECT_EQ(isImpliedCondition(A, A2, DL), true); + EXPECT_EQ(isImpliedCondition(A, A3, DL), false); + EXPECT_EQ(isImpliedCondition(A, A4, DL), None); +} + TEST_F(ValueTrackingTest, IsImpliedConditionOr) { parseAssembly(R"( define void @test(i32 %x, i32 %y) { @@ -1071,6 +1114,25 @@ TEST_F(ValueTrackingTest, IsImpliedConditionOr) { EXPECT_EQ(isImpliedCondition(A, A4, DL, false), None); } +TEST_F(ValueTrackingTest, IsImpliedConditionOr2) { + parseAssembly(R"( + define void @test(i32 %x, i32 %y) { + %c1 = icmp ult i32 %x, 10 + %c2 = icmp ult i32 %y, 15 + %A = select i1 %c1, i1 true, i1 %c2 ; negated + ; x >= 10 /\ y >= 15 + %A2 = icmp ult i32 %x, 5 + %A3 = icmp uge i32 %y, 10 + %A4 = icmp ult i32 %x, 15 + ret void + } + )"); + DataLayout DL = M->getDataLayout(); + EXPECT_EQ(isImpliedCondition(A, A2, DL, false), false); + EXPECT_EQ(isImpliedCondition(A, A3, DL, false), true); + EXPECT_EQ(isImpliedCondition(A, A4, DL, false), None); +} + TEST_F(ComputeKnownBitsTest, KnownNonZeroShift) { // %q is known nonzero without known bits. // Because %q is nonzero, %A[0] is known to be zero. |