diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -215,14 +215,29 @@ // The Chain is the first operand. Opers[0] = Chain; - // Now process the remaining operands. - for (unsigned i = 1; i < NumOpers; ++i) { - SDValue Oper = N->getOperand(i); + if (NumOpers == 2) { + SDValue Oper = N->getOperand(1); + EVT OpVT = Oper.getValueType(); - if (Oper.getValueType().isVector()) + // The result needs scalarizing, but it's not a given that the source does. + if (getTypeAction(OpVT) == TargetLowering::TypeScalarizeVector) Oper = GetScalarizedVector(Oper); + else { + EVT VT = OpVT.getVectorElementType(); + Oper = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, Oper, + DAG.getVectorIdxConstant(0, dl)); + } + Opers[1] = Oper; + } else { + // Now process the remaining operands. + for (unsigned i = 1; i < NumOpers; ++i) { + SDValue Oper = N->getOperand(i); - Opers[i] = Oper; + if (Oper.getValueType().isVector()) + Oper = GetScalarizedVector(Oper); + + Opers[i] = Oper; + } } SDValue Result = DAG.getNode(N->getOpcode(), dl, DAG.getVTList(ValueVTs),