Skip to content

Commit 0412f70

Browse files
dianqktstellar
authored andcommitted
[TailDuplicator] Do not restrict the computed gotos (llvm#114990)
Fixes llvm#106846. This is what I learned from GCC. I found that GCC does not duplicate the BB that has indirect jumps with the jump table. I believe GCC has provided a clear explanation here: > Duplicate the blocks containing computed gotos. This basically unfactors computed gotos that were factored early on in the compilation process to speed up edge based data flow. We used to not unfactor them again, which can seriously pessimize code with many computed jumps in the source code, such as interpreters. (cherry picked from commit dd21aac)
1 parent 72c4a3f commit 0412f70

File tree

3 files changed

+276
-4
lines changed

3 files changed

+276
-4
lines changed

llvm/include/llvm/CodeGen/MachineInstr.h

+11-2
Original file line numberDiff line numberDiff line change
@@ -994,8 +994,17 @@ class MachineInstr
994994

995995
/// Return true if this is an indirect branch, such as a
996996
/// branch through a register.
997-
bool isIndirectBranch(QueryType Type = AnyInBundle) const {
998-
return hasProperty(MCID::IndirectBranch, Type);
997+
bool isIndirectBranch(QueryType Type = AnyInBundle,
998+
bool IncludeJumpTable = true) const {
999+
return hasProperty(MCID::IndirectBranch, Type) &&
1000+
(IncludeJumpTable || !llvm::any_of(operands(), [](const auto &Op) {
1001+
return Op.isJTI();
1002+
}));
1003+
}
1004+
1005+
bool isComputedGoto(QueryType Type = AnyInBundle) const {
1006+
// Jump tables are not considered computed gotos.
1007+
return isIndirectBranch(Type, /*IncludeJumpTable=*/false);
9991008
}
10001009

10011010
/// Return true if this is a branch which may fall

llvm/lib/CodeGen/TailDuplicator.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -601,8 +601,11 @@ bool TailDuplicator::shouldTailDuplicate(bool IsSimple,
601601
// that rearrange the predecessors of the indirect branch.
602602

603603
bool HasIndirectbr = false;
604-
if (!TailBB.empty())
604+
bool HasComputedGoto = false;
605+
if (!TailBB.empty()) {
605606
HasIndirectbr = TailBB.back().isIndirectBranch();
607+
HasComputedGoto = TailBB.back().isComputedGoto();
608+
}
606609

607610
if (HasIndirectbr && PreRegAlloc)
608611
MaxDuplicateCount = TailDupIndirectBranchSize;
@@ -660,7 +663,12 @@ bool TailDuplicator::shouldTailDuplicate(bool IsSimple,
660663
// Duplicating a BB which has both multiple predecessors and successors will
661664
// may cause huge amount of PHI nodes. If we want to remove this limitation,
662665
// we have to address https://github.com/llvm/llvm-project/issues/78578.
663-
if (TailBB.pred_size() > TailDupPredSize &&
666+
// NB. This basically unfactors computed gotos that were factored early on in
667+
// the compilation process to speed up edge based data flow. If we do not
668+
// unfactor them again, it can seriously pessimize code with many computed
669+
// jumps in the source code, such as interpreters. Therefore we do not
670+
// restrict the computed gotos.
671+
if (!HasComputedGoto && TailBB.pred_size() > TailDupPredSize &&
664672
TailBB.succ_size() > TailDupSuccSize) {
665673
// If TailBB or any of its successors contains a phi, we may have to add a
666674
// large number of additional phis with additional incoming values.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=early-tailduplication -tail-dup-pred-size=1 -tail-dup-succ-size=1 %s -o - | FileCheck %s
3+
# Check that only the computed goto is not be restrict by tail-dup-pred-size and tail-dup-succ-size.
4+
--- |
5+
declare i64 @f0()
6+
declare i64 @f1()
7+
declare i64 @f2()
8+
declare i64 @f3()
9+
declare i64 @f4()
10+
declare i64 @f5()
11+
@computed_goto.dispatch = external global [5 x ptr]
12+
define void @computed_goto() { ret void }
13+
define void @jump_table() { ret void }
14+
...
15+
---
16+
name: computed_goto
17+
tracksRegLiveness: true
18+
body: |
19+
; CHECK-LABEL: name: computed_goto
20+
; CHECK: bb.0:
21+
; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)
22+
; CHECK-NEXT: {{ $}}
23+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
24+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
25+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
26+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rax
27+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_nosp = COPY [[COPY]]
28+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64_nosp = COPY [[COPY1]]
29+
; CHECK-NEXT: JMP64m $noreg, 8, [[COPY1]], @computed_goto.dispatch, $noreg
30+
; CHECK-NEXT: {{ $}}
31+
; CHECK-NEXT: bb.1:
32+
; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)
33+
; CHECK-NEXT: {{ $}}
34+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
35+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
36+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
37+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr64 = COPY $rax
38+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64_nosp = COPY [[COPY3]]
39+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gr64_nosp = COPY [[COPY4]]
40+
; CHECK-NEXT: JMP64m $noreg, 8, [[COPY4]], @computed_goto.dispatch, $noreg
41+
; CHECK-NEXT: {{ $}}
42+
; CHECK-NEXT: bb.2:
43+
; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)
44+
; CHECK-NEXT: {{ $}}
45+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
46+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
47+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
48+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gr64 = COPY $rax
49+
; CHECK-NEXT: [[COPY7:%[0-9]+]]:gr64_nosp = COPY [[COPY6]]
50+
; CHECK-NEXT: [[COPY8:%[0-9]+]]:gr64_nosp = COPY [[COPY7]]
51+
; CHECK-NEXT: JMP64m $noreg, 8, [[COPY7]], @computed_goto.dispatch, $noreg
52+
; CHECK-NEXT: {{ $}}
53+
; CHECK-NEXT: bb.3:
54+
; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)
55+
; CHECK-NEXT: {{ $}}
56+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
57+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
58+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
59+
; CHECK-NEXT: [[COPY9:%[0-9]+]]:gr64 = COPY $rax
60+
; CHECK-NEXT: [[COPY10:%[0-9]+]]:gr64_nosp = COPY [[COPY9]]
61+
; CHECK-NEXT: [[COPY11:%[0-9]+]]:gr64_nosp = COPY [[COPY10]]
62+
; CHECK-NEXT: JMP64m $noreg, 8, [[COPY10]], @computed_goto.dispatch, $noreg
63+
; CHECK-NEXT: {{ $}}
64+
; CHECK-NEXT: bb.4:
65+
; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)
66+
; CHECK-NEXT: {{ $}}
67+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
68+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
69+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
70+
; CHECK-NEXT: [[COPY12:%[0-9]+]]:gr64 = COPY $rax
71+
; CHECK-NEXT: [[COPY13:%[0-9]+]]:gr64_nosp = COPY [[COPY12]]
72+
; CHECK-NEXT: [[COPY14:%[0-9]+]]:gr64_nosp = COPY [[COPY13]]
73+
; CHECK-NEXT: JMP64m $noreg, 8, [[COPY13]], @computed_goto.dispatch, $noreg
74+
bb.0:
75+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
76+
CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
77+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
78+
%6:gr64 = COPY $rax
79+
%0:gr64 = COPY %6
80+
JMP_1 %bb.5
81+
82+
bb.1:
83+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
84+
CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
85+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
86+
%10:gr64 = COPY $rax
87+
%1:gr64 = COPY %10
88+
JMP_1 %bb.5
89+
90+
bb.2:
91+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
92+
CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
93+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
94+
%9:gr64 = COPY $rax
95+
%2:gr64 = COPY %9
96+
JMP_1 %bb.5
97+
98+
bb.3:
99+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
100+
CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
101+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
102+
%8:gr64 = COPY $rax
103+
%3:gr64 = COPY %8
104+
JMP_1 %bb.5
105+
106+
bb.4:
107+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
108+
CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
109+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
110+
%7:gr64 = COPY $rax
111+
%4:gr64 = COPY %7
112+
113+
bb.5:
114+
successors: %bb.1, %bb.2, %bb.3, %bb.4
115+
116+
%5:gr64_nosp = PHI %0, %bb.0, %4, %bb.4, %3, %bb.3, %2, %bb.2, %1, %bb.1
117+
JMP64m $noreg, 8, %5, @computed_goto.dispatch, $noreg
118+
119+
...
120+
---
121+
name: jump_table
122+
tracksRegLiveness: true
123+
jumpTable:
124+
kind: block-address
125+
entries:
126+
- id: 0
127+
blocks: [ '%bb.2', '%bb.3', '%bb.4', '%bb.5', '%bb.6' ]
128+
body: |
129+
; CHECK-LABEL: name: jump_table
130+
; CHECK: bb.0:
131+
; CHECK-NEXT: successors: %bb.1(0x80000000)
132+
; CHECK-NEXT: {{ $}}
133+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
134+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
135+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
136+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rax
137+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY [[COPY]]
138+
; CHECK-NEXT: {{ $}}
139+
; CHECK-NEXT: bb.1:
140+
; CHECK-NEXT: successors: %bb.3(0x1999999a), %bb.4(0x1999999a), %bb.5(0x1999999a), %bb.6(0x1999999a), %bb.7(0x1999999a)
141+
; CHECK-NEXT: {{ $}}
142+
; CHECK-NEXT: [[PHI:%[0-9]+]]:gr64 = PHI [[COPY1]], %bb.0, %3, %bb.7, %4, %bb.6, %5, %bb.5, %6, %bb.4, %7, %bb.3
143+
; CHECK-NEXT: [[DEC64r:%[0-9]+]]:gr64_nosp = DEC64r [[PHI]], implicit-def dead $eflags
144+
; CHECK-NEXT: JMP64m $noreg, 8, [[DEC64r]], %jump-table.0, $noreg :: (load (s64) from jump-table)
145+
; CHECK-NEXT: {{ $}}
146+
; CHECK-NEXT: bb.3:
147+
; CHECK-NEXT: successors: %bb.1(0x80000000)
148+
; CHECK-NEXT: {{ $}}
149+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
150+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
151+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
152+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64 = COPY $rax
153+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr64 = COPY [[COPY2]]
154+
; CHECK-NEXT: JMP_1 %bb.1
155+
; CHECK-NEXT: {{ $}}
156+
; CHECK-NEXT: bb.4:
157+
; CHECK-NEXT: successors: %bb.1(0x80000000)
158+
; CHECK-NEXT: {{ $}}
159+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
160+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
161+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
162+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64 = COPY $rax
163+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gr64 = COPY [[COPY4]]
164+
; CHECK-NEXT: JMP_1 %bb.1
165+
; CHECK-NEXT: {{ $}}
166+
; CHECK-NEXT: bb.5:
167+
; CHECK-NEXT: successors: %bb.1(0x80000000)
168+
; CHECK-NEXT: {{ $}}
169+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
170+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
171+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
172+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gr64 = COPY $rax
173+
; CHECK-NEXT: [[COPY7:%[0-9]+]]:gr64 = COPY [[COPY6]]
174+
; CHECK-NEXT: JMP_1 %bb.1
175+
; CHECK-NEXT: {{ $}}
176+
; CHECK-NEXT: bb.6:
177+
; CHECK-NEXT: successors: %bb.1(0x80000000)
178+
; CHECK-NEXT: {{ $}}
179+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
180+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
181+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
182+
; CHECK-NEXT: [[COPY8:%[0-9]+]]:gr64 = COPY $rax
183+
; CHECK-NEXT: [[COPY9:%[0-9]+]]:gr64 = COPY [[COPY8]]
184+
; CHECK-NEXT: JMP_1 %bb.1
185+
; CHECK-NEXT: {{ $}}
186+
; CHECK-NEXT: bb.7:
187+
; CHECK-NEXT: successors: %bb.1(0x80000000)
188+
; CHECK-NEXT: {{ $}}
189+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
190+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f5, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
191+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
192+
; CHECK-NEXT: [[COPY10:%[0-9]+]]:gr64 = COPY $rax
193+
; CHECK-NEXT: [[COPY11:%[0-9]+]]:gr64 = COPY [[COPY10]]
194+
; CHECK-NEXT: JMP_1 %bb.1
195+
; CHECK-NEXT: {{ $}}
196+
; CHECK-NEXT: bb.8:
197+
bb.0:
198+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
199+
CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
200+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
201+
%7:gr64 = COPY $rax
202+
%0:gr64 = COPY %7
203+
204+
bb.1:
205+
%1:gr64 = PHI %0, %bb.0, %6, %bb.6, %5, %bb.5, %4, %bb.4, %3, %bb.3, %2, %bb.2
206+
%8:gr64_nosp = DEC64r %1, implicit-def dead $eflags
207+
208+
bb.8:
209+
successors: %bb.2(0x1999999a), %bb.3(0x1999999a), %bb.4(0x1999999a), %bb.5(0x1999999a), %bb.6(0x1999999a)
210+
211+
JMP64m $noreg, 8, %8, %jump-table.0, $noreg :: (load (s64) from jump-table)
212+
213+
bb.2:
214+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
215+
CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
216+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
217+
%13:gr64 = COPY $rax
218+
%2:gr64 = COPY %13
219+
JMP_1 %bb.1
220+
221+
bb.3:
222+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
223+
CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
224+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
225+
%12:gr64 = COPY $rax
226+
%3:gr64 = COPY %12
227+
JMP_1 %bb.1
228+
229+
bb.4:
230+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
231+
CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
232+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
233+
%11:gr64 = COPY $rax
234+
%4:gr64 = COPY %11
235+
JMP_1 %bb.1
236+
237+
bb.5:
238+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
239+
CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
240+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
241+
%10:gr64 = COPY $rax
242+
%5:gr64 = COPY %10
243+
JMP_1 %bb.1
244+
245+
bb.6:
246+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
247+
CALL64pcrel32 target-flags(x86-plt) @f5, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
248+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
249+
%9:gr64 = COPY $rax
250+
%6:gr64 = COPY %9
251+
JMP_1 %bb.1
252+
253+
bb.7:
254+
255+
...

0 commit comments

Comments
 (0)