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

Chris Lattner lattner at cs.uiuc.edu
Mon Sep 27 09:19:04 PDT 2004



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.249 -> 1.250
---
Log message:

Fold: (setcc (shr X, ShAmt), CI), where 'cc' is eq or ne.  This xform
triggers often, for example:

6x in povray, 1x in gzip, 279x in gcc, 1x in crafty, 8x in eon, 11x in perlbmk,
362x in gap, 4x in vortex, 14 in m88ksim, 211x in 126.gcc, 1x in compress,
11x in ijpeg, and 4x in 147.vortex.



---
Diffs of the changes:  (+45 -0)

Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.249 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.250
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.249	Fri Sep 24 10:21:34 2004
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Mon Sep 27 11:18:50 2004
@@ -1545,6 +1545,51 @@
           }
         }
         break;
+      case Instruction::Shr:         // shr: (setcc (shr X, ShAmt), CI)
+        if (ConstantUInt *ShAmt = dyn_cast<ConstantUInt>(LHSI->getOperand(1))) {
+          unsigned ShAmtVal = ShAmt->getValue();
+          
+          switch (I.getOpcode()) {
+          default: break;
+          case Instruction::SetEQ:
+          case Instruction::SetNE: {
+            // If we are comparing against bits always shifted out, the
+            // comparison cannot succeed.
+            Constant *Comp = 
+              ConstantExpr::getShr(ConstantExpr::getShl(CI, ShAmt), ShAmt);
+            
+            if (Comp != CI) {// Comparing against a bit that we know is zero.
+              bool IsSetNE = I.getOpcode() == Instruction::SetNE;
+              Constant *Cst = ConstantBool::get(IsSetNE);
+              return ReplaceInstUsesWith(I, Cst);
+            }
+              
+            if (LHSI->hasOneUse() || CI->isNullValue()) {
+              // Otherwise strength reduce the shift into an and.
+              uint64_t Val = ~0ULL;          // All ones.
+              Val <<= ShAmtVal;              // Shift over to the right spot.
+
+              Constant *Mask;
+              if (CI->getType()->isUnsigned()) {
+                unsigned TypeBits = CI->getType()->getPrimitiveSize()*8;
+                Val &= (1ULL << TypeBits)-1;
+                Mask = ConstantUInt::get(CI->getType(), Val);
+              } else {
+                Mask = ConstantSInt::get(CI->getType(), Val);
+              }
+              
+              Instruction *AndI =
+                BinaryOperator::createAnd(LHSI->getOperand(0),
+                                          Mask, LHSI->getName()+".mask");
+              Value *And = InsertNewInstBefore(AndI, I);
+              return new SetCondInst(I.getOpcode(), And,
+                                     ConstantExpr::getShl(CI, ShAmt));
+            }
+            break;
+          }
+          }
+        }
+        break;
 
       case Instruction::Div:
         if (0 && isa<ConstantInt>(LHSI->getOperand(1))) {






More information about the llvm-commits mailing list