Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -fast-isel-sink-local-values -O0 -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefix=X86-O0
      3 ; RUN: llc -fast-isel-sink-local-values     -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefix=X64
      4 ; RUN: llc -fast-isel-sink-local-values -O0 -mtriple=i686-unknown   -mcpu=skx -o - %s | FileCheck %s --check-prefix=686-O0
      5 ; RUN: llc -fast-isel-sink-local-values     -mtriple=i686-unknown   -mcpu=skx -o - %s | FileCheck %s --check-prefix=686
      6 
      7 @c = external constant i8, align 1
      8 
      9 define void @foo() {
     10 ; X86-O0-LABEL: foo:
     11 ; X86-O0:       # %bb.0: # %entry
     12 ; X86-O0-NEXT:    xorl %eax, %eax
     13 ; X86-O0-NEXT:    movl %eax, %ecx
     14 ; X86-O0-NEXT:    xorl %eax, %eax
     15 ; X86-O0-NEXT:    movzbl c, %edx
     16 ; X86-O0-NEXT:    subl %edx, %eax
     17 ; X86-O0-NEXT:    movslq %eax, %rsi
     18 ; X86-O0-NEXT:    subq %rsi, %rcx
     19 ; X86-O0-NEXT:    movb %cl, %dil
     20 ; X86-O0-NEXT:    cmpb $0, %dil
     21 ; X86-O0-NEXT:    setne %dil
     22 ; X86-O0-NEXT:    andb $1, %dil
     23 ; X86-O0-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
     24 ; X86-O0-NEXT:    cmpb $0, c
     25 ; X86-O0-NEXT:    setne %dil
     26 ; X86-O0-NEXT:    xorb $-1, %dil
     27 ; X86-O0-NEXT:    xorb $-1, %dil
     28 ; X86-O0-NEXT:    andb $1, %dil
     29 ; X86-O0-NEXT:    movzbl %dil, %eax
     30 ; X86-O0-NEXT:    movzbl c, %edx
     31 ; X86-O0-NEXT:    cmpl %edx, %eax
     32 ; X86-O0-NEXT:    setle %dil
     33 ; X86-O0-NEXT:    andb $1, %dil
     34 ; X86-O0-NEXT:    movzbl %dil, %eax
     35 ; X86-O0-NEXT:    movl %eax, -{{[0-9]+}}(%rsp)
     36 ; X86-O0-NEXT:    retq
     37 ;
     38 ; X64-LABEL: foo:
     39 ; X64:       # %bb.0: # %entry
     40 ; X64-NEXT:    movzbl {{.*}}(%rip), %eax
     41 ; X64-NEXT:    xorl %ecx, %ecx
     42 ; X64-NEXT:    testl %eax, %eax
     43 ; X64-NEXT:    setne %cl
     44 ; X64-NEXT:    testb %al, %al
     45 ; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
     46 ; X64-NEXT:    xorl %edx, %edx
     47 ; X64-NEXT:    cmpl %eax, %ecx
     48 ; X64-NEXT:    setle %dl
     49 ; X64-NEXT:    movl %edx, -{{[0-9]+}}(%rsp)
     50 ; X64-NEXT:    retq
     51 ;
     52 ; 686-O0-LABEL: foo:
     53 ; 686-O0:       # %bb.0: # %entry
     54 ; 686-O0-NEXT:    subl $8, %esp
     55 ; 686-O0-NEXT:    .cfi_def_cfa_offset 12
     56 ; 686-O0-NEXT:    movb c, %al
     57 ; 686-O0-NEXT:    cmpb $0, %al
     58 ; 686-O0-NEXT:    setne %al
     59 ; 686-O0-NEXT:    andb $1, %al
     60 ; 686-O0-NEXT:    movb %al, {{[0-9]+}}(%esp)
     61 ; 686-O0-NEXT:    cmpb $0, c
     62 ; 686-O0-NEXT:    setne %al
     63 ; 686-O0-NEXT:    xorb $-1, %al
     64 ; 686-O0-NEXT:    xorb $-1, %al
     65 ; 686-O0-NEXT:    andb $1, %al
     66 ; 686-O0-NEXT:    movzbl %al, %ecx
     67 ; 686-O0-NEXT:    movzbl c, %edx
     68 ; 686-O0-NEXT:    cmpl %edx, %ecx
     69 ; 686-O0-NEXT:    setle %al
     70 ; 686-O0-NEXT:    andb $1, %al
     71 ; 686-O0-NEXT:    movzbl %al, %ecx
     72 ; 686-O0-NEXT:    movl %ecx, (%esp)
     73 ; 686-O0-NEXT:    addl $8, %esp
     74 ; 686-O0-NEXT:    .cfi_def_cfa_offset 4
     75 ; 686-O0-NEXT:    retl
     76 ;
     77 ; 686-LABEL: foo:
     78 ; 686:       # %bb.0: # %entry
     79 ; 686-NEXT:    subl $8, %esp
     80 ; 686-NEXT:    .cfi_def_cfa_offset 12
     81 ; 686-NEXT:    movzbl c, %eax
     82 ; 686-NEXT:    xorl %ecx, %ecx
     83 ; 686-NEXT:    testl %eax, %eax
     84 ; 686-NEXT:    setne %cl
     85 ; 686-NEXT:    testb %al, %al
     86 ; 686-NEXT:    setne {{[0-9]+}}(%esp)
     87 ; 686-NEXT:    xorl %edx, %edx
     88 ; 686-NEXT:    cmpl %eax, %ecx
     89 ; 686-NEXT:    setle %dl
     90 ; 686-NEXT:    movl %edx, {{[0-9]+}}(%esp)
     91 ; 686-NEXT:    addl $8, %esp
     92 ; 686-NEXT:    .cfi_def_cfa_offset 4
     93 ; 686-NEXT:    retl
     94 entry:
     95   %a = alloca i8, align 1
     96   %b = alloca i32, align 4
     97   %0 = load i8, i8* @c, align 1
     98   %conv = zext i8 %0 to i32
     99   %sub = sub nsw i32 0, %conv
    100   %conv1 = sext i32 %sub to i64
    101   %sub2 = sub nsw i64 0, %conv1
    102   %conv3 = trunc i64 %sub2 to i8
    103   %tobool = icmp ne i8 %conv3, 0
    104   %frombool = zext i1 %tobool to i8
    105   store i8 %frombool, i8* %a, align 1
    106   %1 = load i8, i8* @c, align 1
    107   %tobool4 = icmp ne i8 %1, 0
    108   %lnot = xor i1 %tobool4, true
    109   %lnot5 = xor i1 %lnot, true
    110   %conv6 = zext i1 %lnot5 to i32
    111   %2 = load i8, i8* @c, align 1
    112   %conv7 = zext i8 %2 to i32
    113   %cmp = icmp sle i32 %conv6, %conv7
    114   %conv8 = zext i1 %cmp to i32
    115   store i32 %conv8, i32* %b, align 4
    116   ret void
    117 }
    118 
    119 @var_5 = external global i32, align 4
    120 @var_57 = external global i64, align 8
    121 @_ZN8struct_210member_2_0E = external global i64, align 8
    122 
    123 define void @f1() {
    124 ; X86-O0-LABEL: f1:
    125 ; X86-O0:       # %bb.0: # %entry
    126 ; X86-O0-NEXT:    movslq var_5, %rax
    127 ; X86-O0-NEXT:    movabsq $8381627093, %rcx # imm = 0x1F3957AD5
    128 ; X86-O0-NEXT:    addq %rcx, %rax
    129 ; X86-O0-NEXT:    cmpq $0, %rax
    130 ; X86-O0-NEXT:    setne %dl
    131 ; X86-O0-NEXT:    andb $1, %dl
    132 ; X86-O0-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
    133 ; X86-O0-NEXT:    movl var_5, %esi
    134 ; X86-O0-NEXT:    xorl $-1, %esi
    135 ; X86-O0-NEXT:    cmpl $0, %esi
    136 ; X86-O0-NEXT:    setne %dl
    137 ; X86-O0-NEXT:    xorb $-1, %dl
    138 ; X86-O0-NEXT:    andb $1, %dl
    139 ; X86-O0-NEXT:    movzbl %dl, %esi
    140 ; X86-O0-NEXT:    movl %esi, %eax
    141 ; X86-O0-NEXT:    movslq var_5, %rcx
    142 ; X86-O0-NEXT:    addq $7093, %rcx # imm = 0x1BB5
    143 ; X86-O0-NEXT:    cmpq %rcx, %rax
    144 ; X86-O0-NEXT:    setg %dl
    145 ; X86-O0-NEXT:    andb $1, %dl
    146 ; X86-O0-NEXT:    movzbl %dl, %esi
    147 ; X86-O0-NEXT:    movl %esi, %eax
    148 ; X86-O0-NEXT:    movq %rax, var_57
    149 ; X86-O0-NEXT:    movl var_5, %esi
    150 ; X86-O0-NEXT:    xorl $-1, %esi
    151 ; X86-O0-NEXT:    cmpl $0, %esi
    152 ; X86-O0-NEXT:    setne %dl
    153 ; X86-O0-NEXT:    xorb $-1, %dl
    154 ; X86-O0-NEXT:    andb $1, %dl
    155 ; X86-O0-NEXT:    movzbl %dl, %esi
    156 ; X86-O0-NEXT:    movl %esi, %eax
    157 ; X86-O0-NEXT:    movq %rax, _ZN8struct_210member_2_0E
    158 ; X86-O0-NEXT:    retq
    159 ;
    160 ; X64-LABEL: f1:
    161 ; X64:       # %bb.0: # %entry
    162 ; X64-NEXT:    movslq {{.*}}(%rip), %rax
    163 ; X64-NEXT:    movabsq $-8381627093, %rcx # imm = 0xFFFFFFFE0C6A852B
    164 ; X64-NEXT:    cmpq %rcx, %rax
    165 ; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
    166 ; X64-NEXT:    xorl %ecx, %ecx
    167 ; X64-NEXT:    cmpq $-1, %rax
    168 ; X64-NEXT:    sete %cl
    169 ; X64-NEXT:    xorl %edx, %edx
    170 ; X64-NEXT:    cmpl $-1, %eax
    171 ; X64-NEXT:    sete %dl
    172 ; X64-NEXT:    addq $7093, %rax # imm = 0x1BB5
    173 ; X64-NEXT:    xorl %esi, %esi
    174 ; X64-NEXT:    cmpq %rax, %rdx
    175 ; X64-NEXT:    setg %sil
    176 ; X64-NEXT:    movq %rsi, {{.*}}(%rip)
    177 ; X64-NEXT:    movq %rcx, {{.*}}(%rip)
    178 ; X64-NEXT:    retq
    179 ;
    180 ; 686-O0-LABEL: f1:
    181 ; 686-O0:       # %bb.0: # %entry
    182 ; 686-O0-NEXT:    pushl %ebp
    183 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
    184 ; 686-O0-NEXT:    pushl %ebx
    185 ; 686-O0-NEXT:    .cfi_def_cfa_offset 12
    186 ; 686-O0-NEXT:    pushl %edi
    187 ; 686-O0-NEXT:    .cfi_def_cfa_offset 16
    188 ; 686-O0-NEXT:    pushl %esi
    189 ; 686-O0-NEXT:    .cfi_def_cfa_offset 20
    190 ; 686-O0-NEXT:    subl $24, %esp
    191 ; 686-O0-NEXT:    .cfi_def_cfa_offset 44
    192 ; 686-O0-NEXT:    .cfi_offset %esi, -20
    193 ; 686-O0-NEXT:    .cfi_offset %edi, -16
    194 ; 686-O0-NEXT:    .cfi_offset %ebx, -12
    195 ; 686-O0-NEXT:    .cfi_offset %ebp, -8
    196 ; 686-O0-NEXT:    movl var_5, %eax
    197 ; 686-O0-NEXT:    movl %eax, %ecx
    198 ; 686-O0-NEXT:    sarl $31, %ecx
    199 ; 686-O0-NEXT:    xorl $208307499, %eax # imm = 0xC6A852B
    200 ; 686-O0-NEXT:    xorl $-2, %ecx
    201 ; 686-O0-NEXT:    orl %ecx, %eax
    202 ; 686-O0-NEXT:    setne {{[0-9]+}}(%esp)
    203 ; 686-O0-NEXT:    movl var_5, %ecx
    204 ; 686-O0-NEXT:    movl %ecx, %edx
    205 ; 686-O0-NEXT:    sarl $31, %edx
    206 ; 686-O0-NEXT:    movl %ecx, %esi
    207 ; 686-O0-NEXT:    subl $-1, %esi
    208 ; 686-O0-NEXT:    sete %bl
    209 ; 686-O0-NEXT:    movzbl %bl, %edi
    210 ; 686-O0-NEXT:    xorl %ebp, %ebp
    211 ; 686-O0-NEXT:    addl $7093, %ecx # imm = 0x1BB5
    212 ; 686-O0-NEXT:    adcxl %ebp, %edx
    213 ; 686-O0-NEXT:    subl %edi, %ecx
    214 ; 686-O0-NEXT:    sbbl $0, %edx
    215 ; 686-O0-NEXT:    setl %bl
    216 ; 686-O0-NEXT:    movzbl %bl, %edi
    217 ; 686-O0-NEXT:    movl %edi, var_57
    218 ; 686-O0-NEXT:    movl $0, var_57+4
    219 ; 686-O0-NEXT:    movl var_5, %edi
    220 ; 686-O0-NEXT:    subl $-1, %edi
    221 ; 686-O0-NEXT:    sete %bl
    222 ; 686-O0-NEXT:    movzbl %bl, %ebp
    223 ; 686-O0-NEXT:    movl %ebp, _ZN8struct_210member_2_0E
    224 ; 686-O0-NEXT:    movl $0, _ZN8struct_210member_2_0E+4
    225 ; 686-O0-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
    226 ; 686-O0-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
    227 ; 686-O0-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
    228 ; 686-O0-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
    229 ; 686-O0-NEXT:    movl %edi, (%esp) # 4-byte Spill
    230 ; 686-O0-NEXT:    addl $24, %esp
    231 ; 686-O0-NEXT:    .cfi_def_cfa_offset 20
    232 ; 686-O0-NEXT:    popl %esi
    233 ; 686-O0-NEXT:    .cfi_def_cfa_offset 16
    234 ; 686-O0-NEXT:    popl %edi
    235 ; 686-O0-NEXT:    .cfi_def_cfa_offset 12
    236 ; 686-O0-NEXT:    popl %ebx
    237 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
    238 ; 686-O0-NEXT:    popl %ebp
    239 ; 686-O0-NEXT:    .cfi_def_cfa_offset 4
    240 ; 686-O0-NEXT:    retl
    241 ;
    242 ; 686-LABEL: f1:
    243 ; 686:       # %bb.0: # %entry
    244 ; 686-NEXT:    pushl %edi
    245 ; 686-NEXT:    .cfi_def_cfa_offset 8
    246 ; 686-NEXT:    pushl %esi
    247 ; 686-NEXT:    .cfi_def_cfa_offset 12
    248 ; 686-NEXT:    subl $1, %esp
    249 ; 686-NEXT:    .cfi_def_cfa_offset 13
    250 ; 686-NEXT:    .cfi_offset %esi, -12
    251 ; 686-NEXT:    .cfi_offset %edi, -8
    252 ; 686-NEXT:    movl var_5, %edx
    253 ; 686-NEXT:    movl %edx, %eax
    254 ; 686-NEXT:    xorl $208307499, %eax # imm = 0xC6A852B
    255 ; 686-NEXT:    movl %edx, %esi
    256 ; 686-NEXT:    sarl $31, %esi
    257 ; 686-NEXT:    movl %esi, %ecx
    258 ; 686-NEXT:    xorl $-2, %ecx
    259 ; 686-NEXT:    orl %eax, %ecx
    260 ; 686-NEXT:    setne (%esp)
    261 ; 686-NEXT:    movl %edx, %ecx
    262 ; 686-NEXT:    andl %esi, %ecx
    263 ; 686-NEXT:    xorl %eax, %eax
    264 ; 686-NEXT:    cmpl $-1, %ecx
    265 ; 686-NEXT:    sete %al
    266 ; 686-NEXT:    xorl %ecx, %ecx
    267 ; 686-NEXT:    cmpl $-1, %edx
    268 ; 686-NEXT:    sete %cl
    269 ; 686-NEXT:    xorl %edi, %edi
    270 ; 686-NEXT:    addl $7093, %edx # imm = 0x1BB5
    271 ; 686-NEXT:    adcxl %edi, %esi
    272 ; 686-NEXT:    cmpl %ecx, %edx
    273 ; 686-NEXT:    sbbl $0, %esi
    274 ; 686-NEXT:    setl %cl
    275 ; 686-NEXT:    movzbl %cl, %ecx
    276 ; 686-NEXT:    movl %ecx, var_57
    277 ; 686-NEXT:    movl $0, var_57+4
    278 ; 686-NEXT:    movl %eax, _ZN8struct_210member_2_0E
    279 ; 686-NEXT:    movl $0, _ZN8struct_210member_2_0E+4
    280 ; 686-NEXT:    addl $1, %esp
    281 ; 686-NEXT:    .cfi_def_cfa_offset 12
    282 ; 686-NEXT:    popl %esi
    283 ; 686-NEXT:    .cfi_def_cfa_offset 8
    284 ; 686-NEXT:    popl %edi
    285 ; 686-NEXT:    .cfi_def_cfa_offset 4
    286 ; 686-NEXT:    retl
    287 entry:
    288   %a = alloca i8, align 1
    289   %0 = load i32, i32* @var_5, align 4
    290   %conv = sext i32 %0 to i64
    291   %add = add nsw i64 %conv, 8381627093
    292   %tobool = icmp ne i64 %add, 0
    293   %frombool = zext i1 %tobool to i8
    294   store i8 %frombool, i8* %a, align 1
    295   %1 = load i32, i32* @var_5, align 4
    296   %neg = xor i32 %1, -1
    297   %tobool1 = icmp ne i32 %neg, 0
    298   %lnot = xor i1 %tobool1, true
    299   %conv2 = zext i1 %lnot to i64
    300   %2 = load i32, i32* @var_5, align 4
    301   %conv3 = sext i32 %2 to i64
    302   %add4 = add nsw i64 %conv3, 7093
    303   %cmp = icmp sgt i64 %conv2, %add4
    304   %conv5 = zext i1 %cmp to i64
    305   store i64 %conv5, i64* @var_57, align 8
    306   %3 = load i32, i32* @var_5, align 4
    307   %neg6 = xor i32 %3, -1
    308   %tobool7 = icmp ne i32 %neg6, 0
    309   %lnot8 = xor i1 %tobool7, true
    310   %conv9 = zext i1 %lnot8 to i64
    311   store i64 %conv9, i64* @_ZN8struct_210member_2_0E, align 8
    312   ret void
    313 }
    314 
    315 
    316 @var_7 = external global i8, align 1
    317 
    318 define void @f2() {
    319 ; X86-O0-LABEL: f2:
    320 ; X86-O0:       # %bb.0: # %entry
    321 ; X86-O0-NEXT:    movzbl var_7, %eax
    322 ; X86-O0-NEXT:    cmpb $0, var_7
    323 ; X86-O0-NEXT:    setne %cl
    324 ; X86-O0-NEXT:    xorb $-1, %cl
    325 ; X86-O0-NEXT:    andb $1, %cl
    326 ; X86-O0-NEXT:    movzbl %cl, %edx
    327 ; X86-O0-NEXT:    xorl %edx, %eax
    328 ; X86-O0-NEXT:    movw %ax, %si
    329 ; X86-O0-NEXT:    movw %si, -{{[0-9]+}}(%rsp)
    330 ; X86-O0-NEXT:    movzbl var_7, %eax
    331 ; X86-O0-NEXT:    movw %ax, %si
    332 ; X86-O0-NEXT:    cmpw $0, %si
    333 ; X86-O0-NEXT:    setne %cl
    334 ; X86-O0-NEXT:    xorb $-1, %cl
    335 ; X86-O0-NEXT:    andb $1, %cl
    336 ; X86-O0-NEXT:    movzbl %cl, %eax
    337 ; X86-O0-NEXT:    movzbl var_7, %edx
    338 ; X86-O0-NEXT:    cmpl %edx, %eax
    339 ; X86-O0-NEXT:    sete %cl
    340 ; X86-O0-NEXT:    andb $1, %cl
    341 ; X86-O0-NEXT:    movzbl %cl, %eax
    342 ; X86-O0-NEXT:    movw %ax, %si
    343 ; X86-O0-NEXT:    # implicit-def: $rdi
    344 ; X86-O0-NEXT:    movw %si, (%rdi)
    345 ; X86-O0-NEXT:    retq
    346 ;
    347 ; X64-LABEL: f2:
    348 ; X64:       # %bb.0: # %entry
    349 ; X64-NEXT:    movzbl {{.*}}(%rip), %eax
    350 ; X64-NEXT:    xorl %ecx, %ecx
    351 ; X64-NEXT:    testl %eax, %eax
    352 ; X64-NEXT:    sete %cl
    353 ; X64-NEXT:    xorl %eax, %ecx
    354 ; X64-NEXT:    movw %cx, -{{[0-9]+}}(%rsp)
    355 ; X64-NEXT:    xorl %ecx, %ecx
    356 ; X64-NEXT:    testb %al, %al
    357 ; X64-NEXT:    sete %cl
    358 ; X64-NEXT:    xorl %edx, %edx
    359 ; X64-NEXT:    cmpl %eax, %ecx
    360 ; X64-NEXT:    sete %dl
    361 ; X64-NEXT:    movw %dx, (%rax)
    362 ; X64-NEXT:    retq
    363 ;
    364 ; 686-O0-LABEL: f2:
    365 ; 686-O0:       # %bb.0: # %entry
    366 ; 686-O0-NEXT:    pushl %esi
    367 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
    368 ; 686-O0-NEXT:    subl $2, %esp
    369 ; 686-O0-NEXT:    .cfi_def_cfa_offset 10
    370 ; 686-O0-NEXT:    .cfi_offset %esi, -8
    371 ; 686-O0-NEXT:    movzbl var_7, %eax
    372 ; 686-O0-NEXT:    cmpb $0, var_7
    373 ; 686-O0-NEXT:    setne %cl
    374 ; 686-O0-NEXT:    xorb $-1, %cl
    375 ; 686-O0-NEXT:    andb $1, %cl
    376 ; 686-O0-NEXT:    movzbl %cl, %edx
    377 ; 686-O0-NEXT:    xorl %edx, %eax
    378 ; 686-O0-NEXT:    movw %ax, %si
    379 ; 686-O0-NEXT:    movw %si, (%esp)
    380 ; 686-O0-NEXT:    movzbl var_7, %eax
    381 ; 686-O0-NEXT:    movw %ax, %si
    382 ; 686-O0-NEXT:    cmpw $0, %si
    383 ; 686-O0-NEXT:    setne %cl
    384 ; 686-O0-NEXT:    xorb $-1, %cl
    385 ; 686-O0-NEXT:    andb $1, %cl
    386 ; 686-O0-NEXT:    movzbl %cl, %eax
    387 ; 686-O0-NEXT:    movzbl var_7, %edx
    388 ; 686-O0-NEXT:    cmpl %edx, %eax
    389 ; 686-O0-NEXT:    sete %cl
    390 ; 686-O0-NEXT:    andb $1, %cl
    391 ; 686-O0-NEXT:    movzbl %cl, %eax
    392 ; 686-O0-NEXT:    movw %ax, %si
    393 ; 686-O0-NEXT:    # implicit-def: $eax
    394 ; 686-O0-NEXT:    movw %si, (%eax)
    395 ; 686-O0-NEXT:    addl $2, %esp
    396 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
    397 ; 686-O0-NEXT:    popl %esi
    398 ; 686-O0-NEXT:    .cfi_def_cfa_offset 4
    399 ; 686-O0-NEXT:    retl
    400 ;
    401 ; 686-LABEL: f2:
    402 ; 686:       # %bb.0: # %entry
    403 ; 686-NEXT:    subl $2, %esp
    404 ; 686-NEXT:    .cfi_def_cfa_offset 6
    405 ; 686-NEXT:    movzbl var_7, %eax
    406 ; 686-NEXT:    xorl %ecx, %ecx
    407 ; 686-NEXT:    testl %eax, %eax
    408 ; 686-NEXT:    sete %cl
    409 ; 686-NEXT:    xorl %eax, %ecx
    410 ; 686-NEXT:    movw %cx, (%esp)
    411 ; 686-NEXT:    xorl %ecx, %ecx
    412 ; 686-NEXT:    testb %al, %al
    413 ; 686-NEXT:    sete %cl
    414 ; 686-NEXT:    xorl %edx, %edx
    415 ; 686-NEXT:    cmpl %eax, %ecx
    416 ; 686-NEXT:    sete %dl
    417 ; 686-NEXT:    movw %dx, (%eax)
    418 ; 686-NEXT:    addl $2, %esp
    419 ; 686-NEXT:    .cfi_def_cfa_offset 4
    420 ; 686-NEXT:    retl
    421 entry:
    422   %a = alloca i16, align 2
    423   %0 = load i8, i8* @var_7, align 1
    424   %conv = zext i8 %0 to i32
    425   %1 = load i8, i8* @var_7, align 1
    426   %tobool = icmp ne i8 %1, 0
    427   %lnot = xor i1 %tobool, true
    428   %conv1 = zext i1 %lnot to i32
    429   %xor = xor i32 %conv, %conv1
    430   %conv2 = trunc i32 %xor to i16
    431   store i16 %conv2, i16* %a, align 2
    432   %2 = load i8, i8* @var_7, align 1
    433   %conv3 = zext i8 %2 to i16
    434   %tobool4 = icmp ne i16 %conv3, 0
    435   %lnot5 = xor i1 %tobool4, true
    436   %conv6 = zext i1 %lnot5 to i32
    437   %3 = load i8, i8* @var_7, align 1
    438   %conv7 = zext i8 %3 to i32
    439   %cmp = icmp eq i32 %conv6, %conv7
    440   %conv8 = zext i1 %cmp to i32
    441   %conv9 = trunc i32 %conv8 to i16
    442   store i16 %conv9, i16* undef, align 2
    443   ret void
    444 }
    445 
    446 
    447 @var_13 = external global i32, align 4
    448 @var_16 = external global i32, align 4
    449 @var_46 = external global i32, align 4
    450 
    451 define void @f3() #0 {
    452 ; X86-O0-LABEL: f3:
    453 ; X86-O0:       # %bb.0: # %entry
    454 ; X86-O0-NEXT:    movl var_13, %eax
    455 ; X86-O0-NEXT:    xorl $-1, %eax
    456 ; X86-O0-NEXT:    movl %eax, %eax
    457 ; X86-O0-NEXT:    movl %eax, %ecx
    458 ; X86-O0-NEXT:    cmpl $0, var_13
    459 ; X86-O0-NEXT:    setne %dl
    460 ; X86-O0-NEXT:    xorb $-1, %dl
    461 ; X86-O0-NEXT:    andb $1, %dl
    462 ; X86-O0-NEXT:    movzbl %dl, %eax
    463 ; X86-O0-NEXT:    movl %eax, %esi
    464 ; X86-O0-NEXT:    movl var_13, %eax
    465 ; X86-O0-NEXT:    xorl $-1, %eax
    466 ; X86-O0-NEXT:    xorl var_16, %eax
    467 ; X86-O0-NEXT:    movl %eax, %eax
    468 ; X86-O0-NEXT:    movl %eax, %edi
    469 ; X86-O0-NEXT:    andq %rdi, %rsi
    470 ; X86-O0-NEXT:    orq %rsi, %rcx
    471 ; X86-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
    472 ; X86-O0-NEXT:    movl var_13, %eax
    473 ; X86-O0-NEXT:    xorl $-1, %eax
    474 ; X86-O0-NEXT:    movl %eax, %eax
    475 ; X86-O0-NEXT:    movl %eax, %ecx
    476 ; X86-O0-NEXT:    cmpl $0, var_13
    477 ; X86-O0-NEXT:    setne %dl
    478 ; X86-O0-NEXT:    xorb $-1, %dl
    479 ; X86-O0-NEXT:    andb $1, %dl
    480 ; X86-O0-NEXT:    movzbl %dl, %eax
    481 ; X86-O0-NEXT:    movl %eax, %esi
    482 ; X86-O0-NEXT:    andq $0, %rsi
    483 ; X86-O0-NEXT:    orq %rsi, %rcx
    484 ; X86-O0-NEXT:    movl %ecx, %eax
    485 ; X86-O0-NEXT:    movl %eax, var_46
    486 ; X86-O0-NEXT:    retq
    487 ;
    488 ; X64-LABEL: f3:
    489 ; X64:       # %bb.0: # %entry
    490 ; X64-NEXT:    movl {{.*}}(%rip), %eax
    491 ; X64-NEXT:    xorl %ecx, %ecx
    492 ; X64-NEXT:    testl %eax, %eax
    493 ; X64-NEXT:    notl %eax
    494 ; X64-NEXT:    sete %cl
    495 ; X64-NEXT:    movl {{.*}}(%rip), %edx
    496 ; X64-NEXT:    xorl %eax, %edx
    497 ; X64-NEXT:    andl %edx, %ecx
    498 ; X64-NEXT:    orl %eax, %ecx
    499 ; X64-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
    500 ; X64-NEXT:    movl %eax, {{.*}}(%rip)
    501 ; X64-NEXT:    retq
    502 ;
    503 ; 686-O0-LABEL: f3:
    504 ; 686-O0:       # %bb.0: # %entry
    505 ; 686-O0-NEXT:    pushl %ebp
    506 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
    507 ; 686-O0-NEXT:    .cfi_offset %ebp, -8
    508 ; 686-O0-NEXT:    movl %esp, %ebp
    509 ; 686-O0-NEXT:    .cfi_def_cfa_register %ebp
    510 ; 686-O0-NEXT:    pushl %edi
    511 ; 686-O0-NEXT:    pushl %esi
    512 ; 686-O0-NEXT:    andl $-8, %esp
    513 ; 686-O0-NEXT:    subl $8, %esp
    514 ; 686-O0-NEXT:    .cfi_offset %esi, -16
    515 ; 686-O0-NEXT:    .cfi_offset %edi, -12
    516 ; 686-O0-NEXT:    movl var_13, %eax
    517 ; 686-O0-NEXT:    movl %eax, %ecx
    518 ; 686-O0-NEXT:    notl %ecx
    519 ; 686-O0-NEXT:    testl %eax, %eax
    520 ; 686-O0-NEXT:    sete %dl
    521 ; 686-O0-NEXT:    movzbl %dl, %eax
    522 ; 686-O0-NEXT:    movl var_16, %esi
    523 ; 686-O0-NEXT:    movl %ecx, %edi
    524 ; 686-O0-NEXT:    xorl %esi, %edi
    525 ; 686-O0-NEXT:    andl %edi, %eax
    526 ; 686-O0-NEXT:    orl %eax, %ecx
    527 ; 686-O0-NEXT:    movl %ecx, (%esp)
    528 ; 686-O0-NEXT:    movl $0, {{[0-9]+}}(%esp)
    529 ; 686-O0-NEXT:    movl var_13, %eax
    530 ; 686-O0-NEXT:    notl %eax
    531 ; 686-O0-NEXT:    movl %eax, var_46
    532 ; 686-O0-NEXT:    leal -8(%ebp), %esp
    533 ; 686-O0-NEXT:    popl %esi
    534 ; 686-O0-NEXT:    popl %edi
    535 ; 686-O0-NEXT:    popl %ebp
    536 ; 686-O0-NEXT:    .cfi_def_cfa %esp, 4
    537 ; 686-O0-NEXT:    retl
    538 ;
    539 ; 686-LABEL: f3:
    540 ; 686:       # %bb.0: # %entry
    541 ; 686-NEXT:    pushl %ebp
    542 ; 686-NEXT:    .cfi_def_cfa_offset 8
    543 ; 686-NEXT:    .cfi_offset %ebp, -8
    544 ; 686-NEXT:    movl %esp, %ebp
    545 ; 686-NEXT:    .cfi_def_cfa_register %ebp
    546 ; 686-NEXT:    andl $-8, %esp
    547 ; 686-NEXT:    subl $8, %esp
    548 ; 686-NEXT:    movl var_13, %ecx
    549 ; 686-NEXT:    xorl %eax, %eax
    550 ; 686-NEXT:    testl %ecx, %ecx
    551 ; 686-NEXT:    notl %ecx
    552 ; 686-NEXT:    sete %al
    553 ; 686-NEXT:    movl var_16, %edx
    554 ; 686-NEXT:    xorl %ecx, %edx
    555 ; 686-NEXT:    andl %eax, %edx
    556 ; 686-NEXT:    orl %ecx, %edx
    557 ; 686-NEXT:    movl %edx, (%esp)
    558 ; 686-NEXT:    movl $0, {{[0-9]+}}(%esp)
    559 ; 686-NEXT:    movl %ecx, var_46
    560 ; 686-NEXT:    movl %ebp, %esp
    561 ; 686-NEXT:    popl %ebp
    562 ; 686-NEXT:    .cfi_def_cfa %esp, 4
    563 ; 686-NEXT:    retl
    564 entry:
    565   %a = alloca i64, align 8
    566   %0 = load i32, i32* @var_13, align 4
    567   %neg = xor i32 %0, -1
    568   %conv = zext i32 %neg to i64
    569   %1 = load i32, i32* @var_13, align 4
    570   %tobool = icmp ne i32 %1, 0
    571   %lnot = xor i1 %tobool, true
    572   %conv1 = zext i1 %lnot to i64
    573   %2 = load i32, i32* @var_13, align 4
    574   %neg2 = xor i32 %2, -1
    575   %3 = load i32, i32* @var_16, align 4
    576   %xor = xor i32 %neg2, %3
    577   %conv3 = zext i32 %xor to i64
    578   %and = and i64 %conv1, %conv3
    579   %or = or i64 %conv, %and
    580   store i64 %or, i64* %a, align 8
    581   %4 = load i32, i32* @var_13, align 4
    582   %neg4 = xor i32 %4, -1
    583   %conv5 = zext i32 %neg4 to i64
    584   %5 = load i32, i32* @var_13, align 4
    585   %tobool6 = icmp ne i32 %5, 0
    586   %lnot7 = xor i1 %tobool6, true
    587   %conv8 = zext i1 %lnot7 to i64
    588   %and9 = and i64 %conv8, 0
    589   %or10 = or i64 %conv5, %and9
    590   %conv11 = trunc i64 %or10 to i32
    591   store i32 %conv11, i32* @var_46, align 4
    592   ret void
    593 }
    594 
    595