NewGVN: Fix PR33194, memory corruption by putting temporary instructions in tables sometimes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304194 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Berlin 2017-05-30 06:42:29 +00:00
parent 38012725da
commit 328a635eb4

View File

@ -956,8 +956,12 @@ const Expression *NewGVN::checkSimplificationResults(Expression *E,
if (CC && CC->getDefiningExpr()) { if (CC && CC->getDefiningExpr()) {
// If we simplified to something else, we need to communicate // If we simplified to something else, we need to communicate
// that we're users of the value we simplified to. // that we're users of the value we simplified to.
if (I != V) if (I != V) {
addAdditionalUsers(V, I); // Don't add temporary instructions to the user lists.
if (!AllTempInstructions.count(I))
addAdditionalUsers(V, I);
}
if (I) if (I)
DEBUG(dbgs() << "Simplified " << *I << " to " DEBUG(dbgs() << "Simplified " << *I << " to "
<< " expression " << *CC->getDefiningExpr() << "\n"); << " expression " << *CC->getDefiningExpr() << "\n");
@ -2502,9 +2506,8 @@ NewGVN::makePossiblePhiOfOps(Instruction *I, bool HasBackedge,
// Clone the instruction, create an expression from it, and see if we // Clone the instruction, create an expression from it, and see if we
// have a leader. // have a leader.
Instruction *ValueOp = I->clone(); Instruction *ValueOp = I->clone();
auto Iter = TempToMemory.end();
if (MemAccess) if (MemAccess)
Iter = TempToMemory.insert({ValueOp, MemAccess}).first; TempToMemory.insert({ValueOp, MemAccess});
for (auto &Op : ValueOp->operands()) { for (auto &Op : ValueOp->operands()) {
Op = Op->DoPHITranslation(PHIBlock, PredBB); Op = Op->DoPHITranslation(PHIBlock, PredBB);
@ -2523,7 +2526,7 @@ NewGVN::makePossiblePhiOfOps(Instruction *I, bool HasBackedge,
AllTempInstructions.erase(ValueOp); AllTempInstructions.erase(ValueOp);
ValueOp->deleteValue(); ValueOp->deleteValue();
if (MemAccess) if (MemAccess)
TempToMemory.erase(Iter); TempToMemory.erase(ValueOp);
if (!E) if (!E)
return nullptr; return nullptr;
FoundVal = findPhiOfOpsLeader(E, PredBB); FoundVal = findPhiOfOpsLeader(E, PredBB);