Skip to content

Commit 25edefa

Browse files
fixup! handle phi loop
1 parent d6462da commit 25edefa

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp

Lines changed: 2 additions & 1 deletion
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,7 +1341,7 @@ RISCVVLOptimizer::checkUsers(const MachineInstr &MI) const {
13401341
continue;
13411342
}
13421343

1343-
if (UserMI.isPHI()) {
1344+
if (UserMI.isPHI() && PHISeen.insert(&UserMI).second) {
13441345
LLVM_DEBUG(dbgs() << " Peeking through uses of PHI\n");
13451346
for (auto &PhiUse : MRI->use_operands(UserMI.getOperand(0).getReg()))
13461347
Worklist.insert(&PhiUse);

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,27 @@ body: |
452452
%y:vr = PHI %w, %bb.0, %x, %bb.1
453453
%z:vr = PseudoVADD_VV_M1 $noreg, %y, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */
454454
...
455+
---
456+
name: phi_cycle
457+
tracksRegLiveness: true
458+
body: |
459+
; CHECK-LABEL: name: phi_cycle
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+

patch.diff

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
commit d6462da5dde7d38604bd5783e609ec8392eaf74c
2+
Author: Michael Maitland <[email protected]>
3+
Date: Thu Mar 20 08:21:12 2025 -0700
4+
5+
fixup! clang-format
6+
7+
diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
8+
index 61f43e2e72b1..80ae0fd3d930 100644
9+
--- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
10+
+++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp
11+
@@ -1342,8 +1342,8 @@ RISCVVLOptimizer::checkUsers(const MachineInstr &MI) const {
12+
13+
if (UserMI.isPHI()) {
14+
LLVM_DEBUG(dbgs() << " Peeking through uses of PHI\n");
15+
- for (auto &PhiUse : MRI->use_operands(UserMI.getOperand(0).getReg()))
16+
- Worklist.insert(&PhiUse);
17+
+ for (auto &PhiUse : MRI->use_operands(UserMI.getOperand(0).getReg()))
18+
+ Worklist.insert(&PhiUse);
19+
continue;
20+
}
21+

0 commit comments

Comments
 (0)