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

Chris Lattner lattner at cs.uiuc.edu
Mon Nov 1 19:50:46 PST 2004



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.277 -> 1.278
---
Log message:

* Rearrange code slightly
* Disable broken transforms for simplifying (setcc (cast X to larger), CI) 
  where CC is not != or ==



---
Diffs of the changes:  (+20 -11)

Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.277 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.278
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.277	Wed Oct 27 00:57:15 2004
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Mon Nov  1 21:50:32 2004
@@ -2024,29 +2024,38 @@
           if (SrcTy == Type::BoolTy) SrcBits = 1;
           unsigned DestBits = LHSI->getType()->getPrimitiveSize()*8;
           if (LHSI->getType() == Type::BoolTy) DestBits = 1;
-          if (SrcBits < DestBits) {
+          if (SrcBits < DestBits &&
+              // FIXME: Reenable the code below for < and >.  However, we have
+              // to handle the cases when the source of the cast and the dest of
+              // the cast have different signs.  e.g:
+              //        (cast sbyte %X to uint) >u 255U   -> X <s (sbyte)0
+              (I.getOpcode() == Instruction::SetEQ ||
+               I.getOpcode() == Instruction::SetNE)) {
             // Check to see if the comparison is always true or false.
             Constant *NewCst = ConstantExpr::getCast(CI, SrcTy);
             if (ConstantExpr::getCast(NewCst, LHSI->getType()) != CI) {
-              Constant *Min = ConstantIntegral::getMinValue(SrcTy);
-              Constant *Max = ConstantIntegral::getMaxValue(SrcTy);
-              Min = ConstantExpr::getCast(Min, LHSI->getType());
-              Max = ConstantExpr::getCast(Max, LHSI->getType());
               switch (I.getOpcode()) {
               default: assert(0 && "unknown integer comparison");
+#if 0
+              case Instruction::SetLT: {
+                Constant *Max = ConstantIntegral::getMaxValue(SrcTy);
+                Max = ConstantExpr::getCast(Max, LHSI->getType());
+                return ReplaceInstUsesWith(I, ConstantExpr::getSetLT(Max, CI));
+              }
+              case Instruction::SetGT: {
+                Constant *Min = ConstantIntegral::getMinValue(SrcTy);
+                Min = ConstantExpr::getCast(Min, LHSI->getType());
+                return ReplaceInstUsesWith(I, ConstantExpr::getSetGT(Min, CI));
+              }
+#endif
               case Instruction::SetEQ:
                 return ReplaceInstUsesWith(I, ConstantBool::False);
               case Instruction::SetNE:
                 return ReplaceInstUsesWith(I, ConstantBool::True);
-              case Instruction::SetLT:
-                return ReplaceInstUsesWith(I, ConstantExpr::getSetLT(Max, CI));
-              case Instruction::SetGT:
-                return ReplaceInstUsesWith(I, ConstantExpr::getSetGT(Min, CI));
               }
             }
 
-            return new SetCondInst(I.getOpcode(), LHSI->getOperand(0),
-                                   ConstantExpr::getCast(CI, SrcTy));
+            return new SetCondInst(I.getOpcode(), LHSI->getOperand(0), NewCst);
           }
         }
         break;






More information about the llvm-commits mailing list