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 | |
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.
-rw-r--r-- | llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp | 37 | ||||
-rw-r--r-- | llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll | 30 |
2 files changed, 51 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; + } } } diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll b/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll index 5c26566..579ec8e 100644 --- a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll +++ b/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-overlap.ll @@ -110,3 +110,33 @@ bb9: ; preds = %bb8, %bb7 store double 6.0, double* %tmp3, align 8 ret void } + +; Test case from PR46513. Make sure we do not crash. +; TODO: we should be able to shorten store i32 844283136, i32* %cast.i32 to a +; store of i16. +define void @overlap_no_dominance([4 x i8]* %arg, i1 %c) { +; CHECK-LABEL: @overlap_no_dominance( +; CHECK-NEXT: bb: +; CHECK-NEXT: br i1 [[C:%.*]], label [[BB13:%.*]], label [[BB9:%.*]] +; CHECK: bb9: +; CHECK-NEXT: [[CAST_I32:%.*]] = bitcast [4 x i8]* [[ARG:%.*]] to i32* +; CHECK-NEXT: store i32 844283136, i32* [[CAST_I32]], align 4 +; CHECK-NEXT: br label [[BB13]] +; CHECK: bb13: +; CHECK-NEXT: [[CAST_I16:%.*]] = bitcast [4 x i8]* [[ARG]] to i16* +; CHECK-NEXT: store i16 0, i16* [[CAST_I16]], align 4 +; CHECK-NEXT: ret void +; +bb: + br i1 %c, label %bb13, label %bb9 + +bb9: ; preds = %bb + %cast.i32 = bitcast [4 x i8]* %arg to i32* + store i32 844283136, i32* %cast.i32, align 4 + br label %bb13 + +bb13: ; preds = %bb9, %bb + %cast.i16 = bitcast [4 x i8]* %arg to i16* + store i16 0, i16* %cast.i16, align 4 + ret void +} |