Skip to content

Commit 4b860bb

Browse files
committed
[RISCV] Use vleff's AVL when output VL doesn't dominate in RISCVVLOptimizer
If an instruction's demanded VL is a virtual register defined by a vleff instruction, it might not dominate and fail to have its VL reduced. In leiu of the output VL, we can try and use the AVL passed to the vleff itself since it will be at least greater than or equal the original VL. I tried to create an LLVM IR test for this in but didn't have any luck because the scheduler kept on moving the instruction past the vleff, so it always dominated. So I've just included some mir tests instead.
1 parent 9bdf90a commit 4b860bb

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,15 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) const {
14641464
assert((CommonVL->isImm() || CommonVL->getReg().isVirtual()) &&
14651465
"Expected VL to be an Imm or virtual Reg");
14661466

1467+
// If the VL is defined by a vleff that doesn't dominate MI, try using the
1468+
// vleff's AVL. It will be greater than or equal to the output VL.
1469+
if (CommonVL->isReg()) {
1470+
const MachineInstr *VLMI = MRI->getVRegDef(CommonVL->getReg());
1471+
if (RISCVInstrInfo::isFaultOnlyFirstLoad(*VLMI) &&
1472+
!MDT->dominates(VLMI, &MI))
1473+
CommonVL = VLMI->getOperand(4);
1474+
}
1475+
14671476
if (!RISCV::isVLKnownLE(*CommonVL, VLOp)) {
14681477
LLVM_DEBUG(dbgs() << " Abort due to CommonVL not <= VLOp.\n");
14691478
return false;

llvm/test/CodeGen/RISCV/rvv/vl-opt.mir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ name: vleff_imm
608608
body: |
609609
bb.0:
610610
; CHECK-LABEL: name: vleff_imm
611-
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
611+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
612612
; CHECK-NEXT: %y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
613613
; CHECK-NEXT: PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
614614
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
@@ -624,7 +624,7 @@ body: |
624624
; CHECK: liveins: $x8
625625
; CHECK-NEXT: {{ $}}
626626
; CHECK-NEXT: %avl:gprnox0 = COPY $x8
627-
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
627+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
628628
; CHECK-NEXT: %y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
629629
; CHECK-NEXT: PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
630630
%avl:gprnox0 = COPY $x8

0 commit comments

Comments
 (0)