StringRef getPassName() const override { return RISCV_INSERT_VSETVLI_NAME; }
private:
- bool needVSETVLI(const VSETVLIInfo &Require, const VSETVLIInfo &CurInfo);
- bool needVSETVLIPHI(const VSETVLIInfo &Require, const MachineBasicBlock &MBB);
+ bool needVSETVLI(const VSETVLIInfo &Require,
+ const VSETVLIInfo &CurInfo) const;
+ bool needVSETVLI(const MachineInstr &MI, const VSETVLIInfo &Require,
+ const VSETVLIInfo &CurInfo) const;
+ bool needVSETVLIPHI(const VSETVLIInfo &Require,
+ const MachineBasicBlock &MBB) const;
void insertVSETVLI(MachineBasicBlock &MBB, MachineInstr &MI,
const VSETVLIInfo &Info, const VSETVLIInfo &PrevInfo);
void insertVSETVLI(MachineBasicBlock &MBB,
}
bool RISCVInsertVSETVLI::needVSETVLI(const VSETVLIInfo &Require,
- const VSETVLIInfo &CurInfo) {
+ const VSETVLIInfo &CurInfo) const {
if (CurInfo.isCompatible(Require))
return false;
return CurInfo.isCompatibleWithLoadStoreEEW(EEW, Require);
}
+bool RISCVInsertVSETVLI::needVSETVLI(const MachineInstr &MI, const VSETVLIInfo &Require,
+ const VSETVLIInfo &CurInfo) const {
+ if (!needVSETVLI(Require, CurInfo))
+ return false;
+ // If this is a unit-stride or strided load/store, we may be able to use the
+ // EMUL=(EEW/SEW)*LMUL relationship to avoid changing VTYPE.
+ return !canSkipVSETVLIForLoadStore(MI, Require, CurInfo);
+}
+
bool RISCVInsertVSETVLI::computeVLVTYPEChanges(const MachineBasicBlock &MBB) {
bool HadVectorOp = false;
} else {
// If this instruction isn't compatible with the previous VL/VTYPE
// we need to insert a VSETVLI.
- // If this is a unit-stride or strided load/store, we may be able to use
- // the EMUL=(EEW/SEW)*LMUL relationship to avoid changing vtype.
// NOTE: We only do this if the vtype we're comparing against was
// created in this block. We need the first and third phase to treat
// the store the same way.
- if (!canSkipVSETVLIForLoadStore(MI, NewInfo, BBInfo.Change) &&
- needVSETVLI(NewInfo, BBInfo.Change))
+ if (needVSETVLI(MI, NewInfo, BBInfo.Change))
BBInfo.Change = NewInfo;
}
}
// be/ unneeded if the AVL is a phi node where all incoming values are VL
// outputs from the last VSETVLI in their respective basic blocks.
bool RISCVInsertVSETVLI::needVSETVLIPHI(const VSETVLIInfo &Require,
- const MachineBasicBlock &MBB) {
+ const MachineBasicBlock &MBB) const {
if (DisableInsertVSETVLPHIOpt)
return true;
} else {
// If this instruction isn't compatible with the previous VL/VTYPE
// we need to insert a VSETVLI.
- // If this is a unit-stride or strided load/store, we may be able to use
- // the EMUL=(EEW/SEW)*LMUL relationship to avoid changing vtype.
// NOTE: We can't use predecessor information for the store. We must
// treat it the same as the first phase so that we produce the correct
// vl/vtype for succesor blocks.
- if (!canSkipVSETVLIForLoadStore(MI, NewInfo, CurInfo) &&
- needVSETVLI(NewInfo, CurInfo)) {
+ if (needVSETVLI(MI, NewInfo, CurInfo)) {
insertVSETVLI(MBB, MI, NewInfo, CurInfo);
CurInfo = NewInfo;
}