summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2015-02-07 07:32:58 +0000
committerHal Finkel <hfinkel@anl.gov>2015-02-07 07:32:58 +0000
commit291cc7bacde8fe093aee4e7cc5b09fc90f61d4bc (patch)
tree188e65a68015779bd16163502b5ce50167cc09ec /llvm/lib/Target
parent7e575ed1eae1755c044ee80d6e1d81aedd2b37a0 (diff)
downloadbcm5719-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.cpp16
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;
OpenPOWER on IntegriCloud