1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi < %s | FileCheck %s --check-prefix=CHECK-NOBMI 3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi < %s | FileCheck %s --check-prefix=CHECK-BMI 4 5 ; https://bugs.llvm.org/show_bug.cgi?id=37104 6 7 ; X: [bit 3210] 8 ; Y: [bit 7654] 9 10 define i8 @out8_constmask(i8 %x, i8 %y) { 11 ; CHECK-NOBMI-LABEL: out8_constmask: 12 ; CHECK-NOBMI: # %bb.0: 13 ; CHECK-NOBMI-NEXT: andb $15, %dil 14 ; CHECK-NOBMI-NEXT: andb $-16, %sil 15 ; CHECK-NOBMI-NEXT: orb %dil, %sil 16 ; CHECK-NOBMI-NEXT: movl %esi, %eax 17 ; CHECK-NOBMI-NEXT: retq 18 ; 19 ; CHECK-BMI-LABEL: out8_constmask: 20 ; CHECK-BMI: # %bb.0: 21 ; CHECK-BMI-NEXT: andb $15, %dil 22 ; CHECK-BMI-NEXT: andb $-16, %sil 23 ; CHECK-BMI-NEXT: orb %dil, %sil 24 ; CHECK-BMI-NEXT: movl %esi, %eax 25 ; CHECK-BMI-NEXT: retq 26 %mx = and i8 %x, 15 27 %my = and i8 %y, -16 28 %r = or i8 %mx, %my 29 ret i8 %r 30 } 31 32 define i16 @out16_constmask(i16 %x, i16 %y) { 33 ; CHECK-NOBMI-LABEL: out16_constmask: 34 ; CHECK-NOBMI: # %bb.0: 35 ; CHECK-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi 36 ; CHECK-NOBMI-NEXT: # kill: def $edi killed $edi def $rdi 37 ; CHECK-NOBMI-NEXT: andl $3855, %edi # imm = 0xF0F 38 ; CHECK-NOBMI-NEXT: andl $-3856, %esi # imm = 0xF0F0 39 ; CHECK-NOBMI-NEXT: leal (%rsi,%rdi), %eax 40 ; CHECK-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax 41 ; CHECK-NOBMI-NEXT: retq 42 ; 43 ; CHECK-BMI-LABEL: out16_constmask: 44 ; CHECK-BMI: # %bb.0: 45 ; CHECK-BMI-NEXT: # kill: def $esi killed $esi def $rsi 46 ; CHECK-BMI-NEXT: # kill: def $edi killed $edi def $rdi 47 ; CHECK-BMI-NEXT: andl $3855, %edi # imm = 0xF0F 48 ; CHECK-BMI-NEXT: andl $-3856, %esi # imm = 0xF0F0 49 ; CHECK-BMI-NEXT: leal (%rsi,%rdi), %eax 50 ; CHECK-BMI-NEXT: # kill: def $ax killed $ax killed $eax 51 ; CHECK-BMI-NEXT: retq 52 %mx = and i16 %x, 3855 53 %my = and i16 %y, -3856 54 %r = or i16 %mx, %my 55 ret i16 %r 56 } 57 58 define i32 @out32_constmask(i32 %x, i32 %y) { 59 ; CHECK-NOBMI-LABEL: out32_constmask: 60 ; CHECK-NOBMI: # %bb.0: 61 ; CHECK-NOBMI-NEXT: # kill: def $esi killed $esi def $rsi 62 ; CHECK-NOBMI-NEXT: # kill: def $edi killed $edi def $rdi 63 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 64 ; CHECK-NOBMI-NEXT: andl $-252645136, %esi # imm = 0xF0F0F0F0 65 ; CHECK-NOBMI-NEXT: leal (%rsi,%rdi), %eax 66 ; CHECK-NOBMI-NEXT: retq 67 ; 68 ; CHECK-BMI-LABEL: out32_constmask: 69 ; CHECK-BMI: # %bb.0: 70 ; CHECK-BMI-NEXT: # kill: def $esi killed $esi def $rsi 71 ; CHECK-BMI-NEXT: # kill: def $edi killed $edi def $rdi 72 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 73 ; CHECK-BMI-NEXT: andl $-252645136, %esi # imm = 0xF0F0F0F0 74 ; CHECK-BMI-NEXT: leal (%rsi,%rdi), %eax 75 ; CHECK-BMI-NEXT: retq 76 %mx = and i32 %x, 252645135 77 %my = and i32 %y, -252645136 78 %r = or i32 %mx, %my 79 ret i32 %r 80 } 81 82 define i64 @out64_constmask(i64 %x, i64 %y) { 83 ; CHECK-NOBMI-LABEL: out64_constmask: 84 ; CHECK-NOBMI: # %bb.0: 85 ; CHECK-NOBMI-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 86 ; CHECK-NOBMI-NEXT: andq %rdi, %rcx 87 ; CHECK-NOBMI-NEXT: movabsq $-1085102592571150096, %rax # imm = 0xF0F0F0F0F0F0F0F0 88 ; CHECK-NOBMI-NEXT: andq %rsi, %rax 89 ; CHECK-NOBMI-NEXT: orq %rcx, %rax 90 ; CHECK-NOBMI-NEXT: retq 91 ; 92 ; CHECK-BMI-LABEL: out64_constmask: 93 ; CHECK-BMI: # %bb.0: 94 ; CHECK-BMI-NEXT: movabsq $1085102592571150095, %rcx # imm = 0xF0F0F0F0F0F0F0F 95 ; CHECK-BMI-NEXT: andq %rdi, %rcx 96 ; CHECK-BMI-NEXT: movabsq $-1085102592571150096, %rax # imm = 0xF0F0F0F0F0F0F0F0 97 ; CHECK-BMI-NEXT: andq %rsi, %rax 98 ; CHECK-BMI-NEXT: orq %rcx, %rax 99 ; CHECK-BMI-NEXT: retq 100 %mx = and i64 %x, 1085102592571150095 101 %my = and i64 %y, -1085102592571150096 102 %r = or i64 %mx, %my 103 ret i64 %r 104 } 105 106 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 107 ; Should be the same as the previous one. 108 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 109 110 define i8 @in8_constmask(i8 %x, i8 %y) { 111 ; CHECK-NOBMI-LABEL: in8_constmask: 112 ; CHECK-NOBMI: # %bb.0: 113 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 114 ; CHECK-NOBMI-NEXT: andb $15, %dil 115 ; CHECK-NOBMI-NEXT: xorb %dil, %sil 116 ; CHECK-NOBMI-NEXT: movl %esi, %eax 117 ; CHECK-NOBMI-NEXT: retq 118 ; 119 ; CHECK-BMI-LABEL: in8_constmask: 120 ; CHECK-BMI: # %bb.0: 121 ; CHECK-BMI-NEXT: xorl %esi, %edi 122 ; CHECK-BMI-NEXT: andb $15, %dil 123 ; CHECK-BMI-NEXT: xorb %dil, %sil 124 ; CHECK-BMI-NEXT: movl %esi, %eax 125 ; CHECK-BMI-NEXT: retq 126 %n0 = xor i8 %x, %y 127 %n1 = and i8 %n0, 15 128 %r = xor i8 %n1, %y 129 ret i8 %r 130 } 131 132 define i16 @in16_constmask(i16 %x, i16 %y) { 133 ; CHECK-NOBMI-LABEL: in16_constmask: 134 ; CHECK-NOBMI: # %bb.0: 135 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 136 ; CHECK-NOBMI-NEXT: andl $3855, %edi # imm = 0xF0F 137 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 138 ; CHECK-NOBMI-NEXT: movl %edi, %eax 139 ; CHECK-NOBMI-NEXT: retq 140 ; 141 ; CHECK-BMI-LABEL: in16_constmask: 142 ; CHECK-BMI: # %bb.0: 143 ; CHECK-BMI-NEXT: xorl %esi, %edi 144 ; CHECK-BMI-NEXT: andl $3855, %edi # imm = 0xF0F 145 ; CHECK-BMI-NEXT: xorl %esi, %edi 146 ; CHECK-BMI-NEXT: movl %edi, %eax 147 ; CHECK-BMI-NEXT: retq 148 %n0 = xor i16 %x, %y 149 %n1 = and i16 %n0, 3855 150 %r = xor i16 %n1, %y 151 ret i16 %r 152 } 153 154 define i32 @in32_constmask(i32 %x, i32 %y) { 155 ; CHECK-NOBMI-LABEL: in32_constmask: 156 ; CHECK-NOBMI: # %bb.0: 157 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 158 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 159 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 160 ; CHECK-NOBMI-NEXT: movl %edi, %eax 161 ; CHECK-NOBMI-NEXT: retq 162 ; 163 ; CHECK-BMI-LABEL: in32_constmask: 164 ; CHECK-BMI: # %bb.0: 165 ; CHECK-BMI-NEXT: xorl %esi, %edi 166 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 167 ; CHECK-BMI-NEXT: xorl %esi, %edi 168 ; CHECK-BMI-NEXT: movl %edi, %eax 169 ; CHECK-BMI-NEXT: retq 170 %n0 = xor i32 %x, %y 171 %n1 = and i32 %n0, 252645135 172 %r = xor i32 %n1, %y 173 ret i32 %r 174 } 175 176 define i64 @in64_constmask(i64 %x, i64 %y) { 177 ; CHECK-NOBMI-LABEL: in64_constmask: 178 ; CHECK-NOBMI: # %bb.0: 179 ; CHECK-NOBMI-NEXT: xorq %rsi, %rdi 180 ; CHECK-NOBMI-NEXT: movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F 181 ; CHECK-NOBMI-NEXT: andq %rdi, %rax 182 ; CHECK-NOBMI-NEXT: xorq %rsi, %rax 183 ; CHECK-NOBMI-NEXT: retq 184 ; 185 ; CHECK-BMI-LABEL: in64_constmask: 186 ; CHECK-BMI: # %bb.0: 187 ; CHECK-BMI-NEXT: xorq %rsi, %rdi 188 ; CHECK-BMI-NEXT: movabsq $1085102592571150095, %rax # imm = 0xF0F0F0F0F0F0F0F 189 ; CHECK-BMI-NEXT: andq %rdi, %rax 190 ; CHECK-BMI-NEXT: xorq %rsi, %rax 191 ; CHECK-BMI-NEXT: retq 192 %n0 = xor i64 %x, %y 193 %n1 = and i64 %n0, 1085102592571150095 194 %r = xor i64 %n1, %y 195 ret i64 %r 196 } 197 198 ; ============================================================================ ; 199 ; Constant Commutativity tests. 200 ; ============================================================================ ; 201 202 define i32 @in_constmask_commutativity_0_1(i32 %x, i32 %y) { 203 ; CHECK-NOBMI-LABEL: in_constmask_commutativity_0_1: 204 ; CHECK-NOBMI: # %bb.0: 205 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 206 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 207 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 208 ; CHECK-NOBMI-NEXT: movl %edi, %eax 209 ; CHECK-NOBMI-NEXT: retq 210 ; 211 ; CHECK-BMI-LABEL: in_constmask_commutativity_0_1: 212 ; CHECK-BMI: # %bb.0: 213 ; CHECK-BMI-NEXT: xorl %esi, %edi 214 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 215 ; CHECK-BMI-NEXT: xorl %esi, %edi 216 ; CHECK-BMI-NEXT: movl %edi, %eax 217 ; CHECK-BMI-NEXT: retq 218 %n0 = xor i32 %x, %y 219 %n1 = and i32 %n0, 252645135 220 %r = xor i32 %y, %n1 ; swapped 221 ret i32 %r 222 } 223 224 define i32 @in_constmask_commutativity_1_0(i32 %x, i32 %y) { 225 ; CHECK-NOBMI-LABEL: in_constmask_commutativity_1_0: 226 ; CHECK-NOBMI: # %bb.0: 227 ; CHECK-NOBMI-NEXT: xorl %edi, %esi 228 ; CHECK-NOBMI-NEXT: andl $252645135, %esi # imm = 0xF0F0F0F 229 ; CHECK-NOBMI-NEXT: xorl %edi, %esi 230 ; CHECK-NOBMI-NEXT: movl %esi, %eax 231 ; CHECK-NOBMI-NEXT: retq 232 ; 233 ; CHECK-BMI-LABEL: in_constmask_commutativity_1_0: 234 ; CHECK-BMI: # %bb.0: 235 ; CHECK-BMI-NEXT: xorl %edi, %esi 236 ; CHECK-BMI-NEXT: andl $252645135, %esi # imm = 0xF0F0F0F 237 ; CHECK-BMI-NEXT: xorl %edi, %esi 238 ; CHECK-BMI-NEXT: movl %esi, %eax 239 ; CHECK-BMI-NEXT: retq 240 %n0 = xor i32 %x, %y 241 %n1 = and i32 %n0, 252645135 242 %r = xor i32 %n1, %x ; %x instead of %y 243 ret i32 %r 244 } 245 246 define i32 @in_constmask_commutativity_1_1(i32 %x, i32 %y) { 247 ; CHECK-NOBMI-LABEL: in_constmask_commutativity_1_1: 248 ; CHECK-NOBMI: # %bb.0: 249 ; CHECK-NOBMI-NEXT: xorl %edi, %esi 250 ; CHECK-NOBMI-NEXT: andl $252645135, %esi # imm = 0xF0F0F0F 251 ; CHECK-NOBMI-NEXT: xorl %edi, %esi 252 ; CHECK-NOBMI-NEXT: movl %esi, %eax 253 ; CHECK-NOBMI-NEXT: retq 254 ; 255 ; CHECK-BMI-LABEL: in_constmask_commutativity_1_1: 256 ; CHECK-BMI: # %bb.0: 257 ; CHECK-BMI-NEXT: xorl %edi, %esi 258 ; CHECK-BMI-NEXT: andl $252645135, %esi # imm = 0xF0F0F0F 259 ; CHECK-BMI-NEXT: xorl %edi, %esi 260 ; CHECK-BMI-NEXT: movl %esi, %eax 261 ; CHECK-BMI-NEXT: retq 262 %n0 = xor i32 %x, %y 263 %n1 = and i32 %n0, 252645135 264 %r = xor i32 %x, %n1 ; swapped, %x instead of %y 265 ret i32 %r 266 } 267 268 ; ============================================================================ ; 269 ; Y is an 'and' too. 270 ; ============================================================================ ; 271 272 define i32 @in_complex_y0_constmask(i32 %x, i32 %y_hi, i32 %y_low) { 273 ; CHECK-NOBMI-LABEL: in_complex_y0_constmask: 274 ; CHECK-NOBMI: # %bb.0: 275 ; CHECK-NOBMI-NEXT: andl %edx, %esi 276 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 277 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 278 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 279 ; CHECK-NOBMI-NEXT: movl %edi, %eax 280 ; CHECK-NOBMI-NEXT: retq 281 ; 282 ; CHECK-BMI-LABEL: in_complex_y0_constmask: 283 ; CHECK-BMI: # %bb.0: 284 ; CHECK-BMI-NEXT: andl %edx, %esi 285 ; CHECK-BMI-NEXT: xorl %esi, %edi 286 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 287 ; CHECK-BMI-NEXT: xorl %esi, %edi 288 ; CHECK-BMI-NEXT: movl %edi, %eax 289 ; CHECK-BMI-NEXT: retq 290 %y = and i32 %y_hi, %y_low 291 %n0 = xor i32 %x, %y 292 %n1 = and i32 %n0, 252645135 293 %r = xor i32 %n1, %y 294 ret i32 %r 295 } 296 297 define i32 @in_complex_y1_constmask(i32 %x, i32 %y_hi, i32 %y_low) { 298 ; CHECK-NOBMI-LABEL: in_complex_y1_constmask: 299 ; CHECK-NOBMI: # %bb.0: 300 ; CHECK-NOBMI-NEXT: andl %edx, %esi 301 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 302 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 303 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 304 ; CHECK-NOBMI-NEXT: movl %edi, %eax 305 ; CHECK-NOBMI-NEXT: retq 306 ; 307 ; CHECK-BMI-LABEL: in_complex_y1_constmask: 308 ; CHECK-BMI: # %bb.0: 309 ; CHECK-BMI-NEXT: andl %edx, %esi 310 ; CHECK-BMI-NEXT: xorl %esi, %edi 311 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 312 ; CHECK-BMI-NEXT: xorl %esi, %edi 313 ; CHECK-BMI-NEXT: movl %edi, %eax 314 ; CHECK-BMI-NEXT: retq 315 %y = and i32 %y_hi, %y_low 316 %n0 = xor i32 %x, %y 317 %n1 = and i32 %n0, 252645135 318 %r = xor i32 %y, %n1 319 ret i32 %r 320 } 321 322 ; ============================================================================ ; 323 ; Negative tests. Should not be folded. 324 ; ============================================================================ ; 325 326 ; Multi-use tests. 327 328 declare void @use32(i32) nounwind 329 330 define i32 @in_multiuse_A_constmask(i32 %x, i32 %y, i32 %z) nounwind { 331 ; CHECK-NOBMI-LABEL: in_multiuse_A_constmask: 332 ; CHECK-NOBMI: # %bb.0: 333 ; CHECK-NOBMI-NEXT: pushq %rbp 334 ; CHECK-NOBMI-NEXT: pushq %rbx 335 ; CHECK-NOBMI-NEXT: pushq %rax 336 ; CHECK-NOBMI-NEXT: movl %esi, %ebx 337 ; CHECK-NOBMI-NEXT: movl %edi, %ebp 338 ; CHECK-NOBMI-NEXT: xorl %esi, %ebp 339 ; CHECK-NOBMI-NEXT: andl $252645135, %ebp # imm = 0xF0F0F0F 340 ; CHECK-NOBMI-NEXT: movl %ebp, %edi 341 ; CHECK-NOBMI-NEXT: callq use32 342 ; CHECK-NOBMI-NEXT: xorl %ebx, %ebp 343 ; CHECK-NOBMI-NEXT: movl %ebp, %eax 344 ; CHECK-NOBMI-NEXT: addq $8, %rsp 345 ; CHECK-NOBMI-NEXT: popq %rbx 346 ; CHECK-NOBMI-NEXT: popq %rbp 347 ; CHECK-NOBMI-NEXT: retq 348 ; 349 ; CHECK-BMI-LABEL: in_multiuse_A_constmask: 350 ; CHECK-BMI: # %bb.0: 351 ; CHECK-BMI-NEXT: pushq %rbp 352 ; CHECK-BMI-NEXT: pushq %rbx 353 ; CHECK-BMI-NEXT: pushq %rax 354 ; CHECK-BMI-NEXT: movl %esi, %ebx 355 ; CHECK-BMI-NEXT: movl %edi, %ebp 356 ; CHECK-BMI-NEXT: xorl %esi, %ebp 357 ; CHECK-BMI-NEXT: andl $252645135, %ebp # imm = 0xF0F0F0F 358 ; CHECK-BMI-NEXT: movl %ebp, %edi 359 ; CHECK-BMI-NEXT: callq use32 360 ; CHECK-BMI-NEXT: xorl %ebx, %ebp 361 ; CHECK-BMI-NEXT: movl %ebp, %eax 362 ; CHECK-BMI-NEXT: addq $8, %rsp 363 ; CHECK-BMI-NEXT: popq %rbx 364 ; CHECK-BMI-NEXT: popq %rbp 365 ; CHECK-BMI-NEXT: retq 366 %n0 = xor i32 %x, %y 367 %n1 = and i32 %n0, 252645135 368 call void @use32(i32 %n1) 369 %r = xor i32 %n1, %y 370 ret i32 %r 371 } 372 373 define i32 @in_multiuse_B_constmask(i32 %x, i32 %y, i32 %z) nounwind { 374 ; CHECK-NOBMI-LABEL: in_multiuse_B_constmask: 375 ; CHECK-NOBMI: # %bb.0: 376 ; CHECK-NOBMI-NEXT: pushq %rbp 377 ; CHECK-NOBMI-NEXT: pushq %rbx 378 ; CHECK-NOBMI-NEXT: pushq %rax 379 ; CHECK-NOBMI-NEXT: movl %esi, %ebx 380 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 381 ; CHECK-NOBMI-NEXT: movl %edi, %ebp 382 ; CHECK-NOBMI-NEXT: andl $252645135, %ebp # imm = 0xF0F0F0F 383 ; CHECK-NOBMI-NEXT: callq use32 384 ; CHECK-NOBMI-NEXT: xorl %ebx, %ebp 385 ; CHECK-NOBMI-NEXT: movl %ebp, %eax 386 ; CHECK-NOBMI-NEXT: addq $8, %rsp 387 ; CHECK-NOBMI-NEXT: popq %rbx 388 ; CHECK-NOBMI-NEXT: popq %rbp 389 ; CHECK-NOBMI-NEXT: retq 390 ; 391 ; CHECK-BMI-LABEL: in_multiuse_B_constmask: 392 ; CHECK-BMI: # %bb.0: 393 ; CHECK-BMI-NEXT: pushq %rbp 394 ; CHECK-BMI-NEXT: pushq %rbx 395 ; CHECK-BMI-NEXT: pushq %rax 396 ; CHECK-BMI-NEXT: movl %esi, %ebx 397 ; CHECK-BMI-NEXT: xorl %esi, %edi 398 ; CHECK-BMI-NEXT: movl %edi, %ebp 399 ; CHECK-BMI-NEXT: andl $252645135, %ebp # imm = 0xF0F0F0F 400 ; CHECK-BMI-NEXT: callq use32 401 ; CHECK-BMI-NEXT: xorl %ebx, %ebp 402 ; CHECK-BMI-NEXT: movl %ebp, %eax 403 ; CHECK-BMI-NEXT: addq $8, %rsp 404 ; CHECK-BMI-NEXT: popq %rbx 405 ; CHECK-BMI-NEXT: popq %rbp 406 ; CHECK-BMI-NEXT: retq 407 %n0 = xor i32 %x, %y 408 %n1 = and i32 %n0, 252645135 409 call void @use32(i32 %n0) 410 %r = xor i32 %n1, %y 411 ret i32 %r 412 } 413 414 ; Various bad variants 415 416 define i32 @n0_badconstmask(i32 %x, i32 %y) { 417 ; CHECK-NOBMI-LABEL: n0_badconstmask: 418 ; CHECK-NOBMI: # %bb.0: 419 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 420 ; CHECK-NOBMI-NEXT: andl $-252645135, %esi # imm = 0xF0F0F0F1 421 ; CHECK-NOBMI-NEXT: orl %edi, %esi 422 ; CHECK-NOBMI-NEXT: movl %esi, %eax 423 ; CHECK-NOBMI-NEXT: retq 424 ; 425 ; CHECK-BMI-LABEL: n0_badconstmask: 426 ; CHECK-BMI: # %bb.0: 427 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 428 ; CHECK-BMI-NEXT: andl $-252645135, %esi # imm = 0xF0F0F0F1 429 ; CHECK-BMI-NEXT: orl %edi, %esi 430 ; CHECK-BMI-NEXT: movl %esi, %eax 431 ; CHECK-BMI-NEXT: retq 432 %mx = and i32 %x, 252645135 433 %my = and i32 %y, -252645135 ; instead of -252645136 434 %r = or i32 %mx, %my 435 ret i32 %r 436 } 437 438 define i32 @n1_thirdvar_constmask(i32 %x, i32 %y, i32 %z) { 439 ; CHECK-NOBMI-LABEL: n1_thirdvar_constmask: 440 ; CHECK-NOBMI: # %bb.0: 441 ; CHECK-NOBMI-NEXT: xorl %esi, %edi 442 ; CHECK-NOBMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 443 ; CHECK-NOBMI-NEXT: xorl %edx, %edi 444 ; CHECK-NOBMI-NEXT: movl %edi, %eax 445 ; CHECK-NOBMI-NEXT: retq 446 ; 447 ; CHECK-BMI-LABEL: n1_thirdvar_constmask: 448 ; CHECK-BMI: # %bb.0: 449 ; CHECK-BMI-NEXT: xorl %esi, %edi 450 ; CHECK-BMI-NEXT: andl $252645135, %edi # imm = 0xF0F0F0F 451 ; CHECK-BMI-NEXT: xorl %edx, %edi 452 ; CHECK-BMI-NEXT: movl %edi, %eax 453 ; CHECK-BMI-NEXT: retq 454 %n0 = xor i32 %x, %y 455 %n1 = and i32 %n0, 252645135 456 %r = xor i32 %n1, %z ; instead of %y 457 ret i32 %r 458 } 459