Skip to content

Commit 3494c55

Browse files
authored
[RISCV] postpone removal in initundef pass (#71661)
InitUndef pass need replace the implicit def with Undef pseudo, but current remove method will make noreg2implicit borken. This patch postpone the removal until all basicblock be processed.
1 parent a76adfb commit 3494c55

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

llvm/lib/Target/RISCV/RISCVRVVInitUndef.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "RISCV.h"
4343
#include "RISCVSubtarget.h"
4444
#include "llvm/ADT/SmallSet.h"
45+
#include "llvm/ADT/SmallVector.h"
4546
#include "llvm/CodeGen/DetectDeadLanes.h"
4647
#include "llvm/CodeGen/MachineFunctionPass.h"
4748
using namespace llvm;
@@ -59,6 +60,8 @@ class RISCVInitUndef : public MachineFunctionPass {
5960

6061
// Newly added vregs, assumed to be fully rewritten
6162
SmallSet<Register, 8> NewRegs;
63+
SmallVector<MachineInstr *, 8> DeadInsts;
64+
6265
public:
6366
static char ID;
6467

@@ -174,7 +177,7 @@ bool RISCVInitUndef::handleImplicitDef(MachineBasicBlock &MBB,
174177
BuildMI(MBB, Inst, Inst->getDebugLoc(), TII->get(Opcode), NewDest);
175178

176179
if (!HasOtherUse)
177-
Inst = MBB.erase(Inst);
180+
DeadInsts.push_back(&(*Inst));
178181

179182
for (auto MO : UseMOs) {
180183
MO->setReg(NewDest);
@@ -298,6 +301,10 @@ bool RISCVInitUndef::runOnMachineFunction(MachineFunction &MF) {
298301
for (MachineBasicBlock &BB : MF)
299302
Changed |= processBasicBlock(MF, BB, DLD);
300303

304+
for (auto *DeadMI : DeadInsts)
305+
DeadMI->eraseFromParent();
306+
DeadInsts.clear();
307+
301308
return Changed;
302309
}
303310

llvm/test/CodeGen/RISCV/regalloc-last-chance-recoloring-failure.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ define void @last_chance_recoloring_failure() {
3636
; CHECK-NEXT: vmclr.m v0
3737
; CHECK-NEXT: li s0, 36
3838
; CHECK-NEXT: vsetvli zero, s0, e16, m4, ta, ma
39-
; CHECK-NEXT: vfwadd.vv v16, v8, v8, v0.t
39+
; CHECK-NEXT: vfwadd.vv v16, v8, v12, v0.t
4040
; CHECK-NEXT: csrr a0, vlenb
4141
; CHECK-NEXT: slli a0, a0, 3
4242
; CHECK-NEXT: add a0, sp, a0
@@ -45,7 +45,7 @@ define void @last_chance_recoloring_failure() {
4545
; CHECK-NEXT: call func@plt
4646
; CHECK-NEXT: li a0, 32
4747
; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma
48-
; CHECK-NEXT: vrgather.vv v16, v8, v8, v0.t
48+
; CHECK-NEXT: vrgather.vv v16, v8, v12, v0.t
4949
; CHECK-NEXT: vsetvli zero, s0, e16, m4, ta, ma
5050
; CHECK-NEXT: addi a1, sp, 16
5151
; CHECK-NEXT: csrr a2, vlenb
@@ -105,13 +105,13 @@ define void @last_chance_recoloring_failure() {
105105
; SUBREGLIVENESS-NEXT: vmclr.m v0
106106
; SUBREGLIVENESS-NEXT: li s0, 36
107107
; SUBREGLIVENESS-NEXT: vsetvli zero, s0, e16, m4, ta, ma
108-
; SUBREGLIVENESS-NEXT: vfwadd.vv v16, v8, v8, v0.t
108+
; SUBREGLIVENESS-NEXT: vfwadd.vv v16, v8, v12, v0.t
109109
; SUBREGLIVENESS-NEXT: addi a0, sp, 16
110110
; SUBREGLIVENESS-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill
111111
; SUBREGLIVENESS-NEXT: call func@plt
112112
; SUBREGLIVENESS-NEXT: li a0, 32
113113
; SUBREGLIVENESS-NEXT: vsetvli zero, a0, e16, m4, ta, ma
114-
; SUBREGLIVENESS-NEXT: vrgather.vv v16, v8, v8, v0.t
114+
; SUBREGLIVENESS-NEXT: vrgather.vv v16, v8, v12, v0.t
115115
; SUBREGLIVENESS-NEXT: vsetvli zero, s0, e16, m4, ta, ma
116116
; SUBREGLIVENESS-NEXT: csrr a1, vlenb
117117
; SUBREGLIVENESS-NEXT: slli a1, a1, 3
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2+
# RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs -run-pass=riscv-init-undef -o - %s | FileCheck %s --check-prefix=MIR
3+
...
4+
---
5+
name: vrgather_all_undef
6+
tracksRegLiveness: true
7+
body: |
8+
bb.0.entry:
9+
; MIR-LABEL: name: vrgather_all_undef
10+
; MIR: [[PseudoRVVInitUndefM1_:%[0-9]+]]:vr = PseudoRVVInitUndefM1
11+
; MIR-NEXT: [[DEF:%[0-9]+]]:vr = IMPLICIT_DEF
12+
; MIR-NEXT: early-clobber %1:vr = PseudoVRGATHER_VI_M1 [[DEF]], killed [[PseudoRVVInitUndefM1_]], 0, 0, 5 /* e32 */, 0 /* tu, mu */
13+
; MIR-NEXT: $v8 = COPY %1
14+
; MIR-NEXT: PseudoRET implicit $v8
15+
%2:vr = IMPLICIT_DEF
16+
early-clobber %1:vr = PseudoVRGATHER_VI_M1 $noreg, killed undef %2, 0, 0, 5 /* e32 */, 0 /* tu, mu */
17+
$v8 = COPY %1
18+
PseudoRET implicit $v8
19+
20+
...

0 commit comments

Comments
 (0)