Skip to content

Commit 7e0aecd

Browse files
committed
[RISCV][VLOPT] Peek through copies in checkUsers
Currently if a user of an instruction isn't a vector pseudo we bail. For simple non-subreg virtual COPYs, we can peek through their uses by using a worklist. This is extracted from a loop in TSVC2 (s273) that contains a fcmp + select, which produces a copy that doesn't seem to be coalesced away.
1 parent f337bb1 commit 7e0aecd

File tree

4 files changed

+21
-7
lines changed

4 files changed

+21
-7
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1311,9 +1311,24 @@ RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) {
13111311

13121312
std::optional<MachineOperand> RISCVVLOptimizer::checkUsers(MachineInstr &MI) {
13131313
std::optional<MachineOperand> CommonVL;
1314-
for (auto &UserOp : MRI->use_operands(MI.getOperand(0).getReg())) {
1314+
SmallSetVector<MachineOperand *, 8> Worklist;
1315+
for (auto &UserOp : MRI->use_operands(MI.getOperand(0).getReg()))
1316+
Worklist.insert(&UserOp);
1317+
1318+
while (!Worklist.empty()) {
1319+
MachineOperand &UserOp = *Worklist.pop_back_val();
13151320
const MachineInstr &UserMI = *UserOp.getParent();
13161321
LLVM_DEBUG(dbgs() << " Checking user: " << UserMI << "\n");
1322+
1323+
if (UserMI.isCopy() && UserMI.getOperand(0).getReg().isVirtual() &&
1324+
UserMI.getOperand(0).getSubReg() == RISCV::NoSubRegister &&
1325+
UserMI.getOperand(1).getSubReg() == RISCV::NoSubRegister) {
1326+
LLVM_DEBUG(dbgs() << " Peeking through uses of COPY\n");
1327+
for (auto &CopyUse : MRI->use_operands(UserMI.getOperand(0).getReg()))
1328+
Worklist.insert(&CopyUse);
1329+
continue;
1330+
}
1331+
13171332
if (mayReadPastVL(UserMI)) {
13181333
LLVM_DEBUG(dbgs() << " Abort because used by unsafe instruction\n");
13191334
return std::nullopt;

llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -901,9 +901,9 @@ define void @test_dag_loop() {
901901
; CHECK-NEXT: vssubu.vx v12, v8, zero, v0.t
902902
; CHECK-NEXT: vsetvli zero, zero, e8, m4, ta, ma
903903
; CHECK-NEXT: vmseq.vv v0, v12, v8
904-
; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma
904+
; CHECK-NEXT: vsetvli zero, zero, e16, m8, ta, ma
905905
; CHECK-NEXT: vmv.v.i v8, 0
906-
; CHECK-NEXT: vsetivli zero, 0, e16, m8, tu, mu
906+
; CHECK-NEXT: vsetvli zero, zero, e16, m8, tu, mu
907907
; CHECK-NEXT: vle16.v v8, (zero), v0.t
908908
; CHECK-NEXT: vse16.v v8, (zero)
909909
; CHECK-NEXT: ret

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,9 @@ define void @fadd_fcmp_select_copy(<vscale x 4 x float> %v, <vscale x 4 x i1> %c
235235
;
236236
; VLOPT-LABEL: fadd_fcmp_select_copy:
237237
; VLOPT: # %bb.0:
238-
; VLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
238+
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
239239
; VLOPT-NEXT: vfadd.vv v8, v8, v8
240240
; VLOPT-NEXT: fmv.w.x fa5, zero
241-
; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
242241
; VLOPT-NEXT: vmflt.vf v10, v8, fa5
243242
; VLOPT-NEXT: vmand.mm v10, v0, v10
244243
; VLOPT-NEXT: vse32.v v8, (a0)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ name: copy
295295
body: |
296296
bb.0:
297297
; CHECK-LABEL: name: copy
298-
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
298+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
299299
; CHECK-NEXT: %y:vr = COPY %x
300300
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
301301
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
@@ -307,7 +307,7 @@ name: copy_multiple_users
307307
body: |
308308
bb.0:
309309
; CHECK-LABEL: name: copy_multiple_users
310-
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
310+
; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 3, 3 /* e8 */, 0 /* tu, mu */
311311
; CHECK-NEXT: %y:vr = COPY %x
312312
; CHECK-NEXT: %z0:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
313313
; CHECK-NEXT: %z1:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 3, 3 /* e8 */, 0 /* tu, mu */

0 commit comments

Comments
 (0)