Skip to content

Commit a95edec

Browse files
authored
[RISCV] Use vleff's AVL when output VL doesn't dominate in RISCVVLOptimizer (#156618)
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 71b64bc commit a95edec

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
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(RISCVII::getVLOpNum(VLMI->getDesc()));
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: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,4 +603,61 @@ body: |
603603
$x10 = COPY %9
604604
PseudoRET implicit $x10
605605
...
606-
606+
---
607+
name: vleff_imm
608+
body: |
609+
bb.0:
610+
; CHECK-LABEL: name: vleff_imm
611+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
612+
; CHECK-NEXT: %y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
613+
; CHECK-NEXT: PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
614+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
615+
%y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
616+
PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
617+
...
618+
---
619+
name: vleff_reg_dominates
620+
body: |
621+
bb.0:
622+
liveins: $x8
623+
; CHECK-LABEL: name: vleff_reg_dominates
624+
; CHECK: liveins: $x8
625+
; CHECK-NEXT: {{ $}}
626+
; CHECK-NEXT: %avl:gprnox0 = COPY $x8
627+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
628+
; CHECK-NEXT: %y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
629+
; CHECK-NEXT: PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
630+
%avl:gprnox0 = COPY $x8
631+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
632+
%y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
633+
PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
634+
...
635+
---
636+
name: vleff_reg_doesnt_dominate
637+
body: |
638+
bb.0:
639+
liveins: $x8
640+
; CHECK-LABEL: name: vleff_reg_doesnt_dominate
641+
; CHECK: liveins: $x8
642+
; CHECK-NEXT: {{ $}}
643+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
644+
; CHECK-NEXT: %avl:gprnox0 = COPY $x8
645+
; CHECK-NEXT: %y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
646+
; CHECK-NEXT: PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
647+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
648+
%avl:gprnox0 = COPY $x8
649+
%y:vr, %vl:gprnox0 = PseudoVLE8FF_V_M1 $noreg, $noreg, %avl, 3 /* e8 */, 3 /* ta, ma */
650+
PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
651+
...
652+
---
653+
name: vleff_mask_imm
654+
body: |
655+
bb.0:
656+
; CHECK-LABEL: name: vleff_mask_imm
657+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
658+
; CHECK-NEXT: %y:vrnov0, %vl:gprnox0 = PseudoVLE8FF_V_M1_MASK $noreg, $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
659+
; CHECK-NEXT: PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
660+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 3 /* ta, ma */
661+
%y:vrnov0, %vl:gprnox0 = PseudoVLE8FF_V_M1_MASK $noreg, $noreg, $noreg, 1, 3 /* e8 */, 3 /* ta, ma */
662+
PseudoVSE8_V_M1 %x, $noreg, %vl, 3 /* e8 */
663+
...

0 commit comments

Comments
 (0)