Skip to content

Commit a560a46

Browse files
committed
[PHIElimination] Verify COPY has similar register class, update LiveVars
1 parent 4c7d3e9 commit a560a46

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

llvm/lib/CodeGen/PHIElimination.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,9 +584,13 @@ void PHIEliminationImpl::LowerPHINode(MachineBasicBlock &MBB,
584584
// Reuse an existing copy in the block if possible.
585585
if (IncomingReg.isVirtual()) {
586586
MachineInstr *DefMI = MRI->getUniqueVRegDef(SrcReg);
587+
const TargetRegisterClass *RC1 = MRI->getRegClass(SrcReg);
588+
const TargetRegisterClass *RC2 = MRI->getRegClass(IncomingReg);
587589
if (DefMI && DefMI->isCopy() && DefMI->getParent() == &opBlock &&
588-
MRI->use_empty(SrcReg)) {
590+
MRI->use_empty(SrcReg) && RC2->hasSuperClassEq(RC1)) {
589591
DefMI->getOperand(0).setReg(IncomingReg);
592+
if (LV)
593+
LV->getVarInfo(SrcReg).AliveBlocks.clear();
590594
continue;
591595
}
592596
}

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2-
# RUN: llc -run-pass=phi-node-elimination -mtriple=aarch64-linux-gnu -o - %s | FileCheck %s
2+
# RUN: llc -run-pass=livevars,phi-node-elimination -mtriple=aarch64-linux-gnu -o - %s | FileCheck %s
33

44
# Verify that the original COPY in bb.1 is reappropriated as the PHI source in bb.2,
55
# instead of creating a new COPY with the same source register.
@@ -117,3 +117,28 @@ body: |
117117
118118
...
119119

120+
---
121+
name: copy_subreg
122+
tracksRegLiveness: true
123+
body: |
124+
; CHECK-LABEL: name: copy_subreg
125+
; CHECK: bb.0:
126+
; CHECK-NEXT: successors: %bb.1(0x80000000)
127+
; CHECK-NEXT: liveins: $x0
128+
; CHECK-NEXT: {{ $}}
129+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY killed $x0
130+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY killed [[COPY]]
131+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]].sub_32
132+
; CHECK-NEXT: {{ $}}
133+
; CHECK-NEXT: bb.1:
134+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr32 = COPY [[COPY2]]
135+
bb.0:
136+
successors: %bb.1
137+
liveins: $x0
138+
139+
%0:gpr64 = COPY killed $x0
140+
%1:gpr64 = COPY killed %0
141+
142+
bb.1:
143+
%2:gpr32 = PHI %1.sub_32, %bb.0
144+
...

llvm/test/CodeGen/AArch64/tbl-loops.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ define void @loop1(ptr noalias nocapture noundef writeonly %dst, ptr nocapture n
1717
; CHECK-NEXT: .LBB0_3: // %vector.ph
1818
; CHECK-NEXT: add x11, x8, #1
1919
; CHECK-NEXT: mov w8, #1132396544 // =0x437f0000
20-
; CHECK-NEXT: add x13, x0, #4
20+
; CHECK-NEXT: add x12, x0, #4
2121
; CHECK-NEXT: and x10, x11, #0x1fffffff8
2222
; CHECK-NEXT: dup v0.4s, w8
23-
; CHECK-NEXT: add x14, x1, #16
23+
; CHECK-NEXT: add x13, x1, #16
2424
; CHECK-NEXT: add x8, x1, x10, lsl #2
25-
; CHECK-NEXT: mov x12, x10
2625
; CHECK-NEXT: add x9, x0, x10
26+
; CHECK-NEXT: mov x14, x10
2727
; CHECK-NEXT: .LBB0_4: // %vector.body
2828
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
29-
; CHECK-NEXT: ldp q1, q2, [x14, #-16]
30-
; CHECK-NEXT: subs x12, x12, #8
31-
; CHECK-NEXT: add x14, x14, #32
29+
; CHECK-NEXT: ldp q1, q2, [x13, #-16]
30+
; CHECK-NEXT: subs x14, x14, #8
31+
; CHECK-NEXT: add x13, x13, #32
3232
; CHECK-NEXT: fcmgt v3.4s, v1.4s, v0.4s
3333
; CHECK-NEXT: fcmgt v4.4s, v2.4s, v0.4s
3434
; CHECK-NEXT: fcmlt v5.4s, v1.4s, #0.0
@@ -44,8 +44,8 @@ define void @loop1(ptr noalias nocapture noundef writeonly %dst, ptr nocapture n
4444
; CHECK-NEXT: uzp1 v1.8b, v1.8b, v0.8b
4545
; CHECK-NEXT: uzp1 v2.8b, v2.8b, v0.8b
4646
; CHECK-NEXT: mov v1.s[1], v2.s[0]
47-
; CHECK-NEXT: stur d1, [x13, #-4]
48-
; CHECK-NEXT: add x13, x13, #8
47+
; CHECK-NEXT: stur d1, [x12, #-4]
48+
; CHECK-NEXT: add x12, x12, #8
4949
; CHECK-NEXT: b.ne .LBB0_4
5050
; CHECK-NEXT: // %bb.5: // %middle.block
5151
; CHECK-NEXT: cmp x11, x10

0 commit comments

Comments
 (0)