mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-04 05:31:51 +00:00
Merging r195493:
------------------------------------------------------------------------ r195493 | arsenm | 2013-11-22 11:24:39 -0800 (Fri, 22 Nov 2013) | 6 lines 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. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_34@195606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
215aad562c
commit
e96466ecc0
@ -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);
|
||||
|
31
test/Transforms/StructurizeCFG/no-branch-to-entry.ll
Normal file
31
test/Transforms/StructurizeCFG/no-branch-to-entry.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user