forked from OSchip/llvm-project
[LoopDeletion] Move ICmpInst handling to getValueOnFirstIteration()
As noticed in https://reviews.llvm.org/D105688, it would be great to move handling of ICmpInst which was in canProveExitOnFirstIteration() to getValueOnFirstIteration(). Patch by Dmitry Makogon! Differential Revision: https://reviews.llvm.org/D108978 Reviewed By: reames
This commit is contained in:
parent
90d5298759
commit
718157283c
|
@ -191,6 +191,12 @@ getValueOnFirstIteration(Value *V, DenseMap<Value *, Value *> &FirstIterValue,
|
|||
Value *RHS =
|
||||
getValueOnFirstIteration(BO->getOperand(1), FirstIterValue, SQ);
|
||||
FirstIterV = SimplifyBinOp(BO->getOpcode(), LHS, RHS, SQ);
|
||||
} else if (auto *Cmp = dyn_cast<ICmpInst>(V)) {
|
||||
Value *LHS =
|
||||
getValueOnFirstIteration(Cmp->getOperand(0), FirstIterValue, SQ);
|
||||
Value *RHS =
|
||||
getValueOnFirstIteration(Cmp->getOperand(1), FirstIterValue, SQ);
|
||||
FirstIterV = SimplifyICmpInst(Cmp->getPredicate(), LHS, RHS, SQ);
|
||||
}
|
||||
if (!FirstIterV)
|
||||
FirstIterV = V;
|
||||
|
@ -314,22 +320,20 @@ static bool canProveExitOnFirstIteration(Loop *L, DominatorTree &DT,
|
|||
}
|
||||
|
||||
using namespace PatternMatch;
|
||||
ICmpInst::Predicate Pred;
|
||||
Value *LHS, *RHS;
|
||||
Value *Cond;
|
||||
BasicBlock *IfTrue, *IfFalse;
|
||||
auto *Term = BB->getTerminator();
|
||||
if (match(Term, m_Br(m_ICmp(Pred, m_Value(LHS), m_Value(RHS)),
|
||||
if (match(Term, m_Br(m_Value(Cond),
|
||||
m_BasicBlock(IfTrue), m_BasicBlock(IfFalse)))) {
|
||||
if (!LHS->getType()->isIntegerTy()) {
|
||||
auto *ICmp = dyn_cast<ICmpInst>(Cond);
|
||||
if (!ICmp || !ICmp->getType()->isIntegerTy()) {
|
||||
MarkAllSuccessorsLive(BB);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Can we prove constant true or false for this condition?
|
||||
LHS = getValueOnFirstIteration(LHS, FirstIterValue, SQ);
|
||||
RHS = getValueOnFirstIteration(RHS, FirstIterValue, SQ);
|
||||
auto *KnownCondition = SimplifyICmpInst(Pred, LHS, RHS, SQ);
|
||||
if (!KnownCondition) {
|
||||
auto *KnownCondition = getValueOnFirstIteration(ICmp, FirstIterValue, SQ);
|
||||
if (KnownCondition == ICmp) {
|
||||
// Failed to simplify.
|
||||
MarkAllSuccessorsLive(BB);
|
||||
continue;
|
||||
|
|
Loading…
Reference in New Issue