aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/ConstantRange.cpp
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-07-30 22:54:53 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-07-30 23:06:10 +0200
commit9ebeac678855a1bc2492a9630f0300518e2755dc (patch)
tree5d296367d7378df02e3a0f2aca23f9b4c4adaa85 /llvm/lib/IR/ConstantRange.cpp
parentafae6d97fa55984003321245ec6ceb5af9cc5856 (diff)
downloadllvm-9ebeac678855a1bc2492a9630f0300518e2755dc.zip
llvm-9ebeac678855a1bc2492a9630f0300518e2755dc.tar.gz
llvm-9ebeac678855a1bc2492a9630f0300518e2755dc.tar.bz2
[ConstantRange][CVP] Make use of abs poison flag
Pass the abs poison flag to the underlying ConstantRange implementation, allowing CVP to simplify based on it. Importantly, this recognizes that abs with poison flag is actually non-negative...
Diffstat (limited to 'llvm/lib/IR/ConstantRange.cpp')
-rw-r--r--llvm/lib/IR/ConstantRange.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp
index 6e0b5a0..396c39b 100644
--- a/llvm/lib/IR/ConstantRange.cpp
+++ b/llvm/lib/IR/ConstantRange.cpp
@@ -872,9 +872,12 @@ ConstantRange ConstantRange::intrinsic(Intrinsic::ID IntrinsicID,
return Ops[0].smin(Ops[1]);
case Intrinsic::smax:
return Ops[0].smax(Ops[1]);
- case Intrinsic::abs:
- // TODO: Make use of poison flag.
- return Ops[0].abs();
+ case Intrinsic::abs: {
+ const APInt *IntMinIsPoison = Ops[1].getSingleElement();
+ assert(IntMinIsPoison && "Must be known (immarg)");
+ assert(IntMinIsPoison->getBitWidth() == 1 && "Must be boolean");
+ return Ops[0].abs(IntMinIsPoison->getBoolValue());
+ }
default:
assert(!isIntrinsicSupported(IntrinsicID) && "Shouldn't be supported");
llvm_unreachable("Unsupported intrinsic");