diff options
| author | Daniel Berlin <dberlin@dberlin.org> | 2017-09-05 02:17:40 +0000 |
|---|---|---|
| committer | Daniel Berlin <dberlin@dberlin.org> | 2017-09-05 02:17:40 +0000 |
| commit | 4ad7e8d2633f303fe51f14ae6a69dfe84c7ec818 (patch) | |
| tree | c58f256e60a8eb1428f66677d749e8a5abc7b315 /llvm/lib/Transforms/Scalar | |
| parent | debbaefb76230baf7e1181eaeac7ac44aeaccd17 (diff) | |
| download | bcm5719-llvm-4ad7e8d2633f303fe51f14ae6a69dfe84c7ec818.tar.gz bcm5719-llvm-4ad7e8d2633f303fe51f14ae6a69dfe84c7ec818.zip | |
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.
llvm-svn: 312507
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/NewGVN.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp index 45f49d4d12e..e9046d9af05 100644 --- a/llvm/lib/Transforms/Scalar/NewGVN.cpp +++ b/llvm/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<ConstantExpression>(E)) @@ -3640,6 +3643,8 @@ Value *NewGVN::findPHIOfOpsLeader(const Expression *E, for (auto Member : *CC) { auto *MemberInst = dyn_cast<Instruction>(Member); + if (MemberInst == OrigInst) + continue; // Anything that isn't an instruction is always available. if (!MemberInst) return Member; |

