Skip to content

Commit f8416fc

Browse files
[RISCV][VLOPT] Look through PHI instructions (llvm#132236)
Similar to what we do for copies. We may reduce one of the PHI operands and not the other, and thats perfectly okay.
1 parent f3fa54a commit f8416fc

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,7 @@ std::optional<MachineOperand>
13231323
RISCVVLOptimizer::checkUsers(const MachineInstr &MI) const {
13241324
std::optional<MachineOperand> CommonVL;
13251325
SmallSetVector<MachineOperand *, 8> Worklist;
1326+
SmallPtrSet<const MachineInstr *, 4> PHISeen;
13261327
for (auto &UserOp : MRI->use_operands(MI.getOperand(0).getReg()))
13271328
Worklist.insert(&UserOp);
13281329

@@ -1340,6 +1341,16 @@ RISCVVLOptimizer::checkUsers(const MachineInstr &MI) const {
13401341
continue;
13411342
}
13421343

1344+
if (UserMI.isPHI()) {
1345+
// Don't follow PHI cycles
1346+
if (!PHISeen.insert(&UserMI).second)
1347+
continue;
1348+
LLVM_DEBUG(dbgs() << " Peeking through uses of PHI\n");
1349+
for (auto &PhiUse : MRI->use_operands(UserMI.getOperand(0).getReg()))
1350+
Worklist.insert(&PhiUse);
1351+
continue;
1352+
}
1353+
13431354
auto VLOp = getMinimumVLForUser(UserOp);
13441355
if (!VLOp)
13451356
return std::nullopt;

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

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,134 @@ body: |
368368
%y:vr = COPY %x
369369
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */
370370
...
371+
---
372+
name: phi
373+
tracksRegLiveness: true
374+
body: |
375+
; CHECK-LABEL: name: phi
376+
; CHECK: bb.0:
377+
; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)
378+
; CHECK-NEXT: {{ $}}
379+
; CHECK-NEXT: %w:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
380+
; CHECK-NEXT: BNE $noreg, $noreg, %bb.2
381+
; CHECK-NEXT: {{ $}}
382+
; CHECK-NEXT: bb.1:
383+
; CHECK-NEXT: successors: %bb.2(0x80000000)
384+
; CHECK-NEXT: {{ $}}
385+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
386+
; CHECK-NEXT: {{ $}}
387+
; CHECK-NEXT: bb.2:
388+
; CHECK-NEXT: %y:vr = PHI %w, %bb.0, %x, %bb.1
389+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
390+
bb.0:
391+
%w:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
392+
BNE $noreg, $noreg, %bb.2
393+
bb.1:
394+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
395+
bb.2:
396+
%y:vr = PHI %w, %bb.0, %x, %bb.1
397+
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
398+
...
399+
---
400+
name: phi_user_invalid_sew
401+
tracksRegLiveness: true
402+
body: |
403+
; CHECK-LABEL: name: phi_user_invalid_sew
404+
; CHECK: bb.0:
405+
; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)
406+
; CHECK-NEXT: {{ $}}
407+
; CHECK-NEXT: %w:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
408+
; CHECK-NEXT: BNE $noreg, $noreg, %bb.2
409+
; CHECK-NEXT: {{ $}}
410+
; CHECK-NEXT: bb.1:
411+
; CHECK-NEXT: successors: %bb.2(0x80000000)
412+
; CHECK-NEXT: {{ $}}
413+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
414+
; CHECK-NEXT: {{ $}}
415+
; CHECK-NEXT: bb.2:
416+
; CHECK-NEXT: %y:vr = PHI %w, %bb.0, %x, %bb.1
417+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */
418+
bb.0:
419+
%w:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
420+
BNE $noreg, $noreg, %bb.2
421+
bb.1:
422+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
423+
bb.2:
424+
%y:vr = PHI %w, %bb.0, %x, %bb.1
425+
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */
426+
...
427+
---
428+
name: phi_different_incoming_sew
429+
tracksRegLiveness: true
430+
body: |
431+
; CHECK-LABEL: name: phi_different_incoming_sew
432+
; CHECK: bb.0:
433+
; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)
434+
; CHECK-NEXT: {{ $}}
435+
; CHECK-NEXT: %w:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
436+
; CHECK-NEXT: BNE $noreg, $noreg, %bb.2
437+
; CHECK-NEXT: {{ $}}
438+
; CHECK-NEXT: bb.1:
439+
; CHECK-NEXT: successors: %bb.2(0x80000000)
440+
; CHECK-NEXT: {{ $}}
441+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
442+
; CHECK-NEXT: {{ $}}
443+
; CHECK-NEXT: bb.2:
444+
; CHECK-NEXT: %y:vr = PHI %w, %bb.0, %x, %bb.1
445+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
446+
bb.0:
447+
%w:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
448+
BNE $noreg, $noreg, %bb.2
449+
bb.1:
450+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
451+
bb.2:
452+
%y:vr = PHI %w, %bb.0, %x, %bb.1
453+
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
454+
...
455+
---
456+
name: phi_cycle_direct
457+
tracksRegLiveness: true
458+
body: |
459+
; CHECK-LABEL: name: phi_cycle_direct
460+
; CHECK: bb.0:
461+
; CHECK-NEXT: successors: %bb.1(0x80000000)
462+
; CHECK-NEXT: {{ $}}
463+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
464+
; CHECK-NEXT: {{ $}}
465+
; CHECK-NEXT: bb.1:
466+
; CHECK-NEXT: successors: %bb.1(0x80000000)
467+
; CHECK-NEXT: {{ $}}
468+
; CHECK-NEXT: %y:vr = PHI %x, %bb.0, %y, %bb.1
469+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
470+
; CHECK-NEXT: PseudoBR %bb.1
471+
bb.0:
472+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
473+
bb.1:
474+
%y:vr = PHI %x, %bb.0, %y, %bb.1
475+
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
476+
PseudoBR %bb.1
477+
...
478+
---
479+
name: phi_cycle_indirect
480+
tracksRegLiveness: true
481+
body: |
482+
; CHECK-LABEL: name: phi_cycle_indirect
483+
; CHECK: bb.0:
484+
; CHECK-NEXT: successors: %bb.1(0x80000000)
485+
; CHECK-NEXT: {{ $}}
486+
; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
487+
; CHECK-NEXT: {{ $}}
488+
; CHECK-NEXT: bb.1:
489+
; CHECK-NEXT: successors: %bb.1(0x80000000)
490+
; CHECK-NEXT: {{ $}}
491+
; CHECK-NEXT: %y:vr = PHI %x, %bb.0, %z, %bb.1
492+
; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
493+
; CHECK-NEXT: PseudoBR %bb.1
494+
bb.0:
495+
%x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */
496+
bb.1:
497+
%y:vr = PHI %x, %bb.0, %z, %bb.1
498+
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
499+
PseudoBR %bb.1
500+
...
501+

0 commit comments

Comments
 (0)