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