@@ -26,6 +26,7 @@ struct RISCVMoveMerge : public MachineFunctionPass {
2626
2727 RISCVMoveMerge () : MachineFunctionPass(ID) {}
2828
29+ const RISCVSubtarget *ST;
2930 const RISCVInstrInfo *TII;
3031 const TargetRegisterInfo *TRI;
3132
@@ -37,15 +38,15 @@ struct RISCVMoveMerge : public MachineFunctionPass {
3738 // Merge the two instructions indicated into a single pair instruction.
3839 MachineBasicBlock::iterator
3940 mergePairedInsns (MachineBasicBlock::iterator I,
40- MachineBasicBlock::iterator Paired, unsigned Opcode );
41+ MachineBasicBlock::iterator Paired, bool MoveFromAToS );
4142
4243 // Look for C.MV instruction that can be combined with
4344 // the given instruction into CM.MVA01S or CM.MVSA01. Return the matching
4445 // instruction if one exists.
4546 MachineBasicBlock::iterator
46- findMatchingInst (MachineBasicBlock::iterator &MBBI, unsigned InstOpcode ,
47+ findMatchingInst (MachineBasicBlock::iterator &MBBI, bool MoveFromAToS ,
4748 const DestSourcePair &RegPair);
48- bool mergeMoveSARegPair (const RISCVSubtarget &STI, MachineBasicBlock &MBB);
49+ bool mergeMoveSARegPair (MachineBasicBlock &MBB);
4950 bool runOnMachineFunction (MachineFunction &Fn) override ;
5051
5152 StringRef getPassName () const override { return RISCV_MOVE_MERGE_NAME; }
@@ -58,41 +59,21 @@ char RISCVMoveMerge::ID = 0;
5859INITIALIZE_PASS (RISCVMoveMerge, " riscv-move-merge" , RISCV_MOVE_MERGE_NAME,
5960 false , false )
6061
61- static bool isMoveFromAToS(unsigned Opcode) {
62- switch (Opcode) {
63- case RISCV::CM_MVA01S:
64- case RISCV::QC_CM_MVA01S:
65- return true ;
66- default :
67- return false ;
68- }
69- }
70-
71- static unsigned getMoveFromAToSOpcode (const RISCVSubtarget &STI) {
72- if (STI.hasStdExtZcmp ())
62+ static unsigned getMoveFromAToSOpcode(const RISCVSubtarget &ST) {
63+ if (ST.hasStdExtZcmp ())
7364 return RISCV::CM_MVA01S;
7465
75- if (STI .hasVendorXqccmp ())
66+ if (ST .hasVendorXqccmp ())
7667 return RISCV::QC_CM_MVA01S;
7768
7869 llvm_unreachable (" Unhandled subtarget with paired A to S move." );
7970}
8071
81- static bool isMoveFromSToA (unsigned Opcode) {
82- switch (Opcode) {
83- case RISCV::CM_MVSA01:
84- case RISCV::QC_CM_MVSA01:
85- return true ;
86- default :
87- return false ;
88- }
89- }
90-
91- static unsigned getMoveFromSToAOpcode (const RISCVSubtarget &STI) {
92- if (STI.hasStdExtZcmp ())
72+ static unsigned getMoveFromSToAOpcode (const RISCVSubtarget &ST) {
73+ if (ST.hasStdExtZcmp ())
9374 return RISCV::CM_MVSA01;
9475
95- if (STI .hasVendorXqccmp ())
76+ if (ST .hasVendorXqccmp ())
9677 return RISCV::QC_CM_MVSA01;
9778
9879 llvm_unreachable (" Unhandled subtarget with paired S to A move" );
@@ -123,15 +104,14 @@ bool RISCVMoveMerge::isCandidateToMergeMVSA01(const DestSourcePair &RegPair) {
123104MachineBasicBlock::iterator
124105RISCVMoveMerge::mergePairedInsns (MachineBasicBlock::iterator I,
125106 MachineBasicBlock::iterator Paired,
126- unsigned Opcode ) {
107+ bool MoveFromAToS ) {
127108 const MachineOperand *Sreg1, *Sreg2;
128109 MachineBasicBlock::iterator E = I->getParent ()->end ();
129110 MachineBasicBlock::iterator NextI = next_nodbg (I, E);
130111 DestSourcePair FirstPair = TII->isCopyInstrImpl (*I).value ();
131112 DestSourcePair PairedRegs = TII->isCopyInstrImpl (*Paired).value ();
132- Register ARegInFirstPair = isMoveFromAToS (Opcode)
133- ? FirstPair.Destination ->getReg ()
134- : FirstPair.Source ->getReg ();
113+ Register ARegInFirstPair = MoveFromAToS ? FirstPair.Destination ->getReg ()
114+ : FirstPair.Source ->getReg ();
135115
136116 if (NextI == Paired)
137117 NextI = next_nodbg (NextI, E);
@@ -146,10 +126,13 @@ RISCVMoveMerge::mergePairedInsns(MachineBasicBlock::iterator I,
146126 // mv a0, s2
147127 // mv a1, s1 => cm.mva01s s2,s1
148128 bool StartWithX10 = ARegInFirstPair == RISCV::X10;
149- if (isMoveFromAToS (Opcode)) {
129+ unsigned Opcode;
130+ if (MoveFromAToS) {
131+ Opcode = getMoveFromAToSOpcode (*ST);
150132 Sreg1 = StartWithX10 ? FirstPair.Source : PairedRegs.Source ;
151133 Sreg2 = StartWithX10 ? PairedRegs.Source : FirstPair.Source ;
152134 } else {
135+ Opcode = getMoveFromSToAOpcode (*ST);
153136 Sreg1 = StartWithX10 ? FirstPair.Destination : PairedRegs.Destination ;
154137 Sreg2 = StartWithX10 ? PairedRegs.Destination : FirstPair.Destination ;
155138 }
@@ -163,7 +146,7 @@ RISCVMoveMerge::mergePairedInsns(MachineBasicBlock::iterator I,
163146
164147MachineBasicBlock::iterator
165148RISCVMoveMerge::findMatchingInst (MachineBasicBlock::iterator &MBBI,
166- unsigned InstOpcode ,
149+ bool MoveFromAToS ,
167150 const DestSourcePair &RegPair) {
168151 MachineBasicBlock::iterator E = MBBI->getParent ()->end ();
169152
@@ -181,7 +164,7 @@ RISCVMoveMerge::findMatchingInst(MachineBasicBlock::iterator &MBBI,
181164 Register SourceReg = SecondPair->Source ->getReg ();
182165 Register DestReg = SecondPair->Destination ->getReg ();
183166
184- if (isMoveFromAToS (InstOpcode) && isCandidateToMergeMVA01S (*SecondPair)) {
167+ if (MoveFromAToS && isCandidateToMergeMVA01S (*SecondPair)) {
185168 // If register pair is valid and destination registers are different.
186169 if ((RegPair.Destination ->getReg () == DestReg))
187170 return E;
@@ -195,8 +178,7 @@ RISCVMoveMerge::findMatchingInst(MachineBasicBlock::iterator &MBBI,
195178 return E;
196179
197180 return I;
198- } else if (isMoveFromSToA (InstOpcode) &&
199- isCandidateToMergeMVSA01 (*SecondPair)) {
181+ } else if (!MoveFromAToS && isCandidateToMergeMVSA01 (*SecondPair)) {
200182 if ((RegPair.Source ->getReg () == SourceReg) ||
201183 (RegPair.Destination ->getReg () == DestReg))
202184 return E;
@@ -217,8 +199,7 @@ RISCVMoveMerge::findMatchingInst(MachineBasicBlock::iterator &MBBI,
217199
218200// Finds instructions, which could be represented as C.MV instructions and
219201// merged into CM.MVA01S or CM.MVSA01.
220- bool RISCVMoveMerge::mergeMoveSARegPair (const RISCVSubtarget &STI,
221- MachineBasicBlock &MBB) {
202+ bool RISCVMoveMerge::mergeMoveSARegPair (MachineBasicBlock &MBB) {
222203 bool Modified = false ;
223204
224205 for (MachineBasicBlock::iterator MBBI = MBB.begin (), E = MBB.end ();
@@ -227,22 +208,17 @@ bool RISCVMoveMerge::mergeMoveSARegPair(const RISCVSubtarget &STI,
227208 // can, return Dest/Src register pair.
228209 auto RegPair = TII->isCopyInstrImpl (*MBBI);
229210 if (RegPair.has_value ()) {
230- unsigned Opcode = 0 ;
231-
232- if (isCandidateToMergeMVA01S (*RegPair))
233- Opcode = getMoveFromAToSOpcode (STI);
234- else if (isCandidateToMergeMVSA01 (*RegPair))
235- Opcode = getMoveFromSToAOpcode (STI);
236- else {
211+ bool MoveFromAToS = isCandidateToMergeMVA01S (*RegPair);
212+ if (!MoveFromAToS && !isCandidateToMergeMVSA01 (*RegPair)) {
237213 ++MBBI;
238214 continue ;
239215 }
240216
241217 MachineBasicBlock::iterator Paired =
242- findMatchingInst (MBBI, Opcode , RegPair.value ());
218+ findMatchingInst (MBBI, MoveFromAToS , RegPair.value ());
243219 // If matching instruction can be found merge them.
244220 if (Paired != E) {
245- MBBI = mergePairedInsns (MBBI, Paired, Opcode );
221+ MBBI = mergePairedInsns (MBBI, Paired, MoveFromAToS );
246222 Modified = true ;
247223 continue ;
248224 }
@@ -256,20 +232,20 @@ bool RISCVMoveMerge::runOnMachineFunction(MachineFunction &Fn) {
256232 if (skipFunction (Fn.getFunction ()))
257233 return false ;
258234
259- const RISCVSubtarget *Subtarget = &Fn.getSubtarget <RISCVSubtarget>();
260- if (!(Subtarget ->hasStdExtZcmp () || Subtarget ->hasVendorXqccmp () ))
235+ ST = &Fn.getSubtarget <RISCVSubtarget>();
236+ if (!ST ->hasStdExtZcmp () && !ST ->hasVendorXqccmp ())
261237 return false ;
262238
263- TII = Subtarget ->getInstrInfo ();
264- TRI = Subtarget ->getRegisterInfo ();
239+ TII = ST ->getInstrInfo ();
240+ TRI = ST ->getRegisterInfo ();
265241 // Resize the modified and used register unit trackers. We do this once
266242 // per function and then clear the register units each time we optimize a
267243 // move.
268244 ModifiedRegUnits.init (*TRI);
269245 UsedRegUnits.init (*TRI);
270246 bool Modified = false ;
271247 for (auto &MBB : Fn)
272- Modified |= mergeMoveSARegPair (*Subtarget, MBB);
248+ Modified |= mergeMoveSARegPair (MBB);
273249 return Modified;
274250}
275251
0 commit comments