diff options
| author | Devang Patel <dpatel@apple.com> | 2010-05-03 18:06:58 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2010-05-03 18:06:58 +0000 |
| commit | 9f5200a1227bd82b22fccd7f5c6e6997776bbd96 (patch) | |
| tree | cc2ab279d19a3ff97197fca219a2d91599e651b8 /llvm/lib | |
| parent | b5025c72eb44026cc72939b8ccaf20a0f5d3b0cf (diff) | |
| download | bcm5719-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.cpp | 19 |
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)) { |

