[PATCH] D68809: [MemorySSA] Additional handling of unreachable blocks.

Alina Sbirlea via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 10 09:36:26 PDT 2019


asbirlea created this revision.
asbirlea added a reviewer: george.burgess.iv.
Herald added subscribers: sanjoy.google, Prazek.
Herald added a project: LLVM.

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.


Repository:
  rL LLVM

https://reviews.llvm.org/D68809

Files:
  lib/Analysis/MemorySSAUpdater.cpp
  test/Analysis/MemorySSA/pr43426.ll


Index: test/Analysis/MemorySSA/pr43426.ll
===================================================================
--- /dev/null
+++ test/Analysis/MemorySSA/pr43426.ll
@@ -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
+}
+
Index: lib/Analysis/MemorySSAUpdater.cpp
===================================================================
--- lib/Analysis/MemorySSAUpdater.cpp
+++ lib/Analysis/MemorySSAUpdater.cpp
@@ -48,6 +48,10 @@
     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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68809.224388.patch
Type: text/x-patch
Size: 1639 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191010/0ad4dd5b/attachment.bin>


More information about the llvm-commits mailing list