[llvm] [RISCV][VLOPT] Allow propagation even when VL isn't VLMAX (PR #112228)

Luke Lau via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 15 07:27:54 PDT 2024


================
@@ -721,8 +796,9 @@ bool RISCVVLOptimizer::checkUsers(std::optional<Register> &CommonVL,
     }
 
     if (!CommonVL) {
-      CommonVL = VLOp.getReg();
-    } else if (*CommonVL != VLOp.getReg()) {
+      CommonVL = VLInfo(VLOp);
+      LLVM_DEBUG(dbgs() << "    User VL is: " << VLOp << "\n");
+    } else if (!CommonVL->isCompatible(VLOp)) {
----------------
lukel97 wrote:

Would it be easier to just store the VL as a MachineOperand instead of abstracting it over in VLInfo? In RISCVVectorPeephole we were able to do isCompatible with `CommonVL->isIdenticalTo(VLOp)`, and for hasBenefit we have a method isVLKnownLE that could be shared:

```c++
/// Given two VL operands, do we know that LHS <= RHS?
static bool isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS) {
  if (LHS.isReg() && RHS.isReg() && LHS.getReg().isVirtual() &&
      LHS.getReg() == RHS.getReg())
    return true;
  if (RHS.isImm() && RHS.getImm() == RISCV::VLMaxSentinel)
    return true;
  if (LHS.isImm() && LHS.getImm() == RISCV::VLMaxSentinel)
    return false;
  if (!LHS.isImm() || !RHS.isImm())
    return false;
  return LHS.getImm() <= RHS.getImm();
}
```

https://github.com/llvm/llvm-project/pull/112228


More information about the llvm-commits mailing list