Skip to content

Commit 314bef8

Browse files
committed
[PHIElimination] Reuse existing COPY in predecessor basic block
Simplifies the CFG later on, added a regression test.
1 parent f6b1b91 commit 314bef8

File tree

3 files changed

+151
-0
lines changed

3 files changed

+151
-0
lines changed

llvm/lib/CodeGen/PHIElimination.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,15 @@ void PHIEliminationImpl::LowerPHINode(MachineBasicBlock &MBB,
587587
MachineBasicBlock::iterator InsertPos =
588588
findPHICopyInsertPoint(&opBlock, &MBB, SrcReg);
589589

590+
// Reuse an existing copy in the block if possible.
591+
if (MachineInstr *DefMI = MRI->getUniqueVRegDef(SrcReg)) {
592+
if (DefMI->isCopy() && DefMI->getParent() == &opBlock &&
593+
MRI->use_empty(SrcReg)) {
594+
DefMI->getOperand(0).setReg(IncomingReg);
595+
continue;
596+
}
597+
}
598+
590599
// Insert the copy.
591600
MachineInstr *NewSrcInstr = nullptr;
592601
if (!reusedIncoming && IncomingReg) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# 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
3+
4+
# Verify that the original COPY in bb.1 is reappropriated as the PHI source in bb.2,
5+
# instead of creating a new COPY with the same source register.
6+
7+
---
8+
name: test
9+
tracksRegLiveness: true
10+
body: |
11+
; CHECK-LABEL: name: test
12+
; CHECK: bb.0:
13+
; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)
14+
; CHECK-NEXT: liveins: $nzcv, $wzr
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32 = IMPLICIT_DEF
17+
; CHECK-NEXT: Bcc 8, %bb.2, implicit $nzcv
18+
; CHECK-NEXT: {{ $}}
19+
; CHECK-NEXT: bb.1:
20+
; CHECK-NEXT: successors: %bb.2(0x80000000)
21+
; CHECK-NEXT: {{ $}}
22+
; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32 = COPY $wzr
23+
; CHECK-NEXT: {{ $}}
24+
; CHECK-NEXT: bb.2:
25+
; CHECK-NEXT: %y:gpr32 = COPY [[DEF]]
26+
; CHECK-NEXT: $wzr = COPY %y
27+
bb.0:
28+
liveins: $nzcv, $wzr
29+
Bcc 8, %bb.2, implicit $nzcv
30+
bb.1:
31+
%x:gpr32 = COPY $wzr
32+
bb.2:
33+
%y:gpr32 = PHI %x:gpr32, %bb.1, undef %undef:gpr32, %bb.0
34+
$wzr = COPY %y:gpr32
35+
...
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o - %s -start-before=phi-node-elimination -stop-after=block-placement | FileCheck %s
2+
3+
# TODO: Reduce test case.
4+
# CHECK-NOT: CBNZX
5+
6+
---
7+
name: test
8+
tracksRegLiveness: true
9+
body: |
10+
bb.0:
11+
liveins: $x0, $w1, $x2, $x3
12+
%42:gpr64all = COPY killed $x0
13+
%41:gpr32all = COPY killed $w1
14+
%120:gpr64common = COPY killed $x2
15+
%121:gpr64common = COPY killed $x3
16+
B %bb.20
17+
18+
bb.20:
19+
successors: %bb.21(0x30000000), %bb.22(0x50000000); %bb.21(37.50%), %bb.22(62.50%)
20+
21+
%43:gpr64common = PHI %42:gpr64all, %bb.0, %55:gpr64common, %bb.28
22+
%44:gpr32all = PHI %41:gpr32all, %bb.0, %57:gpr32all, %bb.28
23+
%144:gpr64 = LDRXui %121:gpr64common, 0 :: (load (s64))
24+
%145:gpr64 = LDRXui %43:gpr64common, 0 :: (load (s64))
25+
%146:gpr64 = EORXrr killed %145:gpr64, killed %144:gpr64
26+
STRXui killed %43:gpr64common, %121:gpr64common, 0 :: (store (s64))
27+
STRXui %146:gpr64, %121:gpr64common, 1 :: (store (s64))
28+
%147:gpr64 = LDRXui %120:gpr64common, 1 :: (load (s64))
29+
CBNZX %147:gpr64, %bb.22
30+
31+
bb.21:
32+
successors: %bb.26(0x80000000); %bb.26(100.00%)
33+
34+
%45:gpr64all = COPY killed %146:gpr64
35+
B %bb.26
36+
37+
bb.22:
38+
successors: %bb.23(0x80000000); %bb.23(100.00%)
39+
40+
%46:gpr64all = COPY killed %147:gpr64
41+
%148:gpr64 = LDRXui %120:gpr64common, 0 :: (load (s64))
42+
%47:gpr64all = COPY killed %148:gpr64
43+
44+
bb.23:
45+
successors: %bb.25(0x04000000), %bb.24(0x7c000000); %bb.25(3.12%), %bb.24(96.88%)
46+
47+
%48:gpr32common = PHI %44:gpr32all, %bb.22, %51:gpr32all, %bb.24
48+
%49:gpr64common = PHI %46:gpr64all, %bb.22, %52:gpr64all, %bb.24
49+
%50:gpr64 = PHI %47:gpr64all, %bb.22, %49:gpr64common, %bb.24
50+
%149:gpr32 = LDRWui %49:gpr64common, 2 :: (load (s32))
51+
%150:gpr32common = nsw ADDWri %48:gpr32common, 1, 0
52+
dead $wzr = SUBSWrr killed %149:gpr32, killed %150:gpr32common, implicit-def $nzcv
53+
Bcc 12, %bb.25, implicit killed $nzcv
54+
B %bb.24
55+
56+
bb.24:
57+
successors: %bb.25(0x04000000), %bb.23(0x7c000000); %bb.25(3.12%), %bb.23(96.88%)
58+
59+
%152:gpr32 = LDRWui %49:gpr64common, 3 :: (load (s32))
60+
dead $wzr = SUBSWrr %48:gpr32common, %152:gpr32, implicit-def $nzcv
61+
%154:gpr32 = CSELWr killed %48:gpr32common, killed %152:gpr32, 12, implicit killed $nzcv
62+
%51:gpr32all = COPY killed %154:gpr32
63+
%155:gpr64 = LDRXui %49:gpr64common, 0 :: (load (s64))
64+
%156:gpr64 = EORXrr %155:gpr64, %50:gpr64
65+
%52:gpr64all = COPY %156:gpr64
66+
STRXui %49:gpr64common, %120:gpr64common, 0 :: (store (s64))
67+
STRXui killed %156:gpr64, %120:gpr64common, 1 :: (store (s64))
68+
dead $xzr = SUBSXrr killed %155:gpr64, killed %50:gpr64, implicit-def $nzcv
69+
Bcc 1, %bb.23, implicit killed $nzcv
70+
B %bb.25
71+
72+
bb.25:
73+
successors: %bb.26(0x80000000); %bb.26(100.00%)
74+
75+
%53:gpr32all = PHI %48:gpr32common, %bb.23, %51:gpr32all, %bb.24
76+
%158:gpr64 = LDRXui %121:gpr64common, 1 :: (load (s64))
77+
%54:gpr64all = COPY killed %158:gpr64
78+
79+
bb.26:
80+
successors: %bb.29(0x04000000), %bb.27(0x7c000000); %bb.29(3.12%), %bb.27(96.88%)
81+
82+
%55:gpr64common = PHI %45:gpr64all, %bb.21, %54:gpr64all, %bb.25
83+
%56:gpr32common = PHI %44:gpr32all, %bb.21, %53:gpr32all, %bb.25
84+
CBZX %55:gpr64common, %bb.29
85+
B %bb.27
86+
87+
bb.27:
88+
successors: %bb.29(0x04000000), %bb.28(0x7c000000); %bb.29(3.12%), %bb.28(96.88%)
89+
90+
%159:gpr32 = LDRWui %55:gpr64common, 2 :: (load (s32))
91+
%160:gpr32common = nsw ADDWri %56:gpr32common, 1, 0
92+
dead $wzr = SUBSWrr killed %159:gpr32, killed %160:gpr32common, implicit-def $nzcv
93+
Bcc 12, %bb.29, implicit killed $nzcv
94+
B %bb.28
95+
96+
bb.28:
97+
successors: %bb.20(0x80000000); %bb.20(100.00%)
98+
99+
%162:gpr32 = LDRWui %55:gpr64common, 3 :: (load (s32))
100+
dead $wzr = SUBSWrr %56:gpr32common, %162:gpr32, implicit-def $nzcv
101+
%164:gpr32 = CSELWr killed %56:gpr32common, killed %162:gpr32, 12, implicit killed $nzcv
102+
%57:gpr32all = COPY killed %164:gpr32
103+
B %bb.20
104+
105+
bb.29:
106+
RET_ReallyLR
107+
...

0 commit comments

Comments
 (0)