diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index c3889dd7ff8..75e07ca7620 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -843,6 +843,8 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, case ISD::XOR: case ISD::UDIV: case ISD::UREM: + case ISD::MULHU: + case ISD::MULHS: assert(MVT::isInteger(VT) && "This operator does not apply to FP types!"); // fall through case ISD::ADD: @@ -941,6 +943,16 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, } break; + case ISD::MULHU: + case ISD::MULHS: + if (!C2) return N2; // mul X, 0 -> 0 + + if (C2 == 1) // 0X*01 -> 0X hi(0X) == 0 + return getConstant(0, VT); + + // Many others could be handled here, including -1, powers of 2, etc. + break; + case ISD::UDIV: // FIXME: Move this to the DAG combiner when it exists. if ((C2 & C2-1) == 0 && C2) {