Skip to content

Commit 9311f38

Browse files
authored
[RISCV][NFC] Combine RISCVOptWInstrs::stripWSuffixes and appendWSuffixes into canonicalizeWSuffixes (#149710)
This refactor was suggested in <#144703>. I have checked for unexpected changes by comparing builds of llvm-test-suite with/without this refactor, including with preferWInst force enabled.
1 parent 3b8adcf commit 9311f38

File tree

1 file changed

+41
-53
lines changed

1 file changed

+41
-53
lines changed

llvm/lib/Target/RISCV/RISCVOptWInstrs.cpp

Lines changed: 41 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,9 @@ class RISCVOptWInstrs : public MachineFunctionPass {
6969
bool runOnMachineFunction(MachineFunction &MF) override;
7070
bool removeSExtWInstrs(MachineFunction &MF, const RISCVInstrInfo &TII,
7171
const RISCVSubtarget &ST, MachineRegisterInfo &MRI);
72-
bool stripWSuffixes(MachineFunction &MF, const RISCVInstrInfo &TII,
73-
const RISCVSubtarget &ST, MachineRegisterInfo &MRI);
74-
bool appendWSuffixes(MachineFunction &MF, const RISCVInstrInfo &TII,
75-
const RISCVSubtarget &ST, MachineRegisterInfo &MRI);
72+
bool canonicalizeWSuffixes(MachineFunction &MF, const RISCVInstrInfo &TII,
73+
const RISCVSubtarget &ST,
74+
MachineRegisterInfo &MRI);
7675

7776
void getAnalysisUsage(AnalysisUsage &AU) const override {
7877
AU.setPreservesCFG();
@@ -723,51 +722,38 @@ bool RISCVOptWInstrs::removeSExtWInstrs(MachineFunction &MF,
723722
return MadeChange;
724723
}
725724

726-
bool RISCVOptWInstrs::stripWSuffixes(MachineFunction &MF,
727-
const RISCVInstrInfo &TII,
728-
const RISCVSubtarget &ST,
729-
MachineRegisterInfo &MRI) {
725+
// Strips or adds W suffixes to eligible instructions depending on the
726+
// subtarget preferences.
727+
bool RISCVOptWInstrs::canonicalizeWSuffixes(MachineFunction &MF,
728+
const RISCVInstrInfo &TII,
729+
const RISCVSubtarget &ST,
730+
MachineRegisterInfo &MRI) {
731+
bool ShouldStripW = !(DisableStripWSuffix || ST.preferWInst());
732+
bool ShouldPreferW = ST.preferWInst();
730733
bool MadeChange = false;
731-
for (MachineBasicBlock &MBB : MF) {
732-
for (MachineInstr &MI : MBB) {
733-
unsigned Opc;
734-
// clang-format off
735-
switch (MI.getOpcode()) {
736-
default:
737-
continue;
738-
case RISCV::ADDW: Opc = RISCV::ADD; break;
739-
case RISCV::ADDIW: Opc = RISCV::ADDI; break;
740-
case RISCV::MULW: Opc = RISCV::MUL; break;
741-
case RISCV::SLLIW: Opc = RISCV::SLLI; break;
742-
case RISCV::SUBW: Opc = RISCV::SUB; break;
743-
}
744-
// clang-format on
745734

746-
if (hasAllWUsers(MI, ST, MRI)) {
747-
LLVM_DEBUG(dbgs() << "Replacing " << MI);
748-
MI.setDesc(TII.get(Opc));
749-
LLVM_DEBUG(dbgs() << " with " << MI);
750-
++NumTransformedToNonWInstrs;
751-
MadeChange = true;
752-
}
753-
}
754-
}
755-
756-
return MadeChange;
757-
}
758-
759-
bool RISCVOptWInstrs::appendWSuffixes(MachineFunction &MF,
760-
const RISCVInstrInfo &TII,
761-
const RISCVSubtarget &ST,
762-
MachineRegisterInfo &MRI) {
763-
bool MadeChange = false;
764735
for (MachineBasicBlock &MBB : MF) {
765736
for (MachineInstr &MI : MBB) {
766-
unsigned WOpc;
767-
// TODO: Add more?
737+
std::optional<unsigned> WOpc;
738+
std::optional<unsigned> NonWOpc;
768739
switch (MI.getOpcode()) {
769740
default:
770741
continue;
742+
case RISCV::ADDW:
743+
NonWOpc = RISCV::ADD;
744+
break;
745+
case RISCV::ADDIW:
746+
NonWOpc = RISCV::ADDI;
747+
break;
748+
case RISCV::MULW:
749+
NonWOpc = RISCV::MUL;
750+
break;
751+
case RISCV::SLLIW:
752+
NonWOpc = RISCV::SLLI;
753+
break;
754+
case RISCV::SUBW:
755+
NonWOpc = RISCV::SUB;
756+
break;
771757
case RISCV::ADD:
772758
WOpc = RISCV::ADDW;
773759
break;
@@ -781,7 +767,7 @@ bool RISCVOptWInstrs::appendWSuffixes(MachineFunction &MF,
781767
WOpc = RISCV::MULW;
782768
break;
783769
case RISCV::SLLI:
784-
// SLLIW reads the lowest 5 bits, while SLLI reads lowest 6 bits
770+
// SLLIW reads the lowest 5 bits, while SLLI reads lowest 6 bits.
785771
if (MI.getOperand(2).getImm() >= 32)
786772
continue;
787773
WOpc = RISCV::SLLIW;
@@ -792,19 +778,27 @@ bool RISCVOptWInstrs::appendWSuffixes(MachineFunction &MF,
792778
break;
793779
}
794780

795-
if (hasAllWUsers(MI, ST, MRI)) {
781+
if (ShouldStripW && NonWOpc.has_value() && hasAllWUsers(MI, ST, MRI)) {
796782
LLVM_DEBUG(dbgs() << "Replacing " << MI);
797-
MI.setDesc(TII.get(WOpc));
783+
MI.setDesc(TII.get(NonWOpc.value()));
784+
LLVM_DEBUG(dbgs() << " with " << MI);
785+
++NumTransformedToNonWInstrs;
786+
MadeChange = true;
787+
continue;
788+
}
789+
if (ShouldPreferW && WOpc.has_value() && hasAllWUsers(MI, ST, MRI)) {
790+
LLVM_DEBUG(dbgs() << "Replacing " << MI);
791+
MI.setDesc(TII.get(WOpc.value()));
798792
MI.clearFlag(MachineInstr::MIFlag::NoSWrap);
799793
MI.clearFlag(MachineInstr::MIFlag::NoUWrap);
800794
MI.clearFlag(MachineInstr::MIFlag::IsExact);
801795
LLVM_DEBUG(dbgs() << " with " << MI);
802796
++NumTransformedToWInstrs;
803797
MadeChange = true;
798+
continue;
804799
}
805800
}
806801
}
807-
808802
return MadeChange;
809803
}
810804

@@ -821,12 +815,6 @@ bool RISCVOptWInstrs::runOnMachineFunction(MachineFunction &MF) {
821815

822816
bool MadeChange = false;
823817
MadeChange |= removeSExtWInstrs(MF, TII, ST, MRI);
824-
825-
if (!(DisableStripWSuffix || ST.preferWInst()))
826-
MadeChange |= stripWSuffixes(MF, TII, ST, MRI);
827-
828-
if (ST.preferWInst())
829-
MadeChange |= appendWSuffixes(MF, TII, ST, MRI);
830-
818+
MadeChange |= canonicalizeWSuffixes(MF, TII, ST, MRI);
831819
return MadeChange;
832820
}

0 commit comments

Comments
 (0)