aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2022-12-03 19:40:06 -0500
committerMatt Arsenault <Matthew.Arsenault@amd.com>2022-12-05 10:04:13 -0500
commit51af4ddfc2f4b20f9943b4add8adb1232f4fe73b (patch)
treecfceebeaabc754add2ee3d0535a4a5c9b966534e /llvm/lib/Analysis/ValueTracking.cpp
parent2d7f43f9eaf36cb8ab976a24544099f496aba248 (diff)
downloadllvm-51af4ddfc2f4b20f9943b4add8adb1232f4fe73b.zip
llvm-51af4ddfc2f4b20f9943b4add8adb1232f4fe73b.tar.gz
llvm-51af4ddfc2f4b20f9943b4add8adb1232f4fe73b.tar.bz2
ValueTracking: Teach canCreateUndefOrPoison about more intrinsics
I tried to test the fallthrough to noundef callsite return attribute case, but it seems that folds out as-is.
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 0e4ca6a..bc63368 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5182,7 +5182,24 @@ static bool canCreateUndefOrPoison(const Operator *Op, bool PoisonOnly,
if (auto *II = dyn_cast<IntrinsicInst>(Op)) {
switch (II->getIntrinsicID()) {
// TODO: Add more intrinsics.
+ case Intrinsic::ctlz:
+ case Intrinsic::cttz:
+ case Intrinsic::abs:
+ if (cast<ConstantInt>(II->getArgOperand(1))->isNullValue())
+ return false;
+ break;
case Intrinsic::ctpop:
+ case Intrinsic::bswap:
+ case Intrinsic::bitreverse:
+ case Intrinsic::fshl:
+ case Intrinsic::fshr:
+ case Intrinsic::smax:
+ case Intrinsic::smin:
+ case Intrinsic::umax:
+ case Intrinsic::umin:
+ case Intrinsic::ptrmask:
+ case Intrinsic::fptoui_sat:
+ case Intrinsic::fptosi_sat:
case Intrinsic::sadd_with_overflow:
case Intrinsic::ssub_with_overflow:
case Intrinsic::smul_with_overflow: