@@ -8656,6 +8656,18 @@ static bool checkZExtBool(SDValue Arg, const SelectionDAG &DAG) {
86568656bool shouldUseFormStridedPseudo(MachineInstr &MI) {
86578657 MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
86588658
8659+ const TargetRegisterClass *RegClass = nullptr;
8660+ switch (MI.getOpcode()) {
8661+ case AArch64::FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO:
8662+ RegClass = &AArch64::ZPR2StridedOrContiguousRegClass;
8663+ break;
8664+ case AArch64::FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO:
8665+ RegClass = &AArch64::ZPR4StridedOrContiguousRegClass;
8666+ break;
8667+ default:
8668+ llvm_unreachable("Unexpected opcode.");
8669+ }
8670+
86598671 MCRegister SubReg = MCRegister::NoRegister;
86608672 for (unsigned I = 1; I < MI.getNumOperands(); ++I) {
86618673 MachineOperand &MO = MI.getOperand(I);
@@ -8665,26 +8677,15 @@ bool shouldUseFormStridedPseudo(MachineInstr &MI) {
86658677 if (!Def || !Def->getParent()->isCopy())
86668678 return false;
86678679
8668- const MachineOperand &CpySrc = Def->getParent()->getOperand(1);
8669- MachineOperand *CopySrcOp = MRI.getOneDef(CpySrc.getReg());
8670- unsigned OpSubReg = CpySrc.getSubReg();
8680+ const MachineOperand &CopySrc = Def->getParent()->getOperand(1);
8681+ unsigned OpSubReg = CopySrc.getSubReg();
86718682 if (SubReg == MCRegister::NoRegister)
86728683 SubReg = OpSubReg;
8684+
8685+ MachineOperand *CopySrcOp = MRI.getOneDef(CopySrc.getReg());
86738686 if (!CopySrcOp || !CopySrcOp->isReg() || OpSubReg != SubReg)
86748687 return false;
86758688
8676- const TargetRegisterClass *RegClass = nullptr;
8677- switch (MI.getNumOperands() - 1) {
8678- case 2:
8679- RegClass = &AArch64::ZPR2StridedOrContiguousRegClass;
8680- break;
8681- case 4:
8682- RegClass = &AArch64::ZPR4StridedOrContiguousRegClass;
8683- break;
8684- default:
8685- llvm_unreachable("Unexpected number of operands to pseudo.");
8686- }
8687-
86888689 if (MRI.getRegClass(CopySrcOp->getReg()) != RegClass)
86898690 return false;
86908691 }
@@ -8721,22 +8722,23 @@ void AArch64TargetLowering::AdjustInstrPostInstrSelection(MachineInstr &MI,
87218722 MI.getOpcode() == AArch64::FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO) {
87228723 // If input values to the FORM_TRANSPOSED_REG_TUPLE pseudo aren't copies
87238724 // from a StridedOrContiguous class, fall back on REG_SEQUENCE node.
8724- if (!shouldUseFormStridedPseudo(MI)) {
8725- static const unsigned SubRegs[] = {AArch64::zsub0, AArch64::zsub1,
8726- AArch64::zsub2, AArch64::zsub3};
8727-
8728- const TargetInstrInfo *TII = Subtarget->getInstrInfo();
8729- MachineInstrBuilder MIB = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
8730- TII->get(TargetOpcode::REG_SEQUENCE),
8731- MI.getOperand(0).getReg());
8732-
8733- for (unsigned I = 1; I < MI.getNumOperands(); ++I) {
8734- MIB.add(MI.getOperand(I));
8735- MIB.addImm(SubRegs[I - 1]);
8736- }
8725+ if (shouldUseFormStridedPseudo(MI))
8726+ return;
87378727
8738- MI.eraseFromParent();
8728+ static const unsigned SubRegs[] = {AArch64::zsub0, AArch64::zsub1,
8729+ AArch64::zsub2, AArch64::zsub3};
8730+
8731+ const TargetInstrInfo *TII = Subtarget->getInstrInfo();
8732+ MachineInstrBuilder MIB = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
8733+ TII->get(TargetOpcode::REG_SEQUENCE),
8734+ MI.getOperand(0).getReg());
8735+
8736+ for (unsigned I = 1; I < MI.getNumOperands(); ++I) {
8737+ MIB.add(MI.getOperand(I));
8738+ MIB.addImm(SubRegs[I - 1]);
87398739 }
8740+
8741+ MI.eraseFromParent();
87408742 return;
87418743 }
87428744
0 commit comments