Skip to content

Commit a15144f

Browse files
committed
[AArch64][GlobalISel] Lower G_EXTRACT_VECTOR_ELT with variable indices
G_EXTRACT_VECTOR_ELT instructions with non-constant indices are not selected, so they need to be lowered. Fixes llvm#65049. Reviewed By: Peter Differential Revision: https://reviews.llvm.org/D159096
1 parent bb94817 commit a15144f

File tree

4 files changed

+643
-23
lines changed

4 files changed

+643
-23
lines changed

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -696,12 +696,11 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
696696
return Query.Types[0] != EltTy;
697697
})
698698
.minScalar(2, s64)
699-
.legalIf([=](const LegalityQuery &Query) {
699+
.customIf([=](const LegalityQuery &Query) {
700700
const LLT &VecTy = Query.Types[1];
701701
return VecTy == v2s16 || VecTy == v4s16 || VecTy == v8s16 ||
702702
VecTy == v4s32 || VecTy == v2s64 || VecTy == v2s32 ||
703-
VecTy == v8s8 || VecTy == v16s8 || VecTy == v2s32 ||
704-
VecTy == v2p0;
703+
VecTy == v8s8 || VecTy == v16s8 || VecTy == v2p0;
705704
})
706705
.minScalarOrEltIf(
707706
[=](const LegalityQuery &Query) {
@@ -1022,6 +1021,8 @@ bool AArch64LegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
10221021
return legalizeMemOps(MI, Helper);
10231022
case TargetOpcode::G_FCOPYSIGN:
10241023
return legalizeFCopySign(MI, Helper);
1024+
case TargetOpcode::G_EXTRACT_VECTOR_ELT:
1025+
return legalizeExtractVectorElt(MI, MRI, Helper);
10251026
}
10261027

10271028
llvm_unreachable("expected switch to return");
@@ -1801,3 +1802,14 @@ bool AArch64LegalizerInfo::legalizeFCopySign(MachineInstr &MI,
18011802
MI.eraseFromParent();
18021803
return true;
18031804
}
1805+
1806+
bool AArch64LegalizerInfo::legalizeExtractVectorElt(
1807+
MachineInstr &MI, MachineRegisterInfo &MRI, LegalizerHelper &Helper) const {
1808+
assert(MI.getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT);
1809+
auto VRegAndVal =
1810+
getIConstantVRegValWithLookThrough(MI.getOperand(2).getReg(), MRI);
1811+
if (VRegAndVal)
1812+
return true;
1813+
return Helper.lowerExtractInsertVectorElt(MI) !=
1814+
LegalizerHelper::LegalizeResult::UnableToLegalize;
1815+
}

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class AArch64LegalizerInfo : public LegalizerInfo {
6262
bool legalizeCTTZ(MachineInstr &MI, LegalizerHelper &Helper) const;
6363
bool legalizeMemOps(MachineInstr &MI, LegalizerHelper &Helper) const;
6464
bool legalizeFCopySign(MachineInstr &MI, LegalizerHelper &Helper) const;
65+
bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
66+
LegalizerHelper &Helper) const;
6567
const AArch64Subtarget *ST;
6668
};
6769
} // End llvm namespace.

0 commit comments

Comments
 (0)