; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -fast-isel-sink-local-values -O0 -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefix=X86-O0
; RUN: llc -fast-isel-sink-local-values     -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefix=X64
; RUN: llc -fast-isel-sink-local-values -O0 -mtriple=i686-unknown   -mcpu=skx -o - %s | FileCheck %s --check-prefix=686-O0
; RUN: llc -fast-isel-sink-local-values     -mtriple=i686-unknown   -mcpu=skx -o - %s | FileCheck %s --check-prefix=686

@c = external constant i8, align 1

define void @foo() {
; X86-O0-LABEL: foo:
; X86-O0:       # %bb.0: # %entry
; X86-O0-NEXT:    xorl %eax, %eax
; X86-O0-NEXT:    movl %eax, %ecx
; X86-O0-NEXT:    xorl %eax, %eax
; X86-O0-NEXT:    movzbl c, %edx
; X86-O0-NEXT:    subl %edx, %eax
; X86-O0-NEXT:    movslq %eax, %rsi
; X86-O0-NEXT:    subq %rsi, %rcx
; X86-O0-NEXT:    movb %cl, %dil
; X86-O0-NEXT:    cmpb $0, %dil
; X86-O0-NEXT:    setne %dil
; X86-O0-NEXT:    andb $1, %dil
; X86-O0-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
; X86-O0-NEXT:    cmpb $0, c
; X86-O0-NEXT:    setne %dil
; X86-O0-NEXT:    xorb $-1, %dil
; X86-O0-NEXT:    xorb $-1, %dil
; X86-O0-NEXT:    andb $1, %dil
; X86-O0-NEXT:    movzbl %dil, %eax
; X86-O0-NEXT:    movzbl c, %edx
; X86-O0-NEXT:    cmpl %edx, %eax
; X86-O0-NEXT:    setle %dil
; X86-O0-NEXT:    andb $1, %dil
; X86-O0-NEXT:    movzbl %dil, %eax
; X86-O0-NEXT:    movl %eax, -{{[0-9]+}}(%rsp)
; X86-O0-NEXT:    retq
;
; X64-LABEL: foo:
; X64:       # %bb.0: # %entry
; X64-NEXT:    movzbl {{.*}}(%rip), %eax
; X64-NEXT:    xorl %ecx, %ecx
; X64-NEXT:    testl %eax, %eax
; X64-NEXT:    setne %cl
; X64-NEXT:    testb %al, %al
; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
; X64-NEXT:    xorl %edx, %edx
; X64-NEXT:    cmpl %eax, %ecx
; X64-NEXT:    setle %dl
; X64-NEXT:    movl %edx, -{{[0-9]+}}(%rsp)
; X64-NEXT:    retq
;
; 686-O0-LABEL: foo:
; 686-O0:       # %bb.0: # %entry
; 686-O0-NEXT:    subl $8, %esp
; 686-O0-NEXT:    .cfi_def_cfa_offset 12
; 686-O0-NEXT:    movb c, %al
; 686-O0-NEXT:    cmpb $0, %al
; 686-O0-NEXT:    setne %al
; 686-O0-NEXT:    andb $1, %al
; 686-O0-NEXT:    movb %al, {{[0-9]+}}(%esp)
; 686-O0-NEXT:    cmpb $0, c
; 686-O0-NEXT:    setne %al
; 686-O0-NEXT:    xorb $-1, %al
; 686-O0-NEXT:    xorb $-1, %al
; 686-O0-NEXT:    andb $1, %al
; 686-O0-NEXT:    movzbl %al, %ecx
; 686-O0-NEXT:    movzbl c, %edx
; 686-O0-NEXT:    cmpl %edx, %ecx
; 686-O0-NEXT:    setle %al
; 686-O0-NEXT:    andb $1, %al
; 686-O0-NEXT:    movzbl %al, %ecx
; 686-O0-NEXT:    movl %ecx, (%esp)
; 686-O0-NEXT:    addl $8, %esp
; 686-O0-NEXT:    .cfi_def_cfa_offset 4
; 686-O0-NEXT:    retl
;
; 686-LABEL: foo:
; 686:       # %bb.0: # %entry
; 686-NEXT:    subl $8, %esp
; 686-NEXT:    .cfi_def_cfa_offset 12
; 686-NEXT:    movzbl c, %eax
; 686-NEXT:    xorl %ecx, %ecx
; 686-NEXT:    testl %eax, %eax
; 686-NEXT:    setne %cl
; 686-NEXT:    testb %al, %al
; 686-NEXT:    setne {{[0-9]+}}(%esp)
; 686-NEXT:    xorl %edx, %edx
; 686-NEXT:    cmpl %eax, %ecx
; 686-NEXT:    setle %dl
; 686-NEXT:    movl %edx, {{[0-9]+}}(%esp)
; 686-NEXT:    addl $8, %esp
; 686-NEXT:    .cfi_def_cfa_offset 4
; 686-NEXT:    retl
entry:
  %a = alloca i8, align 1
  %b = alloca i32, align 4
  %0 = load i8, i8* @c, align 1
  %conv = zext i8 %0 to i32
  %sub = sub nsw i32 0, %conv
  %conv1 = sext i32 %sub to i64
  %sub2 = sub nsw i64 0, %conv1
  %conv3 = trunc i64 %sub2 to i8
  %tobool = icmp ne i8 %conv3, 0
  %frombool = zext i1 %tobool to i8
  store i8 %frombool, i8* %a, align 1
  %1 = load i8, i8* @c, align 1
  %tobool4 = icmp ne i8 %1, 0
  %lnot = xor i1 %tobool4, true
  %lnot5 = xor i1 %lnot, true
  %conv6 = zext i1 %lnot5 to i32
  %2 = load i8, i8* @c, align 1
  %conv7 = zext i8 %2 to i32
  %cmp = icmp sle i32 %conv6, %conv7
  %conv8 = zext i1 %cmp to i32
  store i32 %conv8, i32* %b, align 4
  ret void
}

