@@ -93,6 +93,14 @@ class RISCVVLOptimizer : public MachineFunctionPass {
9393 // / downstream users.
9494 DenseMap<const MachineInstr *, DemandedVL> DemandedVLs;
9595 SetVector<const MachineInstr *> Worklist;
96+
97+ // / \returns all vector virtual registers that \p MI uses.
98+ auto virtual_vec_uses (const MachineInstr &MI) const {
99+ return make_filter_range (MI.uses (), [this ](const MachineOperand &MO) {
100+ return MO.isReg () && MO.getReg ().isVirtual () &&
101+ RISCVRegisterInfo::isRVVRegClass (MRI->getRegClass (MO.getReg ()));
102+ });
103+ }
96104};
97105
98106// / Represents the EMUL and EEW of a MachineOperand.
@@ -1623,18 +1631,12 @@ static bool isPhysical(const MachineOperand &MO) {
16231631 return MO.isReg () && MO.getReg ().isPhysical ();
16241632}
16251633
1626- static bool isVirtualVec (const MachineOperand &MO) {
1627- return MO.isReg () && MO.getReg ().isVirtual () &&
1628- RISCVRegisterInfo::isRVVRegClass (
1629- MO.getParent ()->getMF ()->getRegInfo ().getRegClass (MO.getReg ()));
1630- }
1631-
16321634// / Look through \p MI's operands and propagate what it demands to its uses.
16331635void RISCVVLOptimizer::transfer (const MachineInstr &MI) {
16341636 if (!isSupportedInstr (MI) || !checkUsers (MI) || any_of (MI.defs (), isPhysical))
16351637 DemandedVLs[&MI] = DemandedVL::vlmax ();
16361638
1637- for (const MachineOperand &MO : make_filter_range (MI. uses (), isVirtualVec )) {
1639+ for (const MachineOperand &MO : virtual_vec_uses (MI)) {
16381640 const MachineInstr *Def = MRI->getVRegDef (MO.getReg ());
16391641 DemandedVL Prev = DemandedVLs[Def];
16401642 DemandedVLs[Def] = DemandedVLs[Def].max (getMinimumVLForUser (MO));
0 commit comments