[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