diff options
author | Florian Hahn <flo@fhahn.com> | 2020-08-13 11:56:40 +0100 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2020-08-13 12:07:56 +0100 |
commit | 3b0878a370055f2a8a6f3c0f05f00d33589c20cf (patch) | |
tree | 82365006922f25d86bb498069aed9622f8cc0881 /llvm/lib | |
parent | 02e2bd8c4b933f0f756ca4de406e93f4272c3d7a (diff) | |
download | llvm-3b0878a370055f2a8a6f3c0f05f00d33589c20cf.zip llvm-3b0878a370055f2a8a6f3c0f05f00d33589c20cf.tar.gz llvm-3b0878a370055f2a8a6f3c0f05f00d33589c20cf.tar.bz2 |
[DSE,MSSA] Fix crash when using tryToMergePartialOverlappingStores.
We are re-using tryToMergePartialOverlappingStores, which requires
earlier to domiante Later. In the long run,
tryToMergeParialOverlappingStores should be re-written using MemorySSA.
Fixes PR46513.
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index 048b67a..261fb387 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -2249,22 +2249,27 @@ bool eliminateDeadStoresMemorySSA(Function &F, AliasAnalysis &AA, if (EnablePartialStoreMerging && OR == OW_PartialEarlierWithFullLater) { auto *Earlier = dyn_cast<StoreInst>(NI); auto *Later = dyn_cast<StoreInst>(SI); - if (Constant *Merged = tryToMergePartialOverlappingStores( - Earlier, Later, InstWriteOffset, DepWriteOffset, DL, &AA, - &DT)) { - - // Update stored value of earlier store to merged constant. - Earlier->setOperand(0, Merged); - ++NumModifiedStores; - MadeChange = true; - - // Remove later store and remove any outstanding overlap intervals - // for the updated store. - State.deleteDeadInstruction(Later); - auto I = State.IOLs.find(Earlier->getParent()); - if (I != State.IOLs.end()) - I->second.erase(Earlier); - break; + // We are re-using tryToMergePartialOverlappingStores, which requires + // Earlier to domiante Later. + // TODO: implement tryToMergeParialOverlappingStores using MemorySSA. + if (Earlier && Later && DT.dominates(Earlier, Later)) { + if (Constant *Merged = tryToMergePartialOverlappingStores( + Earlier, Later, InstWriteOffset, DepWriteOffset, DL, &AA, + &DT)) { + + // Update stored value of earlier store to merged constant. + Earlier->setOperand(0, Merged); + ++NumModifiedStores; + MadeChange = true; + + // Remove later store and remove any outstanding overlap intervals + // for the updated store. + State.deleteDeadInstruction(Later); + auto I = State.IOLs.find(Earlier->getParent()); + if (I != State.IOLs.end()) + I->second.erase(Earlier); + break; + } } } |