summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Analysis/MemorySSAUpdater.cpp82
-rw-r--r--llvm/test/Analysis/MemorySSA/pr43317.ll32
2 files changed, 71 insertions, 43 deletions
diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp
index 94417dc551a..bec811d17e2 100644
--- a/llvm/lib/Analysis/MemorySSAUpdater.cpp
+++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp
@@ -313,10 +313,10 @@ void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) {
// and that def is now our defining access.
MD->setDefiningAccess(DefBefore);
- // Remember the index where we may insert new phis below.
- unsigned NewPhiIndex = InsertedPHIs.size();
-
SmallVector<WeakVH, 8> FixupList(InsertedPHIs.begin(), InsertedPHIs.end());
+
+ SmallPtrSet<BasicBlock *, 2> DefiningBlocks;
+
if (!DefBeforeSameBlock) {
// If there was a local def before us, we must have the same effect it
// did. Because every may-def is the same, any phis/etc we would create, it
@@ -335,53 +335,49 @@ void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) {
auto Iter = MD->getDefsIterator();
++Iter;
auto IterEnd = MSSA->getBlockDefs(MD->getBlock())->end();
- if (Iter == IterEnd) {
- ForwardIDFCalculator IDFs(*MSSA->DT);
- SmallVector<BasicBlock *, 32> IDFBlocks;
- SmallPtrSet<BasicBlock *, 2> DefiningBlocks;
- for (const auto &VH : InsertedPHIs)
- if (const auto *RealPHI = cast_or_null<MemoryPhi>(VH))
- DefiningBlocks.insert(RealPHI->getBlock());
+ if (Iter == IterEnd)
DefiningBlocks.insert(MD->getBlock());
- IDFs.setDefiningBlocks(DefiningBlocks);
- IDFs.calculate(IDFBlocks);
- SmallVector<AssertingVH<MemoryPhi>, 4> NewInsertedPHIs;
- for (auto *BBIDF : IDFBlocks) {
- auto *MPhi = MSSA->getMemoryAccess(BBIDF);
- if (!MPhi) {
- MPhi = MSSA->createMemoryPhi(BBIDF);
- NewInsertedPHIs.push_back(MPhi);
- }
- // Add the phis created into the IDF blocks to NonOptPhis, so they are
- // not optimized out as trivial by the call to getPreviousDefFromEnd
- // below. Once they are complete, all these Phis are added to the
- // FixupList, and removed from NonOptPhis inside fixupDefs().
- // Existing Phis in IDF may need fixing as well, and potentially be
- // trivial before this insertion, hence add all IDF Phis. See PR43044.
- NonOptPhis.insert(MPhi);
- }
- for (auto &MPhi : NewInsertedPHIs) {
- auto *BBIDF = MPhi->getBlock();
- for (auto *Pred : predecessors(BBIDF)) {
- DenseMap<BasicBlock *, TrackingVH<MemoryAccess>> CachedPreviousDef;
- MPhi->addIncoming(getPreviousDefFromEnd(Pred, CachedPreviousDef),
- Pred);
- }
- }
+ FixupList.push_back(MD);
+ }
- // Re-take the index where we're adding the new phis, because the above
- // call to getPreviousDefFromEnd, may have inserted into InsertedPHIs.
- NewPhiIndex = InsertedPHIs.size();
- for (auto &MPhi : NewInsertedPHIs) {
- InsertedPHIs.push_back(&*MPhi);
- FixupList.push_back(&*MPhi);
- }
+ ForwardIDFCalculator IDFs(*MSSA->DT);
+ SmallVector<BasicBlock *, 32> IDFBlocks;
+ for (const auto &VH : InsertedPHIs)
+ if (const auto *RealPHI = cast_or_null<MemoryPhi>(VH))
+ DefiningBlocks.insert(RealPHI->getBlock());
+ IDFs.setDefiningBlocks(DefiningBlocks);
+ IDFs.calculate(IDFBlocks);
+ SmallVector<AssertingVH<MemoryPhi>, 4> NewInsertedPHIs;
+ for (auto *BBIDF : IDFBlocks) {
+ auto *MPhi = MSSA->getMemoryAccess(BBIDF);
+ if (!MPhi) {
+ MPhi = MSSA->createMemoryPhi(BBIDF);
+ NewInsertedPHIs.push_back(MPhi);
}
+ // Add the phis created into the IDF blocks to NonOptPhis, so they are not
+ // optimized out as trivial by the call to getPreviousDefFromEnd below. Once
+ // they are complete, all these Phis are added to the FixupList, and removed
+ // from NonOptPhis inside fixupDefs(). Existing Phis in IDF may need fixing
+ // as well, and potentially be trivial before this insertion, hence add all
+ // IDF Phis. See PR43044.
+ NonOptPhis.insert(MPhi);
+ }
- FixupList.push_back(MD);
+ for (auto &MPhi : NewInsertedPHIs) {
+ auto *BBIDF = MPhi->getBlock();
+ for (auto *Pred : predecessors(BBIDF)) {
+ DenseMap<BasicBlock *, TrackingVH<MemoryAccess>> CachedPreviousDef;
+ MPhi->addIncoming(getPreviousDefFromEnd(Pred, CachedPreviousDef), Pred);
+ }
}
+ // Remember the index where we may insert new phis.
+ unsigned NewPhiIndex = InsertedPHIs.size();
+ for (auto &MPhi : NewInsertedPHIs) {
+ InsertedPHIs.push_back(&*MPhi);
+ FixupList.push_back(&*MPhi);
+ }
// Remember the index where we stopped inserting new phis above, since the
// fixupDefs call in the loop below may insert more, that are already minimal.
unsigned NewPhiIndexEnd = InsertedPHIs.size();
diff --git a/llvm/test/Analysis/MemorySSA/pr43317.ll b/llvm/test/Analysis/MemorySSA/pr43317.ll
new file mode 100644
index 00000000000..c7018b96ff2
--- /dev/null
+++ b/llvm/test/Analysis/MemorySSA/pr43317.ll
@@ -0,0 +1,32 @@
+; RUN: opt -S -licm -enable-mssa-loop-dependency=true < %s | FileCheck %s
+; REQUIRES: asserts
+@v_274 = external dso_local global i64, align 1
+@v_295 = external dso_local global i16, align 1
+@v_335 = external dso_local global i32, align 1
+
+; CHECK-LABEL: @main()
+define dso_local void @main() {
+entry:
+ store i32 undef, i32* @v_335, align 1
+ br i1 undef, label %gate, label %exit
+
+nopredentry1: ; No predecessors!
+ br label %preinfiniteloop
+
+nopredentry2: ; No predecessors!
+ br label %gate
+
+gate: ; preds = %nopredentry2, %entry
+ br i1 undef, label %preinfiniteloop, label %exit
+
+preinfiniteloop: ; preds = %gate, %nopredentry1
+ br label %infiniteloop
+
+infiniteloop: ; preds = %infiniteloop, %preinfiniteloop
+ store i16 undef, i16* @v_295, align 1
+ br label %infiniteloop
+
+exit: ; preds = %gate, %entry
+ store i64 undef, i64* @v_274, align 1
+ ret void
+}
OpenPOWER on IntegriCloud