@@ -2753,6 +2753,148 @@ bool RISCVDAGToDAGISel::selectSHXADD_UWOp(SDValue N, unsigned ShAmt,
2753
2753
return false ;
2754
2754
}
2755
2755
2756
+ static bool vectorPseudoHasAllNBitUsers (SDNode *User, unsigned UserOpNo,
2757
+ unsigned Bits,
2758
+ const TargetInstrInfo *TII) {
2759
+ const RISCVVPseudosTable::PseudoInfo *PseudoInfo =
2760
+ RISCVVPseudosTable::getPseudoInfo (User->getMachineOpcode ());
2761
+
2762
+ if (!PseudoInfo)
2763
+ return false ;
2764
+
2765
+ const MCInstrDesc &MCID = TII->get (User->getMachineOpcode ());
2766
+ const uint64_t TSFlags = MCID.TSFlags ;
2767
+ if (!RISCVII::hasSEWOp (TSFlags))
2768
+ return false ;
2769
+ assert (RISCVII::hasVLOp (TSFlags));
2770
+
2771
+ bool HasGlueOp = User->getGluedNode () != nullptr ;
2772
+ unsigned ChainOpIdx = User->getNumOperands () - HasGlueOp - 1 ;
2773
+ bool HasChainOp = User->getOperand (ChainOpIdx).getValueType () == MVT::Other;
2774
+ bool HasVecPolicyOp = RISCVII::hasVecPolicyOp (TSFlags);
2775
+ unsigned VLIdx =
2776
+ User->getNumOperands () - HasVecPolicyOp - HasChainOp - HasGlueOp - 2 ;
2777
+ const unsigned Log2SEW = User->getConstantOperandVal (VLIdx + 1 );
2778
+
2779
+ if (UserOpNo == VLIdx)
2780
+ return false ;
2781
+
2782
+ // TODO: Handle Zvbb instructions
2783
+ switch (PseudoInfo->BaseInstr ) {
2784
+ default :
2785
+ return false ;
2786
+
2787
+ // 11.6. Vector Single-Width Shift Instructions
2788
+ case RISCV::VSLL_VX:
2789
+ case RISCV::VSRL_VX:
2790
+ case RISCV::VSRA_VX:
2791
+ // 12.4. Vector Single-Width Scaling Shift Instructions
2792
+ case RISCV::VSSRL_VX:
2793
+ case RISCV::VSSRA_VX:
2794
+ // Only the low lg2(SEW) bits of the shift-amount value are used.
2795
+ if (Bits < Log2SEW)
2796
+ return false ;
2797
+ break ;
2798
+
2799
+ // 11.7 Vector Narrowing Integer Right Shift Instructions
2800
+ case RISCV::VNSRL_WX:
2801
+ case RISCV::VNSRA_WX:
2802
+ // 12.5. Vector Narrowing Fixed-Point Clip Instructions
2803
+ case RISCV::VNCLIPU_WX:
2804
+ case RISCV::VNCLIP_WX:
2805
+ // Only the low lg2(2*SEW) bits of the shift-amount value are used.
2806
+ if (Bits < Log2SEW + 1 )
2807
+ return false ;
2808
+ break ;
2809
+
2810
+ // 11.1. Vector Single-Width Integer Add and Subtract
2811
+ case RISCV::VADD_VX:
2812
+ case RISCV::VSUB_VX:
2813
+ case RISCV::VRSUB_VX:
2814
+ // 11.2. Vector Widening Integer Add/Subtract
2815
+ case RISCV::VWADDU_VX:
2816
+ case RISCV::VWSUBU_VX:
2817
+ case RISCV::VWADD_VX:
2818
+ case RISCV::VWSUB_VX:
2819
+ case RISCV::VWADDU_WX:
2820
+ case RISCV::VWSUBU_WX:
2821
+ case RISCV::VWADD_WX:
2822
+ case RISCV::VWSUB_WX:
2823
+ // 11.4. Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions
2824
+ case RISCV::VADC_VXM:
2825
+ case RISCV::VADC_VIM:
2826
+ case RISCV::VMADC_VXM:
2827
+ case RISCV::VMADC_VIM:
2828
+ case RISCV::VMADC_VX:
2829
+ case RISCV::VSBC_VXM:
2830
+ case RISCV::VMSBC_VXM:
2831
+ case RISCV::VMSBC_VX:
2832
+ // 11.5 Vector Bitwise Logical Instructions
2833
+ case RISCV::VAND_VX:
2834
+ case RISCV::VOR_VX:
2835
+ case RISCV::VXOR_VX:
2836
+ // 11.8. Vector Integer Compare Instructions
2837
+ case RISCV::VMSEQ_VX:
2838
+ case RISCV::VMSNE_VX:
2839
+ case RISCV::VMSLTU_VX:
2840
+ case RISCV::VMSLT_VX:
2841
+ case RISCV::VMSLEU_VX:
2842
+ case RISCV::VMSLE_VX:
2843
+ case RISCV::VMSGTU_VX:
2844
+ case RISCV::VMSGT_VX:
2845
+ // 11.9. Vector Integer Min/Max Instructions
2846
+ case RISCV::VMINU_VX:
2847
+ case RISCV::VMIN_VX:
2848
+ case RISCV::VMAXU_VX:
2849
+ case RISCV::VMAX_VX:
2850
+ // 11.10. Vector Single-Width Integer Multiply Instructions
2851
+ case RISCV::VMUL_VX:
2852
+ case RISCV::VMULH_VX:
2853
+ case RISCV::VMULHU_VX:
2854
+ case RISCV::VMULHSU_VX:
2855
+ // 11.11. Vector Integer Divide Instructions
2856
+ case RISCV::VDIVU_VX:
2857
+ case RISCV::VDIV_VX:
2858
+ case RISCV::VREMU_VX:
2859
+ case RISCV::VREM_VX:
2860
+ // 11.12. Vector Widening Integer Multiply Instructions
2861
+ case RISCV::VWMUL_VX:
2862
+ case RISCV::VWMULU_VX:
2863
+ case RISCV::VWMULSU_VX:
2864
+ // 11.13. Vector Single-Width Integer Multiply-Add Instructions
2865
+ case RISCV::VMACC_VX:
2866
+ case RISCV::VNMSAC_VX:
2867
+ case RISCV::VMADD_VX:
2868
+ case RISCV::VNMSUB_VX:
2869
+ // 11.14. Vector Widening Integer Multiply-Add Instructions
2870
+ case RISCV::VWMACCU_VX:
2871
+ case RISCV::VWMACC_VX:
2872
+ case RISCV::VWMACCSU_VX:
2873
+ case RISCV::VWMACCUS_VX:
2874
+ // 11.15. Vector Integer Merge Instructions
2875
+ case RISCV::VMERGE_VXM:
2876
+ // 11.16. Vector Integer Move Instructions
2877
+ case RISCV::VMV_V_X:
2878
+ // 12.1. Vector Single-Width Saturating Add and Subtract
2879
+ case RISCV::VSADDU_VX:
2880
+ case RISCV::VSADD_VX:
2881
+ case RISCV::VSSUBU_VX:
2882
+ case RISCV::VSSUB_VX:
2883
+ // 12.2. Vector Single-Width Averaging Add and Subtract
2884
+ case RISCV::VAADDU_VX:
2885
+ case RISCV::VAADD_VX:
2886
+ case RISCV::VASUBU_VX:
2887
+ case RISCV::VASUB_VX:
2888
+ // 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation
2889
+ case RISCV::VSMUL_VX:
2890
+ // 16.1. Integer Scalar Move Instructions
2891
+ case RISCV::VMV_S_X:
2892
+ if (Bits < (1 << Log2SEW))
2893
+ return false ;
2894
+ }
2895
+ return true ;
2896
+ }
2897
+
2756
2898
// Return true if all users of this SDNode* only consume the lower \p Bits.
2757
2899
// This can be used to form W instructions for add/sub/mul/shl even when the
2758
2900
// root isn't a sext_inreg. This can allow the ADDW/SUBW/MULW/SLLIW to CSE if
@@ -2784,6 +2926,8 @@ bool RISCVDAGToDAGISel::hasAllNBitUsers(SDNode *Node, unsigned Bits,
2784
2926
// TODO: Add more opcodes?
2785
2927
switch (User->getMachineOpcode ()) {
2786
2928
default :
2929
+ if (vectorPseudoHasAllNBitUsers (User, UI.getOperandNo (), Bits, TII))
2930
+ break ;
2787
2931
return false ;
2788
2932
case RISCV::ADDW:
2789
2933
case RISCV::ADDIW:
0 commit comments