Skip to content

Commit ad66b5a

Browse files
authored
[RISCV][Peephole] Clear kill flags for registers after foldUndefPassthruVMV_V_V (#138847)
Without clearing kill flags, this pass will generate bad machine code. ``` *** Bad machine code: Using a killed virtual register *** - function: main - basic block: %bb.0 entry (0x437ef928) - instruction: %12:vrn7m1 = INSERT_SUBREG %11:vrn7m1(tied-def 0), %0:vr, %subreg.sub_vrm1_0 - operand 2: %0:vr ```
1 parent c38910b commit ad66b5a

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ bool RISCVVectorPeephole::foldUndefPassthruVMV_V_V(MachineInstr &MI) {
584584
}
585585

586586
MRI->replaceRegWith(MI.getOperand(0).getReg(), MI.getOperand(2).getReg());
587+
MRI->clearKillFlags(MI.getOperand(2).getReg());
587588
MI.eraseFromParent();
588589
return true;
589590
}

llvm/test/CodeGen/RISCV/rvv/vmv.v.v-peephole.mir

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,19 @@ body: |
8989
%passthru:vr = COPY $v8
9090
%x:vr = PseudoVADD_VV_MF4 %passthru, $noreg, $noreg, 4, 4 /* e16 */, 0 /* tu, mu */
9191
%y:vr = PseudoVMV_V_V_MF8 %passthru, %x, 4, 3 /* e8 */, 0 /* tu, mu */
92+
...
93+
---
94+
name: kill_flag
95+
tracksRegLiveness: true
96+
body: |
97+
bb.0:
98+
; CHECK-LABEL: name: kill_flag
99+
; CHECK: [[PseudoVADD_VV_M1_:%[0-9]+]]:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
100+
; CHECK-NEXT: [[COPY:%[0-9]+]]:vr = COPY [[PseudoVADD_VV_M1_]]
101+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:vr = COPY [[PseudoVADD_VV_M1_]]
102+
%0:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */
103+
%1:vr = PseudoVMV_V_V_M1 $noreg, %0, -1, 4 /* e16 */, 0 /* tu, mu */
104+
%2:vr = COPY killed %1
105+
%3:vr = COPY %0
106+
...
107+
---

0 commit comments

Comments
 (0)