@var_5 = external global i32, align 4
@var_57 = external global i64, align 8
@_ZN8struct_210member_2_0E = external global i64, align 8

define void @f1() {
; X86-O0-LABEL: f1:
; X86-O0:       # %bb.0: # %entry
; X86-O0-NEXT:    movslq var_5, %rax
; X86-O0-NEXT:    movabsq $8381627093, %rcx # imm = 0x1F3957AD5
; X86-O0-NEXT:    addq %rcx, %rax
; X86-O0-NEXT:    cmpq $0, %rax
; X86-O0-NEXT:    setne %dl
; X86-O0-NEXT:    andb $1, %dl
; X86-O0-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
; X86-O0-NEXT:    movl var_5, %esi
; X86-O0-NEXT:    xorl $-1, %esi
; X86-O0-NEXT:    cmpl $0, %esi
; X86-O0-NEXT:    setne %dl
; X86-O0-NEXT:    xorb $-1, %dl
; X86-O0-NEXT:    andb $1, %dl
; X86-O0-NEXT:    movzbl %dl, %esi
; X86-O0-NEXT:    movl %esi, %eax
; X86-O0-NEXT:    movslq var_5, %rcx
; X86-O0-NEXT:    addq $7093, %rcx # imm = 0x1BB5
; X86-O0-NEXT:    cmpq %rcx, %rax
; X86-O0-NEXT:    setg %dl
; X86-O0-NEXT:    andb $1, %dl
; X86-O0-NEXT:    movzbl %dl, %esi
; X86-O0-NEXT:    movl %esi, %eax
; X86-O0-NEXT:    movq %rax, var_57
; X86-O0-NEXT:    movl var_5, %esi
; X86-O0-NEXT:    xorl $-1, %esi
; X86-O0-NEXT:    cmpl $0, %esi
; X86-O0-NEXT:    setne %dl
; X86-O0-NEXT:    xorb $-1, %dl
; X86-O0-NEXT:    andb $1, %dl
; X86-O0-NEXT:    movzbl %dl, %esi
; X86-O0-NEXT:    movl %esi, %eax
; X86-O0-NEXT:    movq %rax, _ZN8struct_210member_2_0E
; X86-O0-NEXT:    retq
;
; X64-LABEL: f1:
; X64:       # %bb.0: # %entry
; X64-NEXT:    movslq {{.*}}(%rip), %rax
; X64-NEXT:    movabsq $-8381627093, %rcx # imm = 0xFFFFFFFE0C6A852B
; X64-NEXT:    cmpq %rcx, %rax
; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
; X64-NEXT:    xorl %ecx, %ecx
; X64-NEXT:    cmpq $-1, %rax
; X64-NEXT:    sete %cl
; X64-NEXT:    xorl %edx, %edx
; X64-NEXT:    cmpl $-1, %eax
; X64-NEXT:    sete %dl
; X64-NEXT:    addq $7093, %rax # imm = 0x1BB5
; X64-NEXT:    xorl %esi, %esi
; X64-NEXT:    cmpq %rax, %rdx
; X64-NEXT:    setg %sil
; X64-NEXT:    movq %rsi, {{.*}}(%rip)
; X64-NEXT:    movq %rcx, {{.*}}(%rip)
; X64-NEXT:    retq
;
; 686-O0-LABEL: f1:
; 686-O0:       # %bb.0: # %entry
; 686-O0-NEXT:    pushl %ebp
; 686-O0-NEXT:    .cfi_def_cfa_offset 8
; 686-O0-NEXT:    pushl %ebx
; 686-O0-NEXT:    .cfi_def_cfa_offset 12
; 686-O0-NEXT:    pushl %edi
; 686-O0-NEXT:    .cfi_def_cfa_offset 16
; 686-O0-NEXT:    pushl %esi
; 686-O0-NEXT:    .cfi_def_cfa_offset 20
; 686-O0-NEXT:    subl $24, %esp
; 686-O0-NEXT:    .cfi_def_cfa_offset 44
; 686-O0-NEXT:    .cfi_offset %esi, -20
; 686-O0-NEXT:    .cfi_offset %edi, -16
; 686-O0-NEXT:    .cfi_offset %ebx, -12
; 686-O0-NEXT:    .cfi_offset %ebp, -8
; 686-O0-NEXT:    movl var_5, %eax
; 686-O0-NEXT:    movl %eax, %ecx
; 686-O0-NEXT:    sarl $31, %ecx
; 686-O0-NEXT:    xorl $208307499, %eax # imm = 0xC6A852B
; 686-O0-NEXT:    xorl $-2, %ecx
; 686-O0-NEXT:    orl %ecx, %eax
; 686-O0-NEXT:    setne {{[0-9]+}}(%esp)
; 686-O0-NEXT:    movl var_5, %ecx
; 686-O0-NEXT:    movl %ecx, %edx
; 686-O0-NEXT:    sarl $31, %edx
; 686-O0-NEXT:    movl %ecx, %esi
; 686-O0-NEXT:    subl $-1, %esi
; 686-O0-NEXT:    sete %bl
; 686-O0-NEXT:    movzbl %bl, %edi
; 686-O0-NEXT:    xorl %ebp, %ebp
; 686-O0-NEXT:    addl $7093, %ecx # imm = 0x1BB5
; 686-O0-NEXT:    adcxl %ebp, %edx
; 686-O0-NEXT:    subl %edi, %ecx
; 686-O0-NEXT:    sbbl $0, %edx
; 686-O0-NEXT:    setl %bl
; 686-O0-NEXT:    movzbl %bl, %edi
; 686-O0-NEXT:    movl %edi, var_57
; 686-O0-NEXT:    movl $0, var_57+4
; 686-O0-NEXT:    movl var_5, %edi
; 686-O0-NEXT:    subl $-1, %edi
; 686-O0-NEXT:    sete %bl
; 686-O0-NEXT:    movzbl %bl, %ebp
; 686-O0-NEXT:    movl %ebp, _ZN8struct_210member_2_0E
; 686-O0-NEXT:    movl $0, _ZN8struct_210member_2_0E+4
; 686-O0-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; 686-O0-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; 686-O0-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; 686-O0-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
; 686-O0-NEXT:    movl %edi, (%esp) # 4-byte Spill
; 686-O0-NEXT:    addl $24, %esp
; 686-O0-NEXT:    .cfi_def_cfa_offset 20
; 686-O0-NEXT:    popl %esi
; 686-O0-NEXT:    .cfi_def_cfa_offset 16
; 686-O0-NEXT:    popl %edi
; 686-O0-NEXT:    .cfi_def_cfa_offset 12
; 686-O0-NEXT:    popl %ebx
; 686-O0-NEXT:    .cfi_def_cfa_offset 8
; 686-O0-NEXT:    popl %ebp
; 686-O0-NEXT:    .cfi_def_cfa_offset 4
; 686-O0-NEXT:    retl
;
; 686-LABEL: f1:
; 686:       # %bb.0: # %entry
; 686-NEXT:    pushl %edi
; 686-NEXT:    .cfi_def_cfa_offset 8
; 686-NEXT:    pushl %esi
; 686-NEXT:    .cfi_def_cfa_offset 12
; 686-NEXT:    subl $1, %esp
; 686-NEXT:    .cfi_def_cfa_offset 13
; 686-NEXT:    .cfi_offset %esi, -12
; 686-NEXT:    .cfi_offset %edi, -8
; 686-NEXT:    movl var_5, %edx
; 686-NEXT:    movl %edx, %eax
; 686-NEXT:    xorl $208307499, %eax # imm = 0xC6A852B
; 686-NEXT:    movl %edx, %esi
; 686-NEXT:    sarl $31, %esi
; 686-NEXT:    movl %esi, %ecx
; 686-NEXT:    xorl $-2, %ecx
; 686-NEXT:    orl %eax, %ecx
; 686-NEXT:    setne (%esp)
; 686-NEXT:    movl %edx, %ecx
; 686-NEXT:    andl %esi, %ecx
; 686-NEXT:    xorl %eax, %eax
; 686-NEXT:    cmpl $-1, %ecx
; 686-NEXT:    sete %al
; 686-NEXT:    xorl %ecx, %ecx
; 686-NEXT:    cmpl $-1, %edx
; 686-NEXT:    sete %cl
; 686-NEXT:    xorl %edi, %edi
; 686-NEXT:    addl $7093, %edx # imm = 0x1BB5
; 686-NEXT:    adcxl %edi, %esi
; 686-NEXT:    cmpl %ecx, %edx
; 686-NEXT:    sbbl $0, %esi
; 686-NEXT:    setl %cl
; 686-NEXT:    movzbl %cl, %ecx
; 686-NEXT:    movl %ecx, var_57
; 686-NEXT:    movl $0, var_57+4
; 686-NEXT:    movl %eax, _ZN8struct_210member_2_0E
; 686-NEXT:    movl $0, _ZN8struct_210member_2_0E+4
; 686-NEXT:    addl $1, %esp
; 686-NEXT:    .cfi_def_cfa_offset 12
; 686-NEXT:    popl %esi
; 686-NEXT:    .cfi_def_cfa_offset 8
; 686-NEXT:    popl %edi
; 686-NEXT:    .cfi_def_cfa_offset 4
; 686-NEXT:    retl
entry:
  %a = alloca i8, align 1
  %0 = load i32, i32* @var_5, align 4
  %conv = sext i32 %0 to i64
  %add = add nsw i64 %conv, 8381627093
  %tobool = icmp ne i64 %add, 0
  %frombool = zext i1 %tobool to i8
  store i8 %frombool, i8* %a, align 1
  %1 = load i32, i32* @var_5, align 4
  %neg = xor i32 %1, -1
  %tobool1 = icmp ne i32 %neg, 0
  %lnot = xor i1 %tobool1, true
  %conv2 = zext i1 %lnot to i64
  %2 = load i32, i32* @var_5, align 4
  %conv3 = sext i32 %2 to i64
  %add4 = add nsw i64 %conv3, 7093
  %cmp = icmp sgt i64 %conv2, %add4
  %conv5 = zext i1 %cmp to i64
  store i64 %conv5, i64* @var_57, align 8
  %3 = load i32, i32* @var_5, align 4
  %neg6 = xor i32 %3, -1
  %tobool7 = icmp ne i32 %neg6, 0
  %lnot8 = xor i1 %tobool7, true
  %conv9 = zext i1 %lnot8 to i64
  store i64 %conv9, i64* @_ZN8struct_210member_2_0E, align 8
  ret void
}


