diff options
author | Hal Finkel <hfinkel@anl.gov> | 2015-02-07 07:32:58 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2015-02-07 07:32:58 +0000 |
commit | 291cc7bacde8fe093aee4e7cc5b09fc90f61d4bc (patch) | |
tree | 188e65a68015779bd16163502b5ce50167cc09ec /llvm/lib/Target | |
parent | 7e575ed1eae1755c044ee80d6e1d81aedd2b37a0 (diff) | |
download | bcm5719-llvm-291cc7bacde8fe093aee4e7cc5b09fc90f61d4bc.tar.gz bcm5719-llvm-291cc7bacde8fe093aee4e7cc5b09fc90f61d4bc.zip |
[PowerPC] Handle loop predecessor invokes
If a loop predecessor has an invoke as its terminator, and the return value
from that invoke is used to determine the loop iteration space, then we can't
insert a computation based on that value in the loop predecessor prior to the
terminator (oops). If there's such an invoke, or just no predecessor for that
matter, insert a new loop preheader.
llvm-svn: 228488
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp b/llvm/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp index 76dbebc47bc..d370819d949 100644 --- a/llvm/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp +++ b/llvm/lib/Target/PowerPC/PPCLoopPreIncPrep.cpp @@ -41,6 +41,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Local.h" +#include "llvm/Transforms/Utils/LoopUtils.h" #include "llvm/Transforms/Utils/ValueMapper.h" using namespace llvm; @@ -165,9 +166,6 @@ bool PPCLoopPreIncPrep::runOnLoop(Loop *L) { return MadeChange; BasicBlock *Header = L->getHeader(); - BasicBlock *LoopPredecessor = L->getLoopPredecessor(); - if (!LoopPredecessor) - return MadeChange; const PPCSubtarget *ST = TM ? TM->getSubtargetImpl(*Header->getParent()) : nullptr; @@ -236,7 +234,17 @@ bool PPCLoopPreIncPrep::runOnLoop(Loop *L) { } } - if (Buckets.size() > MaxVars) + if (Buckets.empty() || Buckets.size() > MaxVars) + return MadeChange; + + BasicBlock *LoopPredecessor = L->getLoopPredecessor(); + // If there is no loop predecessor, or the loop predecessor's terminator + // returns a value (which might contribute to determining the loop's + // iteration space), insert a new preheader for the loop. + if (!LoopPredecessor || + !LoopPredecessor->getTerminator()->getType()->isVoidTy()) + LoopPredecessor = InsertPreheaderForLoop(L, this); + if (!LoopPredecessor) return MadeChange; SmallSet<BasicBlock *, 16> BBChanged; |