[llvm] [AArch64][GlobalISel] Combine vecreduce(ext) to {U/S}ADDLV (PR #75832)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 19 07:22:27 PST 2023
================
@@ -418,6 +411,158 @@ void applyExtAddvToUdotAddv(MachineInstr &MI, MachineRegisterInfo &MRI,
MI.eraseFromParent();
}
+// Matches {U/S}ADDV(ext(x)) => {U/S}ADDLV(x)
+// Ensure that the type coming from the extend instruction is the right size
+bool matchExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
+ std::pair<Register, bool> &MatchInfo) {
+ assert(MI.getOpcode() == TargetOpcode::G_VECREDUCE_ADD &&
+ "Expected G_VECREDUCE_ADD Opcode");
+
+ // Check if the last instruction is an extend
+ MachineInstr *ExtMI = getDefIgnoringCopies(MI.getOperand(1).getReg(), MRI);
+ auto ExtOpc = ExtMI->getOpcode();
+
+ if (ExtOpc == TargetOpcode::G_ZEXT)
+ std::get<1>(MatchInfo) = 0;
+ else if (ExtOpc == TargetOpcode::G_SEXT)
+ std::get<1>(MatchInfo) = 1;
+ else
+ return false;
+
+ // Check if the source register is a valid type
+ Register ExtSrcReg = ExtMI->getOperand(1).getReg();
+ LLT ExtSrcTy = MRI.getType(ExtSrcReg);
+ LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
+ if ((DstTy.getScalarSizeInBits() == 16 &&
----------------
davemgreen wrote:
This might need to be more careful about the type of the vecreduce, if it's pre-legalization.
It might be unlikely to come up, but the i8->i16 case should also be limited to < 256 vector elements (same for the others but with much higher vector lengths).
https://github.com/llvm/llvm-project/pull/75832
More information about the llvm-commits
mailing list