diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 9 | 
1 files changed, 9 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 89c53e8c1ba..d3d44a82e08 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -855,6 +855,15 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,SDOperand N1,             "Cannot *_EXTEND_INREG FP types");      if (EVT == VT) return N1;  // Not actually extending      assert(EVT < VT && "Not extending!"); + +    // If we are sign extending an extension, use the original source. +    if (N1.getOpcode() == ISD::ZERO_EXTEND_INREG || +        N1.getOpcode() == ISD::SIGN_EXTEND_INREG) { +      if (N1.getOpcode() == Opcode && +          cast<MVTSDNode>(N1)->getExtraValueType() <= EVT) +        return N1; +    } +      break;    } | 

