summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2019-09-17 16:33:35 +0000
committerAlina Sbirlea <asbirlea@google.com>2019-09-17 16:33:35 +0000
commit4e9082ef95db5d760df4cce00a4351fa122176d6 (patch)
tree3877aeaae23bdc752e2346e0d1c33303c0c69628
parent6b2d1346d8ed4c47fb61a249e0bb246dc9731144 (diff)
downloadbcm5719-llvm-4e9082ef95db5d760df4cce00a4351fa122176d6.tar.gz
bcm5719-llvm-4e9082ef95db5d760df4cce00a4351fa122176d6.zip
[MemorySSA] Fix phi insertion when inserting a def.
Summary: When inserting a Def, the current algorithm is walking edges backward and inserting new Phis where needed. There may be additional Phis needed in the IDF of the newly inserted Def and Phis. Adding Phis in the IDF of the Def was added ina previous patch, but we may also need other Phis in the IDF of the newly added Phis. Reviewers: george.burgess.iv Subscribers: Prazek, sanjoy.google, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67637 llvm-svn: 372138
-rw-r--r--llvm/lib/Analysis/MemorySSAUpdater.cpp3
-rw-r--r--llvm/test/Analysis/MemorySSA/pr43320.ll33
2 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp
index b29be09bda7..94417dc551a 100644
--- a/llvm/lib/Analysis/MemorySSAUpdater.cpp
+++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp
@@ -339,6 +339,9 @@ void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) {
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());
DefiningBlocks.insert(MD->getBlock());
IDFs.setDefiningBlocks(DefiningBlocks);
IDFs.calculate(IDFBlocks);
diff --git a/llvm/test/Analysis/MemorySSA/pr43320.ll b/llvm/test/Analysis/MemorySSA/pr43320.ll
new file mode 100644
index 00000000000..6aca3f9eeb1
--- /dev/null
+++ b/llvm/test/Analysis/MemorySSA/pr43320.ll
@@ -0,0 +1,33 @@
+; RUN: opt -licm -enable-mssa-loop-dependency -verify-memoryssa -S < %s | FileCheck %s
+; REQUIRES: asserts
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-none-eabi"
+
+; CHECK-LABEL: @e()
+define void @e() {
+entry:
+ br label %g
+
+g: ; preds = %cleanup, %entry
+ %0 = load i32, i32* null, align 4
+ %and = and i32 %0, undef
+ store i32 %and, i32* null, align 4
+ br i1 undef, label %if.end8, label %if.then
+
+if.then: ; preds = %g
+ br i1 undef, label %k, label %cleanup
+
+k: ; preds = %if.end8, %if.then
+ br i1 undef, label %if.end8, label %cleanup
+
+if.end8: ; preds = %k, %g
+ br i1 undef, label %for.cond.preheader, label %k
+
+for.cond.preheader: ; preds = %if.end8
+ unreachable
+
+cleanup: ; preds = %k, %if.then
+ br label %g
+}
+
OpenPOWER on IntegriCloud