@@ -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