]> granicus.if.org Git - llvm/commitdiff
[MemorySSA] Fix phi insertion when inserting a def.
authorAlina Sbirlea <asbirlea@google.com>
Tue, 17 Sep 2019 16:33:35 +0000 (16:33 +0000)
committerAlina Sbirlea <asbirlea@google.com>
Tue, 17 Sep 2019 16:33:35 +0000 (16:33 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372138 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemorySSAUpdater.cpp
test/Analysis/MemorySSA/pr43320.ll [new file with mode: 0644]

index b29be09bda752feef49db1384d2e582fc1ed869c..94417dc551a9f21e2e67c1f1754ac138479604eb 100644 (file)
@@ -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/test/Analysis/MemorySSA/pr43320.ll b/test/Analysis/MemorySSA/pr43320.ll
new file mode 100644 (file)
index 0000000..6aca3f9
--- /dev/null
@@ -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
+}
+