Add support for ANY_EXTEND and add a few minor folds for it
authorChris Lattner <sabre@nondot.org>
Fri, 2 Sep 2005 00:17:32 +0000 (00:17 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 2 Sep 2005 00:17:32 +0000 (00:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23203 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index e22d723547f3d463bbb22ffd7b1e49b565732074..dd5afbaab13596e2dfa76cc4905d716bbb11c7e7 100644 (file)
@@ -1000,6 +1000,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
     switch (Opcode) {
     default: break;
     case ISD::SIGN_EXTEND: return getConstant(C->getSignExtended(), VT);
+    case ISD::ANY_EXTEND:
     case ISD::ZERO_EXTEND: return getConstant(Val, VT);
     case ISD::TRUNCATE:    return getConstant(Val, VT);
     case ISD::SINT_TO_FP:  return getConstantFP(C->getSignExtended(), VT);
@@ -1034,11 +1035,18 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
     if (OpOpcode == ISD::ZERO_EXTEND)   // (zext (zext x)) -> (zext x)
       return getNode(ISD::ZERO_EXTEND, VT, Operand.Val->getOperand(0));
     break;
+  case ISD::ANY_EXTEND:
+    if (Operand.getValueType() == VT) return Operand;   // noop extension
+    if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND)
+      // (ext (zext x)) -> (zext x)  and  (ext (sext x)) -> (sext x)
+      return getNode(OpOpcode, VT, Operand.Val->getOperand(0));
+    break;
   case ISD::TRUNCATE:
     if (Operand.getValueType() == VT) return Operand;   // noop truncate
     if (OpOpcode == ISD::TRUNCATE)
       return getNode(ISD::TRUNCATE, VT, Operand.Val->getOperand(0));
-    else if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND) {
+    else if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
+             OpOpcode == ISD::ANY_EXTEND) {
       // If the source is smaller than the dest, we still need an extend.
       if (Operand.Val->getOperand(0).getValueType() < VT)
         return getNode(OpOpcode, VT, Operand.Val->getOperand(0));
@@ -1378,6 +1386,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
       // FIXME: Should add a corresponding version of this for
       // ZERO_EXTEND/SIGN_EXTEND by converting them to an ANY_EXTEND node which
       // we don't have yet.
+      // FIXME: NOW WE DO, add this.
 
       // and (sign_extend_inreg x:16:32), 1 -> and x, 1
       if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG) {
@@ -2251,6 +2260,7 @@ const char *SDNode::getOperationName(const SelectionDAG *G) const {
   // Conversion operators.
   case ISD::SIGN_EXTEND: return "sign_extend";
   case ISD::ZERO_EXTEND: return "zero_extend";
+  case ISD::ANY_EXTEND:  return "any_extend";
   case ISD::SIGN_EXTEND_INREG: return "sign_extend_inreg";
   case ISD::TRUNCATE:    return "truncate";
   case ISD::FP_ROUND:    return "fp_round";