aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorYingwei Zheng <dtcxzyw2333@gmail.com>2024-02-23 20:57:56 +0800
committerGitHub <noreply@github.com>2024-02-23 20:57:56 +0800
commit3b70387c5486a057fe0b7d52c79f9decf9c9c95f (patch)
tree25fae4582544d58bdc299f6eae5bbb45ce1c3527 /llvm/unittests/Analysis/ValueTrackingTest.cpp
parente09e0d52a03c7141a7d62fb4adf4d9fee32bebb8 (diff)
downloadllvm-3b70387c5486a057fe0b7d52c79f9decf9c9c95f.zip
llvm-3b70387c5486a057fe0b7d52c79f9decf9c9c95f.tar.gz
llvm-3b70387c5486a057fe0b7d52c79f9decf9c9c95f.tar.bz2
[ValueTracking] Handle more integer intrinsics in `propagatesPoison` (#82749)
This patch extends `propagatesPoison` to handle more integer intrinsics. It will turn more logical ands/ors into bitwise ands/ors. See also https://reviews.llvm.org/D99671.
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp59
1 files changed, 23 insertions, 36 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 8104a329..9e0abe7 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -824,42 +824,7 @@ TEST_F(ValueTrackingTest, ComputeNumSignBits_Shuffle_Pointers) {
TEST(ValueTracking, propagatesPoison) {
std::string AsmHead =
"declare i32 @g(i32)\n"
- "declare {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %b)\n"
- "declare {i32, i1} @llvm.ssub.with.overflow.i32(i32 %a, i32 %b)\n"
- "declare {i32, i1} @llvm.smul.with.overflow.i32(i32 %a, i32 %b)\n"
- "declare {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 %b)\n"
- "declare {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 %b)\n"
- "declare {i32, i1} @llvm.umul.with.overflow.i32(i32 %a, i32 %b)\n"
- "declare float @llvm.sqrt.f32(float)\n"
- "declare float @llvm.powi.f32.i32(float, i32)\n"
- "declare float @llvm.sin.f32(float)\n"
- "declare float @llvm.cos.f32(float)\n"
- "declare float @llvm.pow.f32(float, float)\n"
- "declare float @llvm.exp.f32(float)\n"
- "declare float @llvm.exp2.f32(float)\n"
- "declare float @llvm.log.f32(float)\n"
- "declare float @llvm.log10.f32(float)\n"
- "declare float @llvm.log2.f32(float)\n"
- "declare float @llvm.fma.f32(float, float, float)\n"
- "declare float @llvm.fabs.f32(float)\n"
- "declare float @llvm.minnum.f32(float, float)\n"
- "declare float @llvm.maxnum.f32(float, float)\n"
- "declare float @llvm.minimum.f32(float, float)\n"
- "declare float @llvm.maximum.f32(float, float)\n"
- "declare float @llvm.copysign.f32(float, float)\n"
- "declare float @llvm.floor.f32(float)\n"
- "declare float @llvm.ceil.f32(float)\n"
- "declare float @llvm.trunc.f32(float)\n"
- "declare float @llvm.rint.f32(float)\n"
- "declare float @llvm.nearbyint.f32(float)\n"
- "declare float @llvm.round.f32(float)\n"
- "declare float @llvm.roundeven.f32(float)\n"
- "declare i32 @llvm.lround.f32(float)\n"
- "declare i64 @llvm.llround.f32(float)\n"
- "declare i32 @llvm.lrint.f32(float)\n"
- "declare i64 @llvm.llrint.f32(float)\n"
- "declare float @llvm.fmuladd.f32(float, float, float)\n"
- "define void @f(i32 %x, i32 %y, float %fx, float %fy, "
+ "define void @f(i32 %x, i32 %y, i32 %shamt, float %fx, float %fy, "
"i1 %cond, ptr %p) {\n";
std::string AsmTail = " ret void\n}";
// (propagates poison?, IR instruction)
@@ -912,6 +877,28 @@ TEST(ValueTracking, propagatesPoison) {
{true, "call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %x, i32 %y)", 0},
{true, "call {i32, i1} @llvm.usub.with.overflow.i32(i32 %x, i32 %y)", 0},
{true, "call {i32, i1} @llvm.umul.with.overflow.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.sadd.sat.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.ssub.sat.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.sshl.sat.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.uadd.sat.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.usub.sat.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.ushl.sat.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.ctpop.i32(i32 %x)", 0},
+ {true, "call i32 @llvm.ctlz.i32(i32 %x, i1 true)", 0},
+ {true, "call i32 @llvm.cttz.i32(i32 %x, i1 true)", 0},
+ {true, "call i32 @llvm.abs.i32(i32 %x, i1 true)", 0},
+ {true, "call i32 @llvm.smax.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.smin.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.umax.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.umin.i32(i32 %x, i32 %y)", 0},
+ {true, "call i32 @llvm.bitreverse.i32(i32 %x)", 0},
+ {true, "call i32 @llvm.bswap.i32(i32 %x)", 0},
+ {false, "call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %shamt)", 0},
+ {false, "call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %shamt)", 1},
+ {false, "call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %shamt)", 2},
+ {false, "call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %shamt)", 0},
+ {false, "call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %shamt)", 1},
+ {false, "call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %shamt)", 2},
{false, "call float @llvm.sqrt.f32(float %fx)", 0},
{false, "call float @llvm.powi.f32.i32(float %fx, i32 %x)", 0},
{false, "call float @llvm.sin.f32(float %fx)", 0},