Skip to content

Commit 3710050

Browse files
[RISCV][VLOPT] Set CommonVL as the largest of the users (llvm#120349)
Prior to this patch, we required that all users had the same VL in order to optimize. But as the FIXME said, we can use the largest VL to optimize, as long as we can determine what the largest is. This patch implements the FIXME.
1 parent e504ece commit 3710050

File tree

2 files changed

+83
-5
lines changed

2 files changed

+83
-5
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -973,13 +973,13 @@ bool RISCVVLOptimizer::checkUsers(const MachineOperand *&CommonVL,
973973
assert((!VLOp.isReg() || VLOp.getReg() != RISCV::X0) &&
974974
"Did not expect X0 VL");
975975

976-
if (!CommonVL) {
976+
// Use the largest VL among all the users. If we cannot determine this
977+
// statically, then we cannot optimize the VL.
978+
if (!CommonVL || RISCV::isVLKnownLE(*CommonVL, VLOp)) {
977979
CommonVL = &VLOp;
978980
LLVM_DEBUG(dbgs() << " User VL is: " << VLOp << "\n");
979-
} else if (!CommonVL->isIdenticalTo(VLOp)) {
980-
// FIXME: This check requires all users to have the same VL. We can relax
981-
// this and get the largest VL amongst all users.
982-
LLVM_DEBUG(dbgs() << " Abort because users have different VL\n");
981+
} else if (!RISCV::isVLKnownLE(VLOp, *CommonVL)) {
982+
LLVM_DEBUG(dbgs() << " Abort because cannot determine a common VL\n");
983983
CanReduceVL = false;
984984
break;
985985
}

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,81 @@ body: |
3333
%y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */
3434
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */
3535
...
36+
---
37+
name: use_largest_common_vl_imm_imm
38+
body: |
39+
bb.0:
40+
; CHECK-LABEL: name: use_largest_common_vl_imm_imm
41+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */
42+
; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
43+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */
44+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
45+
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
46+
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0
47+
...
48+
---
49+
name: use_largest_common_vl_same_reg
50+
body: |
51+
bb.0:
52+
liveins: $x1
53+
; CHECK-LABEL: name: use_largest_common_vl_same_reg
54+
; CHECK: liveins: $x1
55+
; CHECK-NEXT: {{ $}}
56+
; CHECK-NEXT: %vl:gprnox0 = COPY $x1
57+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
58+
; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
59+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
60+
%vl:gprnox0 = COPY $x1
61+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
62+
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0
63+
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0
64+
...
65+
---
66+
name: use_largest_common_vl_diff_regs
67+
body: |
68+
bb.0:
69+
liveins: $x1, $x2
70+
; CHECK-LABEL: name: use_largest_common_vl_diff_regs
71+
; CHECK: liveins: $x1, $x2
72+
; CHECK-NEXT: {{ $}}
73+
; CHECK-NEXT: %vl0:gprnox0 = COPY $x1
74+
; CHECK-NEXT: %vl1:gprnox0 = COPY $x2
75+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
76+
; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0 /* tu, mu */
77+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0 /* tu, mu */
78+
%vl0:gprnox0 = COPY $x1
79+
%vl1:gprnox0 = COPY $x2
80+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
81+
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0
82+
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0
83+
...
84+
---
85+
name: use_largest_common_vl_imm_reg
86+
body: |
87+
bb.0:
88+
liveins: $x1
89+
; CHECK-LABEL: name: use_largest_common_vl_imm_reg
90+
; CHECK: liveins: $x1
91+
; CHECK-NEXT: {{ $}}
92+
; CHECK-NEXT: %vl:gprnox0 = COPY $x1
93+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
94+
; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */
95+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
96+
%vl:gprnox0 = COPY $x1
97+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
98+
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0
99+
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
100+
...
101+
---
102+
name: use_largest_common_vl_imm_vlmax
103+
body: |
104+
bb.0:
105+
; CHECK-LABEL: name: use_largest_common_vl_imm_vlmax
106+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
107+
; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
108+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
109+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0
110+
%y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0
111+
%z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0
112+
...
113+

0 commit comments

Comments
 (0)