mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-16 11:24:39 +00:00
Don't try to make BUILD_VECTOR operands have the same
type as the vector element type: allow them to be of a wider integer type than the element type all the way through the system, and not just as far as LegalizeDAG. This should be safe because it used to be this way (the old type legalizer would produce such nodes), so backends should be able to handle it. In fact only targets which have legal vector types with an illegal promoted element type will ever see this (eg: <4 x i16> on ppc). This fixes a regression with the new type legalizer (vec_splat.ll). Also, treat SCALAR_TO_VECTOR the same as BUILD_VECTOR. After all, it is just a special case of BUILD_VECTOR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69467 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -863,24 +863,10 @@ SDValue DAGTypeLegalizer::PromoteIntOp_MEMBARRIER(SDNode *N) {
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N) {
|
||||
// The vector type is legal but the element type is not. This implies
|
||||
// that the vector is a power-of-two in length and that the element
|
||||
// type does not have a strange size (eg: it is not i1).
|
||||
MVT VecVT = N->getValueType(0);
|
||||
unsigned NumElts = VecVT.getVectorNumElements();
|
||||
assert(!(NumElts & 1) && "Legal vector of one illegal element?");
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
|
||||
MVT OldVT = N->getOperand(0).getValueType();
|
||||
MVT NewVT = MVT::getIntegerVT(2 * OldVT.getSizeInBits());
|
||||
assert(OldVT.isSimple() && NewVT.isSimple());
|
||||
|
||||
SDValue ExtVal = DAG.getNode(ISD::ANY_EXTEND, dl, NewVT, N->getOperand(0));
|
||||
SDValue NewVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
|
||||
MVT::getVectorVT(NewVT, NumElts/2), ExtVal);
|
||||
|
||||
// Convert the new vector to the old vector type.
|
||||
return DAG.getNode(ISD::BIT_CONVERT, dl, VecVT, NewVec);
|
||||
// Integer SCALAR_TO_VECTOR operands are implicitly truncated, so just promote
|
||||
// the operand in place.
|
||||
return DAG.UpdateNodeOperands(SDValue(N, 0),
|
||||
GetPromotedInteger(N->getOperand(0)));
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
|
||||
|
Reference in New Issue
Block a user