Skip to content

Commit 392c07b

Browse files
committed
[RISCV] Stop passing the merge opcode around in RISCVMoveMerger. NFC
What most code wants to know is the direction and we have to decode the opcode to figure that out. Instead pass the direction around as a bool and convert to opcode when we create the merge instruction.
1 parent 5836bae commit 392c07b

File tree

1 file changed

+30
-54
lines changed

1 file changed

+30
-54
lines changed

llvm/lib/Target/RISCV/RISCVMoveMerger.cpp

Lines changed: 30 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
5859
INITIALIZE_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) {
123104
MachineBasicBlock::iterator
124105
RISCVMoveMerge::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

164147
MachineBasicBlock::iterator
165148
RISCVMoveMerge::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

Comments
 (0)