summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2017-09-30 23:51:55 +0000
committerDaniel Berlin <dberlin@dberlin.org>2017-09-30 23:51:55 +0000
commitd36c27bedbc79f03d01fea5fdc8b5df4973c6c3d (patch)
tree143e92a5ef2a386a42f02af7a99e43e888467433 /llvm/lib/Transforms/Scalar
parentc1305af09ba4455d77e0426f5625ff9354d2c0eb (diff)
downloadbcm5719-llvm-d36c27bedbc79f03d01fea5fdc8b5df4973c6c3d.tar.gz
bcm5719-llvm-d36c27bedbc79f03d01fea5fdc8b5df4973c6c3d.zip
NewGVN: Fix PR 34473, by not using ExactlyEqualsExpression for finding
phi of ops users. llvm-svn: 314612
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
-rw-r--r--llvm/lib/Transforms/Scalar/NewGVN.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp
index ae7df4c0356..8eb60194c29 100644
--- a/llvm/lib/Transforms/Scalar/NewGVN.cpp
+++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp
@@ -2249,7 +2249,7 @@ void NewGVN::moveValueToNewCongruenceClass(Instruction *I, const Expression *E,
// For a given expression, mark the phi of ops instructions that could have
// changed as a result.
void NewGVN::markPhiOfOpsChanged(const Expression *E) {
- touchAndErase(ExpressionToPhiOfOps, ExactEqualsExpression(*E));
+ touchAndErase(ExpressionToPhiOfOps, E);
}
// Perform congruence finding on a given value numbering expression.
@@ -2668,6 +2668,7 @@ NewGVN::makePossiblePHIOfOps(Instruction *I,
if (!DebugCounter::shouldExecute(PHIOfOpsCounter))
return nullptr;
SmallVector<ValPair, 4> Ops;
+ SmallPtrSet<Value *, 4> Deps;
auto *PHIBlock = getBlockForValue(OpPHI);
RevisitOnReachabilityChange[PHIBlock].reset(InstrToDFSNum(I));
for (unsigned PredNum = 0; PredNum < OpPHI->getNumOperands(); ++PredNum) {
@@ -2686,18 +2687,15 @@ NewGVN::makePossiblePHIOfOps(Instruction *I,
for (auto &Op : ValueOp->operands()) {
auto *OrigOp = &*Op;
// When these operand changes, it could change whether there is a
- // leader for us or not, so we have to add additional users
+ // leader for us or not, so we have to add additional users.
if (isa<PHINode>(Op)) {
Op = Op->DoPHITranslation(PHIBlock, PredBB);
if (Op != OrigOp && Op != I)
- addAdditionalUsers(Op, I);
+ Deps.insert(Op);
} else if (auto *ValuePHI = RealToTemp.lookup(Op)) {
if (getBlockForValue(ValuePHI) == PHIBlock)
Op = ValuePHI->getIncomingValue(PredNum);
}
- // When this operand changes, it could change whether there is a
- // leader for us or not.
- addAdditionalUsers(Op, I);
// If we phi-translated the op, it must be safe.
SafeForPHIOfOps = SafeForPHIOfOps &&
(Op != OrigOp ||
@@ -2726,6 +2724,8 @@ NewGVN::makePossiblePHIOfOps(Instruction *I,
DEBUG(dbgs() << "Found phi of ops operand " << *FoundVal << " in "
<< getBlockName(PredBB) << "\n");
}
+ for (auto Dep : Deps)
+ addAdditionalUsers(Dep, I);
sortPHIOps(Ops);
auto *E = performSymbolicPHIEvaluation(Ops, I, PHIBlock);
if (isa<ConstantExpression>(E) || isa<VariableExpression>(E)) {
OpenPOWER on IntegriCloud