aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorJuneyoung Lee <aqjune@gmail.com>2020-12-28 08:32:45 +0900
committerJuneyoung Lee <aqjune@gmail.com>2020-12-28 08:32:45 +0900
commit860199dfbe60d78a7da6406622b635a2d4435db3 (patch)
treef0634ee12dd0bf5edfb194e3d183473d1045cc2a /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent4ad41902e8c7481ccf3cdf6e618dfcd1e1fc10fc (diff)
downloadllvm-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.cpp62
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.