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

@c = external constant i8, align 1

define void @foo() {
; X86-LABEL: foo:
; X86:       # BB#0: # %entry
; X86-NEXT:    subl $8, %esp
; X86-NEXT:  .Lcfi0:
; X86-NEXT:    .cfi_def_cfa_offset 12
; X86-NEXT:    movzbl c, %eax
; X86-NEXT:    xorl %ecx, %ecx
; X86-NEXT:    testl %eax, %eax
; X86-NEXT:    setne %cl
; X86-NEXT:    testb %al, %al
; X86-NEXT:    setne {{[0-9]+}}(%esp)
; X86-NEXT:    xorl %edx, %edx
; X86-NEXT:    cmpl %eax, %ecx
; X86-NEXT:    setle %dl
; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)
; X86-NEXT:    addl $8, %esp
; X86-NEXT:    retl
;
; X86-O0-LABEL: foo:
; X86-O0:       # BB#0: # %entry
; X86-O0-NEXT:    subl $12, %esp
; X86-O0-NEXT:  .Lcfi0:
; X86-O0-NEXT:    .cfi_def_cfa_offset 16
; X86-O0-NEXT:    movzbl c, %eax
; X86-O0-NEXT:    testl %eax, %eax
; X86-O0-NEXT:    setne %cl
; X86-O0-NEXT:    movl %eax, %edx
; X86-O0-NEXT:    movb %dl, %ch
; X86-O0-NEXT:    testb %ch, %ch
; X86-O0-NEXT:    setne {{[0-9]+}}(%esp)
; X86-O0-NEXT:    movzbl %cl, %edx
; X86-O0-NEXT:    subl %eax, %edx
; X86-O0-NEXT:    setle %cl
; X86-O0-NEXT:    # implicit-def: %EAX
; X86-O0-NEXT:    movb %cl, %al
; X86-O0-NEXT:    andl $1, %eax
; X86-O0-NEXT:    kmovd %eax, %k0
; X86-O0-NEXT:    kmovd %k0, %eax
; X86-O0-NEXT:    movb %al, %cl
; X86-O0-NEXT:    andb $1, %cl
; X86-O0-NEXT:    movzbl %cl, %eax
; X86-O0-NEXT:    movl %eax, {{[0-9]+}}(%esp)
; X86-O0-NEXT:    movl %edx, (%esp) # 4-byte Spill
; X86-O0-NEXT:    addl $12, %esp
; X86-O0-NEXT:    retl
;
; X64-LABEL: foo:
; X64:       # BB#0: # %entry
; X64-NEXT:    movzbl {{.*}}(%rip), %eax
; X64-NEXT:    testb %al, %al
; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
; X64-NEXT:    xorl %ecx, %ecx
; X64-NEXT:    testl %eax, %eax
; X64-NEXT:    setne %cl
; X64-NEXT:    xorl %edx, %edx
; X64-NEXT:    cmpl %eax, %ecx
; X64-NEXT:    setle %dl
; X64-NEXT:    movl %edx, -{{[0-9]+}}(%rsp)
; X64-NEXT:    retq
;
; X64-O0-LABEL: foo:
; X64-O0:       # BB#0: # %entry
; X64-O0-NEXT:    movzbl {{.*}}(%rip), %eax
; X64-O0-NEXT:    movl %eax, %ecx
; X64-O0-NEXT:    movb %cl, %dl
; X64-O0-NEXT:    movl %ecx, %eax
; X64-O0-NEXT:    testq %rcx, %rcx
; X64-O0-NEXT:    setne %sil
; X64-O0-NEXT:    testb %dl, %dl
; X64-O0-NEXT:    setne -{{[0-9]+}}(%rsp)
; X64-O0-NEXT:    movzbl %sil, %edi
; X64-O0-NEXT:    subl %eax, %edi
; X64-O0-NEXT:    setle %dl
; X64-O0-NEXT:    # implicit-def: %EAX
; X64-O0-NEXT:    movb %dl, %al
; X64-O0-NEXT:    andl $1, %eax
; X64-O0-NEXT:    kmovd %eax, %k0
; X64-O0-NEXT:    kmovd %k0, %eax
; X64-O0-NEXT:    movb %al, %dl
; X64-O0-NEXT:    andb $1, %dl
; X64-O0-NEXT:    movzbl %dl, %eax
; X64-O0-NEXT:    movl %eax, -{{[0-9]+}}(%rsp)
; X64-O0-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # 4-byte Spill
; X64-O0-NEXT:    retq
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
}
