Skip to content

Commit de83559

Browse files
guy-davidrlavaee
authored andcommitted
[PHIElimination] Fix bug around $noreg assignment (llvm#146320)
PR which introduced the bug: llvm#131837. Fixes a crash around dead registers which started in f5c62ee by verifying that the reused incoming register is also virtual.
1 parent b2aca00 commit de83559

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

llvm/lib/CodeGen/PHIElimination.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,9 @@ void PHIEliminationImpl::LowerPHINode(MachineBasicBlock &MBB,
582582
}
583583

584584
// Reuse an existing copy in the block if possible.
585-
if (MachineInstr *DefMI = MRI->getUniqueVRegDef(SrcReg)) {
586-
if (DefMI->isCopy() && DefMI->getParent() == &opBlock &&
585+
if (IncomingReg.isVirtual()) {
586+
MachineInstr *DefMI = MRI->getUniqueVRegDef(SrcReg);
587+
if (DefMI && DefMI->isCopy() && DefMI->getParent() == &opBlock &&
587588
MRI->use_empty(SrcReg)) {
588589
DefMI->getOperand(0).setReg(IncomingReg);
589590
continue;

llvm/test/CodeGen/AArch64/PHIElimination-reuse-copy.mir

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,54 @@ body: |
6666
%b:gpr32 = PHI %a:gpr32, %bb.1, undef %undef:gpr32, %bb.0
6767
...
6868

69+
---
70+
name: copy_to_dead
71+
tracksRegLiveness: true
72+
body: |
73+
; CHECK-LABEL: name: copy_to_dead
74+
; CHECK: bb.0:
75+
; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)
76+
; CHECK-NEXT: liveins: $wzr, $xzr
77+
; CHECK-NEXT: {{ $}}
78+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $wzr
79+
; CHECK-NEXT: dead [[COPY1:%[0-9]+]]:gpr64 = COPY $xzr
80+
; CHECK-NEXT: TBZW killed [[COPY]], 0, %bb.2
81+
; CHECK-NEXT: B %bb.1
82+
; CHECK-NEXT: {{ $}}
83+
; CHECK-NEXT: bb.1:
84+
; CHECK-NEXT: successors: %bb.2(0x80000000)
85+
; CHECK-NEXT: {{ $}}
86+
; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr64 = IMPLICIT_DEF
87+
; CHECK-NEXT: [[DEF1:%[0-9]+]]:gpr64 = IMPLICIT_DEF
88+
; CHECK-NEXT: B %bb.2
89+
; CHECK-NEXT: {{ $}}
90+
; CHECK-NEXT: bb.2:
91+
; CHECK-NEXT: successors: %bb.1(0x80000000)
92+
; CHECK-NEXT: {{ $}}
93+
; CHECK-NEXT: [[DEF2:%[0-9]+]]:gpr64 = IMPLICIT_DEF
94+
; CHECK-NEXT: [[DEF3:%[0-9]+]]:gpr64 = IMPLICIT_DEF
95+
; CHECK-NEXT: B %bb.1
96+
bb.0:
97+
liveins: $wzr, $xzr
98+
99+
%9:gpr32 = COPY $wzr
100+
dead %5:gpr64 = COPY $xzr
101+
TBZW killed %9:gpr32, 0, %bb.2
102+
B %bb.1
103+
104+
bb.1:
105+
successors: %bb.2(0x80000000); %bb.2(100.00%)
106+
107+
dead %1:gpr64 = PHI undef %3:gpr64, %bb.2, undef %5:gpr64, %bb.0
108+
dead %2:gpr64 = PHI undef %4:gpr64, %bb.2, undef %5:gpr64, %bb.0
109+
B %bb.2
110+
111+
bb.2:
112+
successors: %bb.1(0x80000000); %bb.1(100.00%)
113+
114+
dead %3:gpr64 = PHI undef %1:gpr64, %bb.1, undef %5:gpr64, %bb.0
115+
dead %4:gpr64 = PHI undef %2:gpr64, %bb.1, undef %5:gpr64, %bb.0
116+
B %bb.1
117+
118+
...
119+

0 commit comments

Comments
 (0)