diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2018-02-07 07:56:26 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2018-02-07 07:56:26 +0000 |
commit | dd5ee6f5d9af2424236fa2ea74b6686e41050fe6 (patch) | |
tree | 6e672023c8ed51ac6168f66e3340f5722952697b /llvm/lib/IR/Instructions.cpp | |
parent | cae66ba5f8dd803103904fd38a1e85d7c5d234de (diff) | |
download | bcm5719-llvm-dd5ee6f5d9af2424236fa2ea74b6686e41050fe6.tar.gz bcm5719-llvm-dd5ee6f5d9af2424236fa2ea74b6686e41050fe6.zip |
[SCEV] Make isLoopEntryGuardedByCond a bit smarter
Sometimes `isLoopEntryGuardedByCond` cannot prove predicate `a > b` directly.
But it is a common situation when `a >= b` is known from ranges and `a != b` is
known from a dominating condition. Thia patch teaches SCEV to sum these facts
together and prove strict comparison via non-strict one.
Differential Revision: https://reviews.llvm.org/D42835
llvm-svn: 324453
Diffstat (limited to 'llvm/lib/IR/Instructions.cpp')
-rw-r--r-- | llvm/lib/IR/Instructions.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 490fcbce743..7fa4b06c566 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -3467,6 +3467,20 @@ CmpInst::Predicate CmpInst::getSwappedPredicate(Predicate pred) { } } +CmpInst::Predicate CmpInst::getNonStrictPredicate(Predicate pred) { + switch (pred) { + case ICMP_SGT: return ICMP_SGE; + case ICMP_SLT: return ICMP_SLE; + case ICMP_UGT: return ICMP_UGE; + case ICMP_ULT: return ICMP_ULE; + case FCMP_OGT: return FCMP_OGE; + case FCMP_OLT: return FCMP_OLE; + case FCMP_UGT: return FCMP_UGE; + case FCMP_ULT: return FCMP_ULE; + default: return pred; + } +} + CmpInst::Predicate CmpInst::getSignedPredicate(Predicate pred) { assert(CmpInst::isUnsigned(pred) && "Call only with signed predicates!"); |