Skip to content

Commit 1669f34

Browse files
committed
[RISCV] Move VMV0 elimination past machine SSA opts
This is the follow up to #125026 that keeps mask operands in virtual register form for as long as possible throughout the backend. The diffs in this patch are from MachineCSE/MachineSink/RISCVVLOptimizer kicking in. The invariant that the mask COPY never has a subreg no longer holds after MachineCSE (it coalesces some copies), so it needed to be relaxed.
1 parent cc7e836 commit 1669f34

35 files changed

+1199
-933
lines changed

llvm/lib/Target/RISCV/RISCVTargetMachine.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -588,8 +588,6 @@ void RISCVPassConfig::addPreEmitPass2() {
588588

589589
void RISCVPassConfig::addMachineSSAOptimization() {
590590
addPass(createRISCVVectorPeepholePass());
591-
// TODO: Move this to pre regalloc
592-
addPass(createRISCVVMV0EliminationPass());
593591

594592
TargetPassConfig::addMachineSSAOptimization();
595593

@@ -602,10 +600,6 @@ void RISCVPassConfig::addMachineSSAOptimization() {
602600
}
603601

604602
void RISCVPassConfig::addPreRegAlloc() {
605-
// TODO: Move this as late as possible before regalloc
606-
if (TM->getOptLevel() == CodeGenOptLevel::None)
607-
addPass(createRISCVVMV0EliminationPass());
608-
609603
addPass(createRISCVPreRAExpandPseudoPass());
610604
if (TM->getOptLevel() != CodeGenOptLevel::None) {
611605
addPass(createRISCVMergeBaseOffsetOptPass());
@@ -619,6 +613,8 @@ void RISCVPassConfig::addPreRegAlloc() {
619613

620614
if (TM->getOptLevel() != CodeGenOptLevel::None && EnableMachinePipeliner)
621615
addPass(&MachinePipelinerID);
616+
617+
addPass(createRISCVVMV0EliminationPass());
622618
}
623619

624620
void RISCVPassConfig::addFastRegAlloc() {

llvm/lib/Target/RISCV/RISCVVMV0Elimination.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,9 @@ bool RISCVVMV0Elimination::runOnMachineFunction(MachineFunction &MF) {
131131

132132
// Peek through a single copy to match what isel does.
133133
if (MachineInstr *SrcMI = MRI.getVRegDef(Src);
134-
SrcMI->isCopy() && SrcMI->getOperand(1).getReg().isVirtual()) {
135-
assert(SrcMI->getOperand(1).getSubReg() == RISCV::NoSubRegister);
134+
SrcMI->isCopy() && SrcMI->getOperand(1).getReg().isVirtual() &&
135+
SrcMI->getOperand(1).getSubReg() == RISCV::NoSubRegister)
136136
Src = SrcMI->getOperand(1).getReg();
137-
}
138137

139138
BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(RISCV::COPY), RISCV::V0)
140139
.addReg(Src);

llvm/test/CodeGen/RISCV/O0-pipeline.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@
3939
; CHECK-NEXT: RISC-V DAG->DAG Pattern Instruction Selection
4040
; CHECK-NEXT: Finalize ISel and expand pseudo-instructions
4141
; CHECK-NEXT: Local Stack Slot Allocation
42-
; CHECK-NEXT: RISC-V VMV0 Elimination
4342
; CHECK-NEXT: RISC-V Pre-RA pseudo instruction expansion pass
4443
; CHECK-NEXT: RISC-V Insert Read/Write CSR Pass
4544
; CHECK-NEXT: RISC-V Insert Write VXRM Pass
4645
; CHECK-NEXT: RISC-V Landing Pad Setup
46+
; CHECK-NEXT: RISC-V VMV0 Elimination
4747
; CHECK-NEXT: Init Undef Pass
4848
; CHECK-NEXT: Eliminate PHI nodes for register allocation
4949
; CHECK-NEXT: Two-Address instruction pass

llvm/test/CodeGen/RISCV/O3-pipeline.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@
9797
; CHECK-NEXT: RISC-V DAG->DAG Pattern Instruction Selection
9898
; CHECK-NEXT: Finalize ISel and expand pseudo-instructions
9999
; CHECK-NEXT: RISC-V Vector Peephole Optimization
100-
; CHECK-NEXT: RISC-V VMV0 Elimination
101100
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
102101
; CHECK-NEXT: Early Tail Duplication
103102
; CHECK-NEXT: Optimize machine instruction PHIs
@@ -128,6 +127,7 @@
128127
; CHECK-NEXT: RISC-V Insert Read/Write CSR Pass
129128
; CHECK-NEXT: RISC-V Insert Write VXRM Pass
130129
; CHECK-NEXT: RISC-V Landing Pad Setup
130+
; CHECK-NEXT: RISC-V VMV0 Elimination
131131
; CHECK-NEXT: Detect Dead Lanes
132132
; CHECK-NEXT: Init Undef Pass
133133
; CHECK-NEXT: Process Implicit Definitions

llvm/test/CodeGen/RISCV/rvv/ceil-vp.ll

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,40 +1515,36 @@ define <vscale x 16 x double> @vp_ceil_vv_nxv16f64(<vscale x 16 x double> %va, <
15151515
; CHECK-NEXT: vmv1r.v v0, v6
15161516
; CHECK-NEXT: vsetvli zero, a2, e64, m8, ta, ma
15171517
; CHECK-NEXT: vfabs.v v24, v16, v0.t
1518+
; CHECK-NEXT: addi a2, sp, 16
1519+
; CHECK-NEXT: vs8r.v v24, (a2) # Unknown-size Folded Spill
1520+
; CHECK-NEXT: vl8r.v v24, (a2) # Unknown-size Folded Reload
15181521
; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu
15191522
; CHECK-NEXT: vmflt.vf v6, v24, fa5, v0.t
15201523
; CHECK-NEXT: fsrmi a2, 3
15211524
; CHECK-NEXT: vmv1r.v v0, v6
15221525
; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma
15231526
; CHECK-NEXT: vfcvt.x.f.v v24, v16, v0.t
1524-
; CHECK-NEXT: addi a3, sp, 16
1525-
; CHECK-NEXT: vs8r.v v24, (a3) # Unknown-size Folded Spill
15261527
; CHECK-NEXT: fsrm a2
1527-
; CHECK-NEXT: addi a2, sp, 16
1528-
; CHECK-NEXT: vl8r.v v24, (a2) # Unknown-size Folded Reload
15291528
; CHECK-NEXT: vfcvt.f.x.v v24, v24, v0.t
15301529
; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu
15311530
; CHECK-NEXT: vfsgnj.vv v16, v24, v16, v0.t
1532-
; CHECK-NEXT: vs8r.v v16, (a2) # Unknown-size Folded Spill
15331531
; CHECK-NEXT: bltu a0, a1, .LBB44_2
15341532
; CHECK-NEXT: # %bb.1:
15351533
; CHECK-NEXT: mv a0, a1
15361534
; CHECK-NEXT: .LBB44_2:
15371535
; CHECK-NEXT: vmv1r.v v0, v7
15381536
; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma
1539-
; CHECK-NEXT: vfabs.v v16, v8, v0.t
1537+
; CHECK-NEXT: vfabs.v v24, v8, v0.t
15401538
; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu
1541-
; CHECK-NEXT: vmflt.vf v7, v16, fa5, v0.t
1539+
; CHECK-NEXT: vmflt.vf v7, v24, fa5, v0.t
15421540
; CHECK-NEXT: fsrmi a0, 3
15431541
; CHECK-NEXT: vmv1r.v v0, v7
15441542
; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, ma
1545-
; CHECK-NEXT: vfcvt.x.f.v v16, v8, v0.t
1543+
; CHECK-NEXT: vfcvt.x.f.v v24, v8, v0.t
15461544
; CHECK-NEXT: fsrm a0
1547-
; CHECK-NEXT: vfcvt.f.x.v v16, v16, v0.t
1545+
; CHECK-NEXT: vfcvt.f.x.v v24, v24, v0.t
15481546
; CHECK-NEXT: vsetvli zero, zero, e64, m8, ta, mu
1549-
; CHECK-NEXT: vfsgnj.vv v8, v16, v8, v0.t
1550-
; CHECK-NEXT: addi a0, sp, 16
1551-
; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload
1547+
; CHECK-NEXT: vfsgnj.vv v8, v24, v8, v0.t
15521548
; CHECK-NEXT: csrr a0, vlenb
15531549
; CHECK-NEXT: slli a0, a0, 3
15541550
; CHECK-NEXT: add sp, sp, a0

0 commit comments

Comments
 (0)