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 =
|
Value *RHS =
|
||||||
getValueOnFirstIteration(BO->getOperand(1), FirstIterValue, SQ);
|
getValueOnFirstIteration(BO->getOperand(1), FirstIterValue, SQ);
|
||||||
FirstIterV = SimplifyBinOp(BO->getOpcode(), LHS, RHS, 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)
|
if (!FirstIterV)
|
||||||
FirstIterV = V;
|
FirstIterV = V;
|
||||||
|
@ -314,22 +320,20 @@ static bool canProveExitOnFirstIteration(Loop *L, DominatorTree &DT,
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace PatternMatch;
|
using namespace PatternMatch;
|
||||||
ICmpInst::Predicate Pred;
|
Value *Cond;
|
||||||
Value *LHS, *RHS;
|
|
||||||
BasicBlock *IfTrue, *IfFalse;
|
BasicBlock *IfTrue, *IfFalse;
|
||||||
auto *Term = BB->getTerminator();
|
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)))) {
|
m_BasicBlock(IfTrue), m_BasicBlock(IfFalse)))) {
|
||||||
if (!LHS->getType()->isIntegerTy()) {
|
auto *ICmp = dyn_cast<ICmpInst>(Cond);
|
||||||
|
if (!ICmp || !ICmp->getType()->isIntegerTy()) {
|
||||||
MarkAllSuccessorsLive(BB);
|
MarkAllSuccessorsLive(BB);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Can we prove constant true or false for this condition?
|
// Can we prove constant true or false for this condition?
|
||||||
LHS = getValueOnFirstIteration(LHS, FirstIterValue, SQ);
|
auto *KnownCondition = getValueOnFirstIteration(ICmp, FirstIterValue, SQ);
|
||||||
RHS = getValueOnFirstIteration(RHS, FirstIterValue, SQ);
|
if (KnownCondition == ICmp) {
|
||||||
auto *KnownCondition = SimplifyICmpInst(Pred, LHS, RHS, SQ);
|
|
||||||
if (!KnownCondition) {
|
|
||||||
// Failed to simplify.
|
// Failed to simplify.
|
||||||
MarkAllSuccessorsLive(BB);
|
MarkAllSuccessorsLive(BB);
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in New Issue