Skip to content

Commit 6cc79a9

Browse files
committed
[RISCV] Postpone earse DeadMI in InitUndef pass
InitUndef pass need replace the implicit def with InitUndef pseudo, but current remove method will make noreg2implicit borken. This patch postpone the removal until all basicblock be processed.
1 parent 403a7c3 commit 6cc79a9

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
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

llvm/test/CodeGen/RISCV/rvv/handle-noreg-with-implicit-def.mir

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ body: |
88
bb.0.entry:
99
; MIR-LABEL: name: vrgather_all_undef
1010
; MIR: [[PseudoRVVInitUndefM1_:%[0-9]+]]:vr = PseudoRVVInitUndefM1
11-
; MIR-NEXT: early-clobber %1:vr = PseudoVRGATHER_VI_M1 $noreg, killed [[PseudoRVVInitUndefM1_]], 0, 0, 5 /* e32 */, 0 /* tu, mu */
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 */
1213
; MIR-NEXT: $v8 = COPY %1
1314
; MIR-NEXT: PseudoRET implicit $v8
1415
%2:vr = IMPLICIT_DEF

0 commit comments

Comments
 (0)