| ; 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 |
| } |
| |