blob: 31554e4c1e0baf573a778a61341bae61c5743434 [file] [log] [blame]
Chandler Carruth4b611a82017-08-25 22:50:52 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Chandler Carruth52a31bf2017-09-07 23:54:24 +00002; RUN: llc < %s -verify-machineinstrs -show-mc-encoding | FileCheck %s
Chandler Carruth4b611a82017-08-25 22:50:52 +00003
4target triple = "x86_64-unknown-unknown"
5
6@g64 = external global i64, align 8
7@g32 = external global i32, align 4
8@g16 = external global i16, align 2
9@g8 = external global i8, align 1
10
11declare void @a()
12declare void @b()
13
Chandler Carruth52a31bf2017-09-07 23:54:24 +000014define void @add64_imm32_br() nounwind {
15; CHECK-LABEL: add64_imm32_br:
Chandler Carruth4b611a82017-08-25 22:50:52 +000016; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +000017; CHECK-NEXT: addq $16777214, {{.*}}(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0xfe,0xff,0xff,0x00]
18; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
19; CHECK-NEXT: # imm = 0xFFFFFE
20; CHECK-NEXT: js .LBB0_1 # encoding: [0x78,A]
21; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +000022; CHECK-NEXT: # BB#2: # %b
23; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +000024; CHECK-NEXT: # encoding: [0xeb,A]
25; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +000026; CHECK-NEXT: .LBB0_1: # %a
27; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +000028; CHECK-NEXT: # encoding: [0xeb,A]
29; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +000030entry:
31 %load1 = load i64, i64* @g64
Chandler Carruth52a31bf2017-09-07 23:54:24 +000032 ; Add 0x00FFFFFE, a positive immediate requiring 24-bits.
33 %add = add i64 %load1, 16777214
34 store i64 %add, i64* @g64
35 %cond = icmp slt i64 %add, 0
36 br i1 %cond, label %a, label %b
37
38a:
39 tail call void @a()
40 ret void
41
42b:
43 tail call void @b()
44 ret void
45}
46
47define void @add64_sext_imm32_br() nounwind {
48; CHECK-LABEL: add64_sext_imm32_br:
49; CHECK: # BB#0: # %entry
50; CHECK-NEXT: addq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
51; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
52; CHECK-NEXT: # imm = 0x80000000
53; CHECK-NEXT: js .LBB1_1 # encoding: [0x78,A]
54; CHECK-NEXT: # fixup A - offset: 1, value: .LBB1_1-1, kind: FK_PCRel_1
55; CHECK-NEXT: # BB#2: # %b
56; CHECK-NEXT: jmp b # TAILCALL
57; CHECK-NEXT: # encoding: [0xeb,A]
58; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
59; CHECK-NEXT: .LBB1_1: # %a
60; CHECK-NEXT: jmp a # TAILCALL
61; CHECK-NEXT: # encoding: [0xeb,A]
62; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
63entry:
64 %load1 = load i64, i64* @g64
65 ; Add -0x80000000, which requires sign-extended 32 bits.
66 %add = add i64 %load1, -2147483648
67 store i64 %add, i64* @g64
68 %cond = icmp slt i64 %add, 0
69 br i1 %cond, label %a, label %b
70
71a:
72 tail call void @a()
73 ret void
74
75b:
76 tail call void @b()
77 ret void
78}
79
80define void @add64_imm32_via_sub_br() nounwind {
81; CHECK-LABEL: add64_imm32_via_sub_br:
82; CHECK: # BB#0: # %entry
83; CHECK-NEXT: subq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80]
84; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
85; CHECK-NEXT: # imm = 0x80000000
86; CHECK-NEXT: js .LBB2_1 # encoding: [0x78,A]
87; CHECK-NEXT: # fixup A - offset: 1, value: .LBB2_1-1, kind: FK_PCRel_1
88; CHECK-NEXT: # BB#2: # %b
89; CHECK-NEXT: jmp b # TAILCALL
90; CHECK-NEXT: # encoding: [0xeb,A]
91; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
92; CHECK-NEXT: .LBB2_1: # %a
93; CHECK-NEXT: jmp a # TAILCALL
94; CHECK-NEXT: # encoding: [0xeb,A]
95; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
96entry:
97 %load1 = load i64, i64* @g64
98 ; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate. This
99 ; get's folded because we can instead subtract -0x80000000.
100 %add = add i64 %load1, 2147483648
101 store i64 %add, i64* @g64
102 %cond = icmp slt i64 %add, 0
103 br i1 %cond, label %a, label %b
104
105a:
106 tail call void @a()
107 ret void
108
109b:
110 tail call void @b()
111 ret void
112}
113
114define void @add64_no_imm32_via_sub_due_to_cf_br() nounwind {
115; CHECK-LABEL: add64_no_imm32_via_sub_due_to_cf_br:
116; CHECK: # BB#0: # %entry
117; CHECK-NEXT: movl $2147483648, %eax # encoding: [0xb8,0x00,0x00,0x00,0x80]
118; CHECK-NEXT: # imm = 0x80000000
119; CHECK-NEXT: addq %rax, {{.*}}(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
120; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
121; CHECK-NEXT: jae .LBB3_2 # encoding: [0x73,A]
122; CHECK-NEXT: # fixup A - offset: 1, value: .LBB3_2-1, kind: FK_PCRel_1
123; CHECK-NEXT: # BB#1: # %a
124; CHECK-NEXT: jmp a # TAILCALL
125; CHECK-NEXT: # encoding: [0xeb,A]
126; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
127; CHECK-NEXT: .LBB3_2: # %b
128; CHECK-NEXT: jmp b # TAILCALL
129; CHECK-NEXT: # encoding: [0xeb,A]
130; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
131entry:
132 %load1 = load i64, i64* @g64
133 ; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate, but
134 ; could in theory be folded into an immediate operand of a sub. However, we
135 ; use the CF flag here and so shouldn't make that transformation.
136 %add = add i64 %load1, 2147483648
137 store i64 %add, i64* @g64
138 %cond = icmp ult i64 %add, 2147483648
139 br i1 %cond, label %a, label %b
140
141a:
142 tail call void @a()
143 ret void
144
145b:
146 tail call void @b()
147 ret void
148}
149
150define void @add64_too_large_imm32_br() nounwind {
151; CHECK-LABEL: add64_too_large_imm32_br:
152; CHECK: # BB#0: # %entry
153; CHECK-NEXT: movl $2147483649, %eax # encoding: [0xb8,0x01,0x00,0x00,0x80]
154; CHECK-NEXT: # imm = 0x80000001
155; CHECK-NEXT: addq %rax, {{.*}}(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
156; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
157; CHECK-NEXT: js .LBB4_1 # encoding: [0x78,A]
158; CHECK-NEXT: # fixup A - offset: 1, value: .LBB4_1-1, kind: FK_PCRel_1
159; CHECK-NEXT: # BB#2: # %b
160; CHECK-NEXT: jmp b # TAILCALL
161; CHECK-NEXT: # encoding: [0xeb,A]
162; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
163; CHECK-NEXT: .LBB4_1: # %a
164; CHECK-NEXT: jmp a # TAILCALL
165; CHECK-NEXT: # encoding: [0xeb,A]
166; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
167entry:
168 %load1 = load i64, i64* @g64
169 ; Add 0x80000001, which cannot fit in a sign extended 32-bit immediate. This
170 ; should not get folded into an immediate.
171 %add = add i64 %load1, 2147483649
172 store i64 %add, i64* @g64
173 %cond = icmp slt i64 %add, 0
174 br i1 %cond, label %a, label %b
175
176a:
177 tail call void @a()
178 ret void
179
180b:
181 tail call void @b()
182 ret void
183}
184
185define void @add64_imm8_via_sub_br() nounwind {
186; CHECK-LABEL: add64_imm8_via_sub_br:
187; CHECK: # BB#0: # %entry
188; CHECK-NEXT: subq $-128, {{.*}}(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80]
189; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
190; CHECK-NEXT: js .LBB5_1 # encoding: [0x78,A]
191; CHECK-NEXT: # fixup A - offset: 1, value: .LBB5_1-1, kind: FK_PCRel_1
192; CHECK-NEXT: # BB#2: # %b
193; CHECK-NEXT: jmp b # TAILCALL
194; CHECK-NEXT: # encoding: [0xeb,A]
195; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
196; CHECK-NEXT: .LBB5_1: # %a
197; CHECK-NEXT: jmp a # TAILCALL
198; CHECK-NEXT: # encoding: [0xeb,A]
199; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
200entry:
201 %load1 = load i64, i64* @g64
202 ; Add 0x80 which can't quite fit into an imm8 because it would be sign
203 ; extended, but which can fit if we convert to a sub and negate the value.
204 %add = add i64 %load1, 128
205 store i64 %add, i64* @g64
206 %cond = icmp slt i64 %add, 0
207 br i1 %cond, label %a, label %b
208
209a:
210 tail call void @a()
211 ret void
212
213b:
214 tail call void @b()
215 ret void
216}
217
218define void @add64_imm8_br() nounwind {
219; CHECK-LABEL: add64_imm8_br:
220; CHECK: # BB#0: # %entry
221; CHECK-NEXT: addq $42, {{.*}}(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0x2a]
222; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
223; CHECK-NEXT: js .LBB6_1 # encoding: [0x78,A]
224; CHECK-NEXT: # fixup A - offset: 1, value: .LBB6_1-1, kind: FK_PCRel_1
225; CHECK-NEXT: # BB#2: # %b
226; CHECK-NEXT: jmp b # TAILCALL
227; CHECK-NEXT: # encoding: [0xeb,A]
228; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
229; CHECK-NEXT: .LBB6_1: # %a
230; CHECK-NEXT: jmp a # TAILCALL
231; CHECK-NEXT: # encoding: [0xeb,A]
232; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
233entry:
234 %load1 = load i64, i64* @g64
235 %add = add i64 %load1, 42
236 store i64 %add, i64* @g64
237 %cond = icmp slt i64 %add, 0
238 br i1 %cond, label %a, label %b
239
240a:
241 tail call void @a()
242 ret void
243
244b:
245 tail call void @b()
246 ret void
247}
248
249define void @add64_imm8_neg_br() nounwind {
250; CHECK-LABEL: add64_imm8_neg_br:
251; CHECK: # BB#0: # %entry
252; CHECK-NEXT: addq $-42, {{.*}}(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0xd6]
253; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
254; CHECK-NEXT: js .LBB7_1 # encoding: [0x78,A]
255; CHECK-NEXT: # fixup A - offset: 1, value: .LBB7_1-1, kind: FK_PCRel_1
256; CHECK-NEXT: # BB#2: # %b
257; CHECK-NEXT: jmp b # TAILCALL
258; CHECK-NEXT: # encoding: [0xeb,A]
259; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
260; CHECK-NEXT: .LBB7_1: # %a
261; CHECK-NEXT: jmp a # TAILCALL
262; CHECK-NEXT: # encoding: [0xeb,A]
263; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
264entry:
265 %load1 = load i64, i64* @g64
266 %add = add i64 %load1, -42
Chandler Carruth4b611a82017-08-25 22:50:52 +0000267 store i64 %add, i64* @g64
268 %cond = icmp slt i64 %add, 0
269 br i1 %cond, label %a, label %b
270
271a:
272 tail call void @a()
273 ret void
274
275b:
276 tail call void @b()
277 ret void
278}
279
280define void @add32_imm_br() nounwind {
281; CHECK-LABEL: add32_imm_br:
282; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000283; CHECK-NEXT: addl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
284; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
285; CHECK-NEXT: # imm = 0x80000000
286; CHECK-NEXT: js .LBB8_1 # encoding: [0x78,A]
287; CHECK-NEXT: # fixup A - offset: 1, value: .LBB8_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000288; CHECK-NEXT: # BB#2: # %b
289; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000290; CHECK-NEXT: # encoding: [0xeb,A]
291; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
292; CHECK-NEXT: .LBB8_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000293; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000294; CHECK-NEXT: # encoding: [0xeb,A]
295; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000296entry:
297 %load1 = load i32, i32* @g32
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000298 ; Add 0x80000000, a positive number requiring 32 bits of immediate.
299 %add = add i32 %load1, 2147483648
300 store i32 %add, i32* @g32
301 %cond = icmp slt i32 %add, 0
302 br i1 %cond, label %a, label %b
303
304a:
305 tail call void @a()
306 ret void
307
308b:
309 tail call void @b()
310 ret void
311}
312
313define void @add32_imm8_br() nounwind {
314; CHECK-LABEL: add32_imm8_br:
315; CHECK: # BB#0: # %entry
316; CHECK-NEXT: addl $42, {{.*}}(%rip) # encoding: [0x83,0x05,A,A,A,A,0x2a]
317; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
318; CHECK-NEXT: js .LBB9_1 # encoding: [0x78,A]
319; CHECK-NEXT: # fixup A - offset: 1, value: .LBB9_1-1, kind: FK_PCRel_1
320; CHECK-NEXT: # BB#2: # %b
321; CHECK-NEXT: jmp b # TAILCALL
322; CHECK-NEXT: # encoding: [0xeb,A]
323; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
324; CHECK-NEXT: .LBB9_1: # %a
325; CHECK-NEXT: jmp a # TAILCALL
326; CHECK-NEXT: # encoding: [0xeb,A]
327; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
328entry:
329 %load1 = load i32, i32* @g32
330 %add = add i32 %load1, 42
331 store i32 %add, i32* @g32
332 %cond = icmp slt i32 %add, 0
333 br i1 %cond, label %a, label %b
334
335a:
336 tail call void @a()
337 ret void
338
339b:
340 tail call void @b()
341 ret void
342}
343
344define void @add32_imm8_neg_br() nounwind {
345; CHECK-LABEL: add32_imm8_neg_br:
346; CHECK: # BB#0: # %entry
347; CHECK-NEXT: addl $-42, {{.*}}(%rip) # encoding: [0x83,0x05,A,A,A,A,0xd6]
348; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
349; CHECK-NEXT: js .LBB10_1 # encoding: [0x78,A]
350; CHECK-NEXT: # fixup A - offset: 1, value: .LBB10_1-1, kind: FK_PCRel_1
351; CHECK-NEXT: # BB#2: # %b
352; CHECK-NEXT: jmp b # TAILCALL
353; CHECK-NEXT: # encoding: [0xeb,A]
354; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
355; CHECK-NEXT: .LBB10_1: # %a
356; CHECK-NEXT: jmp a # TAILCALL
357; CHECK-NEXT: # encoding: [0xeb,A]
358; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
359entry:
360 %load1 = load i32, i32* @g32
361 %add = add i32 %load1, -42
Chandler Carruth4b611a82017-08-25 22:50:52 +0000362 store i32 %add, i32* @g32
363 %cond = icmp slt i32 %add, 0
364 br i1 %cond, label %a, label %b
365
366a:
367 tail call void @a()
368 ret void
369
370b:
371 tail call void @b()
372 ret void
373}
374
375define void @add16_imm_br() nounwind {
376; CHECK-LABEL: add16_imm_br:
377; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000378; CHECK-NEXT: addw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80]
379; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
380; CHECK-NEXT: # imm = 0x8000
381; CHECK-NEXT: js .LBB11_1 # encoding: [0x78,A]
382; CHECK-NEXT: # fixup A - offset: 1, value: .LBB11_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000383; CHECK-NEXT: # BB#2: # %b
384; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000385; CHECK-NEXT: # encoding: [0xeb,A]
386; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
387; CHECK-NEXT: .LBB11_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000388; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000389; CHECK-NEXT: # encoding: [0xeb,A]
390; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000391entry:
392 %load1 = load i16, i16* @g16
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000393 ; Add 0x8000, a positive number requiring 16 bits of immediate.
394 %add = add i16 %load1, 32768
395 store i16 %add, i16* @g16
396 %cond = icmp slt i16 %add, 0
397 br i1 %cond, label %a, label %b
398
399a:
400 tail call void @a()
401 ret void
402
403b:
404 tail call void @b()
405 ret void
406}
407
408define void @add16_imm8_br() nounwind {
409; CHECK-LABEL: add16_imm8_br:
410; CHECK: # BB#0: # %entry
411; CHECK-NEXT: addw $42, {{.*}}(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0x2a]
412; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
413; CHECK-NEXT: js .LBB12_1 # encoding: [0x78,A]
414; CHECK-NEXT: # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1
415; CHECK-NEXT: # BB#2: # %b
416; CHECK-NEXT: jmp b # TAILCALL
417; CHECK-NEXT: # encoding: [0xeb,A]
418; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
419; CHECK-NEXT: .LBB12_1: # %a
420; CHECK-NEXT: jmp a # TAILCALL
421; CHECK-NEXT: # encoding: [0xeb,A]
422; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
423entry:
424 %load1 = load i16, i16* @g16
425 %add = add i16 %load1, 42
426 store i16 %add, i16* @g16
427 %cond = icmp slt i16 %add, 0
428 br i1 %cond, label %a, label %b
429
430a:
431 tail call void @a()
432 ret void
433
434b:
435 tail call void @b()
436 ret void
437}
438
439define void @add16_imm8_neg_br() nounwind {
440; CHECK-LABEL: add16_imm8_neg_br:
441; CHECK: # BB#0: # %entry
442; CHECK-NEXT: addw $-42, {{.*}}(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0xd6]
443; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
444; CHECK-NEXT: js .LBB13_1 # encoding: [0x78,A]
445; CHECK-NEXT: # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1
446; CHECK-NEXT: # BB#2: # %b
447; CHECK-NEXT: jmp b # TAILCALL
448; CHECK-NEXT: # encoding: [0xeb,A]
449; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
450; CHECK-NEXT: .LBB13_1: # %a
451; CHECK-NEXT: jmp a # TAILCALL
452; CHECK-NEXT: # encoding: [0xeb,A]
453; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
454entry:
455 %load1 = load i16, i16* @g16
456 %add = add i16 %load1, -42
Chandler Carruth4b611a82017-08-25 22:50:52 +0000457 store i16 %add, i16* @g16
458 %cond = icmp slt i16 %add, 0
459 br i1 %cond, label %a, label %b
460
461a:
462 tail call void @a()
463 ret void
464
465b:
466 tail call void @b()
467 ret void
468}
469
470define void @add8_imm_br() nounwind {
471; CHECK-LABEL: add8_imm_br:
472; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000473; CHECK-NEXT: addb $-2, {{.*}}(%rip) # encoding: [0x80,0x05,A,A,A,A,0xfe]
474; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
475; CHECK-NEXT: js .LBB14_1 # encoding: [0x78,A]
476; CHECK-NEXT: # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000477; CHECK-NEXT: # BB#2: # %b
478; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000479; CHECK-NEXT: # encoding: [0xeb,A]
480; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
481; CHECK-NEXT: .LBB14_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000482; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000483; CHECK-NEXT: # encoding: [0xeb,A]
484; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000485entry:
486 %load1 = load i8, i8* @g8
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000487 %add = add i8 %load1, -2
Chandler Carruth4b611a82017-08-25 22:50:52 +0000488 store i8 %add, i8* @g8
489 %cond = icmp slt i8 %add, 0
490 br i1 %cond, label %a, label %b
491
492a:
493 tail call void @a()
494 ret void
495
496b:
497 tail call void @b()
498 ret void
499}
500
501define void @add64_reg_br(i64 %arg) nounwind {
502; CHECK-LABEL: add64_reg_br:
503; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000504; CHECK-NEXT: addq %rdi, {{.*}}(%rip) # encoding: [0x48,0x01,0x3d,A,A,A,A]
505; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
506; CHECK-NEXT: js .LBB15_1 # encoding: [0x78,A]
507; CHECK-NEXT: # fixup A - offset: 1, value: .LBB15_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000508; CHECK-NEXT: # BB#2: # %b
509; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000510; CHECK-NEXT: # encoding: [0xeb,A]
511; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
512; CHECK-NEXT: .LBB15_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000513; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000514; CHECK-NEXT: # encoding: [0xeb,A]
515; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000516entry:
517 %load1 = load i64, i64* @g64
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000518 %add = add i64 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000519 store i64 %add, i64* @g64
520 %cond = icmp slt i64 %add, 0
521 br i1 %cond, label %a, label %b
522
523a:
524 tail call void @a()
525 ret void
526
527b:
528 tail call void @b()
529 ret void
530}
531
532define void @add32_reg_br(i32 %arg) nounwind {
533; CHECK-LABEL: add32_reg_br:
534; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000535; CHECK-NEXT: addl %edi, {{.*}}(%rip) # encoding: [0x01,0x3d,A,A,A,A]
536; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
537; CHECK-NEXT: js .LBB16_1 # encoding: [0x78,A]
538; CHECK-NEXT: # fixup A - offset: 1, value: .LBB16_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000539; CHECK-NEXT: # BB#2: # %b
540; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000541; CHECK-NEXT: # encoding: [0xeb,A]
542; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
543; CHECK-NEXT: .LBB16_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000544; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000545; CHECK-NEXT: # encoding: [0xeb,A]
546; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000547entry:
548 %load1 = load i32, i32* @g32
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000549 %add = add i32 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000550 store i32 %add, i32* @g32
551 %cond = icmp slt i32 %add, 0
552 br i1 %cond, label %a, label %b
553
554a:
555 tail call void @a()
556 ret void
557
558b:
559 tail call void @b()
560 ret void
561}
562
563define void @add16_reg_br(i16 %arg) nounwind {
564; CHECK-LABEL: add16_reg_br:
565; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000566; CHECK-NEXT: addw %di, {{.*}}(%rip) # encoding: [0x66,0x01,0x3d,A,A,A,A]
567; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
568; CHECK-NEXT: js .LBB17_1 # encoding: [0x78,A]
569; CHECK-NEXT: # fixup A - offset: 1, value: .LBB17_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000570; CHECK-NEXT: # BB#2: # %b
571; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000572; CHECK-NEXT: # encoding: [0xeb,A]
573; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
574; CHECK-NEXT: .LBB17_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000575; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000576; CHECK-NEXT: # encoding: [0xeb,A]
577; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000578entry:
579 %load1 = load i16, i16* @g16
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000580 %add = add i16 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000581 store i16 %add, i16* @g16
582 %cond = icmp slt i16 %add, 0
583 br i1 %cond, label %a, label %b
584
585a:
586 tail call void @a()
587 ret void
588
589b:
590 tail call void @b()
591 ret void
592}
593
594define void @add8_reg_br(i8 %arg) nounwind {
595; CHECK-LABEL: add8_reg_br:
596; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000597; CHECK-NEXT: addb %dil, {{.*}}(%rip) # encoding: [0x40,0x00,0x3d,A,A,A,A]
598; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
599; CHECK-NEXT: js .LBB18_1 # encoding: [0x78,A]
600; CHECK-NEXT: # fixup A - offset: 1, value: .LBB18_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000601; CHECK-NEXT: # BB#2: # %b
602; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000603; CHECK-NEXT: # encoding: [0xeb,A]
604; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
605; CHECK-NEXT: .LBB18_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000606; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000607; CHECK-NEXT: # encoding: [0xeb,A]
608; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000609entry:
610 %load1 = load i8, i8* @g8
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000611 %add = add i8 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000612 store i8 %add, i8* @g8
613 %cond = icmp slt i8 %add, 0
614 br i1 %cond, label %a, label %b
615
616a:
617 tail call void @a()
618 ret void
619
620b:
621 tail call void @b()
622 ret void
623}
624
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000625define void @sub64_imm32_br() nounwind {
626; CHECK-LABEL: sub64_imm32_br:
Chandler Carruth4b611a82017-08-25 22:50:52 +0000627; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000628; CHECK-NEXT: subq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80]
629; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
630; CHECK-NEXT: # imm = 0x80000000
631; CHECK-NEXT: js .LBB19_1 # encoding: [0x78,A]
632; CHECK-NEXT: # fixup A - offset: 1, value: .LBB19_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000633; CHECK-NEXT: # BB#2: # %b
634; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000635; CHECK-NEXT: # encoding: [0xeb,A]
636; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
637; CHECK-NEXT: .LBB19_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000638; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000639; CHECK-NEXT: # encoding: [0xeb,A]
640; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000641entry:
642 %load1 = load i64, i64* @g64
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000643 ; Subtract -0x80000000, which can't be negated into a sign-extended 32-bit
644 ; immediate, so that we have to select sub here.
645 %sub = sub i64 %load1, -2147483648
646 store i64 %sub, i64* @g64
647 %cond = icmp slt i64 %sub, 0
648 br i1 %cond, label %a, label %b
649
650a:
651 tail call void @a()
652 ret void
653
654b:
655 tail call void @b()
656 ret void
657}
658
659define void @sub64_too_large_imm32_br() nounwind {
660; CHECK-LABEL: sub64_too_large_imm32_br:
661; CHECK: # BB#0: # %entry
662; CHECK-NEXT: movabsq $-4294967295, %rax # encoding: [0x48,0xb8,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff]
663; CHECK-NEXT: # imm = 0xFFFFFFFF00000001
664; CHECK-NEXT: addq %rax, {{.*}}(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
665; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
666; CHECK-NEXT: js .LBB20_1 # encoding: [0x78,A]
667; CHECK-NEXT: # fixup A - offset: 1, value: .LBB20_1-1, kind: FK_PCRel_1
668; CHECK-NEXT: # BB#2: # %b
669; CHECK-NEXT: jmp b # TAILCALL
670; CHECK-NEXT: # encoding: [0xeb,A]
671; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
672; CHECK-NEXT: .LBB20_1: # %a
673; CHECK-NEXT: jmp a # TAILCALL
674; CHECK-NEXT: # encoding: [0xeb,A]
675; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
676entry:
677 %load1 = load i64, i64* @g64
678 ; Subtract 0xFFFFFFFF, which cannot fit in a sign extended 32-bit immediate,
679 ; even if negated and sign extended as an add.
680 %sub = sub i64 %load1, 4294967295
681 store i64 %sub, i64* @g64
682 %cond = icmp slt i64 %sub, 0
683 br i1 %cond, label %a, label %b
684
685a:
686 tail call void @a()
687 ret void
688
689b:
690 tail call void @b()
691 ret void
692}
693
694define void @sub64_imm8_br() nounwind {
695; CHECK-LABEL: sub64_imm8_br:
696; CHECK: # BB#0: # %entry
697; CHECK-NEXT: subq $-128, {{.*}}(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80]
698; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
699; CHECK-NEXT: js .LBB21_1 # encoding: [0x78,A]
700; CHECK-NEXT: # fixup A - offset: 1, value: .LBB21_1-1, kind: FK_PCRel_1
701; CHECK-NEXT: # BB#2: # %b
702; CHECK-NEXT: jmp b # TAILCALL
703; CHECK-NEXT: # encoding: [0xeb,A]
704; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
705; CHECK-NEXT: .LBB21_1: # %a
706; CHECK-NEXT: jmp a # TAILCALL
707; CHECK-NEXT: # encoding: [0xeb,A]
708; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
709entry:
710 %load1 = load i64, i64* @g64
711 ; Subtract -0x80, which can be done with an 8-bit immediate but only as
712 ; a subtract where that immediate can be negative.
713 %sub = sub i64 %load1, -128
Chandler Carruth4b611a82017-08-25 22:50:52 +0000714 store i64 %sub, i64* @g64
715 %cond = icmp slt i64 %sub, 0
716 br i1 %cond, label %a, label %b
717
718a:
719 tail call void @a()
720 ret void
721
722b:
723 tail call void @b()
724 ret void
725}
726
727define void @sub32_imm_br() nounwind {
728; CHECK-LABEL: sub32_imm_br:
729; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000730; CHECK-NEXT: addl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
731; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
732; CHECK-NEXT: # imm = 0x80000000
733; CHECK-NEXT: js .LBB22_1 # encoding: [0x78,A]
734; CHECK-NEXT: # fixup A - offset: 1, value: .LBB22_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000735; CHECK-NEXT: # BB#2: # %b
736; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000737; CHECK-NEXT: # encoding: [0xeb,A]
738; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
739; CHECK-NEXT: .LBB22_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000740; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000741; CHECK-NEXT: # encoding: [0xeb,A]
742; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000743entry:
744 %load1 = load i32, i32* @g32
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000745 ; Subtract -0x80000000, which requires 32 bits of immediate but still gets
746 ; lowered as an add.
747 %sub = sub i32 %load1, -2147483648
748 store i32 %sub, i32* @g32
749 %cond = icmp slt i32 %sub, 0
750 br i1 %cond, label %a, label %b
751
752a:
753 tail call void @a()
754 ret void
755
756b:
757 tail call void @b()
758 ret void
759}
760
761define void @sub32_imm8_br() nounwind {
762; CHECK-LABEL: sub32_imm8_br:
763; CHECK: # BB#0: # %entry
764; CHECK-NEXT: subl $-128, {{.*}}(%rip) # encoding: [0x83,0x2d,A,A,A,A,0x80]
765; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
766; CHECK-NEXT: js .LBB23_1 # encoding: [0x78,A]
767; CHECK-NEXT: # fixup A - offset: 1, value: .LBB23_1-1, kind: FK_PCRel_1
768; CHECK-NEXT: # BB#2: # %b
769; CHECK-NEXT: jmp b # TAILCALL
770; CHECK-NEXT: # encoding: [0xeb,A]
771; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
772; CHECK-NEXT: .LBB23_1: # %a
773; CHECK-NEXT: jmp a # TAILCALL
774; CHECK-NEXT: # encoding: [0xeb,A]
775; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
776entry:
777 %load1 = load i32, i32* @g32
778 ; Subtract -0x80, which can be done with an 8-bit immediate but only as
779 ; a subtract where that immediate can be negative.
780 %sub = sub i32 %load1, -128
Chandler Carruth4b611a82017-08-25 22:50:52 +0000781 store i32 %sub, i32* @g32
782 %cond = icmp slt i32 %sub, 0
783 br i1 %cond, label %a, label %b
784
785a:
786 tail call void @a()
787 ret void
788
789b:
790 tail call void @b()
791 ret void
792}
793
794define void @sub16_imm_br() nounwind {
795; CHECK-LABEL: sub16_imm_br:
796; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000797; CHECK-NEXT: addw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80]
798; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
799; CHECK-NEXT: # imm = 0x8000
800; CHECK-NEXT: js .LBB24_1 # encoding: [0x78,A]
801; CHECK-NEXT: # fixup A - offset: 1, value: .LBB24_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000802; CHECK-NEXT: # BB#2: # %b
803; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000804; CHECK-NEXT: # encoding: [0xeb,A]
805; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
806; CHECK-NEXT: .LBB24_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000807; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000808; CHECK-NEXT: # encoding: [0xeb,A]
809; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000810entry:
811 %load1 = load i16, i16* @g16
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000812 ; Subtract -0x8000, which requires a 16 bits of immediate but still gets
813 ; lowered as an add.
814 %sub = sub i16 %load1, -32768
815 store i16 %sub, i16* @g16
816 %cond = icmp slt i16 %sub, 0
817 br i1 %cond, label %a, label %b
818
819a:
820 tail call void @a()
821 ret void
822
823b:
824 tail call void @b()
825 ret void
826}
827
828define void @sub16_imm8_br() nounwind {
829; CHECK-LABEL: sub16_imm8_br:
830; CHECK: # BB#0: # %entry
831; CHECK-NEXT: subw $-128, {{.*}}(%rip) # encoding: [0x66,0x83,0x2d,A,A,A,A,0x80]
832; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
833; CHECK-NEXT: js .LBB25_1 # encoding: [0x78,A]
834; CHECK-NEXT: # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1
835; CHECK-NEXT: # BB#2: # %b
836; CHECK-NEXT: jmp b # TAILCALL
837; CHECK-NEXT: # encoding: [0xeb,A]
838; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
839; CHECK-NEXT: .LBB25_1: # %a
840; CHECK-NEXT: jmp a # TAILCALL
841; CHECK-NEXT: # encoding: [0xeb,A]
842; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
843entry:
844 %load1 = load i16, i16* @g16
845 ; Subtract -0x80, which can be done with an 8-bit immediate but only as
846 ; a subtract where that immediate can be negative.
847 %sub = sub i16 %load1, -128
Chandler Carruth4b611a82017-08-25 22:50:52 +0000848 store i16 %sub, i16* @g16
849 %cond = icmp slt i16 %sub, 0
850 br i1 %cond, label %a, label %b
851
852a:
853 tail call void @a()
854 ret void
855
856b:
857 tail call void @b()
858 ret void
859}
860
861define void @sub8_imm_br() nounwind {
862; CHECK-LABEL: sub8_imm_br:
863; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000864; CHECK-NEXT: addb $-128, {{.*}}(%rip) # encoding: [0x80,0x05,A,A,A,A,0x80]
865; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
866; CHECK-NEXT: js .LBB26_1 # encoding: [0x78,A]
867; CHECK-NEXT: # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000868; CHECK-NEXT: # BB#2: # %b
869; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000870; CHECK-NEXT: # encoding: [0xeb,A]
871; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
872; CHECK-NEXT: .LBB26_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000873; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000874; CHECK-NEXT: # encoding: [0xeb,A]
875; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000876entry:
877 %load1 = load i8, i8* @g8
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000878 ; Subtract -0x80, which requires an 8-bit immediate but still gets lowered as
879 ; an add.
880 %sub = sub i8 %load1, -128
Chandler Carruth4b611a82017-08-25 22:50:52 +0000881 store i8 %sub, i8* @g8
882 %cond = icmp slt i8 %sub, 0
883 br i1 %cond, label %a, label %b
884
885a:
886 tail call void @a()
887 ret void
888
889b:
890 tail call void @b()
891 ret void
892}
893
894define void @sub64_reg_br(i64 %arg) nounwind {
895; CHECK-LABEL: sub64_reg_br:
896; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000897; CHECK-NEXT: subq %rdi, {{.*}}(%rip) # encoding: [0x48,0x29,0x3d,A,A,A,A]
898; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
899; CHECK-NEXT: js .LBB27_1 # encoding: [0x78,A]
900; CHECK-NEXT: # fixup A - offset: 1, value: .LBB27_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000901; CHECK-NEXT: # BB#2: # %b
902; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000903; CHECK-NEXT: # encoding: [0xeb,A]
904; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
905; CHECK-NEXT: .LBB27_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000906; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000907; CHECK-NEXT: # encoding: [0xeb,A]
908; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000909entry:
910 %load1 = load i64, i64* @g64
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000911 %sub = sub i64 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000912 store i64 %sub, i64* @g64
913 %cond = icmp slt i64 %sub, 0
914 br i1 %cond, label %a, label %b
915
916a:
917 tail call void @a()
918 ret void
919
920b:
921 tail call void @b()
922 ret void
923}
924
925define void @sub32_reg_br(i32 %arg) nounwind {
926; CHECK-LABEL: sub32_reg_br:
927; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000928; CHECK-NEXT: subl %edi, {{.*}}(%rip) # encoding: [0x29,0x3d,A,A,A,A]
929; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
930; CHECK-NEXT: js .LBB28_1 # encoding: [0x78,A]
931; CHECK-NEXT: # fixup A - offset: 1, value: .LBB28_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000932; CHECK-NEXT: # BB#2: # %b
933; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000934; CHECK-NEXT: # encoding: [0xeb,A]
935; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
936; CHECK-NEXT: .LBB28_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000937; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000938; CHECK-NEXT: # encoding: [0xeb,A]
939; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000940entry:
941 %load1 = load i32, i32* @g32
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000942 %sub = sub i32 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000943 store i32 %sub, i32* @g32
944 %cond = icmp slt i32 %sub, 0
945 br i1 %cond, label %a, label %b
946
947a:
948 tail call void @a()
949 ret void
950
951b:
952 tail call void @b()
953 ret void
954}
955
956define void @sub16_reg_br(i16 %arg) nounwind {
957; CHECK-LABEL: sub16_reg_br:
958; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000959; CHECK-NEXT: subw %di, {{.*}}(%rip) # encoding: [0x66,0x29,0x3d,A,A,A,A]
960; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
961; CHECK-NEXT: js .LBB29_1 # encoding: [0x78,A]
962; CHECK-NEXT: # fixup A - offset: 1, value: .LBB29_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000963; CHECK-NEXT: # BB#2: # %b
964; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000965; CHECK-NEXT: # encoding: [0xeb,A]
966; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
967; CHECK-NEXT: .LBB29_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000968; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000969; CHECK-NEXT: # encoding: [0xeb,A]
970; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000971entry:
972 %load1 = load i16, i16* @g16
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000973 %sub = sub i16 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +0000974 store i16 %sub, i16* @g16
975 %cond = icmp slt i16 %sub, 0
976 br i1 %cond, label %a, label %b
977
978a:
979 tail call void @a()
980 ret void
981
982b:
983 tail call void @b()
984 ret void
985}
986
987define void @sub8_reg_br(i8 %arg) nounwind {
988; CHECK-LABEL: sub8_reg_br:
989; CHECK: # BB#0: # %entry
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000990; CHECK-NEXT: subb %dil, {{.*}}(%rip) # encoding: [0x40,0x28,0x3d,A,A,A,A]
991; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
992; CHECK-NEXT: js .LBB30_1 # encoding: [0x78,A]
993; CHECK-NEXT: # fixup A - offset: 1, value: .LBB30_1-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +0000994; CHECK-NEXT: # BB#2: # %b
995; CHECK-NEXT: jmp b # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +0000996; CHECK-NEXT: # encoding: [0xeb,A]
997; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
998; CHECK-NEXT: .LBB30_1: # %a
Chandler Carruth4b611a82017-08-25 22:50:52 +0000999; CHECK-NEXT: jmp a # TAILCALL
Chandler Carruth52a31bf2017-09-07 23:54:24 +00001000; CHECK-NEXT: # encoding: [0xeb,A]
1001; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
Chandler Carruth4b611a82017-08-25 22:50:52 +00001002entry:
1003 %load1 = load i8, i8* @g8
Chandler Carruth52a31bf2017-09-07 23:54:24 +00001004 %sub = sub i8 %load1, %arg
Chandler Carruth4b611a82017-08-25 22:50:52 +00001005 store i8 %sub, i8* @g8
1006 %cond = icmp slt i8 %sub, 0
1007 br i1 %cond, label %a, label %b
1008
1009a:
1010 tail call void @a()
1011 ret void
1012
1013b:
1014 tail call void @b()
1015 ret void
1016}