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