diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -4035,7 +4035,25 @@ LC = RTLIB::MULO_I64; else if (VT == MVT::i128) LC = RTLIB::MULO_I128; - assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported XMULO!"); + + if (LC == RTLIB::UNKNOWN_LIBCALL || !TLI.getLibcallName(LC)) { + // FIXME: This is not an optimal expansion, but better than crashing. + EVT WideVT = + EVT::getIntegerVT(*DAG.getContext(), VT.getScalarSizeInBits() * 2); + SDValue LHS = DAG.getNode(ISD::SIGN_EXTEND, dl, WideVT, N->getOperand(0)); + SDValue RHS = DAG.getNode(ISD::SIGN_EXTEND, dl, WideVT, N->getOperand(1)); + SDValue Mul = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS); + SDValue MulLo, MulHi; + SplitInteger(Mul, MulLo, MulHi); + SDValue SRA = + DAG.getNode(ISD::SRA, dl, VT, MulLo, + DAG.getConstant(VT.getScalarSizeInBits() - 1, dl, VT)); + SDValue Overflow = + DAG.getSetCC(dl, N->getValueType(1), MulHi, SRA, ISD::SETNE); + SplitInteger(MulLo, Lo, Hi); + ReplaceValueWith(SDValue(N, 1), Overflow); + return; + } SDValue Temp = DAG.CreateStackTemporary(PtrVT); // Temporary for the overflow value, default it to zero.