aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorJuneyoung Lee <aqjune@gmail.com>2020-12-29 06:50:26 +0900
committerJuneyoung Lee <aqjune@gmail.com>2020-12-29 06:50:38 +0900
commit0f2c180163a2cc3d6239a32d379ec3d773e56a2f (patch)
treec963c94d720babd9227e25f8e0336ddb0e58f52a /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent4a16c507cb68e425226e81598d91963aacdd57ed (diff)
downloadllvm-0f2c180163a2cc3d6239a32d379ec3d773e56a2f.zip
llvm-0f2c180163a2cc3d6239a32d379ec3d773e56a2f.tar.gz
llvm-0f2c180163a2cc3d6239a32d379ec3d773e56a2f.tar.bz2
[ValueTracking] Implement impliesPoison
This PR adds impliesPoison(ValAssumedPoison, V) that returns true if V is poison under the assumption that ValAssumedPoison is poison. For example, impliesPoison('icmp X, 10', 'icmp X, Y') return true because 'icmp X, Y' is poison if 'icmp X, 10' is poison. impliesPoison can be used for sound optimization of select, as discussed in D77868. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D78152
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 8d24f52..009166a 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -695,6 +695,59 @@ TEST_F(ValueTrackingTest, ComputeNumSignBits_Shuffle2) {
EXPECT_EQ(ComputeNumSignBits(A, M->getDataLayout()), 1u);
}
+TEST_F(ValueTrackingTest, impliesPoisonTest_Identity) {
+ parseAssembly("define void @test(i32 %x, i32 %y) {\n"
+ " %A = add i32 %x, %y\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_ICmp) {
+ parseAssembly("define void @test(i32 %x) {\n"
+ " %A2 = icmp eq i32 %x, 0\n"
+ " %A = icmp eq i32 %x, 1\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_ICmpUnknown) {
+ parseAssembly("define void @test(i32 %x, i32 %y) {\n"
+ " %A2 = icmp eq i32 %x, %y\n"
+ " %A = icmp eq i32 %x, 1\n"
+ " ret void\n"
+ "}");
+ EXPECT_FALSE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_AddNswOkay) {
+ parseAssembly("define void @test(i32 %x) {\n"
+ " %A2 = add nsw i32 %x, 1\n"
+ " %A = add i32 %A2, 1\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_AddNswOkay2) {
+ parseAssembly("define void @test(i32 %x) {\n"
+ " %A2 = add i32 %x, 1\n"
+ " %A = add nsw i32 %A2, 1\n"
+ " ret void\n"
+ "}");
+ EXPECT_TRUE(impliesPoison(A2, A));
+}
+
+TEST_F(ValueTrackingTest, impliesPoisonTest_AddNsw) {
+ parseAssembly("define void @test(i32 %x) {\n"
+ " %A2 = add nsw i32 %x, 1\n"
+ " %A = add i32 %x, 1\n"
+ " ret void\n"
+ "}");
+ EXPECT_FALSE(impliesPoison(A2, A));
+}
+
TEST_F(ValueTrackingTest, ComputeNumSignBits_Shuffle_Pointers) {
parseAssembly(
"define <2 x i32*> @test(<2 x i32*> %x) {\n"