diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-07-30 22:54:53 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-07-30 23:06:10 +0200 |
commit | 9ebeac678855a1bc2492a9630f0300518e2755dc (patch) | |
tree | 5d296367d7378df02e3a0f2aca23f9b4c4adaa85 /llvm/lib/IR/ConstantRange.cpp | |
parent | afae6d97fa55984003321245ec6ceb5af9cc5856 (diff) | |
download | llvm-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.cpp | 9 |
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"); |