1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

StructurizeCFG: Fix verification failure with some loops.

If the beginning of the loop was also the entry block
of the function, branches were inserted to the entry block
which isn't allowed. If this occurs, create a new dummy
function entry block that branches to the start of the loop.

llvm-svn: 195493
This commit is contained in:
Matt Arsenault 2013-11-22 19:24:39 +00:00
parent 9afcbf3562
commit 35acaad8c7
2 changed files with 45 additions and 0 deletions

View File

@ -779,6 +779,20 @@ void StructurizeCFG::handleLoops(bool ExitUseAllowed,
handleLoops(false, LoopEnd);
}
// If the start of the loop is the entry block, we can't branch to it so
// insert a new dummy entry block.
Function *LoopFunc = LoopStart->getParent();
if (LoopStart == &LoopFunc->getEntryBlock()) {
LoopStart->setName("entry.orig");
BasicBlock *NewEntry =
BasicBlock::Create(LoopStart->getContext(),
"entry",
LoopFunc,
LoopStart);
BranchInst::Create(LoopStart, NewEntry);
}
// Create an extra loop end node
LoopEnd = needPrefix(false);
BasicBlock *Next = needPostfix(LoopEnd, ExitUseAllowed);

View File

@ -0,0 +1,31 @@
; RUN: opt -S -o - -structurizecfg < %s | FileCheck %s
; CHECK-LABEL: @no_branch_to_entry_undef(
; CHECK: entry:
; CHECK-NEXT: br label %entry.orig
define void @no_branch_to_entry_undef(i32 addrspace(1)* %out) {
entry:
br i1 undef, label %for.end, label %for.body
for.body: ; preds = %entry, %for.body
store i32 999, i32 addrspace(1)* %out, align 4
br label %for.body
for.end: ; preds = %Flow
ret void
}
; CHECK-LABEL: @no_branch_to_entry_true(
; CHECK: entry:
; CHECK-NEXT: br label %entry.orig
define void @no_branch_to_entry_true(i32 addrspace(1)* %out) {
entry:
br i1 true, label %for.end, label %for.body
for.body: ; preds = %entry, %for.body
store i32 999, i32 addrspace(1)* %out, align 4
br label %for.body
for.end: ; preds = %Flow
ret void
}