forked from OSchip/llvm-project
[CodeGen] Fix warnings in getCopyToPartsVector
Whilst trying to assemble the following test: clang/test/CodeGen/aarch64-sve-intrinsics/acle_sve_set2.c I discovered we were hitting some warnings about possible invalid calls to getVectorNumElements() in getCopyToPartsVector(). I've tried to fix these by using ElementCount types where possible and I've made the assumption that we don't support using a fixed width vector to copy parts of a scalable vector, and vice versa. Looking at how the copy is implemented I think that's the right thing for now. Differential Revision: https://reviews.llvm.org/D82744
This commit is contained in:
parent
d3bf1f3af2
commit
c7df35d2b2
|
@ -745,12 +745,16 @@ static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
|
|||
NumParts = NumRegs; // Silence a compiler warning.
|
||||
assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
|
||||
|
||||
unsigned IntermediateNumElts = IntermediateVT.isVector() ?
|
||||
IntermediateVT.getVectorNumElements() : 1;
|
||||
assert(IntermediateVT.isScalableVector() == ValueVT.isScalableVector() &&
|
||||
"Mixing scalable and fixed vectors when copying in parts");
|
||||
|
||||
ElementCount DestEltCnt;
|
||||
|
||||
if (IntermediateVT.isVector())
|
||||
DestEltCnt = IntermediateVT.getVectorElementCount() * NumIntermediates;
|
||||
else
|
||||
DestEltCnt = ElementCount(NumIntermediates, false);
|
||||
|
||||
// Convert the vector to the appropriate type if necessary.
|
||||
auto DestEltCnt = ElementCount(NumIntermediates * IntermediateNumElts,
|
||||
ValueVT.isScalableVector());
|
||||
EVT BuiltVectorTy = EVT::getVectorVT(
|
||||
*DAG.getContext(), IntermediateVT.getScalarType(), DestEltCnt);
|
||||
if (ValueVT != BuiltVectorTy) {
|
||||
|
@ -764,6 +768,9 @@ static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
|
|||
SmallVector<SDValue, 8> Ops(NumIntermediates);
|
||||
for (unsigned i = 0; i != NumIntermediates; ++i) {
|
||||
if (IntermediateVT.isVector()) {
|
||||
// This does something sensible for scalable vectors - see the
|
||||
// definition of EXTRACT_SUBVECTOR for further details.
|
||||
unsigned IntermediateNumElts = IntermediateVT.getVectorMinNumElements();
|
||||
Ops[i] =
|
||||
DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val,
|
||||
DAG.getVectorIdxConstant(i * IntermediateNumElts, DL));
|
||||
|
|
Loading…
Reference in New Issue