Skip to content

Commit ec4ebac

Browse files
brads55tstellar
authored andcommitted
[AArch64][SVE] Fix incorrect mask type when lowering fixed type SVE gather/scatter
An incorrect mask type when lowering an SVE gather/scatter was causing a codegen fault which manifested as the incorrect predicate size being used for an SVE gather/scatter, (e.g.. p0.b rather than p0.d). Fixes PR51182. Differential Revision: https://reviews.llvm.org/D106943 (cherry picked from commit 191831e)
1 parent 0e3777b commit ec4ebac

File tree

3 files changed

+423
-237
lines changed

3 files changed

+423
-237
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4348,6 +4348,9 @@ SDValue AArch64TargetLowering::LowerMGATHER(SDValue Op,
43484348
IndexVT = getContainerForFixedLengthVector(DAG, IndexVT);
43494349
MemVT = IndexVT.changeVectorElementType(MemVT.getVectorElementType());
43504350
InputVT = DAG.getValueType(MemVT.changeTypeToInteger());
4351+
Mask = DAG.getNode(
4352+
ISD::ZERO_EXTEND, DL,
4353+
VT.changeVectorElementType(IndexVT.getVectorElementType()), Mask);
43514354
}
43524355

43534356
if (PassThru->isUndef() || isZerosVector(PassThru.getNode()))
@@ -4452,6 +4455,9 @@ SDValue AArch64TargetLowering::LowerMSCATTER(SDValue Op,
44524455
ISD::ANY_EXTEND, DL,
44534456
VT.changeVectorElementType(IndexVT.getVectorElementType()), StoreVal);
44544457
StoreVal = convertToScalableVector(DAG, IndexVT, StoreVal);
4458+
Mask = DAG.getNode(
4459+
ISD::ZERO_EXTEND, DL,
4460+
VT.changeVectorElementType(IndexVT.getVectorElementType()), Mask);
44554461
} else if (VT.isFloatingPoint()) {
44564462
// Handle FP data by casting the data so an integer scatter can be used.
44574463
EVT StoreValVT = getPackedSVEVectorVT(VT.getVectorElementCount());

0 commit comments

Comments
 (0)