diff options
author | Yi Jiang <yjiang@apple.com> | 2014-10-29 20:19:47 +0000 |
---|---|---|
committer | Yi Jiang <yjiang@apple.com> | 2014-10-29 20:19:47 +0000 |
commit | ab19fff4d8f9c8a4949b0652b5f9f31d757e0ae3 (patch) | |
tree | 89babc0ff4c844132a7ddcecbc8dd6241b779d39 /llvm/lib/Transforms/Scalar/LoopRotation.cpp | |
parent | 2ec8e1bd20d01102a5e5a5560d4542030ef83056 (diff) | |
download | bcm5719-llvm-ab19fff4d8f9c8a4949b0652b5f9f31d757e0ae3.tar.gz bcm5719-llvm-ab19fff4d8f9c8a4949b0652b5f9f31d757e0ae3.zip |
Do not simplifyLatch for loops where hoisting increments couldresult in extra live range interferance
llvm-svn: 220872
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopRotation.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopRotation.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopRotation.cpp b/llvm/lib/Transforms/Scalar/LoopRotation.cpp index ddb53926ff7..afd2eca598e 100644 --- a/llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ b/llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -194,8 +194,13 @@ static void RewriteUsesOfClonedInstructions(BasicBlock *OrigHeader, /// heuristics. We handle a single arithmetic instruction along with any type /// conversions. static bool shouldSpeculateInstrs(BasicBlock::iterator Begin, - BasicBlock::iterator End) { + BasicBlock::iterator End, Loop *L) { bool seenIncrement = false; + bool MultiExitLoop = false; + + if (!L->getExitingBlock()) + MultiExitLoop = true; + for (BasicBlock::iterator I = Begin; I != End; ++I) { if (!isSafeToSpeculativelyExecute(I)) @@ -219,11 +224,33 @@ static bool shouldSpeculateInstrs(BasicBlock::iterator Begin, case Instruction::Xor: case Instruction::Shl: case Instruction::LShr: - case Instruction::AShr: + case Instruction::AShr: { + Value *IVOpnd = nullptr; + if (isa<ConstantInt>(I->getOperand(0))) + IVOpnd = I->getOperand(1); + + if (isa<ConstantInt>(I->getOperand(1))) { + if (IVOpnd) + return false; + + IVOpnd = I->getOperand(0); + } + + // If increment operand is used outside of the loop, this speculation + // could cause extra live range interference. + if (MultiExitLoop && IVOpnd) { + for (User *UseI : IVOpnd->users()) { + auto *UserInst = cast<Instruction>(UseI); + if (!L->contains(UserInst)) + return false; + } + } + if (seenIncrement) return false; seenIncrement = true; break; + } case Instruction::Trunc: case Instruction::ZExt: case Instruction::SExt: @@ -259,7 +286,7 @@ bool LoopRotate::simplifyLoopLatch(Loop *L) { if (!BI) return false; - if (!shouldSpeculateInstrs(Latch->begin(), Jmp)) + if (!shouldSpeculateInstrs(Latch->begin(), Jmp, L)) return false; DEBUG(dbgs() << "Folding loop latch " << Latch->getName() << " into " |