diff options
author | Chris Lattner <sabre@nondot.org> | 2004-05-13 20:43:31 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-05-13 20:43:31 +0000 |
commit | 82fec4e31da93f17cf95b1bf3f8a0e6d933b4f73 (patch) | |
tree | 6f055103408021aa588cc574afedd9ae99d02d1c /lib/Transforms/Scalar | |
parent | 488b72bd7fa1f7258f077e0805d767e109376233 (diff) | |
download | external_llvm-82fec4e31da93f17cf95b1bf3f8a0e6d933b4f73.zip external_llvm-82fec4e31da93f17cf95b1bf3f8a0e6d933b4f73.tar.gz external_llvm-82fec4e31da93f17cf95b1bf3f8a0e6d933b4f73.tar.bz2 |
Fix a nasty bug that caused us to unroll EXTREMELY large loops due to overflow
in the size calculation.
This is not something you want to see:
Loop Unroll: F[main] Loop %no_exit Loop Size = 2 Trip Count = 2147483648 - UNROLLING!
The problem was that 2*2147483648 == 0.
Now we get:
Loop Unroll: F[main] Loop %no_exit Loop Size = 2 Trip Count = 2147483648 - TOO LARGE: 4294967296>100
Thanks to some anonymous person playing with the demo page that repeatedly
caused zion to go into swapping land. That's one way to ensure you'll get
a quick bugfix. :)
Testcase here: Transforms/LoopUnroll/2004-05-13-DontUnrollTooMuch.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13564 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 7 | ||||
-rw-r--r-- | lib/Transforms/Scalar/LoopUnroll.cpp | 6 |
2 files changed, 10 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 67b99c5..7ef1b56 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1475,6 +1475,13 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) { // integers at the end of their ranges... // if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) { + if (Instruction *LHSI = dyn_cast<Instruction>(Op0)) + if (LHSI->getOpcode() == Instruction::Div && LHSI->hasOneUse() && + isa<ConstantInt>(LHSI->getOperand(1))) { + std::cerr << "COULD FOLD: " << *LHSI; + std::cerr << "COULD FOLD: " << I << "\n"; + } + // Simplify seteq and setne instructions... if (I.getOpcode() == Instruction::SetEQ || I.getOpcode() == Instruction::SetNE) { diff --git a/lib/Transforms/Scalar/LoopUnroll.cpp b/lib/Transforms/Scalar/LoopUnroll.cpp index 3314820..a9cced5 100644 --- a/lib/Transforms/Scalar/LoopUnroll.cpp +++ b/lib/Transforms/Scalar/LoopUnroll.cpp @@ -139,9 +139,9 @@ bool LoopUnroll::visitLoop(Loop *L) { DEBUG(std::cerr << "Loop Unroll: F[" << BB->getParent()->getName() << "] Loop %" << BB->getName() << " Loop Size = " << LoopSize << " Trip Count = " << TripCount << " - "); - if (LoopSize*TripCount > UnrollThreshold) { - DEBUG(std::cerr << "TOO LARGE: " << LoopSize*TripCount << ">" - << UnrollThreshold << "\n"); + uint64_t Size = (uint64_t)LoopSize*(uint64_t)TripCount; + if (Size > UnrollThreshold) { + DEBUG(std::cerr << "TOO LARGE: " << Size << ">" << UnrollThreshold << "\n"); return Changed; } DEBUG(std::cerr << "UNROLLING!\n"); |