xref: /llvm-project/llvm/test/CodeGen/X86/fold-rmw-ops.ll (revision ee5585ed09aff2e54cb540fad4c33f0c93626b1b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -verify-machineinstrs -show-mc-encoding | FileCheck %s
3
4target triple = "x86_64-unknown-unknown"
5
6@g64 = external dso_local global i64, align 8
7@g32 = external dso_local global i32, align 4
8@g16 = external dso_local global i16, align 2
9@g8 = external dso_local global i8, align 1
10
11declare dso_local void @a()
12declare dso_local void @b()
13
14define void @add64_imm32_br() nounwind {
15; CHECK-LABEL: add64_imm32_br:
16; CHECK:       # %bb.0: # %entry
17; CHECK-NEXT:    addq $16777214, g64(%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:    jns b # TAILCALL
21; CHECK-NEXT:    # encoding: [0x79,A]
22; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
23; CHECK-NEXT:  # %bb.1: # %a
24; CHECK-NEXT:    jmp a # TAILCALL
25; CHECK-NEXT:    # encoding: [0xeb,A]
26; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
27entry:
28  %load1 = load i64, ptr @g64
29  ; Add 0x00FFFFFE, a positive immediate requiring 24-bits.
30  %add = add i64 %load1, 16777214
31  store i64 %add, ptr @g64
32  %cond = icmp slt i64 %add, 0
33  br i1 %cond, label %a, label %b
34
35a:
36  tail call void @a()
37  ret void
38
39b:
40  tail call void @b()
41  ret void
42}
43
44define void @add64_sext_imm32_br() nounwind {
45; CHECK-LABEL: add64_sext_imm32_br:
46; CHECK:       # %bb.0: # %entry
47; CHECK-NEXT:    addq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
48; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
49; CHECK-NEXT:    # imm = 0x80000000
50; CHECK-NEXT:    jns b # TAILCALL
51; CHECK-NEXT:    # encoding: [0x79,A]
52; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
53; CHECK-NEXT:  # %bb.1: # %a
54; CHECK-NEXT:    jmp a # TAILCALL
55; CHECK-NEXT:    # encoding: [0xeb,A]
56; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
57entry:
58  %load1 = load i64, ptr @g64
59  ; Add -0x80000000, which requires sign-extended 32 bits.
60  %add = add i64 %load1, -2147483648
61  store i64 %add, ptr @g64
62  %cond = icmp slt i64 %add, 0
63  br i1 %cond, label %a, label %b
64
65a:
66  tail call void @a()
67  ret void
68
69b:
70  tail call void @b()
71  ret void
72}
73
74define void @add64_imm32_via_sub_br() nounwind {
75; CHECK-LABEL: add64_imm32_via_sub_br:
76; CHECK:       # %bb.0: # %entry
77; CHECK-NEXT:    subq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80]
78; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
79; CHECK-NEXT:    # imm = 0x80000000
80; CHECK-NEXT:    jns b # TAILCALL
81; CHECK-NEXT:    # encoding: [0x79,A]
82; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
83; CHECK-NEXT:  # %bb.1: # %a
84; CHECK-NEXT:    jmp a # TAILCALL
85; CHECK-NEXT:    # encoding: [0xeb,A]
86; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
87entry:
88  %load1 = load i64, ptr @g64
89  ; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate. This
90  ; get's folded because we can instead subtract -0x80000000.
91  %add = add i64 %load1, 2147483648
92  store i64 %add, ptr @g64
93  %cond = icmp slt i64 %add, 0
94  br i1 %cond, label %a, label %b
95
96a:
97  tail call void @a()
98  ret void
99
100b:
101  tail call void @b()
102  ret void
103}
104
105define void @add64_no_imm32_via_sub_due_to_cf_br() nounwind {
106; CHECK-LABEL: add64_no_imm32_via_sub_due_to_cf_br:
107; CHECK:       # %bb.0: # %entry
108; CHECK-NEXT:    movl $2147483648, %eax # encoding: [0xb8,0x00,0x00,0x00,0x80]
109; CHECK-NEXT:    # imm = 0x80000000
110; CHECK-NEXT:    addq %rax, g64(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
111; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
112; CHECK-NEXT:    jae b # TAILCALL
113; CHECK-NEXT:    # encoding: [0x73,A]
114; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
115; CHECK-NEXT:  # %bb.1: # %a
116; CHECK-NEXT:    jmp a # TAILCALL
117; CHECK-NEXT:    # encoding: [0xeb,A]
118; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
119entry:
120  %load1 = load i64, ptr @g64
121  ; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate, but
122  ; could in theory be folded into an immediate operand of a sub. However, we
123  ; use the CF flag here and so shouldn't make that transformation.
124  %add = add i64 %load1, 2147483648
125  store i64 %add, ptr @g64
126  %cond = icmp ult i64 %add, 2147483648
127  br i1 %cond, label %a, label %b
128
129a:
130  tail call void @a()
131  ret void
132
133b:
134  tail call void @b()
135  ret void
136}
137
138define void @add64_too_large_imm32_br() nounwind {
139; CHECK-LABEL: add64_too_large_imm32_br:
140; CHECK:       # %bb.0: # %entry
141; CHECK-NEXT:    movl $2147483649, %eax # encoding: [0xb8,0x01,0x00,0x00,0x80]
142; CHECK-NEXT:    # imm = 0x80000001
143; CHECK-NEXT:    addq %rax, g64(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
144; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
145; CHECK-NEXT:    jns b # TAILCALL
146; CHECK-NEXT:    # encoding: [0x79,A]
147; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
148; CHECK-NEXT:  # %bb.1: # %a
149; CHECK-NEXT:    jmp a # TAILCALL
150; CHECK-NEXT:    # encoding: [0xeb,A]
151; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
152entry:
153  %load1 = load i64, ptr @g64
154  ; Add 0x80000001, which cannot fit in a sign extended 32-bit immediate. This
155  ; should not get folded into an immediate.
156  %add = add i64 %load1, 2147483649
157  store i64 %add, ptr @g64
158  %cond = icmp slt i64 %add, 0
159  br i1 %cond, label %a, label %b
160
161a:
162  tail call void @a()
163  ret void
164
165b:
166  tail call void @b()
167  ret void
168}
169
170define void @add64_imm8_via_sub_br() nounwind {
171; CHECK-LABEL: add64_imm8_via_sub_br:
172; CHECK:       # %bb.0: # %entry
173; CHECK-NEXT:    subq $-128, g64(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80]
174; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
175; CHECK-NEXT:    jns b # TAILCALL
176; CHECK-NEXT:    # encoding: [0x79,A]
177; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
178; CHECK-NEXT:  # %bb.1: # %a
179; CHECK-NEXT:    jmp a # TAILCALL
180; CHECK-NEXT:    # encoding: [0xeb,A]
181; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
182entry:
183  %load1 = load i64, ptr @g64
184  ; Add 0x80 which can't quite fit into an imm8 because it would be sign
185  ; extended, but which can fit if we convert to a sub and negate the value.
186  %add = add i64 %load1, 128
187  store i64 %add, ptr @g64
188  %cond = icmp slt i64 %add, 0
189  br i1 %cond, label %a, label %b
190
191a:
192  tail call void @a()
193  ret void
194
195b:
196  tail call void @b()
197  ret void
198}
199
200define void @add64_imm8_br() nounwind {
201; CHECK-LABEL: add64_imm8_br:
202; CHECK:       # %bb.0: # %entry
203; CHECK-NEXT:    addq $42, g64(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0x2a]
204; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
205; CHECK-NEXT:    jns b # TAILCALL
206; CHECK-NEXT:    # encoding: [0x79,A]
207; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
208; CHECK-NEXT:  # %bb.1: # %a
209; CHECK-NEXT:    jmp a # TAILCALL
210; CHECK-NEXT:    # encoding: [0xeb,A]
211; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
212entry:
213  %load1 = load i64, ptr @g64
214  %add = add i64 %load1, 42
215  store i64 %add, ptr @g64
216  %cond = icmp slt i64 %add, 0
217  br i1 %cond, label %a, label %b
218
219a:
220  tail call void @a()
221  ret void
222
223b:
224  tail call void @b()
225  ret void
226}
227
228define void @add64_imm8_neg_br() nounwind {
229; CHECK-LABEL: add64_imm8_neg_br:
230; CHECK:       # %bb.0: # %entry
231; CHECK-NEXT:    addq $-42, g64(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0xd6]
232; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
233; CHECK-NEXT:    jns b # TAILCALL
234; CHECK-NEXT:    # encoding: [0x79,A]
235; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
236; CHECK-NEXT:  # %bb.1: # %a
237; CHECK-NEXT:    jmp a # TAILCALL
238; CHECK-NEXT:    # encoding: [0xeb,A]
239; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
240entry:
241  %load1 = load i64, ptr @g64
242  %add = add i64 %load1, -42
243  store i64 %add, ptr @g64
244  %cond = icmp slt i64 %add, 0
245  br i1 %cond, label %a, label %b
246
247a:
248  tail call void @a()
249  ret void
250
251b:
252  tail call void @b()
253  ret void
254}
255
256define void @add32_imm_br() nounwind {
257; CHECK-LABEL: add32_imm_br:
258; CHECK:       # %bb.0: # %entry
259; CHECK-NEXT:    addl $-2147483648, g32(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
260; CHECK-NEXT:    # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
261; CHECK-NEXT:    # imm = 0x80000000
262; CHECK-NEXT:    jns b # TAILCALL
263; CHECK-NEXT:    # encoding: [0x79,A]
264; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
265; CHECK-NEXT:  # %bb.1: # %a
266; CHECK-NEXT:    jmp a # TAILCALL
267; CHECK-NEXT:    # encoding: [0xeb,A]
268; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
269entry:
270  %load1 = load i32, ptr @g32
271  ; Add 0x80000000, a positive number requiring 32 bits of immediate.
272  %add = add i32 %load1, 2147483648
273  store i32 %add, ptr @g32
274  %cond = icmp slt i32 %add, 0
275  br i1 %cond, label %a, label %b
276
277a:
278  tail call void @a()
279  ret void
280
281b:
282  tail call void @b()
283  ret void
284}
285
286define void @add32_imm8_br() nounwind {
287; CHECK-LABEL: add32_imm8_br:
288; CHECK:       # %bb.0: # %entry
289; CHECK-NEXT:    addl $42, g32(%rip) # encoding: [0x83,0x05,A,A,A,A,0x2a]
290; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
291; CHECK-NEXT:    jns b # TAILCALL
292; CHECK-NEXT:    # encoding: [0x79,A]
293; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
294; CHECK-NEXT:  # %bb.1: # %a
295; CHECK-NEXT:    jmp a # TAILCALL
296; CHECK-NEXT:    # encoding: [0xeb,A]
297; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
298entry:
299  %load1 = load i32, ptr @g32
300  %add = add i32 %load1, 42
301  store i32 %add, ptr @g32
302  %cond = icmp slt i32 %add, 0
303  br i1 %cond, label %a, label %b
304
305a:
306  tail call void @a()
307  ret void
308
309b:
310  tail call void @b()
311  ret void
312}
313
314define void @add32_imm8_neg_br() nounwind {
315; CHECK-LABEL: add32_imm8_neg_br:
316; CHECK:       # %bb.0: # %entry
317; CHECK-NEXT:    addl $-42, g32(%rip) # encoding: [0x83,0x05,A,A,A,A,0xd6]
318; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
319; CHECK-NEXT:    jns b # TAILCALL
320; CHECK-NEXT:    # encoding: [0x79,A]
321; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
322; CHECK-NEXT:  # %bb.1: # %a
323; CHECK-NEXT:    jmp a # TAILCALL
324; CHECK-NEXT:    # encoding: [0xeb,A]
325; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
326entry:
327  %load1 = load i32, ptr @g32
328  %add = add i32 %load1, -42
329  store i32 %add, ptr @g32
330  %cond = icmp slt i32 %add, 0
331  br i1 %cond, label %a, label %b
332
333a:
334  tail call void @a()
335  ret void
336
337b:
338  tail call void @b()
339  ret void
340}
341
342define void @add16_imm_br() nounwind {
343; CHECK-LABEL: add16_imm_br:
344; CHECK:       # %bb.0: # %entry
345; CHECK-NEXT:    addw $-32768, g16(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80]
346; CHECK-NEXT:    # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
347; CHECK-NEXT:    # imm = 0x8000
348; CHECK-NEXT:    jns b # TAILCALL
349; CHECK-NEXT:    # encoding: [0x79,A]
350; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
351; CHECK-NEXT:  # %bb.1: # %a
352; CHECK-NEXT:    jmp a # TAILCALL
353; CHECK-NEXT:    # encoding: [0xeb,A]
354; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
355entry:
356  %load1 = load i16, ptr @g16
357  ; Add 0x8000, a positive number requiring 16 bits of immediate.
358  %add = add i16 %load1, 32768
359  store i16 %add, ptr @g16
360  %cond = icmp slt i16 %add, 0
361  br i1 %cond, label %a, label %b
362
363a:
364  tail call void @a()
365  ret void
366
367b:
368  tail call void @b()
369  ret void
370}
371
372define void @add16_imm8_br() nounwind {
373; CHECK-LABEL: add16_imm8_br:
374; CHECK:       # %bb.0: # %entry
375; CHECK-NEXT:    addw $42, g16(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0x2a]
376; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
377; CHECK-NEXT:    jns b # TAILCALL
378; CHECK-NEXT:    # encoding: [0x79,A]
379; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
380; CHECK-NEXT:  # %bb.1: # %a
381; CHECK-NEXT:    jmp a # TAILCALL
382; CHECK-NEXT:    # encoding: [0xeb,A]
383; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
384entry:
385  %load1 = load i16, ptr @g16
386  %add = add i16 %load1, 42
387  store i16 %add, ptr @g16
388  %cond = icmp slt i16 %add, 0
389  br i1 %cond, label %a, label %b
390
391a:
392  tail call void @a()
393  ret void
394
395b:
396  tail call void @b()
397  ret void
398}
399
400define void @add16_imm8_neg_br() nounwind {
401; CHECK-LABEL: add16_imm8_neg_br:
402; CHECK:       # %bb.0: # %entry
403; CHECK-NEXT:    addw $-42, g16(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0xd6]
404; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
405; CHECK-NEXT:    jns b # TAILCALL
406; CHECK-NEXT:    # encoding: [0x79,A]
407; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
408; CHECK-NEXT:  # %bb.1: # %a
409; CHECK-NEXT:    jmp a # TAILCALL
410; CHECK-NEXT:    # encoding: [0xeb,A]
411; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
412entry:
413  %load1 = load i16, ptr @g16
414  %add = add i16 %load1, -42
415  store i16 %add, ptr @g16
416  %cond = icmp slt i16 %add, 0
417  br i1 %cond, label %a, label %b
418
419a:
420  tail call void @a()
421  ret void
422
423b:
424  tail call void @b()
425  ret void
426}
427
428define void @add8_imm_br() nounwind {
429; CHECK-LABEL: add8_imm_br:
430; CHECK:       # %bb.0: # %entry
431; CHECK-NEXT:    addb $-2, g8(%rip) # encoding: [0x80,0x05,A,A,A,A,0xfe]
432; CHECK-NEXT:    # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
433; CHECK-NEXT:    jns b # TAILCALL
434; CHECK-NEXT:    # encoding: [0x79,A]
435; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
436; CHECK-NEXT:  # %bb.1: # %a
437; CHECK-NEXT:    jmp a # TAILCALL
438; CHECK-NEXT:    # encoding: [0xeb,A]
439; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
440entry:
441  %load1 = load i8, ptr @g8
442  %add = add i8 %load1, -2
443  store i8 %add, ptr @g8
444  %cond = icmp slt i8 %add, 0
445  br i1 %cond, label %a, label %b
446
447a:
448  tail call void @a()
449  ret void
450
451b:
452  tail call void @b()
453  ret void
454}
455
456define void @add64_reg_br(i64 %arg) nounwind {
457; CHECK-LABEL: add64_reg_br:
458; CHECK:       # %bb.0: # %entry
459; CHECK-NEXT:    addq %rdi, g64(%rip) # encoding: [0x48,0x01,0x3d,A,A,A,A]
460; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
461; CHECK-NEXT:    jns b # TAILCALL
462; CHECK-NEXT:    # encoding: [0x79,A]
463; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
464; CHECK-NEXT:  # %bb.1: # %a
465; CHECK-NEXT:    jmp a # TAILCALL
466; CHECK-NEXT:    # encoding: [0xeb,A]
467; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
468entry:
469  %load1 = load i64, ptr @g64
470  %add = add i64 %load1, %arg
471  store i64 %add, ptr @g64
472  %cond = icmp slt i64 %add, 0
473  br i1 %cond, label %a, label %b
474
475a:
476  tail call void @a()
477  ret void
478
479b:
480  tail call void @b()
481  ret void
482}
483
484define void @add32_reg_br(i32 %arg) nounwind {
485; CHECK-LABEL: add32_reg_br:
486; CHECK:       # %bb.0: # %entry
487; CHECK-NEXT:    addl %edi, g32(%rip) # encoding: [0x01,0x3d,A,A,A,A]
488; CHECK-NEXT:    # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
489; CHECK-NEXT:    jns b # TAILCALL
490; CHECK-NEXT:    # encoding: [0x79,A]
491; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
492; CHECK-NEXT:  # %bb.1: # %a
493; CHECK-NEXT:    jmp a # TAILCALL
494; CHECK-NEXT:    # encoding: [0xeb,A]
495; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
496entry:
497  %load1 = load i32, ptr @g32
498  %add = add i32 %load1, %arg
499  store i32 %add, ptr @g32
500  %cond = icmp slt i32 %add, 0
501  br i1 %cond, label %a, label %b
502
503a:
504  tail call void @a()
505  ret void
506
507b:
508  tail call void @b()
509  ret void
510}
511
512define void @add16_reg_br(i16 %arg) nounwind {
513; CHECK-LABEL: add16_reg_br:
514; CHECK:       # %bb.0: # %entry
515; CHECK-NEXT:    addw %di, g16(%rip) # encoding: [0x66,0x01,0x3d,A,A,A,A]
516; CHECK-NEXT:    # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
517; CHECK-NEXT:    jns b # TAILCALL
518; CHECK-NEXT:    # encoding: [0x79,A]
519; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
520; CHECK-NEXT:  # %bb.1: # %a
521; CHECK-NEXT:    jmp a # TAILCALL
522; CHECK-NEXT:    # encoding: [0xeb,A]
523; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
524entry:
525  %load1 = load i16, ptr @g16
526  %add = add i16 %load1, %arg
527  store i16 %add, ptr @g16
528  %cond = icmp slt i16 %add, 0
529  br i1 %cond, label %a, label %b
530
531a:
532  tail call void @a()
533  ret void
534
535b:
536  tail call void @b()
537  ret void
538}
539
540define void @add8_reg_br(i8 %arg) nounwind {
541; CHECK-LABEL: add8_reg_br:
542; CHECK:       # %bb.0: # %entry
543; CHECK-NEXT:    addb %dil, g8(%rip) # encoding: [0x40,0x00,0x3d,A,A,A,A]
544; CHECK-NEXT:    # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
545; CHECK-NEXT:    jns b # TAILCALL
546; CHECK-NEXT:    # encoding: [0x79,A]
547; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
548; CHECK-NEXT:  # %bb.1: # %a
549; CHECK-NEXT:    jmp a # TAILCALL
550; CHECK-NEXT:    # encoding: [0xeb,A]
551; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
552entry:
553  %load1 = load i8, ptr @g8
554  %add = add i8 %load1, %arg
555  store i8 %add, ptr @g8
556  %cond = icmp slt i8 %add, 0
557  br i1 %cond, label %a, label %b
558
559a:
560  tail call void @a()
561  ret void
562
563b:
564  tail call void @b()
565  ret void
566}
567
568define void @sub64_imm32_br() nounwind {
569; CHECK-LABEL: sub64_imm32_br:
570; CHECK:       # %bb.0: # %entry
571; CHECK-NEXT:    subq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80]
572; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
573; CHECK-NEXT:    # imm = 0x80000000
574; CHECK-NEXT:    jns b # TAILCALL
575; CHECK-NEXT:    # encoding: [0x79,A]
576; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
577; CHECK-NEXT:  # %bb.1: # %a
578; CHECK-NEXT:    jmp a # TAILCALL
579; CHECK-NEXT:    # encoding: [0xeb,A]
580; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
581entry:
582  %load1 = load i64, ptr @g64
583  ; Subtract -0x80000000, which can't be negated into a sign-extended 32-bit
584  ; immediate, so that we have to select sub here.
585  %sub = sub i64 %load1, -2147483648
586  store i64 %sub, ptr @g64
587  %cond = icmp slt i64 %sub, 0
588  br i1 %cond, label %a, label %b
589
590a:
591  tail call void @a()
592  ret void
593
594b:
595  tail call void @b()
596  ret void
597}
598
599define void @sub64_too_large_imm32_br() nounwind {
600; CHECK-LABEL: sub64_too_large_imm32_br:
601; CHECK:       # %bb.0: # %entry
602; CHECK-NEXT:    movabsq $-4294967295, %rax # encoding: [0x48,0xb8,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff]
603; CHECK-NEXT:    # imm = 0xFFFFFFFF00000001
604; CHECK-NEXT:    addq %rax, g64(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
605; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
606; CHECK-NEXT:    jns b # TAILCALL
607; CHECK-NEXT:    # encoding: [0x79,A]
608; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
609; CHECK-NEXT:  # %bb.1: # %a
610; CHECK-NEXT:    jmp a # TAILCALL
611; CHECK-NEXT:    # encoding: [0xeb,A]
612; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
613entry:
614  %load1 = load i64, ptr @g64
615  ; Subtract 0xFFFFFFFF, which cannot fit in a sign extended 32-bit immediate,
616  ; even if negated and sign extended as an add.
617  %sub = sub i64 %load1, 4294967295
618  store i64 %sub, ptr @g64
619  %cond = icmp slt i64 %sub, 0
620  br i1 %cond, label %a, label %b
621
622a:
623  tail call void @a()
624  ret void
625
626b:
627  tail call void @b()
628  ret void
629}
630
631define void @sub64_imm8_br() nounwind {
632; CHECK-LABEL: sub64_imm8_br:
633; CHECK:       # %bb.0: # %entry
634; CHECK-NEXT:    subq $-128, g64(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80]
635; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
636; CHECK-NEXT:    jns b # TAILCALL
637; CHECK-NEXT:    # encoding: [0x79,A]
638; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
639; CHECK-NEXT:  # %bb.1: # %a
640; CHECK-NEXT:    jmp a # TAILCALL
641; CHECK-NEXT:    # encoding: [0xeb,A]
642; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
643entry:
644  %load1 = load i64, ptr @g64
645  ; Subtract -0x80, which can be done with an 8-bit immediate but only as
646  ; a subtract where that immediate can be negative.
647  %sub = sub i64 %load1, -128
648  store i64 %sub, ptr @g64
649  %cond = icmp slt i64 %sub, 0
650  br i1 %cond, label %a, label %b
651
652a:
653  tail call void @a()
654  ret void
655
656b:
657  tail call void @b()
658  ret void
659}
660
661define void @sub32_imm_br() nounwind {
662; CHECK-LABEL: sub32_imm_br:
663; CHECK:       # %bb.0: # %entry
664; CHECK-NEXT:    addl $-2147483648, g32(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
665; CHECK-NEXT:    # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
666; CHECK-NEXT:    # imm = 0x80000000
667; CHECK-NEXT:    jns b # TAILCALL
668; CHECK-NEXT:    # encoding: [0x79,A]
669; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
670; CHECK-NEXT:  # %bb.1: # %a
671; CHECK-NEXT:    jmp a # TAILCALL
672; CHECK-NEXT:    # encoding: [0xeb,A]
673; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
674entry:
675  %load1 = load i32, ptr @g32
676  ; Subtract -0x80000000, which requires 32 bits of immediate but still gets
677  ; lowered as an add.
678  %sub = sub i32 %load1, -2147483648
679  store i32 %sub, ptr @g32
680  %cond = icmp slt i32 %sub, 0
681  br i1 %cond, label %a, label %b
682
683a:
684  tail call void @a()
685  ret void
686
687b:
688  tail call void @b()
689  ret void
690}
691
692define void @sub32_imm8_br() nounwind {
693; CHECK-LABEL: sub32_imm8_br:
694; CHECK:       # %bb.0: # %entry
695; CHECK-NEXT:    subl $-128, g32(%rip) # encoding: [0x83,0x2d,A,A,A,A,0x80]
696; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
697; CHECK-NEXT:    jns b # TAILCALL
698; CHECK-NEXT:    # encoding: [0x79,A]
699; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
700; CHECK-NEXT:  # %bb.1: # %a
701; CHECK-NEXT:    jmp a # TAILCALL
702; CHECK-NEXT:    # encoding: [0xeb,A]
703; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
704entry:
705  %load1 = load i32, ptr @g32
706  ; Subtract -0x80, which can be done with an 8-bit immediate but only as
707  ; a subtract where that immediate can be negative.
708  %sub = sub i32 %load1, -128
709  store i32 %sub, ptr @g32
710  %cond = icmp slt i32 %sub, 0
711  br i1 %cond, label %a, label %b
712
713a:
714  tail call void @a()
715  ret void
716
717b:
718  tail call void @b()
719  ret void
720}
721
722define void @sub16_imm_br() nounwind {
723; CHECK-LABEL: sub16_imm_br:
724; CHECK:       # %bb.0: # %entry
725; CHECK-NEXT:    addw $-32768, g16(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80]
726; CHECK-NEXT:    # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
727; CHECK-NEXT:    # imm = 0x8000
728; CHECK-NEXT:    jns b # TAILCALL
729; CHECK-NEXT:    # encoding: [0x79,A]
730; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
731; CHECK-NEXT:  # %bb.1: # %a
732; CHECK-NEXT:    jmp a # TAILCALL
733; CHECK-NEXT:    # encoding: [0xeb,A]
734; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
735entry:
736  %load1 = load i16, ptr @g16
737  ; Subtract -0x8000, which requires a 16 bits of immediate but still gets
738  ; lowered as an add.
739  %sub = sub i16 %load1, -32768
740  store i16 %sub, ptr @g16
741  %cond = icmp slt i16 %sub, 0
742  br i1 %cond, label %a, label %b
743
744a:
745  tail call void @a()
746  ret void
747
748b:
749  tail call void @b()
750  ret void
751}
752
753define void @sub16_imm8_br() nounwind {
754; CHECK-LABEL: sub16_imm8_br:
755; CHECK:       # %bb.0: # %entry
756; CHECK-NEXT:    subw $-128, g16(%rip) # encoding: [0x66,0x83,0x2d,A,A,A,A,0x80]
757; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
758; CHECK-NEXT:    jns b # TAILCALL
759; CHECK-NEXT:    # encoding: [0x79,A]
760; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
761; CHECK-NEXT:  # %bb.1: # %a
762; CHECK-NEXT:    jmp a # TAILCALL
763; CHECK-NEXT:    # encoding: [0xeb,A]
764; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
765entry:
766  %load1 = load i16, ptr @g16
767  ; Subtract -0x80, which can be done with an 8-bit immediate but only as
768  ; a subtract where that immediate can be negative.
769  %sub = sub i16 %load1, -128
770  store i16 %sub, ptr @g16
771  %cond = icmp slt i16 %sub, 0
772  br i1 %cond, label %a, label %b
773
774a:
775  tail call void @a()
776  ret void
777
778b:
779  tail call void @b()
780  ret void
781}
782
783define void @sub8_imm_br() nounwind {
784; CHECK-LABEL: sub8_imm_br:
785; CHECK:       # %bb.0: # %entry
786; CHECK-NEXT:    addb $-128, g8(%rip) # encoding: [0x80,0x05,A,A,A,A,0x80]
787; CHECK-NEXT:    # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
788; CHECK-NEXT:    jns b # TAILCALL
789; CHECK-NEXT:    # encoding: [0x79,A]
790; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
791; CHECK-NEXT:  # %bb.1: # %a
792; CHECK-NEXT:    jmp a # TAILCALL
793; CHECK-NEXT:    # encoding: [0xeb,A]
794; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
795entry:
796  %load1 = load i8, ptr @g8
797  ; Subtract -0x80, which requires an 8-bit immediate but still gets lowered as
798  ; an add.
799  %sub = sub i8 %load1, -128
800  store i8 %sub, ptr @g8
801  %cond = icmp slt i8 %sub, 0
802  br i1 %cond, label %a, label %b
803
804a:
805  tail call void @a()
806  ret void
807
808b:
809  tail call void @b()
810  ret void
811}
812
813define void @sub64_reg_br(i64 %arg) nounwind {
814; CHECK-LABEL: sub64_reg_br:
815; CHECK:       # %bb.0: # %entry
816; CHECK-NEXT:    subq %rdi, g64(%rip) # encoding: [0x48,0x29,0x3d,A,A,A,A]
817; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
818; CHECK-NEXT:    jns b # TAILCALL
819; CHECK-NEXT:    # encoding: [0x79,A]
820; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
821; CHECK-NEXT:  # %bb.1: # %a
822; CHECK-NEXT:    jmp a # TAILCALL
823; CHECK-NEXT:    # encoding: [0xeb,A]
824; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
825entry:
826  %load1 = load i64, ptr @g64
827  %sub = sub i64 %load1, %arg
828  store i64 %sub, ptr @g64
829  %cond = icmp slt i64 %sub, 0
830  br i1 %cond, label %a, label %b
831
832a:
833  tail call void @a()
834  ret void
835
836b:
837  tail call void @b()
838  ret void
839}
840
841define void @sub32_reg_br(i32 %arg) nounwind {
842; CHECK-LABEL: sub32_reg_br:
843; CHECK:       # %bb.0: # %entry
844; CHECK-NEXT:    subl %edi, g32(%rip) # encoding: [0x29,0x3d,A,A,A,A]
845; CHECK-NEXT:    # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
846; CHECK-NEXT:    jns b # TAILCALL
847; CHECK-NEXT:    # encoding: [0x79,A]
848; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
849; CHECK-NEXT:  # %bb.1: # %a
850; CHECK-NEXT:    jmp a # TAILCALL
851; CHECK-NEXT:    # encoding: [0xeb,A]
852; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
853entry:
854  %load1 = load i32, ptr @g32
855  %sub = sub i32 %load1, %arg
856  store i32 %sub, ptr @g32
857  %cond = icmp slt i32 %sub, 0
858  br i1 %cond, label %a, label %b
859
860a:
861  tail call void @a()
862  ret void
863
864b:
865  tail call void @b()
866  ret void
867}
868
869define void @sub16_reg_br(i16 %arg) nounwind {
870; CHECK-LABEL: sub16_reg_br:
871; CHECK:       # %bb.0: # %entry
872; CHECK-NEXT:    subw %di, g16(%rip) # encoding: [0x66,0x29,0x3d,A,A,A,A]
873; CHECK-NEXT:    # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
874; CHECK-NEXT:    jns b # TAILCALL
875; CHECK-NEXT:    # encoding: [0x79,A]
876; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
877; CHECK-NEXT:  # %bb.1: # %a
878; CHECK-NEXT:    jmp a # TAILCALL
879; CHECK-NEXT:    # encoding: [0xeb,A]
880; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
881entry:
882  %load1 = load i16, ptr @g16
883  %sub = sub i16 %load1, %arg
884  store i16 %sub, ptr @g16
885  %cond = icmp slt i16 %sub, 0
886  br i1 %cond, label %a, label %b
887
888a:
889  tail call void @a()
890  ret void
891
892b:
893  tail call void @b()
894  ret void
895}
896
897define void @sub8_reg_br(i8 %arg) nounwind {
898; CHECK-LABEL: sub8_reg_br:
899; CHECK:       # %bb.0: # %entry
900; CHECK-NEXT:    subb %dil, g8(%rip) # encoding: [0x40,0x28,0x3d,A,A,A,A]
901; CHECK-NEXT:    # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
902; CHECK-NEXT:    jns b # TAILCALL
903; CHECK-NEXT:    # encoding: [0x79,A]
904; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
905; CHECK-NEXT:  # %bb.1: # %a
906; CHECK-NEXT:    jmp a # TAILCALL
907; CHECK-NEXT:    # encoding: [0xeb,A]
908; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
909entry:
910  %load1 = load i8, ptr @g8
911  %sub = sub i8 %load1, %arg
912  store i8 %sub, ptr @g8
913  %cond = icmp slt i8 %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 @and64_imm32_br() nounwind {
926; CHECK-LABEL: and64_imm32_br:
927; CHECK:       # %bb.0: # %entry
928; CHECK-NEXT:    andq $16777215, g64(%rip) # encoding: [0x48,0x81,0x25,A,A,A,A,0xff,0xff,0xff,0x00]
929; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
930; CHECK-NEXT:    # imm = 0xFFFFFF
931; CHECK-NEXT:    jne b # TAILCALL
932; CHECK-NEXT:    # encoding: [0x75,A]
933; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
934; CHECK-NEXT:  # %bb.1: # %a
935; CHECK-NEXT:    jmp a # TAILCALL
936; CHECK-NEXT:    # encoding: [0xeb,A]
937; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
938entry:
939  %load1 = load i64, ptr @g64
940  ; And 0x00FFFFFF, a positive immediate requiring 24-bits.
941  %and = and i64 %load1, 16777215
942  store i64 %and, ptr @g64
943  %cond = icmp eq i64 %and, 0
944  br i1 %cond, label %a, label %b
945
946a:
947  tail call void @a()
948  ret void
949
950b:
951  tail call void @b()
952  ret void
953}
954
955define void @and64_sext_imm32_br() nounwind {
956; CHECK-LABEL: and64_sext_imm32_br:
957; CHECK:       # %bb.0: # %entry
958; CHECK-NEXT:    andq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80]
959; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
960; CHECK-NEXT:    # imm = 0x80000000
961; CHECK-NEXT:    jne b # TAILCALL
962; CHECK-NEXT:    # encoding: [0x75,A]
963; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
964; CHECK-NEXT:  # %bb.1: # %a
965; CHECK-NEXT:    jmp a # TAILCALL
966; CHECK-NEXT:    # encoding: [0xeb,A]
967; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
968entry:
969  %load1 = load i64, ptr @g64
970  ; And -0x80000000, which requires sign-extended 32 bits.
971  %and = and i64 %load1, -2147483648
972  store i64 %and, ptr @g64
973  %cond = icmp eq i64 %and, 0
974  br i1 %cond, label %a, label %b
975
976a:
977  tail call void @a()
978  ret void
979
980b:
981  tail call void @b()
982  ret void
983}
984
985define void @and64_imm8_br() nounwind {
986; CHECK-LABEL: and64_imm8_br:
987; CHECK:       # %bb.0: # %entry
988; CHECK-NEXT:    andq $15, g64(%rip) # encoding: [0x48,0x83,0x25,A,A,A,A,0x0f]
989; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
990; CHECK-NEXT:    jne b # TAILCALL
991; CHECK-NEXT:    # encoding: [0x75,A]
992; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
993; CHECK-NEXT:  # %bb.1: # %a
994; CHECK-NEXT:    jmp a # TAILCALL
995; CHECK-NEXT:    # encoding: [0xeb,A]
996; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
997entry:
998  %load1 = load i64, ptr @g64
999  %and = and i64 %load1, 15
1000  store i64 %and, ptr @g64
1001  %cond = icmp eq i64 %and, 0
1002  br i1 %cond, label %a, label %b
1003
1004a:
1005  tail call void @a()
1006  ret void
1007
1008b:
1009  tail call void @b()
1010  ret void
1011}
1012
1013define void @and64_imm8_neg_br() nounwind {
1014; CHECK-LABEL: and64_imm8_neg_br:
1015; CHECK:       # %bb.0: # %entry
1016; CHECK-NEXT:    andq $-4, g64(%rip) # encoding: [0x48,0x83,0x25,A,A,A,A,0xfc]
1017; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
1018; CHECK-NEXT:    jne b # TAILCALL
1019; CHECK-NEXT:    # encoding: [0x75,A]
1020; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1021; CHECK-NEXT:  # %bb.1: # %a
1022; CHECK-NEXT:    jmp a # TAILCALL
1023; CHECK-NEXT:    # encoding: [0xeb,A]
1024; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1025entry:
1026  %load1 = load i64, ptr @g64
1027  %and = and i64 %load1, -4
1028  store i64 %and, ptr @g64
1029  %cond = icmp eq i64 %and, 0
1030  br i1 %cond, label %a, label %b
1031
1032a:
1033  tail call void @a()
1034  ret void
1035
1036b:
1037  tail call void @b()
1038  ret void
1039}
1040
1041define void @and32_imm_br() nounwind {
1042; CHECK-LABEL: and32_imm_br:
1043; CHECK:       # %bb.0: # %entry
1044; CHECK-NEXT:    andl $-2147483648, g32(%rip) # encoding: [0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80]
1045; CHECK-NEXT:    # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
1046; CHECK-NEXT:    # imm = 0x80000000
1047; CHECK-NEXT:    jne b # TAILCALL
1048; CHECK-NEXT:    # encoding: [0x75,A]
1049; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1050; CHECK-NEXT:  # %bb.1: # %a
1051; CHECK-NEXT:    jmp a # TAILCALL
1052; CHECK-NEXT:    # encoding: [0xeb,A]
1053; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1054entry:
1055  %load1 = load i32, ptr @g32
1056  ; And 0x80000000, a positive number requiring 32 bits of immediate.
1057  %and = and i32 %load1, 2147483648
1058  store i32 %and, ptr @g32
1059  %cond = icmp eq i32 %and, 0
1060  br i1 %cond, label %a, label %b
1061
1062a:
1063  tail call void @a()
1064  ret void
1065
1066b:
1067  tail call void @b()
1068  ret void
1069}
1070
1071define void @and32_imm8_br() nounwind {
1072; CHECK-LABEL: and32_imm8_br:
1073; CHECK:       # %bb.0: # %entry
1074; CHECK-NEXT:    andl $15, g32(%rip) # encoding: [0x83,0x25,A,A,A,A,0x0f]
1075; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
1076; CHECK-NEXT:    jne b # TAILCALL
1077; CHECK-NEXT:    # encoding: [0x75,A]
1078; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1079; CHECK-NEXT:  # %bb.1: # %a
1080; CHECK-NEXT:    jmp a # TAILCALL
1081; CHECK-NEXT:    # encoding: [0xeb,A]
1082; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1083entry:
1084  %load1 = load i32, ptr @g32
1085  %and = and i32 %load1, 15
1086  store i32 %and, ptr @g32
1087  %cond = icmp eq i32 %and, 0
1088  br i1 %cond, label %a, label %b
1089
1090a:
1091  tail call void @a()
1092  ret void
1093
1094b:
1095  tail call void @b()
1096  ret void
1097}
1098
1099define void @and32_imm8_neg_br() nounwind {
1100; CHECK-LABEL: and32_imm8_neg_br:
1101; CHECK:       # %bb.0: # %entry
1102; CHECK-NEXT:    andl $-4, g32(%rip) # encoding: [0x83,0x25,A,A,A,A,0xfc]
1103; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
1104; CHECK-NEXT:    jne b # TAILCALL
1105; CHECK-NEXT:    # encoding: [0x75,A]
1106; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1107; CHECK-NEXT:  # %bb.1: # %a
1108; CHECK-NEXT:    jmp a # TAILCALL
1109; CHECK-NEXT:    # encoding: [0xeb,A]
1110; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1111entry:
1112  %load1 = load i32, ptr @g32
1113  %and = and i32 %load1, -4
1114  store i32 %and, ptr @g32
1115  %cond = icmp eq i32 %and, 0
1116  br i1 %cond, label %a, label %b
1117
1118a:
1119  tail call void @a()
1120  ret void
1121
1122b:
1123  tail call void @b()
1124  ret void
1125}
1126
1127define void @and16_imm_br() nounwind {
1128; CHECK-LABEL: and16_imm_br:
1129; CHECK:       # %bb.0: # %entry
1130; CHECK-NEXT:    andw $-32768, g16(%rip) # encoding: [0x66,0x81,0x25,A,A,A,A,0x00,0x80]
1131; CHECK-NEXT:    # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
1132; CHECK-NEXT:    # imm = 0x8000
1133; CHECK-NEXT:    jne b # TAILCALL
1134; CHECK-NEXT:    # encoding: [0x75,A]
1135; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1136; CHECK-NEXT:  # %bb.1: # %a
1137; CHECK-NEXT:    jmp a # TAILCALL
1138; CHECK-NEXT:    # encoding: [0xeb,A]
1139; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1140entry:
1141  %load1 = load i16, ptr @g16
1142  %and = and i16 %load1, 32768
1143  store i16 %and, ptr @g16
1144  %cond = icmp eq i16 %and, 0
1145  br i1 %cond, label %a, label %b
1146
1147a:
1148  tail call void @a()
1149  ret void
1150
1151b:
1152  tail call void @b()
1153  ret void
1154}
1155
1156define void @and16_imm8_br() nounwind {
1157; CHECK-LABEL: and16_imm8_br:
1158; CHECK:       # %bb.0: # %entry
1159; CHECK-NEXT:    andw $15, g16(%rip) # encoding: [0x66,0x83,0x25,A,A,A,A,0x0f]
1160; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
1161; CHECK-NEXT:    jne b # TAILCALL
1162; CHECK-NEXT:    # encoding: [0x75,A]
1163; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1164; CHECK-NEXT:  # %bb.1: # %a
1165; CHECK-NEXT:    jmp a # TAILCALL
1166; CHECK-NEXT:    # encoding: [0xeb,A]
1167; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1168entry:
1169  %load1 = load i16, ptr @g16
1170  %and = and i16 %load1, 15
1171  store i16 %and, ptr @g16
1172  %cond = icmp eq i16 %and, 0
1173  br i1 %cond, label %a, label %b
1174
1175a:
1176  tail call void @a()
1177  ret void
1178
1179b:
1180  tail call void @b()
1181  ret void
1182}
1183
1184define void @and16_imm8_neg_br() nounwind {
1185; CHECK-LABEL: and16_imm8_neg_br:
1186; CHECK:       # %bb.0: # %entry
1187; CHECK-NEXT:    andw $-4, g16(%rip) # encoding: [0x66,0x83,0x25,A,A,A,A,0xfc]
1188; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
1189; CHECK-NEXT:    jne b # TAILCALL
1190; CHECK-NEXT:    # encoding: [0x75,A]
1191; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1192; CHECK-NEXT:  # %bb.1: # %a
1193; CHECK-NEXT:    jmp a # TAILCALL
1194; CHECK-NEXT:    # encoding: [0xeb,A]
1195; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1196entry:
1197  %load1 = load i16, ptr @g16
1198  %and = and i16 %load1, -4
1199  store i16 %and, ptr @g16
1200  %cond = icmp eq i16 %and, 0
1201  br i1 %cond, label %a, label %b
1202
1203a:
1204  tail call void @a()
1205  ret void
1206
1207b:
1208  tail call void @b()
1209  ret void
1210}
1211
1212define void @and8_imm_br() nounwind {
1213; CHECK-LABEL: and8_imm_br:
1214; CHECK:       # %bb.0: # %entry
1215; CHECK-NEXT:    andb $-4, g8(%rip) # encoding: [0x80,0x25,A,A,A,A,0xfc]
1216; CHECK-NEXT:    # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
1217; CHECK-NEXT:    jne b # TAILCALL
1218; CHECK-NEXT:    # encoding: [0x75,A]
1219; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1220; CHECK-NEXT:  # %bb.1: # %a
1221; CHECK-NEXT:    jmp a # TAILCALL
1222; CHECK-NEXT:    # encoding: [0xeb,A]
1223; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1224entry:
1225  %load1 = load i8, ptr @g8
1226  %and = and i8 %load1, -4
1227  store i8 %and, ptr @g8
1228  %cond = icmp eq i8 %and, 0
1229  br i1 %cond, label %a, label %b
1230
1231a:
1232  tail call void @a()
1233  ret void
1234
1235b:
1236  tail call void @b()
1237  ret void
1238}
1239
1240define void @and64_reg_br(i64 %arg) nounwind {
1241; CHECK-LABEL: and64_reg_br:
1242; CHECK:       # %bb.0: # %entry
1243; CHECK-NEXT:    andq %rdi, g64(%rip) # encoding: [0x48,0x21,0x3d,A,A,A,A]
1244; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
1245; CHECK-NEXT:    jne b # TAILCALL
1246; CHECK-NEXT:    # encoding: [0x75,A]
1247; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1248; CHECK-NEXT:  # %bb.1: # %a
1249; CHECK-NEXT:    jmp a # TAILCALL
1250; CHECK-NEXT:    # encoding: [0xeb,A]
1251; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1252entry:
1253  %load1 = load i64, ptr @g64
1254  %and = and i64 %load1, %arg
1255  store i64 %and, ptr @g64
1256  %cond = icmp eq i64 %and, 0
1257  br i1 %cond, label %a, label %b
1258
1259a:
1260  tail call void @a()
1261  ret void
1262
1263b:
1264  tail call void @b()
1265  ret void
1266}
1267
1268define void @and32_reg_br(i32 %arg) nounwind {
1269; CHECK-LABEL: and32_reg_br:
1270; CHECK:       # %bb.0: # %entry
1271; CHECK-NEXT:    andl %edi, g32(%rip) # encoding: [0x21,0x3d,A,A,A,A]
1272; CHECK-NEXT:    # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
1273; CHECK-NEXT:    jne b # TAILCALL
1274; CHECK-NEXT:    # encoding: [0x75,A]
1275; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1276; CHECK-NEXT:  # %bb.1: # %a
1277; CHECK-NEXT:    jmp a # TAILCALL
1278; CHECK-NEXT:    # encoding: [0xeb,A]
1279; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1280entry:
1281  %load1 = load i32, ptr @g32
1282  %and = and i32 %load1, %arg
1283  store i32 %and, ptr @g32
1284  %cond = icmp eq i32 %and, 0
1285  br i1 %cond, label %a, label %b
1286
1287a:
1288  tail call void @a()
1289  ret void
1290
1291b:
1292  tail call void @b()
1293  ret void
1294}
1295
1296define void @and16_reg_br(i16 %arg) nounwind {
1297; CHECK-LABEL: and16_reg_br:
1298; CHECK:       # %bb.0: # %entry
1299; CHECK-NEXT:    andw %di, g16(%rip) # encoding: [0x66,0x21,0x3d,A,A,A,A]
1300; CHECK-NEXT:    # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
1301; CHECK-NEXT:    jne b # TAILCALL
1302; CHECK-NEXT:    # encoding: [0x75,A]
1303; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1304; CHECK-NEXT:  # %bb.1: # %a
1305; CHECK-NEXT:    jmp a # TAILCALL
1306; CHECK-NEXT:    # encoding: [0xeb,A]
1307; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1308entry:
1309  %load1 = load i16, ptr @g16
1310  %and = and i16 %load1, %arg
1311  store i16 %and, ptr @g16
1312  %cond = icmp eq i16 %and, 0
1313  br i1 %cond, label %a, label %b
1314
1315a:
1316  tail call void @a()
1317  ret void
1318
1319b:
1320  tail call void @b()
1321  ret void
1322}
1323
1324define void @and8_reg_br(i8 %arg) nounwind {
1325; CHECK-LABEL: and8_reg_br:
1326; CHECK:       # %bb.0: # %entry
1327; CHECK-NEXT:    andb %dil, g8(%rip) # encoding: [0x40,0x20,0x3d,A,A,A,A]
1328; CHECK-NEXT:    # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
1329; CHECK-NEXT:    jne b # TAILCALL
1330; CHECK-NEXT:    # encoding: [0x75,A]
1331; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1332; CHECK-NEXT:  # %bb.1: # %a
1333; CHECK-NEXT:    jmp a # TAILCALL
1334; CHECK-NEXT:    # encoding: [0xeb,A]
1335; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1336entry:
1337  %load1 = load i8, ptr @g8
1338  %and = and i8 %load1, %arg
1339  store i8 %and, ptr @g8
1340  %cond = icmp eq i8 %and, 0
1341  br i1 %cond, label %a, label %b
1342
1343a:
1344  tail call void @a()
1345  ret void
1346
1347b:
1348  tail call void @b()
1349  ret void
1350}
1351
1352define void @or64_imm32_br() nounwind {
1353; CHECK-LABEL: or64_imm32_br:
1354; CHECK:       # %bb.0: # %entry
1355; CHECK-NEXT:    orq $16777215, g64(%rip) # encoding: [0x48,0x81,0x0d,A,A,A,A,0xff,0xff,0xff,0x00]
1356; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
1357; CHECK-NEXT:    # imm = 0xFFFFFF
1358; CHECK-NEXT:    jne b # TAILCALL
1359; CHECK-NEXT:    # encoding: [0x75,A]
1360; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1361; CHECK-NEXT:  # %bb.1: # %a
1362; CHECK-NEXT:    jmp a # TAILCALL
1363; CHECK-NEXT:    # encoding: [0xeb,A]
1364; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1365entry:
1366  %load1 = load i64, ptr @g64
1367  ; Or 0x00FFFFFF, a positive immediate requiring 24-bits.
1368  %or = or i64 %load1, 16777215
1369  store i64 %or, ptr @g64
1370  %cond = icmp eq i64 %or, 0
1371  br i1 %cond, label %a, label %b
1372
1373a:
1374  tail call void @a()
1375  ret void
1376
1377b:
1378  tail call void @b()
1379  ret void
1380}
1381
1382define void @or64_sext_imm32_br() nounwind {
1383; CHECK-LABEL: or64_sext_imm32_br:
1384; CHECK:       # %bb.0: # %entry
1385; CHECK-NEXT:    orq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x0d,A,A,A,A,0x00,0x00,0x00,0x80]
1386; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
1387; CHECK-NEXT:    # imm = 0x80000000
1388; CHECK-NEXT:    jne b # TAILCALL
1389; CHECK-NEXT:    # encoding: [0x75,A]
1390; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1391; CHECK-NEXT:  # %bb.1: # %a
1392; CHECK-NEXT:    jmp a # TAILCALL
1393; CHECK-NEXT:    # encoding: [0xeb,A]
1394; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1395entry:
1396  %load1 = load i64, ptr @g64
1397  ; Or -0x80000000, which requires sign-extended 32 bits.
1398  %or = or i64 %load1, -2147483648
1399  store i64 %or, ptr @g64
1400  %cond = icmp eq i64 %or, 0
1401  br i1 %cond, label %a, label %b
1402
1403a:
1404  tail call void @a()
1405  ret void
1406
1407b:
1408  tail call void @b()
1409  ret void
1410}
1411
1412define void @or64_imm8_br() nounwind {
1413; CHECK-LABEL: or64_imm8_br:
1414; CHECK:       # %bb.0: # %entry
1415; CHECK-NEXT:    orq $15, g64(%rip) # encoding: [0x48,0x83,0x0d,A,A,A,A,0x0f]
1416; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
1417; CHECK-NEXT:    jne b # TAILCALL
1418; CHECK-NEXT:    # encoding: [0x75,A]
1419; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1420; CHECK-NEXT:  # %bb.1: # %a
1421; CHECK-NEXT:    jmp a # TAILCALL
1422; CHECK-NEXT:    # encoding: [0xeb,A]
1423; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1424entry:
1425  %load1 = load i64, ptr @g64
1426  %or = or i64 %load1, 15
1427  store i64 %or, ptr @g64
1428  %cond = icmp eq i64 %or, 0
1429  br i1 %cond, label %a, label %b
1430
1431a:
1432  tail call void @a()
1433  ret void
1434
1435b:
1436  tail call void @b()
1437  ret void
1438}
1439
1440define void @or64_imm8_neg_br() nounwind {
1441; CHECK-LABEL: or64_imm8_neg_br:
1442; CHECK:       # %bb.0: # %entry
1443; CHECK-NEXT:    orq $-4, g64(%rip) # encoding: [0x48,0x83,0x0d,A,A,A,A,0xfc]
1444; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
1445; CHECK-NEXT:    jne b # TAILCALL
1446; CHECK-NEXT:    # encoding: [0x75,A]
1447; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1448; CHECK-NEXT:  # %bb.1: # %a
1449; CHECK-NEXT:    jmp a # TAILCALL
1450; CHECK-NEXT:    # encoding: [0xeb,A]
1451; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1452entry:
1453  %load1 = load i64, ptr @g64
1454  %or = or i64 %load1, -4
1455  store i64 %or, ptr @g64
1456  %cond = icmp eq i64 %or, 0
1457  br i1 %cond, label %a, label %b
1458
1459a:
1460  tail call void @a()
1461  ret void
1462
1463b:
1464  tail call void @b()
1465  ret void
1466}
1467
1468define void @or32_imm_br() nounwind {
1469; CHECK-LABEL: or32_imm_br:
1470; CHECK:       # %bb.0: # %entry
1471; CHECK-NEXT:    orl $-2147483648, g32(%rip) # encoding: [0x81,0x0d,A,A,A,A,0x00,0x00,0x00,0x80]
1472; CHECK-NEXT:    # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
1473; CHECK-NEXT:    # imm = 0x80000000
1474; CHECK-NEXT:    jne b # TAILCALL
1475; CHECK-NEXT:    # encoding: [0x75,A]
1476; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1477; CHECK-NEXT:  # %bb.1: # %a
1478; CHECK-NEXT:    jmp a # TAILCALL
1479; CHECK-NEXT:    # encoding: [0xeb,A]
1480; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1481entry:
1482  %load1 = load i32, ptr @g32
1483  ; Or 0x80000000, a positive number requiring 32 bits of immediate.
1484  %or = or i32 %load1, 2147483648
1485  store i32 %or, ptr @g32
1486  %cond = icmp eq i32 %or, 0
1487  br i1 %cond, label %a, label %b
1488
1489a:
1490  tail call void @a()
1491  ret void
1492
1493b:
1494  tail call void @b()
1495  ret void
1496}
1497
1498define void @or32_imm8_br() nounwind {
1499; CHECK-LABEL: or32_imm8_br:
1500; CHECK:       # %bb.0: # %entry
1501; CHECK-NEXT:    orl $15, g32(%rip) # encoding: [0x83,0x0d,A,A,A,A,0x0f]
1502; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
1503; CHECK-NEXT:    jne b # TAILCALL
1504; CHECK-NEXT:    # encoding: [0x75,A]
1505; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1506; CHECK-NEXT:  # %bb.1: # %a
1507; CHECK-NEXT:    jmp a # TAILCALL
1508; CHECK-NEXT:    # encoding: [0xeb,A]
1509; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1510entry:
1511  %load1 = load i32, ptr @g32
1512  %or = or i32 %load1, 15
1513  store i32 %or, ptr @g32
1514  %cond = icmp eq i32 %or, 0
1515  br i1 %cond, label %a, label %b
1516
1517a:
1518  tail call void @a()
1519  ret void
1520
1521b:
1522  tail call void @b()
1523  ret void
1524}
1525
1526define void @or32_imm8_neg_br() nounwind {
1527; CHECK-LABEL: or32_imm8_neg_br:
1528; CHECK:       # %bb.0: # %entry
1529; CHECK-NEXT:    orl $-4, g32(%rip) # encoding: [0x83,0x0d,A,A,A,A,0xfc]
1530; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
1531; CHECK-NEXT:    jne b # TAILCALL
1532; CHECK-NEXT:    # encoding: [0x75,A]
1533; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1534; CHECK-NEXT:  # %bb.1: # %a
1535; CHECK-NEXT:    jmp a # TAILCALL
1536; CHECK-NEXT:    # encoding: [0xeb,A]
1537; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1538entry:
1539  %load1 = load i32, ptr @g32
1540  %or = or i32 %load1, -4
1541  store i32 %or, ptr @g32
1542  %cond = icmp eq i32 %or, 0
1543  br i1 %cond, label %a, label %b
1544
1545a:
1546  tail call void @a()
1547  ret void
1548
1549b:
1550  tail call void @b()
1551  ret void
1552}
1553
1554define void @or16_imm_br() nounwind {
1555; CHECK-LABEL: or16_imm_br:
1556; CHECK:       # %bb.0: # %entry
1557; CHECK-NEXT:    orw $-32768, g16(%rip) # encoding: [0x66,0x81,0x0d,A,A,A,A,0x00,0x80]
1558; CHECK-NEXT:    # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
1559; CHECK-NEXT:    # imm = 0x8000
1560; CHECK-NEXT:    jne b # TAILCALL
1561; CHECK-NEXT:    # encoding: [0x75,A]
1562; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1563; CHECK-NEXT:  # %bb.1: # %a
1564; CHECK-NEXT:    jmp a # TAILCALL
1565; CHECK-NEXT:    # encoding: [0xeb,A]
1566; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1567entry:
1568  %load1 = load i16, ptr @g16
1569  %or = or i16 %load1, 32768
1570  store i16 %or, ptr @g16
1571  %cond = icmp eq i16 %or, 0
1572  br i1 %cond, label %a, label %b
1573
1574a:
1575  tail call void @a()
1576  ret void
1577
1578b:
1579  tail call void @b()
1580  ret void
1581}
1582
1583define void @or16_imm8_br() nounwind {
1584; CHECK-LABEL: or16_imm8_br:
1585; CHECK:       # %bb.0: # %entry
1586; CHECK-NEXT:    orw $15, g16(%rip) # encoding: [0x66,0x83,0x0d,A,A,A,A,0x0f]
1587; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
1588; CHECK-NEXT:    jne b # TAILCALL
1589; CHECK-NEXT:    # encoding: [0x75,A]
1590; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1591; CHECK-NEXT:  # %bb.1: # %a
1592; CHECK-NEXT:    jmp a # TAILCALL
1593; CHECK-NEXT:    # encoding: [0xeb,A]
1594; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1595entry:
1596  %load1 = load i16, ptr @g16
1597  %or = or i16 %load1, 15
1598  store i16 %or, ptr @g16
1599  %cond = icmp eq i16 %or, 0
1600  br i1 %cond, label %a, label %b
1601
1602a:
1603  tail call void @a()
1604  ret void
1605
1606b:
1607  tail call void @b()
1608  ret void
1609}
1610
1611define void @or16_imm8_neg_br() nounwind {
1612; CHECK-LABEL: or16_imm8_neg_br:
1613; CHECK:       # %bb.0: # %entry
1614; CHECK-NEXT:    orw $-4, g16(%rip) # encoding: [0x66,0x83,0x0d,A,A,A,A,0xfc]
1615; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
1616; CHECK-NEXT:    jne b # TAILCALL
1617; CHECK-NEXT:    # encoding: [0x75,A]
1618; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1619; CHECK-NEXT:  # %bb.1: # %a
1620; CHECK-NEXT:    jmp a # TAILCALL
1621; CHECK-NEXT:    # encoding: [0xeb,A]
1622; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1623entry:
1624  %load1 = load i16, ptr @g16
1625  %or = or i16 %load1, -4
1626  store i16 %or, ptr @g16
1627  %cond = icmp eq i16 %or, 0
1628  br i1 %cond, label %a, label %b
1629
1630a:
1631  tail call void @a()
1632  ret void
1633
1634b:
1635  tail call void @b()
1636  ret void
1637}
1638
1639define void @or8_imm_br() nounwind {
1640; CHECK-LABEL: or8_imm_br:
1641; CHECK:       # %bb.0: # %entry
1642; CHECK-NEXT:    orb $-4, g8(%rip) # encoding: [0x80,0x0d,A,A,A,A,0xfc]
1643; CHECK-NEXT:    # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
1644; CHECK-NEXT:    jne b # TAILCALL
1645; CHECK-NEXT:    # encoding: [0x75,A]
1646; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1647; CHECK-NEXT:  # %bb.1: # %a
1648; CHECK-NEXT:    jmp a # TAILCALL
1649; CHECK-NEXT:    # encoding: [0xeb,A]
1650; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1651entry:
1652  %load1 = load i8, ptr @g8
1653  %or = or i8 %load1, -4
1654  store i8 %or, ptr @g8
1655  %cond = icmp eq i8 %or, 0
1656  br i1 %cond, label %a, label %b
1657
1658a:
1659  tail call void @a()
1660  ret void
1661
1662b:
1663  tail call void @b()
1664  ret void
1665}
1666
1667define void @or64_reg_br(i64 %arg) nounwind {
1668; CHECK-LABEL: or64_reg_br:
1669; CHECK:       # %bb.0: # %entry
1670; CHECK-NEXT:    orq %rdi, g64(%rip) # encoding: [0x48,0x09,0x3d,A,A,A,A]
1671; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
1672; CHECK-NEXT:    jne b # TAILCALL
1673; CHECK-NEXT:    # encoding: [0x75,A]
1674; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1675; CHECK-NEXT:  # %bb.1: # %a
1676; CHECK-NEXT:    jmp a # TAILCALL
1677; CHECK-NEXT:    # encoding: [0xeb,A]
1678; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1679entry:
1680  %load1 = load i64, ptr @g64
1681  %or = or i64 %load1, %arg
1682  store i64 %or, ptr @g64
1683  %cond = icmp eq i64 %or, 0
1684  br i1 %cond, label %a, label %b
1685
1686a:
1687  tail call void @a()
1688  ret void
1689
1690b:
1691  tail call void @b()
1692  ret void
1693}
1694
1695define void @or32_reg_br(i32 %arg) nounwind {
1696; CHECK-LABEL: or32_reg_br:
1697; CHECK:       # %bb.0: # %entry
1698; CHECK-NEXT:    orl %edi, g32(%rip) # encoding: [0x09,0x3d,A,A,A,A]
1699; CHECK-NEXT:    # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
1700; CHECK-NEXT:    jne b # TAILCALL
1701; CHECK-NEXT:    # encoding: [0x75,A]
1702; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1703; CHECK-NEXT:  # %bb.1: # %a
1704; CHECK-NEXT:    jmp a # TAILCALL
1705; CHECK-NEXT:    # encoding: [0xeb,A]
1706; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1707entry:
1708  %load1 = load i32, ptr @g32
1709  %or = or i32 %load1, %arg
1710  store i32 %or, ptr @g32
1711  %cond = icmp eq i32 %or, 0
1712  br i1 %cond, label %a, label %b
1713
1714a:
1715  tail call void @a()
1716  ret void
1717
1718b:
1719  tail call void @b()
1720  ret void
1721}
1722
1723define void @or16_reg_br(i16 %arg) nounwind {
1724; CHECK-LABEL: or16_reg_br:
1725; CHECK:       # %bb.0: # %entry
1726; CHECK-NEXT:    orw %di, g16(%rip) # encoding: [0x66,0x09,0x3d,A,A,A,A]
1727; CHECK-NEXT:    # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
1728; CHECK-NEXT:    jne b # TAILCALL
1729; CHECK-NEXT:    # encoding: [0x75,A]
1730; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1731; CHECK-NEXT:  # %bb.1: # %a
1732; CHECK-NEXT:    jmp a # TAILCALL
1733; CHECK-NEXT:    # encoding: [0xeb,A]
1734; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1735entry:
1736  %load1 = load i16, ptr @g16
1737  %or = or i16 %load1, %arg
1738  store i16 %or, ptr @g16
1739  %cond = icmp eq i16 %or, 0
1740  br i1 %cond, label %a, label %b
1741
1742a:
1743  tail call void @a()
1744  ret void
1745
1746b:
1747  tail call void @b()
1748  ret void
1749}
1750
1751define void @or8_reg_br(i8 %arg) nounwind {
1752; CHECK-LABEL: or8_reg_br:
1753; CHECK:       # %bb.0: # %entry
1754; CHECK-NEXT:    orb %dil, g8(%rip) # encoding: [0x40,0x08,0x3d,A,A,A,A]
1755; CHECK-NEXT:    # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
1756; CHECK-NEXT:    jne b # TAILCALL
1757; CHECK-NEXT:    # encoding: [0x75,A]
1758; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1759; CHECK-NEXT:  # %bb.1: # %a
1760; CHECK-NEXT:    jmp a # TAILCALL
1761; CHECK-NEXT:    # encoding: [0xeb,A]
1762; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1763entry:
1764  %load1 = load i8, ptr @g8
1765  %or = or i8 %load1, %arg
1766  store i8 %or, ptr @g8
1767  %cond = icmp eq i8 %or, 0
1768  br i1 %cond, label %a, label %b
1769
1770a:
1771  tail call void @a()
1772  ret void
1773
1774b:
1775  tail call void @b()
1776  ret void
1777}
1778
1779define void @xor64_imm32_br() nounwind {
1780; CHECK-LABEL: xor64_imm32_br:
1781; CHECK:       # %bb.0: # %entry
1782; CHECK-NEXT:    xorq $16777215, g64(%rip) # encoding: [0x48,0x81,0x35,A,A,A,A,0xff,0xff,0xff,0x00]
1783; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
1784; CHECK-NEXT:    # imm = 0xFFFFFF
1785; CHECK-NEXT:    jne b # TAILCALL
1786; CHECK-NEXT:    # encoding: [0x75,A]
1787; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1788; CHECK-NEXT:  # %bb.1: # %a
1789; CHECK-NEXT:    jmp a # TAILCALL
1790; CHECK-NEXT:    # encoding: [0xeb,A]
1791; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1792entry:
1793  %load1 = load i64, ptr @g64
1794  ; Xor 0x00FFFFFF, a positive immediate requiring 24-bits.
1795  %xor = xor i64 %load1, 16777215
1796  store i64 %xor, ptr @g64
1797  %cond = icmp eq i64 %xor, 0
1798  br i1 %cond, label %a, label %b
1799
1800a:
1801  tail call void @a()
1802  ret void
1803
1804b:
1805  tail call void @b()
1806  ret void
1807}
1808
1809define void @xor64_sext_imm32_br() nounwind {
1810; CHECK-LABEL: xor64_sext_imm32_br:
1811; CHECK:       # %bb.0: # %entry
1812; CHECK-NEXT:    xorq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x35,A,A,A,A,0x00,0x00,0x00,0x80]
1813; CHECK-NEXT:    # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
1814; CHECK-NEXT:    # imm = 0x80000000
1815; CHECK-NEXT:    jne b # TAILCALL
1816; CHECK-NEXT:    # encoding: [0x75,A]
1817; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1818; CHECK-NEXT:  # %bb.1: # %a
1819; CHECK-NEXT:    jmp a # TAILCALL
1820; CHECK-NEXT:    # encoding: [0xeb,A]
1821; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1822entry:
1823  %load1 = load i64, ptr @g64
1824  ; Xor -0x80000000, which requires sign-extended 32 bits.
1825  %xor = xor i64 %load1, -2147483648
1826  store i64 %xor, ptr @g64
1827  %cond = icmp eq i64 %xor, 0
1828  br i1 %cond, label %a, label %b
1829
1830a:
1831  tail call void @a()
1832  ret void
1833
1834b:
1835  tail call void @b()
1836  ret void
1837}
1838
1839define void @xor64_imm8_br() nounwind {
1840; CHECK-LABEL: xor64_imm8_br:
1841; CHECK:       # %bb.0: # %entry
1842; CHECK-NEXT:    xorq $15, g64(%rip) # encoding: [0x48,0x83,0x35,A,A,A,A,0x0f]
1843; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
1844; CHECK-NEXT:    jne b # TAILCALL
1845; CHECK-NEXT:    # encoding: [0x75,A]
1846; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1847; CHECK-NEXT:  # %bb.1: # %a
1848; CHECK-NEXT:    jmp a # TAILCALL
1849; CHECK-NEXT:    # encoding: [0xeb,A]
1850; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1851entry:
1852  %load1 = load i64, ptr @g64
1853  %xor = xor i64 %load1, 15
1854  store i64 %xor, ptr @g64
1855  %cond = icmp eq i64 %xor, 0
1856  br i1 %cond, label %a, label %b
1857
1858a:
1859  tail call void @a()
1860  ret void
1861
1862b:
1863  tail call void @b()
1864  ret void
1865}
1866
1867define void @xor64_imm8_neg_br() nounwind {
1868; CHECK-LABEL: xor64_imm8_neg_br:
1869; CHECK:       # %bb.0: # %entry
1870; CHECK-NEXT:    xorq $-4, g64(%rip) # encoding: [0x48,0x83,0x35,A,A,A,A,0xfc]
1871; CHECK-NEXT:    # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
1872; CHECK-NEXT:    jne b # TAILCALL
1873; CHECK-NEXT:    # encoding: [0x75,A]
1874; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1875; CHECK-NEXT:  # %bb.1: # %a
1876; CHECK-NEXT:    jmp a # TAILCALL
1877; CHECK-NEXT:    # encoding: [0xeb,A]
1878; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1879entry:
1880  %load1 = load i64, ptr @g64
1881  %xor = xor i64 %load1, -4
1882  store i64 %xor, ptr @g64
1883  %cond = icmp eq i64 %xor, 0
1884  br i1 %cond, label %a, label %b
1885
1886a:
1887  tail call void @a()
1888  ret void
1889
1890b:
1891  tail call void @b()
1892  ret void
1893}
1894
1895define void @xor32_imm_br() nounwind {
1896; CHECK-LABEL: xor32_imm_br:
1897; CHECK:       # %bb.0: # %entry
1898; CHECK-NEXT:    xorl $-2147483648, g32(%rip) # encoding: [0x81,0x35,A,A,A,A,0x00,0x00,0x00,0x80]
1899; CHECK-NEXT:    # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
1900; CHECK-NEXT:    # imm = 0x80000000
1901; CHECK-NEXT:    jne b # TAILCALL
1902; CHECK-NEXT:    # encoding: [0x75,A]
1903; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1904; CHECK-NEXT:  # %bb.1: # %a
1905; CHECK-NEXT:    jmp a # TAILCALL
1906; CHECK-NEXT:    # encoding: [0xeb,A]
1907; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1908entry:
1909  %load1 = load i32, ptr @g32
1910  ; Xor 0x80000000, a positive number requiring 32 bits of immediate.
1911  %xor = xor i32 %load1, 2147483648
1912  store i32 %xor, ptr @g32
1913  %cond = icmp eq i32 %xor, 0
1914  br i1 %cond, label %a, label %b
1915
1916a:
1917  tail call void @a()
1918  ret void
1919
1920b:
1921  tail call void @b()
1922  ret void
1923}
1924
1925define void @xor32_imm8_br() nounwind {
1926; CHECK-LABEL: xor32_imm8_br:
1927; CHECK:       # %bb.0: # %entry
1928; CHECK-NEXT:    xorl $15, g32(%rip) # encoding: [0x83,0x35,A,A,A,A,0x0f]
1929; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
1930; CHECK-NEXT:    jne b # TAILCALL
1931; CHECK-NEXT:    # encoding: [0x75,A]
1932; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1933; CHECK-NEXT:  # %bb.1: # %a
1934; CHECK-NEXT:    jmp a # TAILCALL
1935; CHECK-NEXT:    # encoding: [0xeb,A]
1936; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1937entry:
1938  %load1 = load i32, ptr @g32
1939  %xor = xor i32 %load1, 15
1940  store i32 %xor, ptr @g32
1941  %cond = icmp eq i32 %xor, 0
1942  br i1 %cond, label %a, label %b
1943
1944a:
1945  tail call void @a()
1946  ret void
1947
1948b:
1949  tail call void @b()
1950  ret void
1951}
1952
1953define void @xor32_imm8_neg_br() nounwind {
1954; CHECK-LABEL: xor32_imm8_neg_br:
1955; CHECK:       # %bb.0: # %entry
1956; CHECK-NEXT:    xorl $-4, g32(%rip) # encoding: [0x83,0x35,A,A,A,A,0xfc]
1957; CHECK-NEXT:    # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
1958; CHECK-NEXT:    jne b # TAILCALL
1959; CHECK-NEXT:    # encoding: [0x75,A]
1960; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1961; CHECK-NEXT:  # %bb.1: # %a
1962; CHECK-NEXT:    jmp a # TAILCALL
1963; CHECK-NEXT:    # encoding: [0xeb,A]
1964; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1965entry:
1966  %load1 = load i32, ptr @g32
1967  %xor = xor i32 %load1, -4
1968  store i32 %xor, ptr @g32
1969  %cond = icmp eq i32 %xor, 0
1970  br i1 %cond, label %a, label %b
1971
1972a:
1973  tail call void @a()
1974  ret void
1975
1976b:
1977  tail call void @b()
1978  ret void
1979}
1980
1981define void @xor16_imm_br() nounwind {
1982; CHECK-LABEL: xor16_imm_br:
1983; CHECK:       # %bb.0: # %entry
1984; CHECK-NEXT:    xorw $-32768, g16(%rip) # encoding: [0x66,0x81,0x35,A,A,A,A,0x00,0x80]
1985; CHECK-NEXT:    # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
1986; CHECK-NEXT:    # imm = 0x8000
1987; CHECK-NEXT:    jne b # TAILCALL
1988; CHECK-NEXT:    # encoding: [0x75,A]
1989; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
1990; CHECK-NEXT:  # %bb.1: # %a
1991; CHECK-NEXT:    jmp a # TAILCALL
1992; CHECK-NEXT:    # encoding: [0xeb,A]
1993; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
1994entry:
1995  %load1 = load i16, ptr @g16
1996  %xor = xor i16 %load1, 32768
1997  store i16 %xor, ptr @g16
1998  %cond = icmp eq i16 %xor, 0
1999  br i1 %cond, label %a, label %b
2000
2001a:
2002  tail call void @a()
2003  ret void
2004
2005b:
2006  tail call void @b()
2007  ret void
2008}
2009
2010define void @xor16_imm8_br() nounwind {
2011; CHECK-LABEL: xor16_imm8_br:
2012; CHECK:       # %bb.0: # %entry
2013; CHECK-NEXT:    xorw $15, g16(%rip) # encoding: [0x66,0x83,0x35,A,A,A,A,0x0f]
2014; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
2015; CHECK-NEXT:    jne b # TAILCALL
2016; CHECK-NEXT:    # encoding: [0x75,A]
2017; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2018; CHECK-NEXT:  # %bb.1: # %a
2019; CHECK-NEXT:    jmp a # TAILCALL
2020; CHECK-NEXT:    # encoding: [0xeb,A]
2021; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2022entry:
2023  %load1 = load i16, ptr @g16
2024  %xor = xor i16 %load1, 15
2025  store i16 %xor, ptr @g16
2026  %cond = icmp eq i16 %xor, 0
2027  br i1 %cond, label %a, label %b
2028
2029a:
2030  tail call void @a()
2031  ret void
2032
2033b:
2034  tail call void @b()
2035  ret void
2036}
2037
2038define void @xor16_imm8_neg_br() nounwind {
2039; CHECK-LABEL: xor16_imm8_neg_br:
2040; CHECK:       # %bb.0: # %entry
2041; CHECK-NEXT:    xorw $-4, g16(%rip) # encoding: [0x66,0x83,0x35,A,A,A,A,0xfc]
2042; CHECK-NEXT:    # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
2043; CHECK-NEXT:    jne b # TAILCALL
2044; CHECK-NEXT:    # encoding: [0x75,A]
2045; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2046; CHECK-NEXT:  # %bb.1: # %a
2047; CHECK-NEXT:    jmp a # TAILCALL
2048; CHECK-NEXT:    # encoding: [0xeb,A]
2049; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2050entry:
2051  %load1 = load i16, ptr @g16
2052  %xor = xor i16 %load1, -4
2053  store i16 %xor, ptr @g16
2054  %cond = icmp eq i16 %xor, 0
2055  br i1 %cond, label %a, label %b
2056
2057a:
2058  tail call void @a()
2059  ret void
2060
2061b:
2062  tail call void @b()
2063  ret void
2064}
2065
2066define void @xor8_imm_br() nounwind {
2067; CHECK-LABEL: xor8_imm_br:
2068; CHECK:       # %bb.0: # %entry
2069; CHECK-NEXT:    xorb $-4, g8(%rip) # encoding: [0x80,0x35,A,A,A,A,0xfc]
2070; CHECK-NEXT:    # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
2071; CHECK-NEXT:    jne b # TAILCALL
2072; CHECK-NEXT:    # encoding: [0x75,A]
2073; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2074; CHECK-NEXT:  # %bb.1: # %a
2075; CHECK-NEXT:    jmp a # TAILCALL
2076; CHECK-NEXT:    # encoding: [0xeb,A]
2077; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2078entry:
2079  %load1 = load i8, ptr @g8
2080  %xor = xor i8 %load1, -4
2081  store i8 %xor, ptr @g8
2082  %cond = icmp eq i8 %xor, 0
2083  br i1 %cond, label %a, label %b
2084
2085a:
2086  tail call void @a()
2087  ret void
2088
2089b:
2090  tail call void @b()
2091  ret void
2092}
2093
2094define void @xor64_reg_br(i64 %arg) nounwind {
2095; CHECK-LABEL: xor64_reg_br:
2096; CHECK:       # %bb.0: # %entry
2097; CHECK-NEXT:    xorq %rdi, g64(%rip) # encoding: [0x48,0x31,0x3d,A,A,A,A]
2098; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
2099; CHECK-NEXT:    jne b # TAILCALL
2100; CHECK-NEXT:    # encoding: [0x75,A]
2101; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2102; CHECK-NEXT:  # %bb.1: # %a
2103; CHECK-NEXT:    jmp a # TAILCALL
2104; CHECK-NEXT:    # encoding: [0xeb,A]
2105; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2106entry:
2107  %load1 = load i64, ptr @g64
2108  %xor = xor i64 %load1, %arg
2109  store i64 %xor, ptr @g64
2110  %cond = icmp eq i64 %xor, 0
2111  br i1 %cond, label %a, label %b
2112
2113a:
2114  tail call void @a()
2115  ret void
2116
2117b:
2118  tail call void @b()
2119  ret void
2120}
2121
2122define void @xor32_reg_br(i32 %arg) nounwind {
2123; CHECK-LABEL: xor32_reg_br:
2124; CHECK:       # %bb.0: # %entry
2125; CHECK-NEXT:    xorl %edi, g32(%rip) # encoding: [0x31,0x3d,A,A,A,A]
2126; CHECK-NEXT:    # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
2127; CHECK-NEXT:    jne b # TAILCALL
2128; CHECK-NEXT:    # encoding: [0x75,A]
2129; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2130; CHECK-NEXT:  # %bb.1: # %a
2131; CHECK-NEXT:    jmp a # TAILCALL
2132; CHECK-NEXT:    # encoding: [0xeb,A]
2133; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2134entry:
2135  %load1 = load i32, ptr @g32
2136  %xor = xor i32 %load1, %arg
2137  store i32 %xor, ptr @g32
2138  %cond = icmp eq i32 %xor, 0
2139  br i1 %cond, label %a, label %b
2140
2141a:
2142  tail call void @a()
2143  ret void
2144
2145b:
2146  tail call void @b()
2147  ret void
2148}
2149
2150define void @xor16_reg_br(i16 %arg) nounwind {
2151; CHECK-LABEL: xor16_reg_br:
2152; CHECK:       # %bb.0: # %entry
2153; CHECK-NEXT:    xorw %di, g16(%rip) # encoding: [0x66,0x31,0x3d,A,A,A,A]
2154; CHECK-NEXT:    # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
2155; CHECK-NEXT:    jne b # TAILCALL
2156; CHECK-NEXT:    # encoding: [0x75,A]
2157; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2158; CHECK-NEXT:  # %bb.1: # %a
2159; CHECK-NEXT:    jmp a # TAILCALL
2160; CHECK-NEXT:    # encoding: [0xeb,A]
2161; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2162entry:
2163  %load1 = load i16, ptr @g16
2164  %xor = xor i16 %load1, %arg
2165  store i16 %xor, ptr @g16
2166  %cond = icmp eq i16 %xor, 0
2167  br i1 %cond, label %a, label %b
2168
2169a:
2170  tail call void @a()
2171  ret void
2172
2173b:
2174  tail call void @b()
2175  ret void
2176}
2177
2178define void @xor8_reg_br(i8 %arg) nounwind {
2179; CHECK-LABEL: xor8_reg_br:
2180; CHECK:       # %bb.0: # %entry
2181; CHECK-NEXT:    xorb %dil, g8(%rip) # encoding: [0x40,0x30,0x3d,A,A,A,A]
2182; CHECK-NEXT:    # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
2183; CHECK-NEXT:    jne b # TAILCALL
2184; CHECK-NEXT:    # encoding: [0x75,A]
2185; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2186; CHECK-NEXT:  # %bb.1: # %a
2187; CHECK-NEXT:    jmp a # TAILCALL
2188; CHECK-NEXT:    # encoding: [0xeb,A]
2189; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2190entry:
2191  %load1 = load i8, ptr @g8
2192  %xor = xor i8 %load1, %arg
2193  store i8 %xor, ptr @g8
2194  %cond = icmp eq i8 %xor, 0
2195  br i1 %cond, label %a, label %b
2196
2197a:
2198  tail call void @a()
2199  ret void
2200
2201b:
2202  tail call void @b()
2203  ret void
2204}
2205
2206define void @neg64_br() nounwind {
2207; CHECK-LABEL: neg64_br:
2208; CHECK:       # %bb.0: # %entry
2209; CHECK-NEXT:    negq g64(%rip) # encoding: [0x48,0xf7,0x1d,A,A,A,A]
2210; CHECK-NEXT:    # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
2211; CHECK-NEXT:    jns b # TAILCALL
2212; CHECK-NEXT:    # encoding: [0x79,A]
2213; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2214; CHECK-NEXT:  # %bb.1: # %a
2215; CHECK-NEXT:    jmp a # TAILCALL
2216; CHECK-NEXT:    # encoding: [0xeb,A]
2217; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2218entry:
2219  %load1 = load i64, ptr @g64
2220  %sub = sub i64 0, %load1
2221  store i64 %sub, ptr @g64
2222  %cond = icmp slt i64 %sub, 0
2223  br i1 %cond, label %a, label %b
2224
2225a:
2226  tail call void @a()
2227  ret void
2228
2229b:
2230  tail call void @b()
2231  ret void
2232}
2233
2234define void @neg32_br() nounwind {
2235; CHECK-LABEL: neg32_br:
2236; CHECK:       # %bb.0: # %entry
2237; CHECK-NEXT:    negl g32(%rip) # encoding: [0xf7,0x1d,A,A,A,A]
2238; CHECK-NEXT:    # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
2239; CHECK-NEXT:    jns b # TAILCALL
2240; CHECK-NEXT:    # encoding: [0x79,A]
2241; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2242; CHECK-NEXT:  # %bb.1: # %a
2243; CHECK-NEXT:    jmp a # TAILCALL
2244; CHECK-NEXT:    # encoding: [0xeb,A]
2245; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2246entry:
2247  %load1 = load i32, ptr @g32
2248  %sub = sub i32 0, %load1
2249  store i32 %sub, ptr @g32
2250  %cond = icmp slt i32 %sub, 0
2251  br i1 %cond, label %a, label %b
2252
2253a:
2254  tail call void @a()
2255  ret void
2256
2257b:
2258  tail call void @b()
2259  ret void
2260}
2261
2262define void @neg16_br() nounwind {
2263; CHECK-LABEL: neg16_br:
2264; CHECK:       # %bb.0: # %entry
2265; CHECK-NEXT:    negw g16(%rip) # encoding: [0x66,0xf7,0x1d,A,A,A,A]
2266; CHECK-NEXT:    # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
2267; CHECK-NEXT:    jns b # TAILCALL
2268; CHECK-NEXT:    # encoding: [0x79,A]
2269; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2270; CHECK-NEXT:  # %bb.1: # %a
2271; CHECK-NEXT:    jmp a # TAILCALL
2272; CHECK-NEXT:    # encoding: [0xeb,A]
2273; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2274entry:
2275  %load1 = load i16, ptr @g16
2276  %sub = sub i16 0, %load1
2277  store i16 %sub, ptr @g16
2278  %cond = icmp slt i16 %sub, 0
2279  br i1 %cond, label %a, label %b
2280
2281a:
2282  tail call void @a()
2283  ret void
2284
2285b:
2286  tail call void @b()
2287  ret void
2288}
2289
2290define void @neg8_br() nounwind {
2291; CHECK-LABEL: neg8_br:
2292; CHECK:       # %bb.0: # %entry
2293; CHECK-NEXT:    negb g8(%rip) # encoding: [0xf6,0x1d,A,A,A,A]
2294; CHECK-NEXT:    # fixup A - offset: 2, value: g8-4, kind: reloc_riprel_4byte
2295; CHECK-NEXT:    jns b # TAILCALL
2296; CHECK-NEXT:    # encoding: [0x79,A]
2297; CHECK-NEXT:    # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
2298; CHECK-NEXT:  # %bb.1: # %a
2299; CHECK-NEXT:    jmp a # TAILCALL
2300; CHECK-NEXT:    # encoding: [0xeb,A]
2301; CHECK-NEXT:    # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
2302entry:
2303  %load1 = load i8, ptr @g8
2304  %sub = sub i8 0, %load1
2305  store i8 %sub, ptr @g8
2306  %cond = icmp slt i8 %sub, 0
2307  br i1 %cond, label %a, label %b
2308
2309a:
2310  tail call void @a()
2311  ret void
2312
2313b:
2314  tail call void @b()
2315  ret void
2316}
2317