28#define DEBUG_TYPE "riscv-vl-optimizer"
29#define PASS_NAME "RISC-V VL Optimizer"
54 std::optional<MachineOperand>
58 std::optional<MachineOperand> checkUsers(
const MachineInstr &
MI)
const;
73 std::optional<std::pair<unsigned, bool>> EMUL;
80 OperandInfo(std::pair<unsigned, bool> EMUL,
unsigned Log2EEW)
81 : EMUL(EMUL), Log2EEW(Log2EEW) {}
83 OperandInfo(
unsigned Log2EEW) : Log2EEW(Log2EEW) {}
85 OperandInfo() =
delete;
89 static bool areCompatible(
const OperandInfo &Def,
const OperandInfo &
User) {
90 if (Def.Log2EEW !=
User.Log2EEW)
92 if (
User.EMUL && Def.EMUL !=
User.EMUL)
104 OS <<
"EMUL: none\n";
105 OS <<
", EEW: " << (1 << Log2EEW);
111char RISCVVLOptimizer::ID = 0;
117 return new RISCVVLOptimizer();
128 const std::optional<OperandInfo> &OI) {
138static std::pair<unsigned, bool>
150 unsigned MISEW = 1 << MILog2SEW;
152 unsigned EEW = 1 << Log2EEW;
155 unsigned Num = EEW, Denom = MISEW;
156 int GCD = MILMULIsFractional ? std::gcd(Num, Denom * MILMUL)
157 : std::gcd(Num * MILMUL, Denom);
158 Num = MILMULIsFractional ? Num / GCD : Num * MILMUL / GCD;
159 Denom = MILMULIsFractional ? Denom * MILMUL / GCD : Denom / GCD;
160 return std::make_pair(Num > Denom ? Num : Denom, Denom > Num);
174 unsigned MISEW = 1 << MILog2SEW;
175 unsigned EEW = MISEW / Factor;
176 unsigned Log2EEW =
Log2_32(EEW);
181static std::optional<unsigned>
186 RISCVVPseudosTable::getPseudoInfo(
MI.getOpcode());
187 assert(
RVV &&
"Could not find MI in PseudoTable");
202 Info.RegClass == RISCV::VMV0RegClassID)
207 switch (
RVV->BaseInstr) {
211 case RISCV::VSETIVLI:
231 case RISCV::VLSE16_V:
232 case RISCV::VSSE16_V:
236 case RISCV::VLSE32_V:
237 case RISCV::VSSE32_V:
241 case RISCV::VLSE64_V:
242 case RISCV::VSSE64_V:
248 case RISCV::VLUXEI8_V:
249 case RISCV::VLOXEI8_V:
250 case RISCV::VSUXEI8_V:
251 case RISCV::VSOXEI8_V: {
256 case RISCV::VLUXEI16_V:
257 case RISCV::VLOXEI16_V:
258 case RISCV::VSUXEI16_V:
259 case RISCV::VSOXEI16_V: {
264 case RISCV::VLUXEI32_V:
265 case RISCV::VLOXEI32_V:
266 case RISCV::VSUXEI32_V:
267 case RISCV::VSOXEI32_V: {
272 case RISCV::VLUXEI64_V:
273 case RISCV::VLOXEI64_V:
274 case RISCV::VSUXEI64_V:
275 case RISCV::VSOXEI64_V: {
288 case RISCV::VRSUB_VI:
289 case RISCV::VRSUB_VX:
313 case RISCV::VMINU_VV:
314 case RISCV::VMINU_VX:
317 case RISCV::VMAXU_VV:
318 case RISCV::VMAXU_VX:
325 case RISCV::VMULH_VV:
326 case RISCV::VMULH_VX:
327 case RISCV::VMULHU_VV:
328 case RISCV::VMULHU_VX:
329 case RISCV::VMULHSU_VV:
330 case RISCV::VMULHSU_VX:
333 case RISCV::VDIVU_VV:
334 case RISCV::VDIVU_VX:
337 case RISCV::VREMU_VV:
338 case RISCV::VREMU_VX:
343 case RISCV::VMACC_VV:
344 case RISCV::VMACC_VX:
345 case RISCV::VNMSAC_VV:
346 case RISCV::VNMSAC_VX:
347 case RISCV::VMADD_VV:
348 case RISCV::VMADD_VX:
349 case RISCV::VNMSUB_VV:
350 case RISCV::VNMSUB_VX:
355 case RISCV::VMERGE_VIM:
356 case RISCV::VMERGE_VVM:
357 case RISCV::VMERGE_VXM:
358 case RISCV::VADC_VIM:
359 case RISCV::VADC_VVM:
360 case RISCV::VADC_VXM:
361 case RISCV::VSBC_VVM:
362 case RISCV::VSBC_VXM:
371 case RISCV::VSADDU_VI:
372 case RISCV::VSADDU_VV:
373 case RISCV::VSADDU_VX:
374 case RISCV::VSADD_VI:
375 case RISCV::VSADD_VV:
376 case RISCV::VSADD_VX:
377 case RISCV::VSSUBU_VV:
378 case RISCV::VSSUBU_VX:
379 case RISCV::VSSUB_VV:
380 case RISCV::VSSUB_VX:
381 case RISCV::VAADDU_VV:
382 case RISCV::VAADDU_VX:
383 case RISCV::VAADD_VV:
384 case RISCV::VAADD_VX:
385 case RISCV::VASUBU_VV:
386 case RISCV::VASUBU_VX:
387 case RISCV::VASUB_VV:
388 case RISCV::VASUB_VX:
392 case RISCV::VSMUL_VV:
393 case RISCV::VSMUL_VX:
396 case RISCV::VSSRL_VI:
397 case RISCV::VSSRL_VV:
398 case RISCV::VSSRL_VX:
399 case RISCV::VSSRA_VI:
400 case RISCV::VSSRA_VV:
401 case RISCV::VSSRA_VX:
408 case RISCV::VFMV_F_S:
409 case RISCV::VFMV_S_F:
412 case RISCV::VSLIDEUP_VI:
413 case RISCV::VSLIDEUP_VX:
414 case RISCV::VSLIDEDOWN_VI:
415 case RISCV::VSLIDEDOWN_VX:
416 case RISCV::VSLIDE1UP_VX:
417 case RISCV::VFSLIDE1UP_VF:
418 case RISCV::VSLIDE1DOWN_VX:
419 case RISCV::VFSLIDE1DOWN_VF:
422 case RISCV::VRGATHER_VI:
423 case RISCV::VRGATHER_VV:
424 case RISCV::VRGATHER_VX:
427 case RISCV::VCOMPRESS_VM:
431 case RISCV::VFADD_VF:
432 case RISCV::VFADD_VV:
433 case RISCV::VFSUB_VF:
434 case RISCV::VFSUB_VV:
435 case RISCV::VFRSUB_VF:
437 case RISCV::VFMUL_VF:
438 case RISCV::VFMUL_VV:
439 case RISCV::VFDIV_VF:
440 case RISCV::VFDIV_VV:
441 case RISCV::VFRDIV_VF:
443 case RISCV::VFMACC_VV:
444 case RISCV::VFMACC_VF:
445 case RISCV::VFNMACC_VV:
446 case RISCV::VFNMACC_VF:
447 case RISCV::VFMSAC_VV:
448 case RISCV::VFMSAC_VF:
449 case RISCV::VFNMSAC_VV:
450 case RISCV::VFNMSAC_VF:
451 case RISCV::VFMADD_VV:
452 case RISCV::VFMADD_VF:
453 case RISCV::VFNMADD_VV:
454 case RISCV::VFNMADD_VF:
455 case RISCV::VFMSUB_VV:
456 case RISCV::VFMSUB_VF:
457 case RISCV::VFNMSUB_VV:
458 case RISCV::VFNMSUB_VF:
460 case RISCV::VFSQRT_V:
462 case RISCV::VFRSQRT7_V:
464 case RISCV::VFREC7_V:
466 case RISCV::VFMIN_VF:
467 case RISCV::VFMIN_VV:
468 case RISCV::VFMAX_VF:
469 case RISCV::VFMAX_VV:
471 case RISCV::VFSGNJ_VF:
472 case RISCV::VFSGNJ_VV:
473 case RISCV::VFSGNJN_VV:
474 case RISCV::VFSGNJN_VF:
475 case RISCV::VFSGNJX_VF:
476 case RISCV::VFSGNJX_VV:
478 case RISCV::VFCLASS_V:
480 case RISCV::VFMV_V_F:
482 case RISCV::VFCVT_XU_F_V:
483 case RISCV::VFCVT_X_F_V:
484 case RISCV::VFCVT_RTZ_XU_F_V:
485 case RISCV::VFCVT_RTZ_X_F_V:
486 case RISCV::VFCVT_F_XU_V:
487 case RISCV::VFCVT_F_X_V:
489 case RISCV::VFMERGE_VFM:
493 case RISCV::VFIRST_M:
496 case RISCV::VANDN_VV:
497 case RISCV::VANDN_VX:
501 case RISCV::VBREV8_V:
519 case RISCV::VCLMUL_VV:
520 case RISCV::VCLMUL_VX:
522 case RISCV::VCLMULH_VV:
523 case RISCV::VCLMULH_VX:
527 case RISCV::VWSLL_VI:
528 case RISCV::VWSLL_VX:
529 case RISCV::VWSLL_VV:
532 case RISCV::VWADDU_VV:
533 case RISCV::VWADDU_VX:
534 case RISCV::VWSUBU_VV:
535 case RISCV::VWSUBU_VX:
536 case RISCV::VWADD_VV:
537 case RISCV::VWADD_VX:
538 case RISCV::VWSUB_VV:
539 case RISCV::VWSUB_VX:
542 case RISCV::VWMUL_VV:
543 case RISCV::VWMUL_VX:
544 case RISCV::VWMULSU_VV:
545 case RISCV::VWMULSU_VX:
546 case RISCV::VWMULU_VV:
547 case RISCV::VWMULU_VX:
553 case RISCV::VWMACCU_VV:
554 case RISCV::VWMACCU_VX:
555 case RISCV::VWMACC_VV:
556 case RISCV::VWMACC_VX:
557 case RISCV::VWMACCSU_VV:
558 case RISCV::VWMACCSU_VX:
559 case RISCV::VWMACCUS_VX:
561 case RISCV::VFWMACC_VF:
562 case RISCV::VFWMACC_VV:
563 case RISCV::VFWNMACC_VF:
564 case RISCV::VFWNMACC_VV:
565 case RISCV::VFWMSAC_VF:
566 case RISCV::VFWMSAC_VV:
567 case RISCV::VFWNMSAC_VF:
568 case RISCV::VFWNMSAC_VV:
569 case RISCV::VFWMACCBF16_VV:
570 case RISCV::VFWMACCBF16_VF:
573 case RISCV::VFWADD_VV:
574 case RISCV::VFWADD_VF:
575 case RISCV::VFWSUB_VV:
576 case RISCV::VFWSUB_VF:
578 case RISCV::VFWMUL_VF:
579 case RISCV::VFWMUL_VV:
581 case RISCV::VFWCVT_XU_F_V:
582 case RISCV::VFWCVT_X_F_V:
583 case RISCV::VFWCVT_RTZ_XU_F_V:
584 case RISCV::VFWCVT_RTZ_X_F_V:
585 case RISCV::VFWCVT_F_XU_V:
586 case RISCV::VFWCVT_F_X_V:
587 case RISCV::VFWCVT_F_F_V:
588 case RISCV::VFWCVTBF16_F_F_V:
589 return IsMODef ? MILog2SEW + 1 : MILog2SEW;
592 case RISCV::VWADDU_WV:
593 case RISCV::VWADDU_WX:
594 case RISCV::VWSUBU_WV:
595 case RISCV::VWSUBU_WX:
596 case RISCV::VWADD_WV:
597 case RISCV::VWADD_WX:
598 case RISCV::VWSUB_WV:
599 case RISCV::VWSUB_WX:
601 case RISCV::VFWADD_WF:
602 case RISCV::VFWADD_WV:
603 case RISCV::VFWSUB_WF:
604 case RISCV::VFWSUB_WV: {
605 bool IsOp1 = (HasPassthru && !IsTied) ? MO.
getOperandNo() == 2
607 bool TwoTimes = IsMODef || IsOp1;
608 return TwoTimes ? MILog2SEW + 1 : MILog2SEW;
612 case RISCV::VZEXT_VF2:
613 case RISCV::VSEXT_VF2:
615 case RISCV::VZEXT_VF4:
616 case RISCV::VSEXT_VF4:
618 case RISCV::VZEXT_VF8:
619 case RISCV::VSEXT_VF8:
624 case RISCV::VNSRL_WX:
625 case RISCV::VNSRL_WI:
626 case RISCV::VNSRL_WV:
627 case RISCV::VNSRA_WI:
628 case RISCV::VNSRA_WV:
629 case RISCV::VNSRA_WX:
632 case RISCV::VNCLIPU_WI:
633 case RISCV::VNCLIPU_WV:
634 case RISCV::VNCLIPU_WX:
635 case RISCV::VNCLIP_WI:
636 case RISCV::VNCLIP_WV:
637 case RISCV::VNCLIP_WX:
639 case RISCV::VFNCVT_XU_F_W:
640 case RISCV::VFNCVT_X_F_W:
641 case RISCV::VFNCVT_RTZ_XU_F_W:
642 case RISCV::VFNCVT_RTZ_X_F_W:
643 case RISCV::VFNCVT_F_XU_W:
644 case RISCV::VFNCVT_F_X_W:
645 case RISCV::VFNCVT_F_F_W:
646 case RISCV::VFNCVT_ROD_F_F_W:
647 case RISCV::VFNCVTBF16_F_F_W: {
650 bool TwoTimes = IsOp1;
651 return TwoTimes ? MILog2SEW + 1 : MILog2SEW;
663 case RISCV::VMAND_MM:
664 case RISCV::VMNAND_MM:
665 case RISCV::VMANDN_MM:
666 case RISCV::VMXOR_MM:
668 case RISCV::VMNOR_MM:
669 case RISCV::VMORN_MM:
670 case RISCV::VMXNOR_MM:
673 case RISCV::VMSOF_M: {
680 case RISCV::VIOTA_M: {
688 case RISCV::VMSEQ_VI:
689 case RISCV::VMSEQ_VV:
690 case RISCV::VMSEQ_VX:
691 case RISCV::VMSNE_VI:
692 case RISCV::VMSNE_VV:
693 case RISCV::VMSNE_VX:
694 case RISCV::VMSLTU_VV:
695 case RISCV::VMSLTU_VX:
696 case RISCV::VMSLT_VV:
697 case RISCV::VMSLT_VX:
698 case RISCV::VMSLEU_VV:
699 case RISCV::VMSLEU_VI:
700 case RISCV::VMSLEU_VX:
701 case RISCV::VMSLE_VV:
702 case RISCV::VMSLE_VI:
703 case RISCV::VMSLE_VX:
704 case RISCV::VMSGTU_VI:
705 case RISCV::VMSGTU_VX:
706 case RISCV::VMSGT_VI:
707 case RISCV::VMSGT_VX:
710 case RISCV::VMADC_VIM:
711 case RISCV::VMADC_VVM:
712 case RISCV::VMADC_VXM:
713 case RISCV::VMSBC_VVM:
714 case RISCV::VMSBC_VXM:
716 case RISCV::VMADC_VV:
717 case RISCV::VMADC_VI:
718 case RISCV::VMADC_VX:
719 case RISCV::VMSBC_VV:
720 case RISCV::VMSBC_VX:
723 case RISCV::VMFEQ_VF:
724 case RISCV::VMFEQ_VV:
725 case RISCV::VMFNE_VF:
726 case RISCV::VMFNE_VV:
727 case RISCV::VMFLT_VF:
728 case RISCV::VMFLT_VV:
729 case RISCV::VMFLE_VF:
730 case RISCV::VMFLE_VV:
731 case RISCV::VMFGT_VF:
732 case RISCV::VMFGE_VF: {
740 case RISCV::VREDAND_VS:
741 case RISCV::VREDMAX_VS:
742 case RISCV::VREDMAXU_VS:
743 case RISCV::VREDMIN_VS:
744 case RISCV::VREDMINU_VS:
745 case RISCV::VREDOR_VS:
746 case RISCV::VREDSUM_VS:
747 case RISCV::VREDXOR_VS:
749 case RISCV::VFREDMAX_VS:
750 case RISCV::VFREDMIN_VS:
751 case RISCV::VFREDOSUM_VS:
752 case RISCV::VFREDUSUM_VS: {
759 case RISCV::VWREDSUM_VS:
760 case RISCV::VWREDSUMU_VS:
762 case RISCV::VFWREDOSUM_VS:
763 case RISCV::VFWREDUSUM_VS: {
765 return TwoTimes ? MILog2SEW + 1 : MILog2SEW;
770 case RISCV::VRGATHEREI16_VV: {
781static std::optional<OperandInfo>
785 RISCVVPseudosTable::getPseudoInfo(
MI.getOpcode());
786 assert(
RVV &&
"Could not find MI in PseudoTable");
792 switch (
RVV->BaseInstr) {
799 case RISCV::VREDAND_VS:
800 case RISCV::VREDMAX_VS:
801 case RISCV::VREDMAXU_VS:
802 case RISCV::VREDMIN_VS:
803 case RISCV::VREDMINU_VS:
804 case RISCV::VREDOR_VS:
805 case RISCV::VREDSUM_VS:
806 case RISCV::VREDXOR_VS:
807 case RISCV::VWREDSUM_VS:
808 case RISCV::VWREDSUMU_VS:
809 case RISCV::VFWREDOSUM_VS:
810 case RISCV::VFWREDUSUM_VS:
812 return OperandInfo(*Log2EEW);
825 RISCVVPseudosTable::getPseudoInfo(
MI.getOpcode());
830 switch (
RVV->BaseInstr) {
837 case RISCV::VLSE16_V:
839 case RISCV::VLSE32_V:
841 case RISCV::VLSE64_V:
843 case RISCV::VLUXEI8_V:
844 case RISCV::VLOXEI8_V:
845 case RISCV::VLUXEI16_V:
846 case RISCV::VLOXEI16_V:
847 case RISCV::VLUXEI32_V:
848 case RISCV::VLOXEI32_V:
849 case RISCV::VLUXEI64_V:
850 case RISCV::VLOXEI64_V:
857 case RISCV::VRSUB_VI:
858 case RISCV::VRSUB_VX:
880 case RISCV::VWADDU_VV:
881 case RISCV::VWADDU_VX:
882 case RISCV::VWSUBU_VV:
883 case RISCV::VWSUBU_VX:
884 case RISCV::VWADD_VV:
885 case RISCV::VWADD_VX:
886 case RISCV::VWSUB_VV:
887 case RISCV::VWSUB_VX:
888 case RISCV::VWADDU_WV:
889 case RISCV::VWADDU_WX:
890 case RISCV::VWSUBU_WV:
891 case RISCV::VWSUBU_WX:
892 case RISCV::VWADD_WV:
893 case RISCV::VWADD_WX:
894 case RISCV::VWSUB_WV:
895 case RISCV::VWSUB_WX:
897 case RISCV::VZEXT_VF2:
898 case RISCV::VSEXT_VF2:
899 case RISCV::VZEXT_VF4:
900 case RISCV::VSEXT_VF4:
901 case RISCV::VZEXT_VF8:
902 case RISCV::VSEXT_VF8:
905 case RISCV::VMADC_VV:
906 case RISCV::VMADC_VI:
907 case RISCV::VMADC_VX:
908 case RISCV::VMSBC_VV:
909 case RISCV::VMSBC_VX:
911 case RISCV::VNSRL_WX:
912 case RISCV::VNSRL_WI:
913 case RISCV::VNSRL_WV:
914 case RISCV::VNSRA_WI:
915 case RISCV::VNSRA_WV:
916 case RISCV::VNSRA_WX:
918 case RISCV::VMSEQ_VI:
919 case RISCV::VMSEQ_VV:
920 case RISCV::VMSEQ_VX:
921 case RISCV::VMSNE_VI:
922 case RISCV::VMSNE_VV:
923 case RISCV::VMSNE_VX:
924 case RISCV::VMSLTU_VV:
925 case RISCV::VMSLTU_VX:
926 case RISCV::VMSLT_VV:
927 case RISCV::VMSLT_VX:
928 case RISCV::VMSLEU_VV:
929 case RISCV::VMSLEU_VI:
930 case RISCV::VMSLEU_VX:
931 case RISCV::VMSLE_VV:
932 case RISCV::VMSLE_VI:
933 case RISCV::VMSLE_VX:
934 case RISCV::VMSGTU_VI:
935 case RISCV::VMSGTU_VX:
936 case RISCV::VMSGT_VI:
937 case RISCV::VMSGT_VX:
939 case RISCV::VMINU_VV:
940 case RISCV::VMINU_VX:
943 case RISCV::VMAXU_VV:
944 case RISCV::VMAXU_VX:
950 case RISCV::VMULH_VV:
951 case RISCV::VMULH_VX:
952 case RISCV::VMULHU_VV:
953 case RISCV::VMULHU_VX:
954 case RISCV::VMULHSU_VV:
955 case RISCV::VMULHSU_VX:
957 case RISCV::VDIVU_VV:
958 case RISCV::VDIVU_VX:
961 case RISCV::VREMU_VV:
962 case RISCV::VREMU_VX:
966 case RISCV::VWMUL_VV:
967 case RISCV::VWMUL_VX:
968 case RISCV::VWMULSU_VV:
969 case RISCV::VWMULSU_VX:
970 case RISCV::VWMULU_VV:
971 case RISCV::VWMULU_VX:
973 case RISCV::VMACC_VV:
974 case RISCV::VMACC_VX:
975 case RISCV::VNMSAC_VV:
976 case RISCV::VNMSAC_VX:
977 case RISCV::VMADD_VV:
978 case RISCV::VMADD_VX:
979 case RISCV::VNMSUB_VV:
980 case RISCV::VNMSUB_VX:
982 case RISCV::VMERGE_VIM:
983 case RISCV::VMERGE_VVM:
984 case RISCV::VMERGE_VXM:
986 case RISCV::VADC_VIM:
987 case RISCV::VADC_VVM:
988 case RISCV::VADC_VXM:
989 case RISCV::VMADC_VIM:
990 case RISCV::VMADC_VVM:
991 case RISCV::VMADC_VXM:
992 case RISCV::VSBC_VVM:
993 case RISCV::VSBC_VXM:
994 case RISCV::VMSBC_VVM:
995 case RISCV::VMSBC_VXM:
997 case RISCV::VWMACCU_VV:
998 case RISCV::VWMACCU_VX:
999 case RISCV::VWMACC_VV:
1000 case RISCV::VWMACC_VX:
1001 case RISCV::VWMACCSU_VV:
1002 case RISCV::VWMACCSU_VX:
1003 case RISCV::VWMACCUS_VX:
1008 case RISCV::VMV_V_I:
1009 case RISCV::VMV_V_X:
1010 case RISCV::VMV_V_V:
1012 case RISCV::VSADDU_VV:
1013 case RISCV::VSADDU_VX:
1014 case RISCV::VSADDU_VI:
1015 case RISCV::VSADD_VV:
1016 case RISCV::VSADD_VX:
1017 case RISCV::VSADD_VI:
1018 case RISCV::VSSUBU_VV:
1019 case RISCV::VSSUBU_VX:
1020 case RISCV::VSSUB_VV:
1021 case RISCV::VSSUB_VX:
1023 case RISCV::VAADDU_VV:
1024 case RISCV::VAADDU_VX:
1025 case RISCV::VAADD_VV:
1026 case RISCV::VAADD_VX:
1027 case RISCV::VASUBU_VV:
1028 case RISCV::VASUBU_VX:
1029 case RISCV::VASUB_VV:
1030 case RISCV::VASUB_VX:
1032 case RISCV::VSMUL_VV:
1033 case RISCV::VSMUL_VX:
1035 case RISCV::VSSRL_VV:
1036 case RISCV::VSSRL_VX:
1037 case RISCV::VSSRL_VI:
1038 case RISCV::VSSRA_VV:
1039 case RISCV::VSSRA_VX:
1040 case RISCV::VSSRA_VI:
1042 case RISCV::VNCLIPU_WV:
1043 case RISCV::VNCLIPU_WX:
1044 case RISCV::VNCLIPU_WI:
1045 case RISCV::VNCLIP_WV:
1046 case RISCV::VNCLIP_WX:
1047 case RISCV::VNCLIP_WI:
1050 case RISCV::VANDN_VV:
1051 case RISCV::VANDN_VX:
1053 case RISCV::VBREV_V:
1055 case RISCV::VBREV8_V:
1057 case RISCV::VREV8_V:
1063 case RISCV::VCPOP_V:
1065 case RISCV::VROL_VV:
1066 case RISCV::VROL_VX:
1068 case RISCV::VROR_VI:
1069 case RISCV::VROR_VV:
1070 case RISCV::VROR_VX:
1072 case RISCV::VWSLL_VI:
1073 case RISCV::VWSLL_VX:
1074 case RISCV::VWSLL_VV:
1077 case RISCV::VCLMUL_VV:
1078 case RISCV::VCLMUL_VX:
1080 case RISCV::VCLMULH_VV:
1081 case RISCV::VCLMULH_VX:
1089 case RISCV::VMAND_MM:
1090 case RISCV::VMNAND_MM:
1091 case RISCV::VMANDN_MM:
1092 case RISCV::VMXOR_MM:
1093 case RISCV::VMOR_MM:
1094 case RISCV::VMNOR_MM:
1095 case RISCV::VMORN_MM:
1096 case RISCV::VMXNOR_MM:
1097 case RISCV::VMSBF_M:
1098 case RISCV::VMSIF_M:
1099 case RISCV::VMSOF_M:
1100 case RISCV::VIOTA_M:
1103 case RISCV::VSLIDEUP_VX:
1104 case RISCV::VSLIDEUP_VI:
1105 case RISCV::VSLIDEDOWN_VX:
1106 case RISCV::VSLIDEDOWN_VI:
1107 case RISCV::VSLIDE1UP_VX:
1108 case RISCV::VFSLIDE1UP_VF:
1110 case RISCV::VRGATHER_VI:
1111 case RISCV::VRGATHER_VV:
1112 case RISCV::VRGATHER_VX:
1113 case RISCV::VRGATHEREI16_VV:
1115 case RISCV::VFADD_VF:
1116 case RISCV::VFADD_VV:
1117 case RISCV::VFSUB_VF:
1118 case RISCV::VFSUB_VV:
1119 case RISCV::VFRSUB_VF:
1121 case RISCV::VFWADD_VV:
1122 case RISCV::VFWADD_VF:
1123 case RISCV::VFWSUB_VV:
1124 case RISCV::VFWSUB_VF:
1125 case RISCV::VFWADD_WF:
1126 case RISCV::VFWADD_WV:
1127 case RISCV::VFWSUB_WF:
1128 case RISCV::VFWSUB_WV:
1130 case RISCV::VFMUL_VF:
1131 case RISCV::VFMUL_VV:
1132 case RISCV::VFDIV_VF:
1133 case RISCV::VFDIV_VV:
1134 case RISCV::VFRDIV_VF:
1136 case RISCV::VFWMUL_VF:
1137 case RISCV::VFWMUL_VV:
1139 case RISCV::VFMACC_VV:
1140 case RISCV::VFMACC_VF:
1141 case RISCV::VFNMACC_VV:
1142 case RISCV::VFNMACC_VF:
1143 case RISCV::VFMSAC_VV:
1144 case RISCV::VFMSAC_VF:
1145 case RISCV::VFNMSAC_VV:
1146 case RISCV::VFNMSAC_VF:
1147 case RISCV::VFMADD_VV:
1148 case RISCV::VFMADD_VF:
1149 case RISCV::VFNMADD_VV:
1150 case RISCV::VFNMADD_VF:
1151 case RISCV::VFMSUB_VV:
1152 case RISCV::VFMSUB_VF:
1153 case RISCV::VFNMSUB_VV:
1154 case RISCV::VFNMSUB_VF:
1156 case RISCV::VFWMACC_VV:
1157 case RISCV::VFWMACC_VF:
1158 case RISCV::VFWNMACC_VV:
1159 case RISCV::VFWNMACC_VF:
1160 case RISCV::VFWMSAC_VV:
1161 case RISCV::VFWMSAC_VF:
1162 case RISCV::VFWNMSAC_VV:
1163 case RISCV::VFWNMSAC_VF:
1164 case RISCV::VFWMACCBF16_VV:
1165 case RISCV::VFWMACCBF16_VF:
1167 case RISCV::VFSQRT_V:
1169 case RISCV::VFRSQRT7_V:
1171 case RISCV::VFREC7_V:
1173 case RISCV::VFMIN_VF:
1174 case RISCV::VFMIN_VV:
1175 case RISCV::VFMAX_VF:
1176 case RISCV::VFMAX_VV:
1178 case RISCV::VFSGNJ_VF:
1179 case RISCV::VFSGNJ_VV:
1180 case RISCV::VFSGNJN_VV:
1181 case RISCV::VFSGNJN_VF:
1182 case RISCV::VFSGNJX_VF:
1183 case RISCV::VFSGNJX_VV:
1185 case RISCV::VMFEQ_VF:
1186 case RISCV::VMFEQ_VV:
1187 case RISCV::VMFNE_VF:
1188 case RISCV::VMFNE_VV:
1189 case RISCV::VMFLT_VF:
1190 case RISCV::VMFLT_VV:
1191 case RISCV::VMFLE_VF:
1192 case RISCV::VMFLE_VV:
1193 case RISCV::VMFGT_VF:
1194 case RISCV::VMFGE_VF:
1196 case RISCV::VFCLASS_V:
1198 case RISCV::VFMERGE_VFM:
1200 case RISCV::VFMV_V_F:
1202 case RISCV::VFCVT_XU_F_V:
1203 case RISCV::VFCVT_X_F_V:
1204 case RISCV::VFCVT_RTZ_XU_F_V:
1205 case RISCV::VFCVT_RTZ_X_F_V:
1206 case RISCV::VFCVT_F_XU_V:
1207 case RISCV::VFCVT_F_X_V:
1209 case RISCV::VFWCVT_XU_F_V:
1210 case RISCV::VFWCVT_X_F_V:
1211 case RISCV::VFWCVT_RTZ_XU_F_V:
1212 case RISCV::VFWCVT_RTZ_X_F_V:
1213 case RISCV::VFWCVT_F_XU_V:
1214 case RISCV::VFWCVT_F_X_V:
1215 case RISCV::VFWCVT_F_F_V:
1216 case RISCV::VFWCVTBF16_F_F_V:
1218 case RISCV::VFNCVT_XU_F_W:
1219 case RISCV::VFNCVT_X_F_W:
1220 case RISCV::VFNCVT_RTZ_XU_F_W:
1221 case RISCV::VFNCVT_RTZ_X_F_W:
1222 case RISCV::VFNCVT_F_XU_W:
1223 case RISCV::VFNCVT_F_X_W:
1224 case RISCV::VFNCVT_F_F_W:
1225 case RISCV::VFNCVT_ROD_F_F_W:
1226 case RISCV::VFNCVTBF16_F_F_W:
1237 RISCVVPseudosTable::getPseudoInfo(
MI->getOpcode());
1242 switch (
RVV->BaseInstr) {
1244 case RISCV::VREDAND_VS:
1245 case RISCV::VREDMAX_VS:
1246 case RISCV::VREDMAXU_VS:
1247 case RISCV::VREDMIN_VS:
1248 case RISCV::VREDMINU_VS:
1249 case RISCV::VREDOR_VS:
1250 case RISCV::VREDSUM_VS:
1251 case RISCV::VREDXOR_VS:
1252 case RISCV::VWREDSUM_VS:
1253 case RISCV::VWREDSUMU_VS:
1254 case RISCV::VFREDMAX_VS:
1255 case RISCV::VFREDMIN_VS:
1256 case RISCV::VFREDOSUM_VS:
1257 case RISCV::VFREDUSUM_VS:
1258 case RISCV::VFWREDOSUM_VS:
1259 case RISCV::VFWREDUSUM_VS:
1261 case RISCV::VMV_X_S:
1262 case RISCV::VFMV_F_S:
1269bool RISCVVLOptimizer::isCandidate(
const MachineInstr &
MI)
const {
1274 if (
MI.getNumExplicitDefs() != 1)
1279 if (!
MI.allImplicitDefsAreDead()) {
1280 LLVM_DEBUG(
dbgs() <<
"Not a candidate because has non-dead implicit def\n");
1284 if (
MI.mayRaiseFPException()) {
1285 LLVM_DEBUG(
dbgs() <<
"Not a candidate because may raise FP exception\n");
1290 if (MMO->isVolatile()) {
1291 LLVM_DEBUG(
dbgs() <<
"Not a candidate because contains volatile MMO\n");
1309 LLVM_DEBUG(
dbgs() <<
"Not a candidate due to unsupported instruction: "
1316 "Instruction shouldn't be supported if elements depend on VL");
1319 MRI->getRegClass(
MI.getOperand(0).getReg())->TSFlags) &&
1320 "All supported instructions produce a vector register result");
1322 LLVM_DEBUG(
dbgs() <<
"Found a candidate for VL reduction: " <<
MI <<
"\n");
1326std::optional<MachineOperand>
1327RISCVVLOptimizer::getMinimumVLForUser(
const MachineOperand &UserOp)
const {
1334 return std::nullopt;
1339 LLVM_DEBUG(
dbgs() <<
" Abort because used by unsafe instruction\n");
1340 return std::nullopt;
1347 "Did not expect X0 VL");
1354 auto DemandedVL = DemandedVLs.lookup(&UserMI);
1357 "instruction with demanded tail\n");
1358 return std::nullopt;
1365 LLVM_DEBUG(
dbgs() <<
" Used this operand as a scalar operand\n");
1371 if (
auto DemandedVL = DemandedVLs.lookup(&UserMI)) {
1380std::optional<MachineOperand>
1382 std::optional<MachineOperand> CommonVL;
1385 for (
auto &UserOp :
MRI->use_operands(
MI.getOperand(0).getReg()))
1386 Worklist.
insert(&UserOp);
1388 while (!Worklist.
empty()) {
1400 if (UserMI.
isPHI()) {
1402 if (!PHISeen.
insert(&UserMI).second)
1410 auto VLOp = getMinimumVLForUser(UserOp);
1412 return std::nullopt;
1420 LLVM_DEBUG(
dbgs() <<
" Abort because cannot determine a common VL\n");
1421 return std::nullopt;
1426 return std::nullopt;
1430 std::optional<OperandInfo> ProducerInfo =
1432 if (!ConsumerInfo || !ProducerInfo) {
1433 LLVM_DEBUG(
dbgs() <<
" Abort due to unknown operand information.\n");
1434 LLVM_DEBUG(
dbgs() <<
" ConsumerInfo is: " << ConsumerInfo <<
"\n");
1435 LLVM_DEBUG(
dbgs() <<
" ProducerInfo is: " << ProducerInfo <<
"\n");
1436 return std::nullopt;
1439 if (!OperandInfo::areCompatible(*ProducerInfo, *ConsumerInfo)) {
1442 <<
" Abort due to incompatible information for EMUL or EEW.\n");
1443 LLVM_DEBUG(
dbgs() <<
" ConsumerInfo is: " << ConsumerInfo <<
"\n");
1444 LLVM_DEBUG(
dbgs() <<
" ProducerInfo is: " << ProducerInfo <<
"\n");
1445 return std::nullopt;
1461 LLVM_DEBUG(
dbgs() <<
" Abort due to VL == 1, no point in reducing.\n");
1465 auto CommonVL = DemandedVLs.lookup(&
MI);
1469 assert((CommonVL->isImm() || CommonVL->getReg().isVirtual()) &&
1470 "Expected VL to be an Imm or virtual Reg");
1477 if (CommonVL->isIdenticalTo(VLOp)) {
1479 dbgs() <<
" Abort due to CommonVL == VLOp, no point in reducing.\n");
1483 if (CommonVL->isImm()) {
1485 << CommonVL->getImm() <<
" for " <<
MI <<
"\n");
1490 if (!MDT->dominates(VLMI, &
MI)) {
1495 dbgs() <<
" Reduce VL from " << VLOp <<
" to "
1496 <<
printReg(CommonVL->getReg(),
MRI->getTargetRegisterInfo())
1497 <<
" for " <<
MI <<
"\n");
1509 MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1512 if (!
ST.hasVInstructions())
1515 TII =
ST.getInstrInfo();
1517 assert(DemandedVLs.empty());
1526 DemandedVLs.insert({&
MI, checkUsers(
MI)});
1532 bool MadeChange =
false;
1535 if (!MDT->isReachableFromEntry(&
MBB))
1541 if (!tryReduceVL(
MI))
1547 DemandedVLs.clear();
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
Analysis containing CSE Info
#define LLVM_ATTRIBUTE_UNUSED
const HexagonInstrInfo * TII
static bool isCandidate(const MachineInstr *MI, Register &DefedReg, Register FrameReg)
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
static LLVM_ATTRIBUTE_UNUSED raw_ostream & operator<<(raw_ostream &OS, const OperandInfo &OI)
static unsigned getIntegerExtensionOperandEEW(unsigned Factor, const MachineInstr &MI, const MachineOperand &MO)
Dest has EEW=SEW.
static std::optional< unsigned > getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI)
static bool isVectorOpUsedAsScalarOp(const MachineOperand &MO)
Return true if MO is a vector operand but is used as a scalar operand.
static std::pair< unsigned, bool > getEMULEqualsEEWDivSEWTimesLMUL(unsigned Log2EEW, const MachineInstr &MI)
Return EMUL = (EEW / SEW) * LMUL where EEW comes from Log2EEW and LMUL and SEW are from the TSFlags o...
static bool isSupportedInstr(const MachineInstr &MI)
Return true if this optimization should consider MI for VL reduction.
static std::optional< OperandInfo > getOperandInfo(const MachineOperand &MO, const MachineRegisterInfo *MRI)
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
FunctionPass class - This class is used to implement most global optimizations.
Describe properties that are true of each instruction in the target description file.
This holds information about one operand of a machine instruction, indicating the register class for ...
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
LLVM_ABI unsigned getNumExplicitDefs() const
Returns the number of non-implicit definitions.
const MachineOperand & getOperand(unsigned i) const
A description of a memory reference used in the backend.
MachineOperand class - Representation of each machine instruction operand.
LLVM_ABI unsigned getOperandNo() const
Returns the index of this operand in the instruction that it belongs to.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
LLVM_ABI void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags=0)
ChangeToImmediate - Replace this operand with a new immediate operand of the specified value.
LLVM_ABI void ChangeToRegister(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isDebug=false)
ChangeToRegister - Replace this operand with a new register operand of the specified value.
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
void insert_range(Range &&R)
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
value_type pop_back_val()
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
static bool readsPastVL(uint64_t TSFlags)
static bool isTiedPseudo(uint64_t TSFlags)
static RISCVVType::VLMUL getLMul(uint64_t TSFlags)
static unsigned getVLOpNum(const MCInstrDesc &Desc)
static bool hasVLOp(uint64_t TSFlags)
static unsigned getSEWOpNum(const MCInstrDesc &Desc)
static bool elementsDependOnVL(uint64_t TSFlags)
static bool hasSEWOp(uint64_t TSFlags)
static bool isFirstDefTiedToFirstUse(const MCInstrDesc &Desc)
static bool isVRegClass(uint8_t TSFlags)
LLVM_ABI std::pair< unsigned, bool > decodeVLMUL(VLMUL VLMul)
bool isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS)
Given two VL operands, do we know that LHS <= RHS?
unsigned getRVVMCOpcode(unsigned RVVPseudoOpcode)
This is an optimization pass for GlobalISel generic memory operations.
FunctionPass * createRISCVVLOptimizerPass()
iterator_range< po_iterator< T > > post_order(const T &G)
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
Description of the encoding of one expression Op.