From 190a2948690a2cbcadb5c1af964f67b81c98dad3 Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Tue, 5 Sep 2017 02:17:40 +0000 Subject: [PATCH] NewGVN: Change where check for original instruction in phi of ops leader finding is done. Where we had it before, we would stop looking when we hit the original instruction, but skip it. Now we skip it and keep looking. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312507 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/NewGVN.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/NewGVN.cpp b/lib/Transforms/Scalar/NewGVN.cpp index 45f49d4d12e..e9046d9af05 100644 --- a/lib/Transforms/Scalar/NewGVN.cpp +++ b/lib/Transforms/Scalar/NewGVN.cpp @@ -713,7 +713,9 @@ private: void replaceInstruction(Instruction *, Value *); void markInstructionForDeletion(Instruction *); void deleteInstructionsInBlock(BasicBlock *); - Value *findPHIOfOpsLeader(const Expression *E, const BasicBlock *BB) const; + Value *findPHIOfOpsLeader(const Expression *, const Instruction *, + const BasicBlock *) const; + // New instruction creation. void handleNewInstruction(Instruction *){}; @@ -2551,8 +2553,8 @@ Value *NewGVN::findLeaderForInst(Instruction *TransInst, TempToMemory.erase(TransInst); if (!E) return nullptr; - auto *FoundVal = findPHIOfOpsLeader(E, PredBB); - if (!FoundVal || FoundVal == OrigInst) { + auto *FoundVal = findPHIOfOpsLeader(E, OrigInst, PredBB); + if (!FoundVal) { ExpressionToPhiOfOps[E].insert(OrigInst); DEBUG(dbgs() << "Cannot find phi of ops operand for " << *TransInst << " in block " << getBlockName(PredBB) << "\n"); @@ -3622,6 +3624,7 @@ CongruenceClass *NewGVN::getClassForExpression(const Expression *E) const { // Given a value and a basic block we are trying to see if it is available in, // see if the value has a leader available in that block. Value *NewGVN::findPHIOfOpsLeader(const Expression *E, + const Instruction *OrigInst, const BasicBlock *BB) const { // It would already be constant if we could make it constant if (auto *CE = dyn_cast(E)) @@ -3640,6 +3643,8 @@ Value *NewGVN::findPHIOfOpsLeader(const Expression *E, for (auto Member : *CC) { auto *MemberInst = dyn_cast(Member); + if (MemberInst == OrigInst) + continue; // Anything that isn't an instruction is always available. if (!MemberInst) return Member; -- 2.50.1