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 | c12c945cc46102f1b1bdba4a7cc6cbb044f5fc31 (patch) | |
tree | 5135643c46e78cb0e9eac02153cab8d8425dcd14 /llvm/lib/Transforms/Scalar/InstructionCombining.cpp | |
parent | 535a48942a6e36e96bb2dd900a0fb94ac484d5ba (diff) | |
download | bcm5719-llvm-c12c945cc46102f1b1bdba4a7cc6cbb044f5fc31.tar.gz bcm5719-llvm-c12c945cc46102f1b1bdba4a7cc6cbb044f5fc31.zip |
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
llvm-svn: 13564
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 67b99c56e7e..7ef1b560477 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/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) { |