[llvm] fe74323 - [AArch64] Avoid introducing illegal types in LowerVECTOR_COMPRESS (NFC) (#168520)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 21 05:35:41 PST 2025
Author: Benjamin Maxwell
Date: 2025-11-21T13:35:36Z
New Revision: fe743233579113594f7ef964d735f41d60a211e3
URL: https://github.com/llvm/llvm-project/commit/fe743233579113594f7ef964d735f41d60a211e3
DIFF: https://github.com/llvm/llvm-project/commit/fe743233579113594f7ef964d735f41d60a211e3.diff
LOG: [AArch64] Avoid introducing illegal types in LowerVECTOR_COMPRESS (NFC) (#168520)
This does not seem to be an issue currently, but when using
VECTOR_COMPRESS as part of another lowering, I found these BITCASTs
would result in "Unexpected illegal type!" errors.
For example, this would convert the legal nxv2f32 type into the illegal
nxv2i32 type. This patch avoids this by using no-op casts for unpacked
types.
Added:
Modified:
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 7eb976558507f..ac3745ea5c274 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -7348,6 +7348,37 @@ SDValue AArch64TargetLowering::LowerLOAD(SDValue Op,
return SDValue();
}
+// Convert to ContainerVT with no-op casts where possible.
+static SDValue convertToSVEContainerType(SDLoc DL, SDValue Vec, EVT ContainerVT,
+ SelectionDAG &DAG) {
+ EVT VecVT = Vec.getValueType();
+ if (VecVT.isFloatingPoint()) {
+ // Use no-op casts for floating-point types.
+ EVT PackedVT = getPackedSVEVectorVT(VecVT.getScalarType());
+ Vec = DAG.getNode(AArch64ISD::REINTERPRET_CAST, DL, PackedVT, Vec);
+ Vec = DAG.getNode(AArch64ISD::NVCAST, DL, ContainerVT, Vec);
+ } else {
+ // Extend integers (may not be a no-op).
+ Vec = DAG.getNode(ISD::ANY_EXTEND, DL, ContainerVT, Vec);
+ }
+ return Vec;
+}
+
+// Convert to VecVT with no-op casts where possible.
+static SDValue convertFromSVEContainerType(SDLoc DL, SDValue Vec, EVT VecVT,
+ SelectionDAG &DAG) {
+ if (VecVT.isFloatingPoint()) {
+ // Use no-op casts for floating-point types.
+ EVT PackedVT = getPackedSVEVectorVT(VecVT.getScalarType());
+ Vec = DAG.getNode(AArch64ISD::NVCAST, DL, PackedVT, Vec);
+ Vec = DAG.getNode(AArch64ISD::REINTERPRET_CAST, DL, VecVT, Vec);
+ } else {
+ // Truncate integers (may not be a no-op).
+ Vec = DAG.getNode(ISD::TRUNCATE, DL, VecVT, Vec);
+ }
+ return Vec;
+}
+
SDValue AArch64TargetLowering::LowerVECTOR_COMPRESS(SDValue Op,
SelectionDAG &DAG) const {
SDLoc DL(Op);
@@ -7399,14 +7430,10 @@ SDValue AArch64TargetLowering::LowerVECTOR_COMPRESS(SDValue Op,
// Get legal type for compact instruction
EVT ContainerVT = getSVEContainerType(VecVT);
- EVT CastVT = VecVT.changeVectorElementTypeToInteger();
- // Convert to i32 or i64 for smaller types, as these are the only supported
+ // Convert to 32 or 64 bits for smaller types, as these are the only supported
// sizes for compact.
- if (ContainerVT != VecVT) {
- Vec = DAG.getBitcast(CastVT, Vec);
- Vec = DAG.getNode(ISD::ANY_EXTEND, DL, ContainerVT, Vec);
- }
+ Vec = convertToSVEContainerType(DL, Vec, ContainerVT, DAG);
SDValue Compressed = DAG.getNode(
ISD::INTRINSIC_WO_CHAIN, DL, Vec.getValueType(),
@@ -7429,21 +7456,23 @@ SDValue AArch64TargetLowering::LowerVECTOR_COMPRESS(SDValue Op,
DAG.getNode(ISD::VSELECT, DL, VecVT, IndexMask, Compressed, Passthru);
}
+ // If we changed the element type before, we need to convert it back.
+ if (ElmtVT.isFloatingPoint())
+ Compressed = convertFromSVEContainerType(DL, Compressed, VecVT, DAG);
+
// Extracting from a legal SVE type before truncating produces better code.
if (IsFixedLength) {
- Compressed = DAG.getNode(
- ISD::EXTRACT_SUBVECTOR, DL,
- FixedVecVT.changeVectorElementType(ContainerVT.getVectorElementType()),
- Compressed, DAG.getConstant(0, DL, MVT::i64));
- CastVT = FixedVecVT.changeVectorElementTypeToInteger();
+ EVT FixedSubVector = VecVT.isInteger()
+ ? FixedVecVT.changeVectorElementType(
+ ContainerVT.getVectorElementType())
+ : FixedVecVT;
+ Compressed = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, FixedSubVector,
+ Compressed, DAG.getConstant(0, DL, MVT::i64));
VecVT = FixedVecVT;
}
- // If we changed the element type before, we need to convert it back.
- if (ContainerVT != VecVT) {
- Compressed = DAG.getNode(ISD::TRUNCATE, DL, CastVT, Compressed);
- Compressed = DAG.getBitcast(VecVT, Compressed);
- }
+ if (VecVT.isInteger())
+ Compressed = DAG.getNode(ISD::TRUNCATE, DL, VecVT, Compressed);
return Compressed;
}
More information about the llvm-commits
mailing list