aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LazyValueInfo.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2022-11-02 11:25:42 +0100
committerNikita Popov <npopov@redhat.com>2022-11-03 15:35:27 +0100
commit68b24c3b448946f86586be6e66af64cdce6edadc (patch)
treef7cd6fc7ea5e3eb2ca8477d0fe568da37692a13b /llvm/lib/Analysis/LazyValueInfo.cpp
parent150fc73ddab65901e2f89c70af436706b859eef8 (diff)
downloadllvm-68b24c3b448946f86586be6e66af64cdce6edadc.zip
llvm-68b24c3b448946f86586be6e66af64cdce6edadc.tar.gz
llvm-68b24c3b448946f86586be6e66af64cdce6edadc.tar.bz2
[CVP] Simplify comparisons without constant operand
CVP currently only tries to simplify comparisons if there is a constant operand. However, even if both are non-constant, we may be able to determine the result of the comparison based on range information. IPSCCP is already capable of doing this, but because it runs very early, it may miss some cases. Differential Revision: https://reviews.llvm.org/D137253
Diffstat (limited to 'llvm/lib/Analysis/LazyValueInfo.cpp')
-rw-r--r--llvm/lib/Analysis/LazyValueInfo.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index 2fae260..6f61091 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -1859,9 +1859,27 @@ LazyValueInfo::Tristate LazyValueInfo::getPredicateAt(unsigned P, Value *LHS,
return getPredicateAt(CmpInst::getSwappedPredicate(Pred), RHS, C, CxtI,
UseBlockValue);
- // Got two non-Constant values. While we could handle them somewhat,
- // by getting their constant ranges, and applying ConstantRange::icmp(),
- // so far it did not appear to be profitable.
+ // Got two non-Constant values. Try to determine the comparison results based
+ // on the block values of the two operands, e.g. because they have
+ // non-overlapping ranges.
+ if (UseBlockValue) {
+ Module *M = CxtI->getModule();
+ ValueLatticeElement L =
+ getImpl(PImpl, AC, M).getValueInBlock(LHS, CxtI->getParent(), CxtI);
+ if (L.isOverdefined())
+ return LazyValueInfo::Unknown;
+
+ ValueLatticeElement R =
+ getImpl(PImpl, AC, M).getValueInBlock(RHS, CxtI->getParent(), CxtI);
+ Type *Ty = CmpInst::makeCmpResultType(LHS->getType());
+ if (Constant *Res = L.getCompare((CmpInst::Predicate)P, Ty, R,
+ M->getDataLayout())) {
+ if (Res->isNullValue())
+ return LazyValueInfo::False;
+ if (Res->isOneValue())
+ return LazyValueInfo::True;
+ }
+ }
return LazyValueInfo::Unknown;
}