|
71 | 71 |
|
72 | 72 | #include "AArch64ExpandImm.h"
|
73 | 73 | #include "AArch64InstrInfo.h"
|
74 |
| -#include "AArch64Subtarget.h" |
75 | 74 | #include "MCTargetDesc/AArch64AddressingModes.h"
|
76 | 75 | #include "llvm/CodeGen/MachineDominators.h"
|
77 | 76 | #include "llvm/CodeGen/MachineLoopInfo.h"
|
@@ -138,7 +137,6 @@ struct AArch64MIPeepholeOpt : public MachineFunctionPass {
|
138 | 137 | bool visitFMOVDr(MachineInstr &MI);
|
139 | 138 | bool visitUBFMXri(MachineInstr &MI);
|
140 | 139 | bool visitCopy(MachineInstr &MI);
|
141 |
| - bool visitRegSequence(MachineInstr &MI); |
142 | 140 | bool runOnMachineFunction(MachineFunction &MF) override;
|
143 | 141 |
|
144 | 142 | StringRef getPassName() const override {
|
@@ -837,85 +835,6 @@ bool AArch64MIPeepholeOpt::visitCopy(MachineInstr &MI) {
|
837 | 835 | return true;
|
838 | 836 | }
|
839 | 837 |
|
840 |
| -// Using the FORM_TRANSPOSED_REG_TUPLE pseudo can improve register allocation |
841 |
| -// of multi-vector intrinsics. However, the psuedo should only be emitted if |
842 |
| -// the input registers of the REG_SEQUENCE are copy nodes where the source |
843 |
| -// register is in a StridedOrContiguous class. For example: |
844 |
| -// |
845 |
| -// %3:zpr2stridedorcontiguous = LD1B_2Z_IMM_PSEUDO .. |
846 |
| -// %4:zpr = COPY %3.zsub1:zpr2stridedorcontiguous |
847 |
| -// %5:zpr = COPY %3.zsub0:zpr2stridedorcontiguous |
848 |
| -// %6:zpr2stridedorcontiguous = LD1B_2Z_PSEUDO .. |
849 |
| -// %7:zpr = COPY %6.zsub1:zpr2stridedorcontiguous |
850 |
| -// %8:zpr = COPY %6.zsub0:zpr2stridedorcontiguous |
851 |
| -// %9:zpr2mul2 = REG_SEQUENCE %5:zpr, %subreg.zsub0, %8:zpr, %subreg.zsub1 |
852 |
| -// |
853 |
| -// -> %9:zpr2mul2 = FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO %5:zpr, %8:zpr |
854 |
| -// |
855 |
| -bool AArch64MIPeepholeOpt::visitRegSequence(MachineInstr &MI) { |
856 |
| - MachineRegisterInfo &MRI = MI.getMF()->getRegInfo(); |
857 |
| - |
858 |
| - auto &ST = MI.getMF()->getSubtarget<AArch64Subtarget>(); |
859 |
| - if (!ST.hasSME() || !ST.isStreaming()) |
860 |
| - return false; |
861 |
| - |
862 |
| - switch (MRI.getRegClass(MI.getOperand(0).getReg())->getID()) { |
863 |
| - case AArch64::ZPR2RegClassID: |
864 |
| - case AArch64::ZPR4RegClassID: |
865 |
| - case AArch64::ZPR2Mul2RegClassID: |
866 |
| - case AArch64::ZPR4Mul4RegClassID: |
867 |
| - break; |
868 |
| - default: |
869 |
| - return false; |
870 |
| - } |
871 |
| - |
872 |
| - // The first operand is the register class created by the REG_SEQUENCE. |
873 |
| - // Each operand pair after this consists of a vreg + subreg index, so |
874 |
| - // for example a sequence of 2 registers will have a total of 5 operands. |
875 |
| - if (MI.getNumOperands() != 5 && MI.getNumOperands() != 9) |
876 |
| - return false; |
877 |
| - |
878 |
| - MCRegister SubReg = MCRegister::NoRegister; |
879 |
| - for (unsigned I = 1; I < MI.getNumOperands(); I += 2) { |
880 |
| - MachineOperand &MO = MI.getOperand(I); |
881 |
| - |
882 |
| - if (!MI.getOperand(I).isReg()) |
883 |
| - return false; |
884 |
| - |
885 |
| - MachineOperand *Def = MRI.getOneDef(MO.getReg()); |
886 |
| - if (!Def || !Def->getParent()->isCopy()) |
887 |
| - return false; |
888 |
| - |
889 |
| - const MachineOperand &CopySrc = Def->getParent()->getOperand(1); |
890 |
| - unsigned OpSubReg = CopySrc.getSubReg(); |
891 |
| - if (SubReg == MCRegister::NoRegister) |
892 |
| - SubReg = OpSubReg; |
893 |
| - |
894 |
| - MachineOperand *CopySrcOp = MRI.getOneDef(CopySrc.getReg()); |
895 |
| - if (!CopySrcOp || !CopySrcOp->isReg() || OpSubReg != SubReg || |
896 |
| - CopySrcOp->getReg().isPhysical()) |
897 |
| - return false; |
898 |
| - |
899 |
| - const TargetRegisterClass *CopySrcClass = |
900 |
| - MRI.getRegClass(CopySrcOp->getReg()); |
901 |
| - if (CopySrcClass != &AArch64::ZPR2StridedOrContiguousRegClass && |
902 |
| - CopySrcClass != &AArch64::ZPR4StridedOrContiguousRegClass) |
903 |
| - return false; |
904 |
| - } |
905 |
| - |
906 |
| - unsigned Opc = MI.getNumOperands() == 5 |
907 |
| - ? AArch64::FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO |
908 |
| - : AArch64::FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO; |
909 |
| - |
910 |
| - MachineInstrBuilder MIB = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), |
911 |
| - TII->get(Opc), MI.getOperand(0).getReg()); |
912 |
| - for (unsigned I = 1; I < MI.getNumOperands(); I += 2) |
913 |
| - MIB.addReg(MI.getOperand(I).getReg()); |
914 |
| - |
915 |
| - MI.eraseFromParent(); |
916 |
| - return true; |
917 |
| -} |
918 |
| - |
919 | 838 | bool AArch64MIPeepholeOpt::runOnMachineFunction(MachineFunction &MF) {
|
920 | 839 | if (skipFunction(MF.getFunction()))
|
921 | 840 | return false;
|
@@ -1007,9 +926,6 @@ bool AArch64MIPeepholeOpt::runOnMachineFunction(MachineFunction &MF) {
|
1007 | 926 | case AArch64::COPY:
|
1008 | 927 | Changed |= visitCopy(MI);
|
1009 | 928 | break;
|
1010 |
| - case AArch64::REG_SEQUENCE: |
1011 |
| - Changed |= visitRegSequence(MI); |
1012 |
| - break; |
1013 | 929 | }
|
1014 | 930 | }
|
1015 | 931 | }
|
|
0 commit comments