@@ -69,10 +69,9 @@ class RISCVOptWInstrs : public MachineFunctionPass {
69
69
bool runOnMachineFunction (MachineFunction &MF) override ;
70
70
bool removeSExtWInstrs (MachineFunction &MF, const RISCVInstrInfo &TII,
71
71
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);
76
75
77
76
void getAnalysisUsage (AnalysisUsage &AU) const override {
78
77
AU.setPreservesCFG ();
@@ -723,51 +722,38 @@ bool RISCVOptWInstrs::removeSExtWInstrs(MachineFunction &MF,
723
722
return MadeChange;
724
723
}
725
724
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 ();
730
733
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
745
734
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 ;
764
735
for (MachineBasicBlock &MBB : MF) {
765
736
for (MachineInstr &MI : MBB) {
766
- unsigned WOpc;
767
- // TODO: Add more?
737
+ std::optional< unsigned > WOpc;
738
+ std::optional< unsigned > NonWOpc;
768
739
switch (MI.getOpcode ()) {
769
740
default :
770
741
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 ;
771
757
case RISCV::ADD:
772
758
WOpc = RISCV::ADDW;
773
759
break ;
@@ -781,7 +767,7 @@ bool RISCVOptWInstrs::appendWSuffixes(MachineFunction &MF,
781
767
WOpc = RISCV::MULW;
782
768
break ;
783
769
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.
785
771
if (MI.getOperand (2 ).getImm () >= 32 )
786
772
continue ;
787
773
WOpc = RISCV::SLLIW;
@@ -792,19 +778,27 @@ bool RISCVOptWInstrs::appendWSuffixes(MachineFunction &MF,
792
778
break ;
793
779
}
794
780
795
- if (hasAllWUsers (MI, ST, MRI)) {
781
+ if (ShouldStripW && NonWOpc. has_value () && hasAllWUsers (MI, ST, MRI)) {
796
782
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 ()));
798
792
MI.clearFlag (MachineInstr::MIFlag::NoSWrap);
799
793
MI.clearFlag (MachineInstr::MIFlag::NoUWrap);
800
794
MI.clearFlag (MachineInstr::MIFlag::IsExact);
801
795
LLVM_DEBUG (dbgs () << " with " << MI);
802
796
++NumTransformedToWInstrs;
803
797
MadeChange = true ;
798
+ continue ;
804
799
}
805
800
}
806
801
}
807
-
808
802
return MadeChange;
809
803
}
810
804
@@ -821,12 +815,6 @@ bool RISCVOptWInstrs::runOnMachineFunction(MachineFunction &MF) {
821
815
822
816
bool MadeChange = false ;
823
817
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);
831
819
return MadeChange;
832
820
}
0 commit comments