1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s 3 4 define zeroext i1 @all_bits_clear(i32 %P, i32 %Q) nounwind { 5 ; CHECK-LABEL: all_bits_clear: 6 ; CHECK: # %bb.0: 7 ; CHECK-NEXT: orl %esi, %edi 8 ; CHECK-NEXT: sete %al 9 ; CHECK-NEXT: retq 10 %a = icmp eq i32 %P, 0 11 %b = icmp eq i32 %Q, 0 12 %c = and i1 %a, %b 13 ret i1 %c 14 } 15 16 define zeroext i1 @all_sign_bits_clear(i32 %P, i32 %Q) nounwind { 17 ; CHECK-LABEL: all_sign_bits_clear: 18 ; CHECK: # %bb.0: 19 ; CHECK-NEXT: orl %esi, %edi 20 ; CHECK-NEXT: setns %al 21 ; CHECK-NEXT: retq 22 %a = icmp sgt i32 %P, -1 23 %b = icmp sgt i32 %Q, -1 24 %c = and i1 %a, %b 25 ret i1 %c 26 } 27 28 define zeroext i1 @all_bits_set(i32 %P, i32 %Q) nounwind { 29 ; CHECK-LABEL: all_bits_set: 30 ; CHECK: # %bb.0: 31 ; CHECK-NEXT: andl %esi, %edi 32 ; CHECK-NEXT: cmpl $-1, %edi 33 ; CHECK-NEXT: sete %al 34 ; CHECK-NEXT: retq 35 %a = icmp eq i32 %P, -1 36 %b = icmp eq i32 %Q, -1 37 %c = and i1 %a, %b 38 ret i1 %c 39 } 40 41 define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q) nounwind { 42 ; CHECK-LABEL: all_sign_bits_set: 43 ; CHECK: # %bb.0: 44 ; CHECK-NEXT: andl %esi, %edi 45 ; CHECK-NEXT: shrl $31, %edi 46 ; CHECK-NEXT: movl %edi, %eax 47 ; CHECK-NEXT: retq 48 %a = icmp slt i32 %P, 0 49 %b = icmp slt i32 %Q, 0 50 %c = and i1 %a, %b 51 ret i1 %c 52 } 53 54 define zeroext i1 @any_bits_set(i32 %P, i32 %Q) nounwind { 55 ; CHECK-LABEL: any_bits_set: 56 ; CHECK: # %bb.0: 57 ; CHECK-NEXT: orl %esi, %edi 58 ; CHECK-NEXT: setne %al 59 ; CHECK-NEXT: retq 60 %a = icmp ne i32 %P, 0 61 %b = icmp ne i32 %Q, 0 62 %c = or i1 %a, %b 63 ret i1 %c 64 } 65 66 define zeroext i1 @any_sign_bits_set(i32 %P, i32 %Q) nounwind { 67 ; CHECK-LABEL: any_sign_bits_set: 68 ; CHECK: # %bb.0: 69 ; CHECK-NEXT: orl %esi, %edi 70 ; CHECK-NEXT: shrl $31, %edi 71 ; CHECK-NEXT: movl %edi, %eax 72 ; CHECK-NEXT: retq 73 %a = icmp slt i32 %P, 0 74 %b = icmp slt i32 %Q, 0 75 %c = or i1 %a, %b 76 ret i1 %c 77 } 78 79 define zeroext i1 @any_bits_clear(i32 %P, i32 %Q) nounwind { 80 ; CHECK-LABEL: any_bits_clear: 81 ; CHECK: # %bb.0: 82 ; CHECK-NEXT: andl %esi, %edi 83 ; CHECK-NEXT: cmpl $-1, %edi 84 ; CHECK-NEXT: setne %al 85 ; CHECK-NEXT: retq 86 %a = icmp ne i32 %P, -1 87 %b = icmp ne i32 %Q, -1 88 %c = or i1 %a, %b 89 ret i1 %c 90 } 91 92 define zeroext i1 @any_sign_bits_clear(i32 %P, i32 %Q) nounwind { 93 ; CHECK-LABEL: any_sign_bits_clear: 94 ; CHECK: # %bb.0: 95 ; CHECK-NEXT: testl %esi, %edi 96 ; CHECK-NEXT: setns %al 97 ; CHECK-NEXT: retq 98 %a = icmp sgt i32 %P, -1 99 %b = icmp sgt i32 %Q, -1 100 %c = or i1 %a, %b 101 ret i1 %c 102 } 103 104 ; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0 105 define i32 @all_bits_clear_branch(i32* %P, i32* %Q) nounwind { 106 ; CHECK-LABEL: all_bits_clear_branch: 107 ; CHECK: # %bb.0: # %entry 108 ; CHECK-NEXT: orq %rsi, %rdi 109 ; CHECK-NEXT: jne .LBB8_2 110 ; CHECK-NEXT: # %bb.1: # %bb1 111 ; CHECK-NEXT: movl $4, %eax 112 ; CHECK-NEXT: retq 113 ; CHECK-NEXT: .LBB8_2: # %return 114 ; CHECK-NEXT: movl $192, %eax 115 ; CHECK-NEXT: retq 116 entry: 117 %a = icmp eq i32* %P, null 118 %b = icmp eq i32* %Q, null 119 %c = and i1 %a, %b 120 br i1 %c, label %bb1, label %return 121 122 bb1: 123 ret i32 4 124 125 return: 126 ret i32 192 127 } 128 129 define i32 @all_sign_bits_clear_branch(i32 %P, i32 %Q) nounwind { 130 ; CHECK-LABEL: all_sign_bits_clear_branch: 131 ; CHECK: # %bb.0: # %entry 132 ; CHECK-NEXT: testl %edi, %edi 133 ; CHECK-NEXT: js .LBB9_3 134 ; CHECK-NEXT: # %bb.1: # %entry 135 ; CHECK-NEXT: testl %esi, %esi 136 ; CHECK-NEXT: js .LBB9_3 137 ; CHECK-NEXT: # %bb.2: # %bb1 138 ; CHECK-NEXT: movl $4, %eax 139 ; CHECK-NEXT: retq 140 ; CHECK-NEXT: .LBB9_3: # %return 141 ; CHECK-NEXT: movl $192, %eax 142 ; CHECK-NEXT: retq 143 entry: 144 %a = icmp sgt i32 %P, -1 145 %b = icmp sgt i32 %Q, -1 146 %c = and i1 %a, %b 147 br i1 %c, label %bb1, label %return 148 149 bb1: 150 ret i32 4 151 152 return: 153 ret i32 192 154 } 155 156 define i32 @all_bits_set_branch(i32 %P, i32 %Q) nounwind { 157 ; CHECK-LABEL: all_bits_set_branch: 158 ; CHECK: # %bb.0: # %entry 159 ; CHECK-NEXT: cmpl $-1, %edi 160 ; CHECK-NEXT: jne .LBB10_3 161 ; CHECK-NEXT: # %bb.1: # %entry 162 ; CHECK-NEXT: cmpl $-1, %esi 163 ; CHECK-NEXT: jne .LBB10_3 164 ; CHECK-NEXT: # %bb.2: # %bb1 165 ; CHECK-NEXT: movl $4, %eax 166 ; CHECK-NEXT: retq 167 ; CHECK-NEXT: .LBB10_3: # %return 168 ; CHECK-NEXT: movl $192, %eax 169 ; CHECK-NEXT: retq 170 entry: 171 %a = icmp eq i32 %P, -1 172 %b = icmp eq i32 %Q, -1 173 %c = and i1 %a, %b 174 br i1 %c, label %bb1, label %return 175 176 bb1: 177 ret i32 4 178 179 return: 180 ret i32 192 181 } 182 183 define i32 @all_sign_bits_set_branch(i32 %P, i32 %Q) nounwind { 184 ; CHECK-LABEL: all_sign_bits_set_branch: 185 ; CHECK: # %bb.0: # %entry 186 ; CHECK-NEXT: testl %edi, %edi 187 ; CHECK-NEXT: jns .LBB11_3 188 ; CHECK-NEXT: # %bb.1: # %entry 189 ; CHECK-NEXT: testl %esi, %esi 190 ; CHECK-NEXT: jns .LBB11_3 191 ; CHECK-NEXT: # %bb.2: # %bb1 192 ; CHECK-NEXT: movl $4, %eax 193 ; CHECK-NEXT: retq 194 ; CHECK-NEXT: .LBB11_3: # %return 195 ; CHECK-NEXT: movl $192, %eax 196 ; CHECK-NEXT: retq 197 entry: 198 %a = icmp slt i32 %P, 0 199 %b = icmp slt i32 %Q, 0 200 %c = and i1 %a, %b 201 br i1 %c, label %bb1, label %return 202 203 bb1: 204 ret i32 4 205 206 return: 207 ret i32 192 208 } 209 210 ; PR3351 - (P != 0) | (Q != 0) -> (P|Q) != 0 211 define i32 @any_bits_set_branch(i32* %P, i32* %Q) nounwind { 212 ; CHECK-LABEL: any_bits_set_branch: 213 ; CHECK: # %bb.0: # %entry 214 ; CHECK-NEXT: orq %rsi, %rdi 215 ; CHECK-NEXT: je .LBB12_2 216 ; CHECK-NEXT: # %bb.1: # %bb1 217 ; CHECK-NEXT: movl $4, %eax 218 ; CHECK-NEXT: retq 219 ; CHECK-NEXT: .LBB12_2: # %return 220 ; CHECK-NEXT: movl $192, %eax 221 ; CHECK-NEXT: retq 222 entry: 223 %a = icmp ne i32* %P, null 224 %b = icmp ne i32* %Q, null 225 %c = or i1 %a, %b 226 br i1 %c, label %bb1, label %return 227 228 bb1: 229 ret i32 4 230 231 return: 232 ret i32 192 233 } 234 235 define i32 @any_sign_bits_set_branch(i32 %P, i32 %Q) nounwind { 236 ; CHECK-LABEL: any_sign_bits_set_branch: 237 ; CHECK: # %bb.0: # %entry 238 ; CHECK-NEXT: testl %edi, %edi 239 ; CHECK-NEXT: js .LBB13_2 240 ; CHECK-NEXT: # %bb.1: # %entry 241 ; CHECK-NEXT: testl %esi, %esi 242 ; CHECK-NEXT: js .LBB13_2 243 ; CHECK-NEXT: # %bb.3: # %return 244 ; CHECK-NEXT: movl $192, %eax 245 ; CHECK-NEXT: retq 246 ; CHECK-NEXT: .LBB13_2: # %bb1 247 ; CHECK-NEXT: movl $4, %eax 248 ; CHECK-NEXT: retq 249 entry: 250 %a = icmp slt i32 %P, 0 251 %b = icmp slt i32 %Q, 0 252 %c = or i1 %a, %b 253 br i1 %c, label %bb1, label %return 254 255 bb1: 256 ret i32 4 257 258 return: 259 ret i32 192 260 } 261 262 define i32 @any_bits_clear_branch(i32 %P, i32 %Q) nounwind { 263 ; CHECK-LABEL: any_bits_clear_branch: 264 ; CHECK: # %bb.0: # %entry 265 ; CHECK-NEXT: cmpl $-1, %edi 266 ; CHECK-NEXT: jne .LBB14_2 267 ; CHECK-NEXT: # %bb.1: # %entry 268 ; CHECK-NEXT: cmpl $-1, %esi 269 ; CHECK-NEXT: jne .LBB14_2 270 ; CHECK-NEXT: # %bb.3: # %return 271 ; CHECK-NEXT: movl $192, %eax 272 ; CHECK-NEXT: retq 273 ; CHECK-NEXT: .LBB14_2: # %bb1 274 ; CHECK-NEXT: movl $4, %eax 275 ; CHECK-NEXT: retq 276 entry: 277 %a = icmp ne i32 %P, -1 278 %b = icmp ne i32 %Q, -1 279 %c = or i1 %a, %b 280 br i1 %c, label %bb1, label %return 281 282 bb1: 283 ret i32 4 284 285 return: 286 ret i32 192 287 } 288 289 define i32 @any_sign_bits_clear_branch(i32 %P, i32 %Q) nounwind { 290 ; CHECK-LABEL: any_sign_bits_clear_branch: 291 ; CHECK: # %bb.0: # %entry 292 ; CHECK-NEXT: testl %edi, %edi 293 ; CHECK-NEXT: jns .LBB15_2 294 ; CHECK-NEXT: # %bb.1: # %entry 295 ; CHECK-NEXT: testl %esi, %esi 296 ; CHECK-NEXT: jns .LBB15_2 297 ; CHECK-NEXT: # %bb.3: # %return 298 ; CHECK-NEXT: movl $192, %eax 299 ; CHECK-NEXT: retq 300 ; CHECK-NEXT: .LBB15_2: # %bb1 301 ; CHECK-NEXT: movl $4, %eax 302 ; CHECK-NEXT: retq 303 entry: 304 %a = icmp sgt i32 %P, -1 305 %b = icmp sgt i32 %Q, -1 306 %c = or i1 %a, %b 307 br i1 %c, label %bb1, label %return 308 309 bb1: 310 ret i32 4 311 312 return: 313 ret i32 192 314 } 315 316 define <4 x i1> @all_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 317 ; CHECK-LABEL: all_bits_clear_vec: 318 ; CHECK: # %bb.0: 319 ; CHECK-NEXT: por %xmm1, %xmm0 320 ; CHECK-NEXT: pxor %xmm1, %xmm1 321 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 322 ; CHECK-NEXT: retq 323 %a = icmp eq <4 x i32> %P, zeroinitializer 324 %b = icmp eq <4 x i32> %Q, zeroinitializer 325 %c = and <4 x i1> %a, %b 326 ret <4 x i1> %c 327 } 328 329 define <4 x i1> @all_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 330 ; CHECK-LABEL: all_sign_bits_clear_vec: 331 ; CHECK: # %bb.0: 332 ; CHECK-NEXT: por %xmm1, %xmm0 333 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 334 ; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 335 ; CHECK-NEXT: retq 336 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1> 337 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1> 338 %c = and <4 x i1> %a, %b 339 ret <4 x i1> %c 340 } 341 342 define <4 x i1> @all_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 343 ; CHECK-LABEL: all_bits_set_vec: 344 ; CHECK: # %bb.0: 345 ; CHECK-NEXT: pand %xmm1, %xmm0 346 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 347 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 348 ; CHECK-NEXT: retq 349 %a = icmp eq <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1> 350 %b = icmp eq <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1> 351 %c = and <4 x i1> %a, %b 352 ret <4 x i1> %c 353 } 354 355 define <4 x i1> @all_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 356 ; CHECK-LABEL: all_sign_bits_set_vec: 357 ; CHECK: # %bb.0: 358 ; CHECK-NEXT: pand %xmm1, %xmm0 359 ; CHECK-NEXT: pxor %xmm1, %xmm1 360 ; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 361 ; CHECK-NEXT: movdqa %xmm1, %xmm0 362 ; CHECK-NEXT: retq 363 %a = icmp slt <4 x i32> %P, zeroinitializer 364 %b = icmp slt <4 x i32> %Q, zeroinitializer 365 %c = and <4 x i1> %a, %b 366 ret <4 x i1> %c 367 } 368 369 define <4 x i1> @any_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 370 ; CHECK-LABEL: any_bits_set_vec: 371 ; CHECK: # %bb.0: 372 ; CHECK-NEXT: por %xmm1, %xmm0 373 ; CHECK-NEXT: pxor %xmm1, %xmm1 374 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 375 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 376 ; CHECK-NEXT: pxor %xmm1, %xmm0 377 ; CHECK-NEXT: retq 378 %a = icmp ne <4 x i32> %P, zeroinitializer 379 %b = icmp ne <4 x i32> %Q, zeroinitializer 380 %c = or <4 x i1> %a, %b 381 ret <4 x i1> %c 382 } 383 384 define <4 x i1> @any_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 385 ; CHECK-LABEL: any_sign_bits_set_vec: 386 ; CHECK: # %bb.0: 387 ; CHECK-NEXT: por %xmm1, %xmm0 388 ; CHECK-NEXT: pxor %xmm1, %xmm1 389 ; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 390 ; CHECK-NEXT: movdqa %xmm1, %xmm0 391 ; CHECK-NEXT: retq 392 %a = icmp slt <4 x i32> %P, zeroinitializer 393 %b = icmp slt <4 x i32> %Q, zeroinitializer 394 %c = or <4 x i1> %a, %b 395 ret <4 x i1> %c 396 } 397 398 define <4 x i1> @any_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 399 ; CHECK-LABEL: any_bits_clear_vec: 400 ; CHECK: # %bb.0: 401 ; CHECK-NEXT: pand %xmm1, %xmm0 402 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 403 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 404 ; CHECK-NEXT: pxor %xmm1, %xmm0 405 ; CHECK-NEXT: retq 406 %a = icmp ne <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1> 407 %b = icmp ne <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1> 408 %c = or <4 x i1> %a, %b 409 ret <4 x i1> %c 410 } 411 412 define <4 x i1> @any_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind { 413 ; CHECK-LABEL: any_sign_bits_clear_vec: 414 ; CHECK: # %bb.0: 415 ; CHECK-NEXT: pand %xmm1, %xmm0 416 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 417 ; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 418 ; CHECK-NEXT: retq 419 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1> 420 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1> 421 %c = or <4 x i1> %a, %b 422 ret <4 x i1> %c 423 } 424 425 define zeroext i1 @ne_neg1_and_ne_zero(i64 %x) nounwind { 426 ; CHECK-LABEL: ne_neg1_and_ne_zero: 427 ; CHECK: # %bb.0: 428 ; CHECK-NEXT: incq %rdi 429 ; CHECK-NEXT: cmpq $1, %rdi 430 ; CHECK-NEXT: seta %al 431 ; CHECK-NEXT: retq 432 %cmp1 = icmp ne i64 %x, -1 433 %cmp2 = icmp ne i64 %x, 0 434 %and = and i1 %cmp1, %cmp2 435 ret i1 %and 436 } 437 438 ; PR32401 - https://bugs.llvm.org/show_bug.cgi?id=32401 439 440 define zeroext i1 @and_eq(i8 %a, i8 %b, i8 %c, i8 %d) nounwind { 441 ; CHECK-LABEL: and_eq: 442 ; CHECK: # %bb.0: 443 ; CHECK-NEXT: xorl %esi, %edi 444 ; CHECK-NEXT: xorl %ecx, %edx 445 ; CHECK-NEXT: orb %dl, %dil 446 ; CHECK-NEXT: sete %al 447 ; CHECK-NEXT: retq 448 %cmp1 = icmp eq i8 %a, %b 449 %cmp2 = icmp eq i8 %c, %d 450 %and = and i1 %cmp1, %cmp2 451 ret i1 %and 452 } 453 454 define zeroext i1 @or_ne(i8 %a, i8 %b, i8 %c, i8 %d) nounwind { 455 ; CHECK-LABEL: or_ne: 456 ; CHECK: # %bb.0: 457 ; CHECK-NEXT: xorl %esi, %edi 458 ; CHECK-NEXT: xorl %ecx, %edx 459 ; CHECK-NEXT: orb %dl, %dil 460 ; CHECK-NEXT: setne %al 461 ; CHECK-NEXT: retq 462 %cmp1 = icmp ne i8 %a, %b 463 %cmp2 = icmp ne i8 %c, %d 464 %or = or i1 %cmp1, %cmp2 465 ret i1 %or 466 } 467 468 ; This should not be transformed because vector compares + bitwise logic are faster. 469 470 define <4 x i1> @and_eq_vec(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) nounwind { 471 ; CHECK-LABEL: and_eq_vec: 472 ; CHECK: # %bb.0: 473 ; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 474 ; CHECK-NEXT: pcmpeqd %xmm3, %xmm2 475 ; CHECK-NEXT: pand %xmm2, %xmm0 476 ; CHECK-NEXT: retq 477 %cmp1 = icmp eq <4 x i32> %a, %b 478 %cmp2 = icmp eq <4 x i32> %c, %d 479 %and = and <4 x i1> %cmp1, %cmp2 480 ret <4 x i1> %and 481 } 482 483