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

Chris Lattner lattner at cs.uiuc.edu
Sun Jan 16 19:20:17 PST 2005



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.305 -> 1.306
---
Log message:

Move code out of indentation one level to make it easier to read.

Disable the xform for < > cases.  It turns out that the following is being
miscompiled:

bool %test(sbyte %S) {
        %T = cast sbyte %S to uint
        %V = setgt uint %T, 255
        ret bool %V
}



---
Diffs of the changes:  (+65 -61)

Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.305 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.306
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.305	Fri Jan 14 11:35:12 2005
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Sun Jan 16 21:20:02 2005
@@ -2438,13 +2438,11 @@
         break;
 
       // (setcc (cast X to larger), CI)
-      case Instruction::Cast: {        
-        Instruction* replacement = 
-          visitSetCondInstWithCastAndConstant(I,cast<CastInst>(LHSI),CI);
-        if (replacement)
-          return replacement;
+      case Instruction::Cast:
+        if (Instruction *R = 
+                visitSetCondInstWithCastAndConstant(I,cast<CastInst>(LHSI),CI))
+          return R;
         break;
-      }
 
       case Instruction::Shl:         // (setcc (shl X, ShAmt), CI)
         if (ConstantUInt *ShAmt = dyn_cast<ConstantUInt>(LHSI->getOperand(1))) {
@@ -2919,61 +2917,67 @@
                                                   ConstantInt* CI) {
   const Type *SrcTy = LHSI->getOperand(0)->getType();
   const Type *DestTy = LHSI->getType();
-  if (SrcTy->isIntegral() && DestTy->isIntegral()) {
-    unsigned SrcBits = SrcTy->getPrimitiveSize()*8;
-    unsigned DestBits = DestTy->getPrimitiveSize()*8;
-    if (SrcTy == Type::BoolTy) 
-      SrcBits = 1;
-    if (DestTy == Type::BoolTy) 
-      DestBits = 1;
-    if (SrcBits < DestBits) {
-      // There are fewer bits in the source of the cast than in the result
-      // of the cast. Any other case doesn't matter because the constant
-      // value won't have changed due to sign extension.
-      Constant *NewCst = ConstantExpr::getCast(CI, SrcTy);
-      if (ConstantExpr::getCast(NewCst, DestTy) == CI) {
-        // The constant value operand of the setCC before and after a 
-        // cast to the source type of the cast instruction is the same 
-        // value, so we just replace with the same setcc opcode, but 
-        // using the source value compared to the constant casted to the 
-        // source type. 
-        if (SrcTy->isSigned() && DestTy->isUnsigned()) {
-          CastInst* Cst = new CastInst(LHSI->getOperand(0),
-            SrcTy->getUnsignedVersion(), LHSI->getName());
-          InsertNewInstBefore(Cst,I);
-          return new SetCondInst(I.getOpcode(), Cst, 
-              ConstantExpr::getCast(CI, SrcTy->getUnsignedVersion()));
-        }
-        return new SetCondInst(I.getOpcode(), LHSI->getOperand(0),NewCst);
-      }
-      // The constant value before and after a cast to the source type 
-      // is different, so various cases are possible depending on the 
-      // opcode and the signs of the types involved in the cast.
-      switch (I.getOpcode()) {
-        case Instruction::SetLT: {
-          Constant* Max = ConstantIntegral::getMaxValue(SrcTy);
-          Max = ConstantExpr::getCast(Max, DestTy);
-          return ReplaceInstUsesWith(I, ConstantExpr::getSetLT(Max, CI));
-        }
-        case Instruction::SetGT: {
-          Constant* Min = ConstantIntegral::getMinValue(SrcTy);
-          Min = ConstantExpr::getCast(Min, DestTy);
-          return ReplaceInstUsesWith(I, ConstantExpr::getSetGT(Min, CI));
-        }
-        case Instruction::SetEQ:
-          // We're looking for equality, and we know the values are not
-          // equal so replace with constant False.
-          return ReplaceInstUsesWith(I, ConstantBool::False);
-        case Instruction::SetNE: 
-          // We're testing for inequality, and we know the values are not
-          // equal so replace with constant True.
-          return ReplaceInstUsesWith(I, ConstantBool::True);
-        case Instruction::SetLE: 
-        case Instruction::SetGE: 
-          assert(!"SetLE and SetGE should be handled elsewhere");
-        default: 
-          assert(!"unknown integer comparison");
-      }
+  if (!SrcTy->isIntegral() || !DestTy->isIntegral())
+    return 0;
+
+  unsigned SrcBits = SrcTy->getPrimitiveSize()*8;
+  unsigned DestBits = DestTy->getPrimitiveSize()*8;
+  if (SrcTy == Type::BoolTy) 
+    SrcBits = 1;
+  if (DestTy == Type::BoolTy) 
+    DestBits = 1;
+  if (SrcBits < DestBits) {
+    // There are fewer bits in the source of the cast than in the result
+    // of the cast. Any other case doesn't matter because the constant
+    // value won't have changed due to sign extension.
+    Constant *NewCst = ConstantExpr::getCast(CI, SrcTy);
+    if (ConstantExpr::getCast(NewCst, DestTy) == CI) {
+      // The constant value operand of the setCC before and after a 
+      // cast to the source type of the cast instruction is the same 
+      // value, so we just replace with the same setcc opcode, but 
+      // using the source value compared to the constant casted to the 
+      // source type. 
+      if (SrcTy->isSigned() && DestTy->isUnsigned()) {
+        CastInst* Cst = new CastInst(LHSI->getOperand(0),
+                                     SrcTy->getUnsignedVersion(),
+                                     LHSI->getName());
+        InsertNewInstBefore(Cst,I);
+        return new SetCondInst(I.getOpcode(), Cst, 
+                               ConstantExpr::getCast(CI,
+                                                 SrcTy->getUnsignedVersion()));
+      }
+      return new SetCondInst(I.getOpcode(), LHSI->getOperand(0),NewCst);
+    }
+
+    // The constant value before and after a cast to the source type 
+    // is different, so various cases are possible depending on the 
+    // opcode and the signs of the types involved in the cast.
+    switch (I.getOpcode()) {
+    case Instruction::SetLT: {
+      return 0;
+      Constant* Max = ConstantIntegral::getMaxValue(SrcTy);
+      Max = ConstantExpr::getCast(Max, DestTy);
+      return ReplaceInstUsesWith(I, ConstantExpr::getSetLT(Max, CI));
+    }
+    case Instruction::SetGT: {
+      return 0; // FIXME! RENABLE.  This breaks for (cast sbyte to uint) > 255
+      Constant* Min = ConstantIntegral::getMinValue(SrcTy);
+      Min = ConstantExpr::getCast(Min, DestTy);
+      return ReplaceInstUsesWith(I, ConstantExpr::getSetGT(Min, CI));
+    }
+    case Instruction::SetEQ:
+      // We're looking for equality, and we know the values are not
+      // equal so replace with constant False.
+      return ReplaceInstUsesWith(I, ConstantBool::False);
+    case Instruction::SetNE: 
+      // We're testing for inequality, and we know the values are not
+      // equal so replace with constant True.
+      return ReplaceInstUsesWith(I, ConstantBool::True);
+    case Instruction::SetLE: 
+    case Instruction::SetGE: 
+      assert(0 && "SetLE and SetGE should be handled elsewhere");
+    default: 
+      assert(0 && "unknown integer comparison");
     }
   }
   return 0;






More information about the llvm-commits mailing list