]> granicus.if.org Git - llvm/commitdiff
[MemorySSA] Additional handling of unreachable blocks.
authorAlina Sbirlea <asbirlea@google.com>
Thu, 10 Oct 2019 20:43:06 +0000 (20:43 +0000)
committerAlina Sbirlea <asbirlea@google.com>
Thu, 10 Oct 2019 20:43:06 +0000 (20:43 +0000)
Summary:
Whenever we get the previous definition, the assumption is that the
recursion starts ina  reachable block.
If the recursion starts in an unreachable block, we may recurse
indefinitely. Handle this case by returning LoE if the block is
unreachable.

Resolves PR43426.

Reviewers: george.burgess.iv

Subscribers: Prazek, sanjoy.google, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68809

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

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

index 78e197aad5545b6eace86ad3de21489fd875283b..ce74c708df1e4175c8269c42e94c4f008d823f3b 100644 (file)
@@ -48,6 +48,10 @@ MemoryAccess *MemorySSAUpdater::getPreviousDefRecursive(
     return Cached->second;
   }
 
+  // If this method is called from an unreachable block, return LoE.
+  if (!MSSA->DT->isReachableFromEntry(BB))
+    return MSSA->getLiveOnEntryDef();
+
   if (BasicBlock *Pred = BB->getSinglePredecessor()) {
     // Single predecessor case, just recurse, we can only have one definition.
     MemoryAccess *Result = getPreviousDefFromEnd(Pred, CachedPreviousDef);
diff --git a/test/Analysis/MemorySSA/pr43426.ll b/test/Analysis/MemorySSA/pr43426.ll
new file mode 100644 (file)
index 0000000..f603c32
--- /dev/null
@@ -0,0 +1,40 @@
+; RUN: opt -licm -enable-mssa-loop-dependency -S %s | FileCheck %s
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-LABEL: @d()
+define dso_local void @d() {
+entry:
+  br label %header
+
+header:
+  store i32 1, i32* null, align 4
+  br i1 true, label %cleanup53, label %body
+
+body:
+  br i1 undef, label %cleanup31, label %for.cond11
+
+for.cond11: ; Needs branch as is
+  br i1 undef, label %unreachable, label %latch
+
+cleanup31:
+  br label %unreachable
+
+deadblock:
+  br i1 undef, label %unreachable, label %deadblock
+
+cleanup53:
+  %val = load i32, i32* null, align 4
+  %cmpv = icmp eq i32 %val, 0
+  br i1 %cmpv, label %cleanup63, label %latch
+
+latch:
+  br label %header
+
+cleanup63:
+  ret void
+
+unreachable:
+  unreachable
+}
+