summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2013-11-22 19:24:39 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2013-11-22 19:24:39 +0000
commit08e1b756df4bed91621c9a056ace8d8f5b98304c (patch)
treec10acf9921382f4916fa539fec4baabc5bfae985 /lib/Transforms
parent7575fdd7a4b5cadc0f0715fd101728b0a8188121 (diff)
downloadllvm-08e1b756df4bed91621c9a056ace8d8f5b98304c.tar.gz
llvm-08e1b756df4bed91621c9a056ace8d8f5b98304c.tar.bz2
llvm-08e1b756df4bed91621c9a056ace8d8f5b98304c.tar.xz
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/trunk@195493 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/StructurizeCFG.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/StructurizeCFG.cpp b/lib/Transforms/Scalar/StructurizeCFG.cpp
index 0124dfdbeb..5045ff8fdf 100644
--- a/lib/Transforms/Scalar/StructurizeCFG.cpp
+++ b/lib/Transforms/Scalar/StructurizeCFG.cpp
@@ -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);