@var_7 = external global i8, align 1

define void @f2() {
; X86-O0-LABEL: f2:
; X86-O0:       # %bb.0: # %entry
; X86-O0-NEXT:    movzbl var_7, %eax
; X86-O0-NEXT:    cmpb $0, var_7
; X86-O0-NEXT:    setne %cl
; X86-O0-NEXT:    xorb $-1, %cl
; X86-O0-NEXT:    andb $1, %cl
; X86-O0-NEXT:    movzbl %cl, %edx
; X86-O0-NEXT:    xorl %edx, %eax
; X86-O0-NEXT:    movw %ax, %si
; X86-O0-NEXT:    movw %si, -{{[0-9]+}}(%rsp)
; X86-O0-NEXT:    movzbl var_7, %eax
; X86-O0-NEXT:    movw %ax, %si
; X86-O0-NEXT:    cmpw $0, %si
; X86-O0-NEXT:    setne %cl
; X86-O0-NEXT:    xorb $-1, %cl
; X86-O0-NEXT:    andb $1, %cl
; X86-O0-NEXT:    movzbl %cl, %eax
; X86-O0-NEXT:    movzbl var_7, %edx
; X86-O0-NEXT:    cmpl %edx, %eax
; X86-O0-NEXT:    sete %cl
; X86-O0-NEXT:    andb $1, %cl
; X86-O0-NEXT:    movzbl %cl, %eax
; X86-O0-NEXT:    movw %ax, %si
; X86-O0-NEXT:    # implicit-def: $rdi
; X86-O0-NEXT:    movw %si, (%rdi)
; X86-O0-NEXT:    retq
;
; X64-LABEL: f2:
; X64:       # %bb.0: # %entry
; X64-NEXT:    movzbl {{.*}}(%rip), %eax
; X64-NEXT:    xorl %ecx, %ecx
; X64-NEXT:    testl %eax, %eax
; X64-NEXT:    sete %cl
; X64-NEXT:    xorl %eax, %ecx
; X64-NEXT:    movw %cx, -{{[0-9]+}}(%rsp)
; X64-NEXT:    xorl %ecx, %ecx
; X64-NEXT:    testb %al, %al
; X64-NEXT:    sete %cl
; X64-NEXT:    xorl %edx, %edx
; X64-NEXT:    cmpl %eax, %ecx
; X64-NEXT:    sete %dl
; X64-NEXT:    movw %dx, (%rax)
; X64-NEXT:    retq
;
; 686-O0-LABEL: f2:
; 686-O0:       # %bb.0: # %entry
; 686-O0-NEXT:    pushl %esi
; 686-O0-NEXT:    .cfi_def_cfa_offset 8
; 686-O0-NEXT:    subl $2, %esp
; 686-O0-NEXT:    .cfi_def_cfa_offset 10
; 686-O0-NEXT:    .cfi_offset %esi, -8
; 686-O0-NEXT:    movzbl var_7, %eax
; 686-O0-NEXT:    cmpb $0, var_7
; 686-O0-NEXT:    setne %cl
; 686-O0-NEXT:    xorb $-1, %cl
; 686-O0-NEXT:    andb $1, %cl
; 686-O0-NEXT:    movzbl %cl, %edx
; 686-O0-NEXT:    xorl %edx, %eax
; 686-O0-NEXT:    movw %ax, %si
; 686-O0-NEXT:    movw %si, (%esp)
; 686-O0-NEXT:    movzbl var_7, %eax
; 686-O0-NEXT:    movw %ax, %si
; 686-O0-NEXT:    cmpw $0, %si
; 686-O0-NEXT:    setne %cl
; 686-O0-NEXT:    xorb $-1, %cl
; 686-O0-NEXT:    andb $1, %cl
; 686-O0-NEXT:    movzbl %cl, %eax
; 686-O0-NEXT:    movzbl var_7, %edx
; 686-O0-NEXT:    cmpl %edx, %eax
; 686-O0-NEXT:    sete %cl
; 686-O0-NEXT:    andb $1, %cl
; 686-O0-NEXT:    movzbl %cl, %eax
; 686-O0-NEXT:    movw %ax, %si
; 686-O0-NEXT:    # implicit-def: $eax
; 686-O0-NEXT:    movw %si, (%eax)
; 686-O0-NEXT:    addl $2, %esp
; 686-O0-NEXT:    .cfi_def_cfa_offset 8
; 686-O0-NEXT:    popl %esi
; 686-O0-NEXT:    .cfi_def_cfa_offset 4
; 686-O0-NEXT:    retl
;
; 686-LABEL: f2:
; 686:       # %bb.0: # %entry
; 686-NEXT:    subl $2, %esp
; 686-NEXT:    .cfi_def_cfa_offset 6
; 686-NEXT:    movzbl var_7, %eax
; 686-NEXT:    xorl %ecx, %ecx
; 686-NEXT:    testl %eax, %eax
; 686-NEXT:    sete %cl
; 686-NEXT:    xorl %eax, %ecx
; 686-NEXT:    movw %cx, (%esp)
; 686-NEXT:    xorl %ecx, %ecx
; 686-NEXT:    testb %al, %al
; 686-NEXT:    sete %cl
; 686-NEXT:    xorl %edx, %edx
; 686-NEXT:    cmpl %eax, %ecx
; 686-NEXT:    sete %dl
; 686-NEXT:    movw %dx, (%eax)
; 686-NEXT:    addl $2, %esp
; 686-NEXT:    .cfi_def_cfa_offset 4
; 686-NEXT:    retl
entry:
  %a = alloca i16, align 2
  %0 = load i8, i8* @var_7, align 1
  %conv = zext i8 %0 to i32
  %1 = load i8, i8* @var_7, align 1
  %tobool = icmp ne i8 %1, 0
  %lnot = xor i1 %tobool, true
  %conv1 = zext i1 %lnot to i32
  %xor = xor i32 %conv, %conv1
  %conv2 = trunc i32 %xor to i16
  store i16 %conv2, i16* %a, align 2
  %2 = load i8, i8* @var_7, align 1
  %conv3 = zext i8 %2 to i16
  %tobool4 = icmp ne i16 %conv3, 0
  %lnot5 = xor i1 %tobool4, true
  %conv6 = zext i1 %lnot5 to i32
  %3 = load i8, i8* @var_7, align 1
  %conv7 = zext i8 %3 to i32
  %cmp = icmp eq i32 %conv6, %conv7
  %conv8 = zext i1 %cmp to i32
  %conv9 = trunc i32 %conv8 to i16
  store i16 %conv9, i16* undef, align 2
  ret void
}


