summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2010-05-03 18:06:58 +0000
committerDevang Patel <dpatel@apple.com>2010-05-03 18:06:58 +0000
commit9f5200a1227bd82b22fccd7f5c6e6997776bbd96 (patch)
treecc2ab279d19a3ff97197fca219a2d91599e651b8 /llvm/lib
parentb5025c72eb44026cc72939b8ccaf20a0f5d3b0cf (diff)
downloadbcm5719-llvm-9f5200a1227bd82b22fccd7f5c6e6997776bbd96.tar.gz
bcm5719-llvm-9f5200a1227bd82b22fccd7f5c6e6997776bbd96.zip
Check for side effects before splitting loop.
Patch by Jakub Staszak! llvm-svn: 102928
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp b/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp
index 16d3f2f703f..101ff5b2001 100644
--- a/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp
@@ -948,6 +948,25 @@ bool LoopIndexSplit::splitLoop() {
if (!IVBasedValues.count(SplitCondition->getOperand(!SVOpNum)))
return false;
+ // Check for side effects.
+ for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
+ I != E; ++I) {
+ BasicBlock *BB = *I;
+
+ assert(DT->dominates(Header, BB));
+ if (DT->properlyDominates(SplitCondition->getParent(), BB))
+ continue;
+
+ for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
+ BI != BE; ++BI) {
+ Instruction *Inst = BI;
+
+ if (!Inst->isSafeToSpeculativelyExecute() && !isa<PHINode>(Inst)
+ && !isa<BranchInst>(Inst) && !isa<DbgInfoIntrinsic>(Inst))
+ return false;
+ }
+ }
+
// Normalize loop conditions so that it is easier to calculate new loop
// bounds.
if (IVisGT(*ExitCondition) || IVisGE(*ExitCondition)) {
OpenPOWER on IntegriCloud