mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[CodeGen] Use SPLAT_VECTOR for zeroinitialiser with scalable types
Summary: When generating code for the LLVM IR zeroinitialiser operation, if the vector type is scalable we should be using SPLAT_VECTOR instead of BUILD_VECTOR. Differential Revision: https://reviews.llvm.org/D78636
This commit is contained in:
parent
219eaf384f
commit
f81af32255
@ -4240,6 +4240,8 @@ static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT,
|
||||
SelectionDAG &DAG) {
|
||||
int NumOps = Ops.size();
|
||||
assert(NumOps != 0 && "Can't build an empty vector!");
|
||||
assert(!VT.isScalableVector() &&
|
||||
"BUILD_VECTOR cannot be used with scalable types");
|
||||
assert(VT.getVectorNumElements() == (unsigned)NumOps &&
|
||||
"Incorrect element count in BUILD_VECTOR!");
|
||||
|
||||
|
@ -1552,16 +1552,17 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
||||
return DAG.getBlockAddress(BA, VT);
|
||||
|
||||
VectorType *VecTy = cast<VectorType>(V->getType());
|
||||
unsigned NumElements = VecTy->getNumElements();
|
||||
|
||||
// Now that we know the number and type of the elements, get that number of
|
||||
// elements into the Ops array based on what kind of constant it is.
|
||||
SmallVector<SDValue, 16> Ops;
|
||||
if (const ConstantVector *CV = dyn_cast<ConstantVector>(C)) {
|
||||
SmallVector<SDValue, 16> Ops;
|
||||
unsigned NumElements = cast<FixedVectorType>(VecTy)->getNumElements();
|
||||
for (unsigned i = 0; i != NumElements; ++i)
|
||||
Ops.push_back(getValue(CV->getOperand(i)));
|
||||
} else {
|
||||
assert(isa<ConstantAggregateZero>(C) && "Unknown vector constant!");
|
||||
|
||||
return NodeMap[V] = DAG.getBuildVector(VT, getCurSDLoc(), Ops);
|
||||
} else if (isa<ConstantAggregateZero>(C)) {
|
||||
EVT EltVT =
|
||||
TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());
|
||||
|
||||
@ -1570,11 +1571,16 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {
|
||||
Op = DAG.getConstantFP(0, getCurSDLoc(), EltVT);
|
||||
else
|
||||
Op = DAG.getConstant(0, getCurSDLoc(), EltVT);
|
||||
Ops.assign(NumElements, Op);
|
||||
}
|
||||
|
||||
// Create a BUILD_VECTOR node.
|
||||
return NodeMap[V] = DAG.getBuildVector(VT, getCurSDLoc(), Ops);
|
||||
if (isa<ScalableVectorType>(VecTy))
|
||||
return NodeMap[V] = DAG.getSplatVector(VT, getCurSDLoc(), Op);
|
||||
else {
|
||||
SmallVector<SDValue, 16> Ops;
|
||||
Ops.assign(cast<FixedVectorType>(VecTy)->getNumElements(), Op);
|
||||
return NodeMap[V] = DAG.getBuildVector(VT, getCurSDLoc(), Ops);
|
||||
}
|
||||
}
|
||||
llvm_unreachable("Unknown vector constant");
|
||||
}
|
||||
|
||||
// If this is a static alloca, generate it as the frameindex instead of
|
||||
|
Loading…
x
Reference in New Issue
Block a user