mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[MemorySSA] Rename all phi entries.
When renaming Phis incoming values, there may be multiple edges incoming from the same block (switch). Rename all. llvm-svn: 370548
This commit is contained in:
parent
e25039a021
commit
5ec60553a7
@ -1088,9 +1088,14 @@ void MemorySSA::renameSuccessorPhis(BasicBlock *BB, MemoryAccess *IncomingVal,
|
||||
AccessList *Accesses = It->second.get();
|
||||
auto *Phi = cast<MemoryPhi>(&Accesses->front());
|
||||
if (RenameAllUses) {
|
||||
int PhiIndex = Phi->getBasicBlockIndex(BB);
|
||||
assert(PhiIndex != -1 && "Incomplete phi during partial rename");
|
||||
Phi->setIncomingValue(PhiIndex, IncomingVal);
|
||||
bool ReplacementDone = false;
|
||||
for (unsigned I = 0, E = Phi->getNumIncomingValues(); I != E; ++I)
|
||||
if (Phi->getIncomingBlock(I) == BB) {
|
||||
Phi->setIncomingValue(I, IncomingVal);
|
||||
ReplacementDone = true;
|
||||
}
|
||||
(void) ReplacementDone;
|
||||
assert(ReplacementDone && "Incomplete phi during partial rename");
|
||||
} else
|
||||
Phi->addIncoming(IncomingVal, BB);
|
||||
}
|
||||
|
51
test/Analysis/MemorySSA/renamephis.ll
Normal file
51
test/Analysis/MemorySSA/renamephis.ll
Normal file
@ -0,0 +1,51 @@
|
||||
; RUN: opt -licm -enable-mssa-loop-dependency -verify-memoryssa -S %s | FileCheck %s
|
||||
; REQUIRES: asserts
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
@0 = external global { { [86 x i8]*, i32, i32 }, { i16, i16, [20 x i8] }*, i8, i8 }
|
||||
|
||||
declare void @g()
|
||||
|
||||
; Function Attrs: argmemonly nounwind willreturn
|
||||
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #0
|
||||
|
||||
; CHECK-LABEL: @f
|
||||
define void @f() align 2 {
|
||||
entry:
|
||||
%P = alloca i32*, align 8
|
||||
br label %cond.end.i.i.i.i
|
||||
|
||||
cond.end.i.i.i.i: ; preds = %cont20, %entry
|
||||
br i1 undef, label %cont20, label %if.end
|
||||
|
||||
cont20: ; preds = %cond.end.i.i.i.i, %cond.end.i.i.i.i, %cond.end.i.i.i.i
|
||||
store i32* undef, i32** %P, align 8
|
||||
br label %cond.end.i.i.i.i
|
||||
|
||||
if.end: ; preds = %cond.end.i.i.i.i
|
||||
br i1 undef, label %cond.exit, label %handler.type_mismatch2.i
|
||||
|
||||
handler.type_mismatch2.i: ; preds = %if.end
|
||||
tail call void @g()
|
||||
unreachable
|
||||
|
||||
cond.exit: ; preds = %if.end
|
||||
switch i8 undef, label %block.exit [
|
||||
i8 81, label %sw.bb94
|
||||
i8 12, label %cleanup
|
||||
i8 74, label %cleanup
|
||||
]
|
||||
|
||||
block.exit: ; preds = %cond.exit
|
||||
unreachable
|
||||
|
||||
sw.bb94: ; preds = %cond.exit
|
||||
call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull undef)
|
||||
br label %cleanup
|
||||
|
||||
cleanup: ; preds = %sw.bb94, %cond.exit, %cond.exit
|
||||
ret void
|
||||
}
|
||||
|
||||
attributes #0 = { argmemonly nounwind willreturn }
|
Loading…
x
Reference in New Issue
Block a user