[llvm] r274606 - Fix handling of forward unreachable but reverse-reachable blocks in MemorySSA construction

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 5 22:32:05 PDT 2016


Author: dannyb
Date: Wed Jul  6 00:32:05 2016
New Revision: 274606

URL: http://llvm.org/viewvc/llvm-project?rev=274606&view=rev
Log:
Fix handling of forward unreachable but reverse-reachable blocks in MemorySSA construction

Added:
    llvm/trunk/test/Transforms/Util/MemorySSA/forward-unreachable.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp

Modified: llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp?rev=274606&r1=274605&r2=274606&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/MemorySSA.cpp Wed Jul  6 00:32:05 2016
@@ -201,8 +201,6 @@ MemoryAccess *MemorySSA::renameBlock(Bas
       continue;
     AccessList *Accesses = It->second.get();
     auto *Phi = cast<MemoryPhi>(&Accesses->front());
-    assert(std::find(succ_begin(BB), succ_end(BB), S) != succ_end(BB) &&
-           "Must be at least one edge from Succ to BB!");
     Phi->addIncoming(IncomingVal, BB);
   }
 
@@ -252,6 +250,22 @@ void MemorySSA::markUnreachableAsLiveOnE
   assert(!DT->isReachableFromEntry(BB) &&
          "Reachable block found while handling unreachable blocks");
 
+  // Make sure phi nodes in our reachable successors end up with a
+  // LiveOnEntryDef for our incoming edge, even though our block is forward
+  // unreachable.  We could just disconnect these blocks from the CFG fully,
+  // but we do not right now.
+  for (const BasicBlock *S : successors(BB)) {
+    if (!DT->isReachableFromEntry(S))
+      continue;
+    auto It = PerBlockAccesses.find(S);
+    // Rename the phi nodes in our successor block
+    if (It == PerBlockAccesses.end() || !isa<MemoryPhi>(It->second->front()))
+      continue;
+    AccessList *Accesses = It->second.get();
+    auto *Phi = cast<MemoryPhi>(&Accesses->front());
+    Phi->addIncoming(LiveOnEntryDef.get(), BB);
+  }
+
   auto It = PerBlockAccesses.find(BB);
   if (It == PerBlockAccesses.end())
     return;

Added: llvm/trunk/test/Transforms/Util/MemorySSA/forward-unreachable.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Util/MemorySSA/forward-unreachable.ll?rev=274606&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/Util/MemorySSA/forward-unreachable.ll (added)
+++ llvm/trunk/test/Transforms/Util/MemorySSA/forward-unreachable.ll Wed Jul  6 00:32:05 2016
@@ -0,0 +1,23 @@
+; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+
+define void @test() {
+entry:
+  br i1 undef, label %split1, label %split2
+
+split1:
+  store i16 undef, i16* undef, align 2
+ br label %merge
+split2:
+ br label %merge
+forwardunreachable:
+  br label %merge
+merge:
+; The forwardunreachable block still needs an entry in the phi node,
+; because it is reverse reachable, so the CFG still has it as a
+; predecessor of the block
+; CHECK:  3 = MemoryPhi({split1,1},{split2,liveOnEntry},{forwardunreachable,liveOnEntry})
+  store i16 undef, i16* undef, align 2
+  ret void
+}
+




More information about the llvm-commits mailing list