[llvm] [RISCV] Improve cleanup phase of RISCV Insert VSETVLI pass (PR #67144)
Yeting Kuo via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 11 01:40:27 PDT 2023
================
@@ -1426,85 +1426,96 @@ static bool isNonZeroAVL(const MachineOperand &MO) {
return 0 != MO.getImm();
}
-// Return true if we can mutate PrevMI to match MI without changing any the
-// fields which would be observed.
-static bool canMutatePriorConfig(const MachineInstr &PrevMI,
- const MachineInstr &MI,
- const DemandedFields &Used) {
- // If the VL values aren't equal, return false if either a) the former is
- // demanded, or b) we can't rewrite the former to be the later for
- // implementation reasons.
- if (!isVLPreservingConfig(MI)) {
- if (Used.VLAny)
- return false;
-
- // We don't bother to handle the equally zero case here as it's largely
- // uninteresting.
- if (Used.VLZeroness) {
- if (isVLPreservingConfig(PrevMI))
- return false;
- if (!isNonZeroAVL(MI.getOperand(1)) ||
- !isNonZeroAVL(PrevMI.getOperand(1)))
- return false;
- }
-
- // TODO: Track whether the register is defined between
- // PrevMI and MI.
- if (MI.getOperand(1).isReg() &&
- RISCV::X0 != MI.getOperand(1).getReg())
- return false;
- }
-
- if (!PrevMI.getOperand(2).isImm() || !MI.getOperand(2).isImm())
- return false;
-
- auto PriorVType = PrevMI.getOperand(2).getImm();
- auto VType = MI.getOperand(2).getImm();
- return areCompatibleVTYPEs(PriorVType, VType, Used);
-}
-
void RISCVInsertVSETVLI::doLocalPostpass(MachineBasicBlock &MBB) {
MachineInstr *NextMI = nullptr;
// We can have arbitrary code in successors, so VL and VTYPE
// must be considered demanded.
DemandedFields Used;
Used.demandVL();
Used.demandVTYPE();
- SmallVector<MachineInstr*> ToDelete;
+ SmallPtrSet<MachineInstr *, 8> ToDelete;
for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) {
if (!isVectorConfigInstr(MI)) {
doUnion(Used, getDemanded(MI, MRI));
+
+ // We can't handle the case when the source AVL register of *NextMI is
+ // defined after MI
+ if (NextMI && NextMI->getOperand(1).isReg()) {
+ for (const MachineOperand &MO : MI.operands()) {
+ if (MO.isReg() && MO.isDef() &&
+ MO.getReg() == NextMI->getOperand(1).getReg()) {
+ Used.demandVL();
+ break;
+ }
+ }
+ }
+
continue;
}
Register VRegDef = MI.getOperand(0).getReg();
if (VRegDef != RISCV::X0 &&
- !(VRegDef.isVirtual() && MRI->use_nodbg_empty(VRegDef)))
- Used.demandVL();
+ !(VRegDef.isVirtual() && MRI->use_nodbg_empty(VRegDef))) {
+ for (MachineInstr &UserMI : MRI->use_nodbg_instructions(VRegDef)) {
----------------
yetingk wrote:
Could we simplify the loop by `any_of`?
https://github.com/llvm/llvm-project/pull/67144
More information about the llvm-commits
mailing list