Improve and enable folding of conditional branches with tail calls. 1. Make it so that conditional tail calls can be emitted even when there are multiple predecessors. 2. Don't guard the transformation behind -Os. The rationale for guarding it was static-prediction can be affected by whether the branch is forward of backward. This is no longer true for almost any X86 cpus (anything newer than `SnB`) so is no longer a meaningful concern. Reviewed By: pengfei Differential Revision: https://reviews.llvm.org/D140931
2317 lines
67 KiB
LLVM
2317 lines
67 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -verify-machineinstrs -show-mc-encoding | FileCheck %s
|
|
|
|
target triple = "x86_64-unknown-unknown"
|
|
|
|
@g64 = external dso_local global i64, align 8
|
|
@g32 = external dso_local global i32, align 4
|
|
@g16 = external dso_local global i16, align 2
|
|
@g8 = external dso_local global i8, align 1
|
|
|
|
declare dso_local void @a()
|
|
declare dso_local void @b()
|
|
|
|
define void @add64_imm32_br() nounwind {
|
|
; CHECK-LABEL: add64_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addq $16777214, g64(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0xfe,0xff,0xff,0x00]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0xFFFFFE
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Add 0x00FFFFFE, a positive immediate requiring 24-bits.
|
|
%add = add i64 %load1, 16777214
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_sext_imm32_br() nounwind {
|
|
; CHECK-LABEL: add64_sext_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Add -0x80000000, which requires sign-extended 32 bits.
|
|
%add = add i64 %load1, -2147483648
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_imm32_via_sub_br() nounwind {
|
|
; CHECK-LABEL: add64_imm32_via_sub_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate. This
|
|
; get's folded because we can instead subtract -0x80000000.
|
|
%add = add i64 %load1, 2147483648
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_no_imm32_via_sub_due_to_cf_br() nounwind {
|
|
; CHECK-LABEL: add64_no_imm32_via_sub_due_to_cf_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movl $2147483648, %eax # encoding: [0xb8,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: addq %rax, g64(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jae b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x73,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate, but
|
|
; could in theory be folded into an immediate operand of a sub. However, we
|
|
; use the CF flag here and so shouldn't make that transformation.
|
|
%add = add i64 %load1, 2147483648
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp ult i64 %add, 2147483648
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_too_large_imm32_br() nounwind {
|
|
; CHECK-LABEL: add64_too_large_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movl $2147483649, %eax # encoding: [0xb8,0x01,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # imm = 0x80000001
|
|
; CHECK-NEXT: addq %rax, g64(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Add 0x80000001, which cannot fit in a sign extended 32-bit immediate. This
|
|
; should not get folded into an immediate.
|
|
%add = add i64 %load1, 2147483649
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_imm8_via_sub_br() nounwind {
|
|
; CHECK-LABEL: add64_imm8_via_sub_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subq $-128, g64(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Add 0x80 which can't quite fit into an imm8 because it would be sign
|
|
; extended, but which can fit if we convert to a sub and negate the value.
|
|
%add = add i64 %load1, 128
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_imm8_br() nounwind {
|
|
; CHECK-LABEL: add64_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addq $42, g64(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0x2a]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%add = add i64 %load1, 42
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: add64_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addq $-42, g64(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0xd6]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%add = add i64 %load1, -42
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add32_imm_br() nounwind {
|
|
; CHECK-LABEL: add32_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addl $-2147483648, g32(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
; Add 0x80000000, a positive number requiring 32 bits of immediate.
|
|
%add = add i32 %load1, 2147483648
|
|
store i32 %add, ptr @g32
|
|
%cond = icmp slt i32 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add32_imm8_br() nounwind {
|
|
; CHECK-LABEL: add32_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addl $42, g32(%rip) # encoding: [0x83,0x05,A,A,A,A,0x2a]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%add = add i32 %load1, 42
|
|
store i32 %add, ptr @g32
|
|
%cond = icmp slt i32 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add32_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: add32_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addl $-42, g32(%rip) # encoding: [0x83,0x05,A,A,A,A,0xd6]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%add = add i32 %load1, -42
|
|
store i32 %add, ptr @g32
|
|
%cond = icmp slt i32 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add16_imm_br() nounwind {
|
|
; CHECK-LABEL: add16_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addw $-32768, g16(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x8000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
; Add 0x8000, a positive number requiring 16 bits of immediate.
|
|
%add = add i16 %load1, 32768
|
|
store i16 %add, ptr @g16
|
|
%cond = icmp slt i16 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add16_imm8_br() nounwind {
|
|
; CHECK-LABEL: add16_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addw $42, g16(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0x2a]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%add = add i16 %load1, 42
|
|
store i16 %add, ptr @g16
|
|
%cond = icmp slt i16 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add16_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: add16_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addw $-42, g16(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0xd6]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%add = add i16 %load1, -42
|
|
store i16 %add, ptr @g16
|
|
%cond = icmp slt i16 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add8_imm_br() nounwind {
|
|
; CHECK-LABEL: add8_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addb $-2, g8(%rip) # encoding: [0x80,0x05,A,A,A,A,0xfe]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%add = add i8 %load1, -2
|
|
store i8 %add, ptr @g8
|
|
%cond = icmp slt i8 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add64_reg_br(i64 %arg) nounwind {
|
|
; CHECK-LABEL: add64_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addq %rdi, g64(%rip) # encoding: [0x48,0x01,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%add = add i64 %load1, %arg
|
|
store i64 %add, ptr @g64
|
|
%cond = icmp slt i64 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add32_reg_br(i32 %arg) nounwind {
|
|
; CHECK-LABEL: add32_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addl %edi, g32(%rip) # encoding: [0x01,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%add = add i32 %load1, %arg
|
|
store i32 %add, ptr @g32
|
|
%cond = icmp slt i32 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add16_reg_br(i16 %arg) nounwind {
|
|
; CHECK-LABEL: add16_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addw %di, g16(%rip) # encoding: [0x66,0x01,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%add = add i16 %load1, %arg
|
|
store i16 %add, ptr @g16
|
|
%cond = icmp slt i16 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @add8_reg_br(i8 %arg) nounwind {
|
|
; CHECK-LABEL: add8_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addb %dil, g8(%rip) # encoding: [0x40,0x00,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%add = add i8 %load1, %arg
|
|
store i8 %add, ptr @g8
|
|
%cond = icmp slt i8 %add, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub64_imm32_br() nounwind {
|
|
; CHECK-LABEL: sub64_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Subtract -0x80000000, which can't be negated into a sign-extended 32-bit
|
|
; immediate, so that we have to select sub here.
|
|
%sub = sub i64 %load1, -2147483648
|
|
store i64 %sub, ptr @g64
|
|
%cond = icmp slt i64 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub64_too_large_imm32_br() nounwind {
|
|
; CHECK-LABEL: sub64_too_large_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movabsq $-4294967295, %rax # encoding: [0x48,0xb8,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff]
|
|
; CHECK-NEXT: # imm = 0xFFFFFFFF00000001
|
|
; CHECK-NEXT: addq %rax, g64(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Subtract 0xFFFFFFFF, which cannot fit in a sign extended 32-bit immediate,
|
|
; even if negated and sign extended as an add.
|
|
%sub = sub i64 %load1, 4294967295
|
|
store i64 %sub, ptr @g64
|
|
%cond = icmp slt i64 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub64_imm8_br() nounwind {
|
|
; CHECK-LABEL: sub64_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subq $-128, g64(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Subtract -0x80, which can be done with an 8-bit immediate but only as
|
|
; a subtract where that immediate can be negative.
|
|
%sub = sub i64 %load1, -128
|
|
store i64 %sub, ptr @g64
|
|
%cond = icmp slt i64 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub32_imm_br() nounwind {
|
|
; CHECK-LABEL: sub32_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addl $-2147483648, g32(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
; Subtract -0x80000000, which requires 32 bits of immediate but still gets
|
|
; lowered as an add.
|
|
%sub = sub i32 %load1, -2147483648
|
|
store i32 %sub, ptr @g32
|
|
%cond = icmp slt i32 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub32_imm8_br() nounwind {
|
|
; CHECK-LABEL: sub32_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subl $-128, g32(%rip) # encoding: [0x83,0x2d,A,A,A,A,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
; Subtract -0x80, which can be done with an 8-bit immediate but only as
|
|
; a subtract where that immediate can be negative.
|
|
%sub = sub i32 %load1, -128
|
|
store i32 %sub, ptr @g32
|
|
%cond = icmp slt i32 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub16_imm_br() nounwind {
|
|
; CHECK-LABEL: sub16_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addw $-32768, g16(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x8000
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
; Subtract -0x8000, which requires a 16 bits of immediate but still gets
|
|
; lowered as an add.
|
|
%sub = sub i16 %load1, -32768
|
|
store i16 %sub, ptr @g16
|
|
%cond = icmp slt i16 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub16_imm8_br() nounwind {
|
|
; CHECK-LABEL: sub16_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subw $-128, g16(%rip) # encoding: [0x66,0x83,0x2d,A,A,A,A,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
; Subtract -0x80, which can be done with an 8-bit immediate but only as
|
|
; a subtract where that immediate can be negative.
|
|
%sub = sub i16 %load1, -128
|
|
store i16 %sub, ptr @g16
|
|
%cond = icmp slt i16 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub8_imm_br() nounwind {
|
|
; CHECK-LABEL: sub8_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: addb $-128, g8(%rip) # encoding: [0x80,0x05,A,A,A,A,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
; Subtract -0x80, which requires an 8-bit immediate but still gets lowered as
|
|
; an add.
|
|
%sub = sub i8 %load1, -128
|
|
store i8 %sub, ptr @g8
|
|
%cond = icmp slt i8 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub64_reg_br(i64 %arg) nounwind {
|
|
; CHECK-LABEL: sub64_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subq %rdi, g64(%rip) # encoding: [0x48,0x29,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%sub = sub i64 %load1, %arg
|
|
store i64 %sub, ptr @g64
|
|
%cond = icmp slt i64 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub32_reg_br(i32 %arg) nounwind {
|
|
; CHECK-LABEL: sub32_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subl %edi, g32(%rip) # encoding: [0x29,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%sub = sub i32 %load1, %arg
|
|
store i32 %sub, ptr @g32
|
|
%cond = icmp slt i32 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub16_reg_br(i16 %arg) nounwind {
|
|
; CHECK-LABEL: sub16_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subw %di, g16(%rip) # encoding: [0x66,0x29,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%sub = sub i16 %load1, %arg
|
|
store i16 %sub, ptr @g16
|
|
%cond = icmp slt i16 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @sub8_reg_br(i8 %arg) nounwind {
|
|
; CHECK-LABEL: sub8_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: subb %dil, g8(%rip) # encoding: [0x40,0x28,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%sub = sub i8 %load1, %arg
|
|
store i8 %sub, ptr @g8
|
|
%cond = icmp slt i8 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and64_imm32_br() nounwind {
|
|
; CHECK-LABEL: and64_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andq $16777215, g64(%rip) # encoding: [0x48,0x81,0x25,A,A,A,A,0xff,0xff,0xff,0x00]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0xFFFFFF
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; And 0x00FFFFFF, a positive immediate requiring 24-bits.
|
|
%and = and i64 %load1, 16777215
|
|
store i64 %and, ptr @g64
|
|
%cond = icmp eq i64 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and64_sext_imm32_br() nounwind {
|
|
; CHECK-LABEL: and64_sext_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; And -0x80000000, which requires sign-extended 32 bits.
|
|
%and = and i64 %load1, -2147483648
|
|
store i64 %and, ptr @g64
|
|
%cond = icmp eq i64 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and64_imm8_br() nounwind {
|
|
; CHECK-LABEL: and64_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andq $15, g64(%rip) # encoding: [0x48,0x83,0x25,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%and = and i64 %load1, 15
|
|
store i64 %and, ptr @g64
|
|
%cond = icmp eq i64 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and64_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: and64_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andq $-4, g64(%rip) # encoding: [0x48,0x83,0x25,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%and = and i64 %load1, -4
|
|
store i64 %and, ptr @g64
|
|
%cond = icmp eq i64 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and32_imm_br() nounwind {
|
|
; CHECK-LABEL: and32_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andl $-2147483648, g32(%rip) # encoding: [0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
; And 0x80000000, a positive number requiring 32 bits of immediate.
|
|
%and = and i32 %load1, 2147483648
|
|
store i32 %and, ptr @g32
|
|
%cond = icmp eq i32 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and32_imm8_br() nounwind {
|
|
; CHECK-LABEL: and32_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andl $15, g32(%rip) # encoding: [0x83,0x25,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%and = and i32 %load1, 15
|
|
store i32 %and, ptr @g32
|
|
%cond = icmp eq i32 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and32_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: and32_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andl $-4, g32(%rip) # encoding: [0x83,0x25,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%and = and i32 %load1, -4
|
|
store i32 %and, ptr @g32
|
|
%cond = icmp eq i32 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and16_imm_br() nounwind {
|
|
; CHECK-LABEL: and16_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andw $-32768, g16(%rip) # encoding: [0x66,0x81,0x25,A,A,A,A,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x8000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%and = and i16 %load1, 32768
|
|
store i16 %and, ptr @g16
|
|
%cond = icmp eq i16 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and16_imm8_br() nounwind {
|
|
; CHECK-LABEL: and16_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andw $15, g16(%rip) # encoding: [0x66,0x83,0x25,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%and = and i16 %load1, 15
|
|
store i16 %and, ptr @g16
|
|
%cond = icmp eq i16 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and16_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: and16_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andw $-4, g16(%rip) # encoding: [0x66,0x83,0x25,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%and = and i16 %load1, -4
|
|
store i16 %and, ptr @g16
|
|
%cond = icmp eq i16 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and8_imm_br() nounwind {
|
|
; CHECK-LABEL: and8_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andb $-4, g8(%rip) # encoding: [0x80,0x25,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%and = and i8 %load1, -4
|
|
store i8 %and, ptr @g8
|
|
%cond = icmp eq i8 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and64_reg_br(i64 %arg) nounwind {
|
|
; CHECK-LABEL: and64_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andq %rdi, g64(%rip) # encoding: [0x48,0x21,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%and = and i64 %load1, %arg
|
|
store i64 %and, ptr @g64
|
|
%cond = icmp eq i64 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and32_reg_br(i32 %arg) nounwind {
|
|
; CHECK-LABEL: and32_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andl %edi, g32(%rip) # encoding: [0x21,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%and = and i32 %load1, %arg
|
|
store i32 %and, ptr @g32
|
|
%cond = icmp eq i32 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and16_reg_br(i16 %arg) nounwind {
|
|
; CHECK-LABEL: and16_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andw %di, g16(%rip) # encoding: [0x66,0x21,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%and = and i16 %load1, %arg
|
|
store i16 %and, ptr @g16
|
|
%cond = icmp eq i16 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @and8_reg_br(i8 %arg) nounwind {
|
|
; CHECK-LABEL: and8_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andb %dil, g8(%rip) # encoding: [0x40,0x20,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%and = and i8 %load1, %arg
|
|
store i8 %and, ptr @g8
|
|
%cond = icmp eq i8 %and, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or64_imm32_br() nounwind {
|
|
; CHECK-LABEL: or64_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orq $16777215, g64(%rip) # encoding: [0x48,0x81,0x0d,A,A,A,A,0xff,0xff,0xff,0x00]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0xFFFFFF
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Or 0x00FFFFFF, a positive immediate requiring 24-bits.
|
|
%or = or i64 %load1, 16777215
|
|
store i64 %or, ptr @g64
|
|
%cond = icmp eq i64 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or64_sext_imm32_br() nounwind {
|
|
; CHECK-LABEL: or64_sext_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x0d,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Or -0x80000000, which requires sign-extended 32 bits.
|
|
%or = or i64 %load1, -2147483648
|
|
store i64 %or, ptr @g64
|
|
%cond = icmp eq i64 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or64_imm8_br() nounwind {
|
|
; CHECK-LABEL: or64_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orq $15, g64(%rip) # encoding: [0x48,0x83,0x0d,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%or = or i64 %load1, 15
|
|
store i64 %or, ptr @g64
|
|
%cond = icmp eq i64 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or64_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: or64_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orq $-4, g64(%rip) # encoding: [0x48,0x83,0x0d,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%or = or i64 %load1, -4
|
|
store i64 %or, ptr @g64
|
|
%cond = icmp eq i64 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or32_imm_br() nounwind {
|
|
; CHECK-LABEL: or32_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orl $-2147483648, g32(%rip) # encoding: [0x81,0x0d,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
; Or 0x80000000, a positive number requiring 32 bits of immediate.
|
|
%or = or i32 %load1, 2147483648
|
|
store i32 %or, ptr @g32
|
|
%cond = icmp eq i32 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or32_imm8_br() nounwind {
|
|
; CHECK-LABEL: or32_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orl $15, g32(%rip) # encoding: [0x83,0x0d,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%or = or i32 %load1, 15
|
|
store i32 %or, ptr @g32
|
|
%cond = icmp eq i32 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or32_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: or32_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orl $-4, g32(%rip) # encoding: [0x83,0x0d,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%or = or i32 %load1, -4
|
|
store i32 %or, ptr @g32
|
|
%cond = icmp eq i32 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or16_imm_br() nounwind {
|
|
; CHECK-LABEL: or16_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orw $-32768, g16(%rip) # encoding: [0x66,0x81,0x0d,A,A,A,A,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x8000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%or = or i16 %load1, 32768
|
|
store i16 %or, ptr @g16
|
|
%cond = icmp eq i16 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or16_imm8_br() nounwind {
|
|
; CHECK-LABEL: or16_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orw $15, g16(%rip) # encoding: [0x66,0x83,0x0d,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%or = or i16 %load1, 15
|
|
store i16 %or, ptr @g16
|
|
%cond = icmp eq i16 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or16_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: or16_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orw $-4, g16(%rip) # encoding: [0x66,0x83,0x0d,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%or = or i16 %load1, -4
|
|
store i16 %or, ptr @g16
|
|
%cond = icmp eq i16 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or8_imm_br() nounwind {
|
|
; CHECK-LABEL: or8_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orb $-4, g8(%rip) # encoding: [0x80,0x0d,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%or = or i8 %load1, -4
|
|
store i8 %or, ptr @g8
|
|
%cond = icmp eq i8 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or64_reg_br(i64 %arg) nounwind {
|
|
; CHECK-LABEL: or64_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orq %rdi, g64(%rip) # encoding: [0x48,0x09,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%or = or i64 %load1, %arg
|
|
store i64 %or, ptr @g64
|
|
%cond = icmp eq i64 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or32_reg_br(i32 %arg) nounwind {
|
|
; CHECK-LABEL: or32_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orl %edi, g32(%rip) # encoding: [0x09,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%or = or i32 %load1, %arg
|
|
store i32 %or, ptr @g32
|
|
%cond = icmp eq i32 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or16_reg_br(i16 %arg) nounwind {
|
|
; CHECK-LABEL: or16_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orw %di, g16(%rip) # encoding: [0x66,0x09,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%or = or i16 %load1, %arg
|
|
store i16 %or, ptr @g16
|
|
%cond = icmp eq i16 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @or8_reg_br(i8 %arg) nounwind {
|
|
; CHECK-LABEL: or8_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: orb %dil, g8(%rip) # encoding: [0x40,0x08,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%or = or i8 %load1, %arg
|
|
store i8 %or, ptr @g8
|
|
%cond = icmp eq i8 %or, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor64_imm32_br() nounwind {
|
|
; CHECK-LABEL: xor64_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorq $16777215, g64(%rip) # encoding: [0x48,0x81,0x35,A,A,A,A,0xff,0xff,0xff,0x00]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0xFFFFFF
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Xor 0x00FFFFFF, a positive immediate requiring 24-bits.
|
|
%xor = xor i64 %load1, 16777215
|
|
store i64 %xor, ptr @g64
|
|
%cond = icmp eq i64 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor64_sext_imm32_br() nounwind {
|
|
; CHECK-LABEL: xor64_sext_imm32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorq $-2147483648, g64(%rip) # encoding: [0x48,0x81,0x35,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
; Xor -0x80000000, which requires sign-extended 32 bits.
|
|
%xor = xor i64 %load1, -2147483648
|
|
store i64 %xor, ptr @g64
|
|
%cond = icmp eq i64 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor64_imm8_br() nounwind {
|
|
; CHECK-LABEL: xor64_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorq $15, g64(%rip) # encoding: [0x48,0x83,0x35,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%xor = xor i64 %load1, 15
|
|
store i64 %xor, ptr @g64
|
|
%cond = icmp eq i64 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor64_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: xor64_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorq $-4, g64(%rip) # encoding: [0x48,0x83,0x35,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%xor = xor i64 %load1, -4
|
|
store i64 %xor, ptr @g64
|
|
%cond = icmp eq i64 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor32_imm_br() nounwind {
|
|
; CHECK-LABEL: xor32_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorl $-2147483648, g32(%rip) # encoding: [0x81,0x35,A,A,A,A,0x00,0x00,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x80000000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
; Xor 0x80000000, a positive number requiring 32 bits of immediate.
|
|
%xor = xor i32 %load1, 2147483648
|
|
store i32 %xor, ptr @g32
|
|
%cond = icmp eq i32 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor32_imm8_br() nounwind {
|
|
; CHECK-LABEL: xor32_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorl $15, g32(%rip) # encoding: [0x83,0x35,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%xor = xor i32 %load1, 15
|
|
store i32 %xor, ptr @g32
|
|
%cond = icmp eq i32 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor32_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: xor32_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorl $-4, g32(%rip) # encoding: [0x83,0x35,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%xor = xor i32 %load1, -4
|
|
store i32 %xor, ptr @g32
|
|
%cond = icmp eq i32 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor16_imm_br() nounwind {
|
|
; CHECK-LABEL: xor16_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorw $-32768, g16(%rip) # encoding: [0x66,0x81,0x35,A,A,A,A,0x00,0x80]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: # imm = 0x8000
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%xor = xor i16 %load1, 32768
|
|
store i16 %xor, ptr @g16
|
|
%cond = icmp eq i16 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor16_imm8_br() nounwind {
|
|
; CHECK-LABEL: xor16_imm8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorw $15, g16(%rip) # encoding: [0x66,0x83,0x35,A,A,A,A,0x0f]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%xor = xor i16 %load1, 15
|
|
store i16 %xor, ptr @g16
|
|
%cond = icmp eq i16 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor16_imm8_neg_br() nounwind {
|
|
; CHECK-LABEL: xor16_imm8_neg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorw $-4, g16(%rip) # encoding: [0x66,0x83,0x35,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%xor = xor i16 %load1, -4
|
|
store i16 %xor, ptr @g16
|
|
%cond = icmp eq i16 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor8_imm_br() nounwind {
|
|
; CHECK-LABEL: xor8_imm_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorb $-4, g8(%rip) # encoding: [0x80,0x35,A,A,A,A,0xfc]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%xor = xor i8 %load1, -4
|
|
store i8 %xor, ptr @g8
|
|
%cond = icmp eq i8 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor64_reg_br(i64 %arg) nounwind {
|
|
; CHECK-LABEL: xor64_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorq %rdi, g64(%rip) # encoding: [0x48,0x31,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%xor = xor i64 %load1, %arg
|
|
store i64 %xor, ptr @g64
|
|
%cond = icmp eq i64 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor32_reg_br(i32 %arg) nounwind {
|
|
; CHECK-LABEL: xor32_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorl %edi, g32(%rip) # encoding: [0x31,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%xor = xor i32 %load1, %arg
|
|
store i32 %xor, ptr @g32
|
|
%cond = icmp eq i32 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor16_reg_br(i16 %arg) nounwind {
|
|
; CHECK-LABEL: xor16_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorw %di, g16(%rip) # encoding: [0x66,0x31,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%xor = xor i16 %load1, %arg
|
|
store i16 %xor, ptr @g16
|
|
%cond = icmp eq i16 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @xor8_reg_br(i8 %arg) nounwind {
|
|
; CHECK-LABEL: xor8_reg_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorb %dil, g8(%rip) # encoding: [0x40,0x30,0x3d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jne b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x75,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%xor = xor i8 %load1, %arg
|
|
store i8 %xor, ptr @g8
|
|
%cond = icmp eq i8 %xor, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @neg64_br() nounwind {
|
|
; CHECK-LABEL: neg64_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: negq g64(%rip) # encoding: [0x48,0xf7,0x1d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i64, ptr @g64
|
|
%sub = sub i64 0, %load1
|
|
store i64 %sub, ptr @g64
|
|
%cond = icmp slt i64 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @neg32_br() nounwind {
|
|
; CHECK-LABEL: neg32_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: negl g32(%rip) # encoding: [0xf7,0x1d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i32, ptr @g32
|
|
%sub = sub i32 0, %load1
|
|
store i32 %sub, ptr @g32
|
|
%cond = icmp slt i32 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @neg16_br() nounwind {
|
|
; CHECK-LABEL: neg16_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: negw g16(%rip) # encoding: [0x66,0xf7,0x1d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i16, ptr @g16
|
|
%sub = sub i16 0, %load1
|
|
store i16 %sub, ptr @g16
|
|
%cond = icmp slt i16 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|
|
|
|
define void @neg8_br() nounwind {
|
|
; CHECK-LABEL: neg8_br:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: negb g8(%rip) # encoding: [0xf6,0x1d,A,A,A,A]
|
|
; CHECK-NEXT: # fixup A - offset: 2, value: g8-4, kind: reloc_riprel_4byte
|
|
; CHECK-NEXT: jns b # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0x79,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1
|
|
; CHECK-NEXT: # %bb.1: # %a
|
|
; CHECK-NEXT: jmp a # TAILCALL
|
|
; CHECK-NEXT: # encoding: [0xeb,A]
|
|
; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1
|
|
entry:
|
|
%load1 = load i8, ptr @g8
|
|
%sub = sub i8 0, %load1
|
|
store i8 %sub, ptr @g8
|
|
%cond = icmp slt i8 %sub, 0
|
|
br i1 %cond, label %a, label %b
|
|
|
|
a:
|
|
tail call void @a()
|
|
ret void
|
|
|
|
b:
|
|
tail call void @b()
|
|
ret void
|
|
}
|