forked from OSchip/llvm-project
[CodeGen] Fix FoldConstantVectorArithmetic for scalable vectors
For now I have changed FoldConstantVectorArithmetic to return early if we encounter a scalable vector, since the subsequent code assumes you can perform lane-wise constant folds. However, in future work we should be able to extend this to look at splats of a constant value and fold those if possible. I have also added the same code to FoldConstantArithmetic, since that deals with vectors too. The warnings I fixed in this patch were being generated by this existing test: CodeGen/AArch64/sve-int-arith.ll Differential Revision: https://reviews.llvm.org/D79421
This commit is contained in:
parent
8c24f33158
commit
fb1c55b57d
|
@ -4915,8 +4915,14 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
|
||||||
if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(N2))
|
if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(N2))
|
||||||
return FoldSymbolOffset(Opcode, VT, GA, N1);
|
return FoldSymbolOffset(Opcode, VT, GA, N1);
|
||||||
|
|
||||||
// For vectors, extract each constant element and fold them individually.
|
// TODO: All the folds below are performed lane-by-lane and assume a fixed
|
||||||
// Either input may be an undef value.
|
// vector width, however we should be able to do constant folds involving
|
||||||
|
// splat vector nodes too.
|
||||||
|
if (VT.isScalableVector())
|
||||||
|
return SDValue();
|
||||||
|
|
||||||
|
// For fixed width vectors, extract each constant element and fold them
|
||||||
|
// individually. Either input may be an undef value.
|
||||||
auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
|
auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
|
||||||
if (!BV1 && !N1->isUndef())
|
if (!BV1 && !N1->isUndef())
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
@ -4992,6 +4998,13 @@ SDValue SelectionDAG::FoldConstantVectorArithmetic(unsigned Opcode,
|
||||||
if (!VT.isVector())
|
if (!VT.isVector())
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
||||||
|
// TODO: All the folds below are performed lane-by-lane and assume a fixed
|
||||||
|
// vector width, however we should be able to do constant folds involving
|
||||||
|
// splat vector nodes too.
|
||||||
|
if (VT.isScalableVector())
|
||||||
|
return SDValue();
|
||||||
|
|
||||||
|
// From this point onwards all vectors are assumed to be fixed width.
|
||||||
unsigned NumElts = VT.getVectorNumElements();
|
unsigned NumElts = VT.getVectorNumElements();
|
||||||
|
|
||||||
auto IsScalarOrSameVectorSize = [&](const SDValue &Op) {
|
auto IsScalarOrSameVectorSize = [&](const SDValue &Op) {
|
||||||
|
|
Loading…
Reference in New Issue