[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp LoopUnroll.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu May 13 15:43:01 PDT 2004


Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.201 -> 1.202
LoopUnroll.cpp updated: 1.9 -> 1.10

---
Log message:

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



---
Diffs of the changes:  (+10 -3)

Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.201 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.202
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.201	Sat May  8 17:41:42 2004
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Thu May 13 15:43:31 2004
@@ -1475,6 +1475,13 @@
   // 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) {


Index: llvm/lib/Transforms/Scalar/LoopUnroll.cpp
diff -u llvm/lib/Transforms/Scalar/LoopUnroll.cpp:1.9 llvm/lib/Transforms/Scalar/LoopUnroll.cpp:1.10
--- llvm/lib/Transforms/Scalar/LoopUnroll.cpp:1.9	Tue Apr 20 15:26:03 2004
+++ llvm/lib/Transforms/Scalar/LoopUnroll.cpp	Thu May 13 15:43:31 2004
@@ -139,9 +139,9 @@
   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");





More information about the llvm-commits mailing list