aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-01-16 15:32:40 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-01-19 18:04:23 +0100
commit051ec9f5f43a83e23bd3e20e512fc5ec44c19850 (patch)
tree1b43f47a0d8603ffdcf2d87e5a3b19558b2836df /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent0808c7009a06773e78772c7b74d254fd3572f0ea (diff)
downloadllvm-051ec9f5f43a83e23bd3e20e512fc5ec44c19850.zip
llvm-051ec9f5f43a83e23bd3e20e512fc5ec44c19850.tar.gz
llvm-051ec9f5f43a83e23bd3e20e512fc5ec44c19850.tar.bz2
[ValueTracking] Strengthen impliesPoison reasoning
Split impliesPoison into two recursive walks, one over V, the other over ValAssumedPoison. This allows us to reason about poison implications in a number of additional cases that are important in practice. This is a generalized form of D94859, which handles the cmp to cmp implication in particular. Differential Revision: https://reviews.llvm.org/D94866
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 4b3b33b..f3240e0 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -748,6 +748,46 @@ TEST_F(ValueTrackingTest, impliesPoisonTest_AddNsw) {
EXPECT_FALSE(impliesPoison(A2, A));
}
+TEST_F(ValueTrackingTest, impliesPoisonTest_Cmp) {
+ parseAssembly("define void @test(i32 %x, i32 %y, i1 %c) {\n"
+ " %A2 = icmp eq i32 %x, %y\n"
+ " %A0 = icmp ult i32 %x, %y\n"
+ " %A = or i1 %A0, %c\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_FCmpFMF) {
+ parseAssembly("define void @test(float %x, float %y, i1 %c) {\n"
+ " %A2 = fcmp nnan oeq float %x, %y\n"
+ " %A0 = fcmp olt float %x, %y\n"
+ " %A = or i1 %A0, %c\n"
+ " ret void\n"
+ "}");
+ EXPECT_FALSE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_AddSubSameOps) {
+ parseAssembly("define void @test(i32 %x, i32 %y, i1 %c) {\n"
+ " %A2 = add i32 %x, %y\n"
+ " %A = sub i32 %x, %y\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_MaskCmp) {
+ parseAssembly("define void @test(i32 %x, i32 %y, i1 %c) {\n"
+ " %M2 = and i32 %x, 7\n"
+ " %A2 = icmp eq i32 %M2, 1\n"
+ " %M = and i32 %x, 15\n"
+ " %A = icmp eq i32 %M, 3\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A2, A));
+}
+
TEST_F(ValueTrackingTest, ComputeNumSignBits_Shuffle_Pointers) {
parseAssembly(
"define <2 x i32*> @test(<2 x i32*> %x) {\n"