xref: /llvm-project/llvm/test/CodeGen/X86/stackmap-nops.ll (revision 1d641daf260308815d014d1bf1b424a1ed1e7277)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=znver1 | FileCheck --check-prefix=CHECK-AMD %s
4
5; Check that we get a fast sequence of nops on each platform.
6
7define void @nop_test() {
8; CHECK-LABEL: nop_test:
9; CHECK:       ## %bb.0: ## %entry
10; CHECK-NEXT:    pushq %rbp
11; CHECK-NEXT:    .cfi_def_cfa_offset 16
12; CHECK-NEXT:    .cfi_offset %rbp, -16
13; CHECK-NEXT:    movq %rsp, %rbp
14; CHECK-NEXT:    .cfi_def_cfa_register %rbp
15; CHECK-NEXT:  Ltmp0:
16; CHECK-NEXT:  Ltmp1:
17; CHECK-NEXT:    nop
18; CHECK-NEXT:  Ltmp2:
19; CHECK-NEXT:    xchgw %ax, %ax
20; CHECK-NEXT:  Ltmp3:
21; CHECK-NEXT:    nopl (%rax)
22; CHECK-NEXT:  Ltmp4:
23; CHECK-NEXT:    nopl 8(%rax)
24; CHECK-NEXT:  Ltmp5:
25; CHECK-NEXT:    nopl 8(%rax,%rax)
26; CHECK-NEXT:  Ltmp6:
27; CHECK-NEXT:    nopw 8(%rax,%rax)
28; CHECK-NEXT:  Ltmp7:
29; CHECK-NEXT:    nopl 512(%rax)
30; CHECK-NEXT:  Ltmp8:
31; CHECK-NEXT:    nopl 512(%rax,%rax)
32; CHECK-NEXT:  Ltmp9:
33; CHECK-NEXT:    nopw 512(%rax,%rax)
34; CHECK-NEXT:  Ltmp10:
35; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
36; CHECK-NEXT:  Ltmp11:
37; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
38; CHECK-NEXT:    nop
39; CHECK-NEXT:  Ltmp12:
40; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
41; CHECK-NEXT:    xchgw %ax, %ax
42; CHECK-NEXT:  Ltmp13:
43; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
44; CHECK-NEXT:    nopl (%rax)
45; CHECK-NEXT:  Ltmp14:
46; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
47; CHECK-NEXT:    nopl 8(%rax)
48; CHECK-NEXT:  Ltmp15:
49; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
50; CHECK-NEXT:    nopl 8(%rax,%rax)
51; CHECK-NEXT:  Ltmp16:
52; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
53; CHECK-NEXT:    nopw 8(%rax,%rax)
54; CHECK-NEXT:  Ltmp17:
55; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
56; CHECK-NEXT:    nopl 512(%rax)
57; CHECK-NEXT:  Ltmp18:
58; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
59; CHECK-NEXT:    nopl 512(%rax,%rax)
60; CHECK-NEXT:  Ltmp19:
61; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
62; CHECK-NEXT:    nopw 512(%rax,%rax)
63; CHECK-NEXT:  Ltmp20:
64; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
65; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
66; CHECK-NEXT:  Ltmp21:
67; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
68; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
69; CHECK-NEXT:    nop
70; CHECK-NEXT:  Ltmp22:
71; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
72; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
73; CHECK-NEXT:    xchgw %ax, %ax
74; CHECK-NEXT:  Ltmp23:
75; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
76; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
77; CHECK-NEXT:    nopl (%rax)
78; CHECK-NEXT:  Ltmp24:
79; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
80; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
81; CHECK-NEXT:    nopl 8(%rax)
82; CHECK-NEXT:  Ltmp25:
83; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
84; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
85; CHECK-NEXT:    nopl 8(%rax,%rax)
86; CHECK-NEXT:  Ltmp26:
87; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
88; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
89; CHECK-NEXT:    nopw 8(%rax,%rax)
90; CHECK-NEXT:  Ltmp27:
91; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
92; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
93; CHECK-NEXT:    nopl 512(%rax)
94; CHECK-NEXT:  Ltmp28:
95; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
96; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
97; CHECK-NEXT:    nopl 512(%rax,%rax)
98; CHECK-NEXT:  Ltmp29:
99; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
100; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
101; CHECK-NEXT:    nopw 512(%rax,%rax)
102; CHECK-NEXT:  Ltmp30:
103; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
104; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
105; CHECK-NEXT:    nopw %cs:512(%rax,%rax)
106; CHECK-NEXT:  Ltmp31:
107; CHECK-NEXT:    popq %rbp
108; CHECK-NEXT:    retq
109;
110; CHECK-AMD-LABEL: nop_test:
111; CHECK-AMD:       ## %bb.0: ## %entry
112; CHECK-AMD-NEXT:    pushq %rbp
113; CHECK-AMD-NEXT:    .cfi_def_cfa_offset 16
114; CHECK-AMD-NEXT:    .cfi_offset %rbp, -16
115; CHECK-AMD-NEXT:    movq %rsp, %rbp
116; CHECK-AMD-NEXT:    .cfi_def_cfa_register %rbp
117; CHECK-AMD-NEXT:  Ltmp0:
118; CHECK-AMD-NEXT:  Ltmp1:
119; CHECK-AMD-NEXT:    nop
120; CHECK-AMD-NEXT:  Ltmp2:
121; CHECK-AMD-NEXT:    xchgw %ax, %ax
122; CHECK-AMD-NEXT:  Ltmp3:
123; CHECK-AMD-NEXT:    nopl (%rax)
124; CHECK-AMD-NEXT:  Ltmp4:
125; CHECK-AMD-NEXT:    nopl 8(%rax)
126; CHECK-AMD-NEXT:  Ltmp5:
127; CHECK-AMD-NEXT:    nopl 8(%rax,%rax)
128; CHECK-AMD-NEXT:  Ltmp6:
129; CHECK-AMD-NEXT:    nopw 8(%rax,%rax)
130; CHECK-AMD-NEXT:  Ltmp7:
131; CHECK-AMD-NEXT:    nopl 512(%rax)
132; CHECK-AMD-NEXT:  Ltmp8:
133; CHECK-AMD-NEXT:    nopl 512(%rax,%rax)
134; CHECK-AMD-NEXT:  Ltmp9:
135; CHECK-AMD-NEXT:    nopw 512(%rax,%rax)
136; CHECK-AMD-NEXT:  Ltmp10:
137; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
138; CHECK-AMD-NEXT:  Ltmp11:
139; CHECK-AMD-NEXT:    .byte 102
140; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
141; CHECK-AMD-NEXT:  Ltmp12:
142; CHECK-AMD-NEXT:    .byte 102
143; CHECK-AMD-NEXT:    .byte 102
144; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
145; CHECK-AMD-NEXT:  Ltmp13:
146; CHECK-AMD-NEXT:    .byte 102
147; CHECK-AMD-NEXT:    .byte 102
148; CHECK-AMD-NEXT:    .byte 102
149; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
150; CHECK-AMD-NEXT:  Ltmp14:
151; CHECK-AMD-NEXT:    .byte 102
152; CHECK-AMD-NEXT:    .byte 102
153; CHECK-AMD-NEXT:    .byte 102
154; CHECK-AMD-NEXT:    .byte 102
155; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
156; CHECK-AMD-NEXT:  Ltmp15:
157; CHECK-AMD-NEXT:    .byte 102
158; CHECK-AMD-NEXT:    .byte 102
159; CHECK-AMD-NEXT:    .byte 102
160; CHECK-AMD-NEXT:    .byte 102
161; CHECK-AMD-NEXT:    .byte 102
162; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
163; CHECK-AMD-NEXT:  Ltmp16:
164; CHECK-AMD-NEXT:    .byte 102
165; CHECK-AMD-NEXT:    .byte 102
166; CHECK-AMD-NEXT:    .byte 102
167; CHECK-AMD-NEXT:    .byte 102
168; CHECK-AMD-NEXT:    .byte 102
169; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
170; CHECK-AMD-NEXT:    nop
171; CHECK-AMD-NEXT:  Ltmp17:
172; CHECK-AMD-NEXT:    .byte 102
173; CHECK-AMD-NEXT:    .byte 102
174; CHECK-AMD-NEXT:    .byte 102
175; CHECK-AMD-NEXT:    .byte 102
176; CHECK-AMD-NEXT:    .byte 102
177; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
178; CHECK-AMD-NEXT:    xchgw %ax, %ax
179; CHECK-AMD-NEXT:  Ltmp18:
180; CHECK-AMD-NEXT:    .byte 102
181; CHECK-AMD-NEXT:    .byte 102
182; CHECK-AMD-NEXT:    .byte 102
183; CHECK-AMD-NEXT:    .byte 102
184; CHECK-AMD-NEXT:    .byte 102
185; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
186; CHECK-AMD-NEXT:    nopl (%rax)
187; CHECK-AMD-NEXT:  Ltmp19:
188; CHECK-AMD-NEXT:    .byte 102
189; CHECK-AMD-NEXT:    .byte 102
190; CHECK-AMD-NEXT:    .byte 102
191; CHECK-AMD-NEXT:    .byte 102
192; CHECK-AMD-NEXT:    .byte 102
193; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
194; CHECK-AMD-NEXT:    nopl 8(%rax)
195; CHECK-AMD-NEXT:  Ltmp20:
196; CHECK-AMD-NEXT:    .byte 102
197; CHECK-AMD-NEXT:    .byte 102
198; CHECK-AMD-NEXT:    .byte 102
199; CHECK-AMD-NEXT:    .byte 102
200; CHECK-AMD-NEXT:    .byte 102
201; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
202; CHECK-AMD-NEXT:    nopl 8(%rax,%rax)
203; CHECK-AMD-NEXT:  Ltmp21:
204; CHECK-AMD-NEXT:    .byte 102
205; CHECK-AMD-NEXT:    .byte 102
206; CHECK-AMD-NEXT:    .byte 102
207; CHECK-AMD-NEXT:    .byte 102
208; CHECK-AMD-NEXT:    .byte 102
209; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
210; CHECK-AMD-NEXT:    nopw 8(%rax,%rax)
211; CHECK-AMD-NEXT:  Ltmp22:
212; CHECK-AMD-NEXT:    .byte 102
213; CHECK-AMD-NEXT:    .byte 102
214; CHECK-AMD-NEXT:    .byte 102
215; CHECK-AMD-NEXT:    .byte 102
216; CHECK-AMD-NEXT:    .byte 102
217; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
218; CHECK-AMD-NEXT:    nopl 512(%rax)
219; CHECK-AMD-NEXT:  Ltmp23:
220; CHECK-AMD-NEXT:    .byte 102
221; CHECK-AMD-NEXT:    .byte 102
222; CHECK-AMD-NEXT:    .byte 102
223; CHECK-AMD-NEXT:    .byte 102
224; CHECK-AMD-NEXT:    .byte 102
225; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
226; CHECK-AMD-NEXT:    nopl 512(%rax,%rax)
227; CHECK-AMD-NEXT:  Ltmp24:
228; CHECK-AMD-NEXT:    .byte 102
229; CHECK-AMD-NEXT:    .byte 102
230; CHECK-AMD-NEXT:    .byte 102
231; CHECK-AMD-NEXT:    .byte 102
232; CHECK-AMD-NEXT:    .byte 102
233; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
234; CHECK-AMD-NEXT:    nopw 512(%rax,%rax)
235; CHECK-AMD-NEXT:  Ltmp25:
236; CHECK-AMD-NEXT:    .byte 102
237; CHECK-AMD-NEXT:    .byte 102
238; CHECK-AMD-NEXT:    .byte 102
239; CHECK-AMD-NEXT:    .byte 102
240; CHECK-AMD-NEXT:    .byte 102
241; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
242; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
243; CHECK-AMD-NEXT:  Ltmp26:
244; CHECK-AMD-NEXT:    .byte 102
245; CHECK-AMD-NEXT:    .byte 102
246; CHECK-AMD-NEXT:    .byte 102
247; CHECK-AMD-NEXT:    .byte 102
248; CHECK-AMD-NEXT:    .byte 102
249; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
250; CHECK-AMD-NEXT:    .byte 102
251; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
252; CHECK-AMD-NEXT:  Ltmp27:
253; CHECK-AMD-NEXT:    .byte 102
254; CHECK-AMD-NEXT:    .byte 102
255; CHECK-AMD-NEXT:    .byte 102
256; CHECK-AMD-NEXT:    .byte 102
257; CHECK-AMD-NEXT:    .byte 102
258; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
259; CHECK-AMD-NEXT:    .byte 102
260; CHECK-AMD-NEXT:    .byte 102
261; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
262; CHECK-AMD-NEXT:  Ltmp28:
263; CHECK-AMD-NEXT:    .byte 102
264; CHECK-AMD-NEXT:    .byte 102
265; CHECK-AMD-NEXT:    .byte 102
266; CHECK-AMD-NEXT:    .byte 102
267; CHECK-AMD-NEXT:    .byte 102
268; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
269; CHECK-AMD-NEXT:    .byte 102
270; CHECK-AMD-NEXT:    .byte 102
271; CHECK-AMD-NEXT:    .byte 102
272; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
273; CHECK-AMD-NEXT:  Ltmp29:
274; CHECK-AMD-NEXT:    .byte 102
275; CHECK-AMD-NEXT:    .byte 102
276; CHECK-AMD-NEXT:    .byte 102
277; CHECK-AMD-NEXT:    .byte 102
278; CHECK-AMD-NEXT:    .byte 102
279; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
280; CHECK-AMD-NEXT:    .byte 102
281; CHECK-AMD-NEXT:    .byte 102
282; CHECK-AMD-NEXT:    .byte 102
283; CHECK-AMD-NEXT:    .byte 102
284; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
285; CHECK-AMD-NEXT:  Ltmp30:
286; CHECK-AMD-NEXT:    .byte 102
287; CHECK-AMD-NEXT:    .byte 102
288; CHECK-AMD-NEXT:    .byte 102
289; CHECK-AMD-NEXT:    .byte 102
290; CHECK-AMD-NEXT:    .byte 102
291; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
292; CHECK-AMD-NEXT:    .byte 102
293; CHECK-AMD-NEXT:    .byte 102
294; CHECK-AMD-NEXT:    .byte 102
295; CHECK-AMD-NEXT:    .byte 102
296; CHECK-AMD-NEXT:    .byte 102
297; CHECK-AMD-NEXT:    nopw %cs:512(%rax,%rax)
298; CHECK-AMD-NEXT:  Ltmp31:
299; CHECK-AMD-NEXT:    popq %rbp
300; CHECK-AMD-NEXT:    retq
301entry:
302  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  0, i32  0)
303  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  1, i32  1)
304  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  2, i32  2)
305  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  3, i32  3)
306  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  4, i32  4)
307  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  5, i32  5)
308  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  6, i32  6)
309  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  7, i32  7)
310  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  8, i32  8)
311  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64  9, i32  9)
312  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 10, i32 10)
313  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 11, i32 11)
314  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 12, i32 12)
315  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 13, i32 13)
316  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 14, i32 14)
317  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 15, i32 15)
318  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 16, i32 16)
319  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 17, i32 17)
320  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 18, i32 18)
321  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 19, i32 19)
322  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 20, i32 20)
323  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 21, i32 21)
324  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 22, i32 22)
325  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 23, i32 23)
326  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 24, i32 24)
327  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 25, i32 25)
328  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 26, i32 26)
329  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 27, i32 27)
330  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 28, i32 28)
331  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 29, i32 29)
332  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 30, i32 30)
333; Add an extra stackmap with a zero-length shadow to thwart the shadow
334; optimization. This will force all 15 bytes of the previous shadow to be
335; padded with nops.
336  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 31, i32 0)
337  ret void
338}
339
340declare void @llvm.experimental.stackmap(i64, i32, ...)
341