@var_13 = external global i32, align 4
@var_16 = external global i32, align 4
@var_46 = external global i32, align 4

define void @f3() #0 {
; X86-O0-LABEL: f3:
; X86-O0:       # %bb.0: # %entry
; X86-O0-NEXT:    movl var_13, %eax
; X86-O0-NEXT:    xorl $-1, %eax
; X86-O0-NEXT:    movl %eax, %eax
; X86-O0-NEXT:    movl %eax, %ecx
; X86-O0-NEXT:    cmpl $0, var_13
; X86-O0-NEXT:    setne %dl
; X86-O0-NEXT:    xorb $-1, %dl
; X86-O0-NEXT:    andb $1, %dl
; X86-O0-NEXT:    movzbl %dl, %eax
; X86-O0-NEXT:    movl %eax, %esi
; X86-O0-NEXT:    movl var_13, %eax
; X86-O0-NEXT:    xorl $-1, %eax
; X86-O0-NEXT:    xorl var_16, %eax
; X86-O0-NEXT:    movl %eax, %eax
; X86-O0-NEXT:    movl %eax, %edi
; X86-O0-NEXT:    andq %rdi, %rsi
; X86-O0-NEXT:    orq %rsi, %rcx
; X86-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
; X86-O0-NEXT:    movl var_13, %eax
; X86-O0-NEXT:    xorl $-1, %eax
; X86-O0-NEXT:    movl %eax, %eax
; X86-O0-NEXT:    movl %eax, %ecx
; X86-O0-NEXT:    cmpl $0, var_13
; X86-O0-NEXT:    setne %dl
; X86-O0-NEXT:    xorb $-1, %dl
; X86-O0-NEXT:    andb $1, %dl
; X86-O0-NEXT:    movzbl %dl, %eax
; X86-O0-NEXT:    movl %eax, %esi
; X86-O0-NEXT:    andq $0, %rsi
; X86-O0-NEXT:    orq %rsi, %rcx
; X86-O0-NEXT:    movl %ecx, %eax
; X86-O0-NEXT:    movl %eax, var_46
; X86-O0-NEXT:    retq
;
; X64-LABEL: f3:
; X64:       # %bb.0: # %entry
; X64-NEXT:    movl {{.*}}(%rip), %eax
; X64-NEXT:    xorl %ecx, %ecx
; X64-NEXT:    testl %eax, %eax
; X64-NEXT:    notl %eax
; X64-NEXT:    sete %cl
; X64-NEXT:    movl {{.*}}(%rip), %edx
; X64-NEXT:    xorl %eax, %edx
; X64-NEXT:    andl %edx, %ecx
; X64-NEXT:    orl %eax, %ecx
; X64-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
; X64-NEXT:    movl %eax, {{.*}}(%rip)
; X64-NEXT:    retq
;
; 686-O0-LABEL: f3:
; 686-O0:       # %bb.0: # %entry
; 686-O0-NEXT:    pushl %ebp
; 686-O0-NEXT:    .cfi_def_cfa_offset 8
; 686-O0-NEXT:    .cfi_offset %ebp, -8
; 686-O0-NEXT:    movl %esp, %ebp
; 686-O0-NEXT:    .cfi_def_cfa_register %ebp
; 686-O0-NEXT:    pushl %edi
; 686-O0-NEXT:    pushl %esi
; 686-O0-NEXT:    andl $-8, %esp
; 686-O0-NEXT:    subl $8, %esp
; 686-O0-NEXT:    .cfi_offset %esi, -16
; 686-O0-NEXT:    .cfi_offset %edi, -12
; 686-O0-NEXT:    movl var_13, %eax
; 686-O0-NEXT:    movl %eax, %ecx
; 686-O0-NEXT:    notl %ecx
; 686-O0-NEXT:    testl %eax, %eax
; 686-O0-NEXT:    sete %dl
; 686-O0-NEXT:    movzbl %dl, %eax
; 686-O0-NEXT:    movl var_16, %esi
; 686-O0-NEXT:    movl %ecx, %edi
; 686-O0-NEXT:    xorl %esi, %edi
; 686-O0-NEXT:    andl %edi, %eax
; 686-O0-NEXT:    orl %eax, %ecx
; 686-O0-NEXT:    movl %ecx, (%esp)
; 686-O0-NEXT:    movl $0, {{[0-9]+}}(%esp)
; 686-O0-NEXT:    movl var_13, %eax
; 686-O0-NEXT:    notl %eax
; 686-O0-NEXT:    movl %eax, var_46
; 686-O0-NEXT:    leal -8(%ebp), %esp
; 686-O0-NEXT:    popl %esi
; 686-O0-NEXT:    popl %edi
; 686-O0-NEXT:    popl %ebp
; 686-O0-NEXT:    .cfi_def_cfa %esp, 4
; 686-O0-NEXT:    retl
;
; 686-LABEL: f3:
; 686:       # %bb.0: # %entry
; 686-NEXT:    pushl %ebp
; 686-NEXT:    .cfi_def_cfa_offset 8
; 686-NEXT:    .cfi_offset %ebp, -8
; 686-NEXT:    movl %esp, %ebp
; 686-NEXT:    .cfi_def_cfa_register %ebp
; 686-NEXT:    andl $-8, %esp
; 686-NEXT:    subl $8, %esp
; 686-NEXT:    movl var_13, %ecx
; 686-NEXT:    xorl %eax, %eax
; 686-NEXT:    testl %ecx, %ecx
; 686-NEXT:    notl %ecx
; 686-NEXT:    sete %al
; 686-NEXT:    movl var_16, %edx
; 686-NEXT:    xorl %ecx, %edx
; 686-NEXT:    andl %eax, %edx
; 686-NEXT:    orl %ecx, %edx
; 686-NEXT:    movl %edx, (%esp)
; 686-NEXT:    movl $0, {{[0-9]+}}(%esp)
; 686-NEXT:    movl %ecx, var_46
; 686-NEXT:    movl %ebp, %esp
; 686-NEXT:    popl %ebp
; 686-NEXT:    .cfi_def_cfa %esp, 4
; 686-NEXT:    retl
entry:
  %a = alloca i64, align 8
  %0 = load i32, i32* @var_13, align 4
  %neg = xor i32 %0, -1
  %conv = zext i32 %neg to i64
  %1 = load i32, i32* @var_13, align 4
  %tobool = icmp ne i32 %1, 0
  %lnot = xor i1 %tobool, true
  %conv1 = zext i1 %lnot to i64
  %2 = load i32, i32* @var_13, align 4
  %neg2 = xor i32 %2, -1
  %3 = load i32, i32* @var_16, align 4
  %xor = xor i32 %neg2, %3
  %conv3 = zext i32 %xor to i64
  %and = and i64 %conv1, %conv3
  %or = or i64 %conv, %and
  store i64 %or, i64* %a, align 8
  %4 = load i32, i32* @var_13, align 4
  %neg4 = xor i32 %4, -1
  %conv5 = zext i32 %neg4 to i64
  %5 = load i32, i32* @var_13, align 4
  %tobool6 = icmp ne i32 %5, 0
  %lnot7 = xor i1 %tobool6, true
  %conv8 = zext i1 %lnot7 to i64
  %and9 = and i64 %conv8, 0
  %or10 = or i64 %conv5, %and9
  %conv11 = trunc i64 %or10 to i32
  store i32 %conv11, i32* @var_46, align 4
  ret void
}

