Skip to content

Commit 77b124c

Browse files
authored
[AArch64][GlobalISel] Add legalization for G_VECREDUCE_SEQ_FADD. (#76238)
And G_VECREDUCE_SEQ_FMUL at the same time. They require the elements of the vector operand to be accumulated in order, so just need to be scalarized. Some of the operands are not simplified as much as they can quite yet due to not canonicalizing constant operands post-legalization.
1 parent f5f66e2 commit 77b124c

File tree

6 files changed

+681
-89
lines changed

6 files changed

+681
-89
lines changed

llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,9 @@ class LegalizerHelper {
350350

351351
LegalizeResult fewerElementsVectorReductions(MachineInstr &MI,
352352
unsigned TypeIdx, LLT NarrowTy);
353+
LegalizeResult fewerElementsVectorSeqReductions(MachineInstr &MI,
354+
unsigned TypeIdx,
355+
LLT NarrowTy);
353356

354357
LegalizeResult fewerElementsVectorShuffle(MachineInstr &MI, unsigned TypeIdx,
355358
LLT NarrowTy);

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4718,6 +4718,9 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
47184718
return fewerElementsVectorMultiEltType(GMI, NumElts, {2 /*imm*/});
47194719
GISEL_VECREDUCE_CASES_NONSEQ
47204720
return fewerElementsVectorReductions(MI, TypeIdx, NarrowTy);
4721+
case TargetOpcode::G_VECREDUCE_SEQ_FADD:
4722+
case TargetOpcode::G_VECREDUCE_SEQ_FMUL:
4723+
return fewerElementsVectorSeqReductions(MI, TypeIdx, NarrowTy);
47214724
case G_SHUFFLE_VECTOR:
47224725
return fewerElementsVectorShuffle(MI, TypeIdx, NarrowTy);
47234726
case G_FPOWI:
@@ -4951,6 +4954,36 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorReductions(
49514954
return Legalized;
49524955
}
49534956

4957+
LegalizerHelper::LegalizeResult
4958+
LegalizerHelper::fewerElementsVectorSeqReductions(MachineInstr &MI,
4959+
unsigned int TypeIdx,
4960+
LLT NarrowTy) {
4961+
auto [DstReg, DstTy, ScalarReg, ScalarTy, SrcReg, SrcTy] =
4962+
MI.getFirst3RegLLTs();
4963+
if (!NarrowTy.isScalar() || TypeIdx != 2 || DstTy != ScalarTy ||
4964+
DstTy != NarrowTy)
4965+
return UnableToLegalize;
4966+
4967+
assert((MI.getOpcode() == TargetOpcode::G_VECREDUCE_SEQ_FADD ||
4968+
MI.getOpcode() == TargetOpcode::G_VECREDUCE_SEQ_FMUL) &&
4969+
"Unexpected vecreduce opcode");
4970+
unsigned ScalarOpc = MI.getOpcode() == TargetOpcode::G_VECREDUCE_SEQ_FADD
4971+
? TargetOpcode::G_FADD
4972+
: TargetOpcode::G_FMUL;
4973+
4974+
SmallVector<Register> SplitSrcs;
4975+
unsigned NumParts = SrcTy.getNumElements();
4976+
extractParts(SrcReg, NarrowTy, NumParts, SplitSrcs);
4977+
Register Acc = ScalarReg;
4978+
for (unsigned i = 0; i < NumParts; i++)
4979+
Acc = MIRBuilder.buildInstr(ScalarOpc, {NarrowTy}, {Acc, SplitSrcs[i]})
4980+
.getReg(0);
4981+
4982+
MIRBuilder.buildCopy(DstReg, Acc);
4983+
MI.eraseFromParent();
4984+
return Legalized;
4985+
}
4986+
49544987
LegalizerHelper::LegalizeResult
49554988
LegalizerHelper::tryNarrowPow2Reduction(MachineInstr &MI, Register SrcReg,
49564989
LLT SrcTy, LLT NarrowTy,

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
10241024
.scalarize(1)
10251025
.lower();
10261026

1027+
getActionDefinitionsBuilder({G_VECREDUCE_SEQ_FADD, G_VECREDUCE_SEQ_FMUL})
1028+
.scalarize(2)
1029+
.lower();
1030+
10271031
getActionDefinitionsBuilder(G_VECREDUCE_ADD)
10281032
.legalFor({{s8, v16s8},
10291033
{s8, v8s8},

llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -726,11 +726,12 @@
726726
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
727727
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
728728
# DEBUG-NEXT: G_VECREDUCE_SEQ_FADD (opcode {{[0-9]+}}): 3 type indices, 0 imm indices
729-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
730-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
729+
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
730+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
731731
# DEBUG-NEXT: G_VECREDUCE_SEQ_FMUL (opcode {{[0-9]+}}): 3 type indices, 0 imm indices
732-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
733-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
732+
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
733+
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
734+
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected
734735
# DEBUG-NEXT: G_VECREDUCE_FADD (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
735736
# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected
736737
# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected

0 commit comments

Comments
 (0)