diff options
author | Juneyoung Lee <aqjune@gmail.com> | 2020-12-29 06:50:26 +0900 |
---|---|---|
committer | Juneyoung Lee <aqjune@gmail.com> | 2020-12-29 06:50:38 +0900 |
commit | 0f2c180163a2cc3d6239a32d379ec3d773e56a2f (patch) | |
tree | c963c94d720babd9227e25f8e0336ddb0e58f52a /llvm/unittests/Analysis/ValueTrackingTest.cpp | |
parent | 4a16c507cb68e425226e81598d91963aacdd57ed (diff) | |
download | llvm-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.cpp | 53 |
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" |