@@ -335,52 +335,8 @@ define i8 @and_or_do_not_hoist_mask(i8 %a, i8 %b) {
335
335
ret i8 %extra_use_of_or
336
336
}
337
337
338
- ; ((B & C0) | A) | (B & C1) -> (B & C0|C1) | A
339
- define i64 @or_or_and (i64 %x ) {
340
- ; CHECK-LABEL: @or_or_and(
341
- ; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[X:%.*]], 8
342
- ; CHECK-NEXT: [[SHL:%.*]] = and i64 [[TMP1]], 71776119061217280
343
- ; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[X]], 8
344
- ; CHECK-NEXT: [[SHL3:%.*]] = and i64 [[TMP2]], -72057594037927936
345
- ; CHECK-NEXT: [[OR:%.*]] = or i64 [[SHL]], [[SHL3]]
346
- ; CHECK-NEXT: [[SHL6:%.*]] = and i64 [[TMP1]], 1095216660480
347
- ; CHECK-NEXT: [[OR7:%.*]] = or i64 [[OR]], [[SHL6]]
348
- ; CHECK-NEXT: ret i64 [[OR7]]
349
- ;
350
- %1 = lshr i64 %x , 8
351
- %shl = and i64 %1 , 71776119061217280
352
- %2 = shl i64 %x , 8
353
- %shl3 = and i64 %2 , -72057594037927936
354
- %or = or i64 %shl , %shl3
355
- %shl6 = and i64 %1 , 1095216660480
356
- %or7 = or i64 %or , %shl6
357
- ret i64 %or7
358
- }
359
-
360
- ; (A | (B & C0)) | (B & C1) -> A | (B & C0|C1)
361
- define i64 @or_or_and_commute0 (i64 %x ) {
362
- ; CHECK-LABEL: @or_or_and_commute0(
363
- ; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[X:%.*]], 8
364
- ; CHECK-NEXT: [[SHL:%.*]] = and i64 [[TMP1]], 71776119061217280
365
- ; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[X]], 8
366
- ; CHECK-NEXT: [[SHL3:%.*]] = and i64 [[TMP2]], -72057594037927936
367
- ; CHECK-NEXT: [[OR:%.*]] = or i64 [[SHL3]], [[SHL]]
368
- ; CHECK-NEXT: [[SHL6:%.*]] = and i64 [[TMP1]], 1095216660480
369
- ; CHECK-NEXT: [[OR7:%.*]] = or i64 [[OR]], [[SHL6]]
370
- ; CHECK-NEXT: ret i64 [[OR7]]
371
- ;
372
- %1 = lshr i64 %x , 8
373
- %shl = and i64 %1 , 71776119061217280
374
- %2 = shl i64 %x , 8
375
- %shl3 = and i64 %2 , -72057594037927936
376
- %or = or i64 %shl3 , %shl
377
- %shl6 = and i64 %1 , 1095216660480
378
- %or7 = or i64 %or , %shl6
379
- ret i64 %or7
380
- }
381
-
382
- define i64 @or_or_or_and_complex (i64 noundef %i ) {
383
- ; CHECK-LABEL: @or_or_or_and_complex(
338
+ define i64 @or_or_and_complex (i64 %i ) {
339
+ ; CHECK-LABEL: @or_or_and_complex(
384
340
; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[I:%.*]], 8
385
341
; CHECK-NEXT: [[SHL:%.*]] = and i64 [[TMP1]], 71776119061217280
386
342
; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[I]], 8
@@ -419,3 +375,259 @@ define i64 @or_or_or_and_complex(i64 noundef %i) {
419
375
%or27 = or i64 %or23 , %shl26
420
376
ret i64 %or27
421
377
}
378
+
379
+ ; (C | (A & D)) | (A & B)
380
+ define i8 @or_or_and_pat1 (i8 %a , i8 %b , i8 %c , i8 %d ) {
381
+ ; CHECK-LABEL: @or_or_and_pat1(
382
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
383
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
384
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
385
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
386
+ ; CHECK-NEXT: ret i8 [[OR2]]
387
+ ;
388
+ %and1 = and i8 %a , %b
389
+ %and2 = and i8 %a , %d
390
+ %or1 = or i8 %c , %and2
391
+ %or2 = or i8 %or1 , %and1
392
+ ret i8 %or2
393
+ }
394
+
395
+ ; (C | (D & A)) | (A & B)
396
+ define i8 @or_or_and_pat2 (i8 %a , i8 %b , i8 %c , i8 %d ) {
397
+ ; CHECK-LABEL: @or_or_and_pat2(
398
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
399
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
400
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
401
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
402
+ ; CHECK-NEXT: ret i8 [[OR2]]
403
+ ;
404
+ %and1 = and i8 %a , %b
405
+ %and2 = and i8 %d , %a
406
+ %or1 = or i8 %c , %and2
407
+ %or2 = or i8 %or1 , %and1
408
+ ret i8 %or2
409
+ }
410
+
411
+ ; (C | (B & D)) | (A & B)
412
+ define i8 @or_or_and_pat3 (i8 %a , i8 %b , i8 %c , i8 %d ) {
413
+ ; CHECK-LABEL: @or_or_and_pat3(
414
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
415
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
416
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
417
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
418
+ ; CHECK-NEXT: ret i8 [[OR2]]
419
+ ;
420
+ %and1 = and i8 %a , %b
421
+ %and2 = and i8 %b , %d
422
+ %or1 = or i8 %c , %and2
423
+ %or2 = or i8 %or1 , %and1
424
+ ret i8 %or2
425
+ }
426
+
427
+ ; (C | (D & B)) | (A & B)
428
+ define i8 @or_or_and_pat4 (i8 %a , i8 %b , i8 %c , i8 %d ) {
429
+ ; CHECK-LABEL: @or_or_and_pat4(
430
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
431
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
432
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
433
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
434
+ ; CHECK-NEXT: ret i8 [[OR2]]
435
+ ;
436
+ %and1 = and i8 %a , %b
437
+ %and2 = and i8 %d , %b
438
+ %or1 = or i8 %c , %and2
439
+ %or2 = or i8 %or1 , %and1
440
+ ret i8 %or2
441
+ }
442
+
443
+ ; ((A & D) | C) | (A & B)
444
+ define i8 @or_or_and_pat5 (i8 %a , i8 %b , i8 %c , i8 %d ) {
445
+ ; CHECK-LABEL: @or_or_and_pat5(
446
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
447
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
448
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
449
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
450
+ ; CHECK-NEXT: ret i8 [[OR2]]
451
+ ;
452
+ %and1 = and i8 %a , %b
453
+ %and2 = and i8 %a , %d
454
+ %or1 = or i8 %and2 , %c
455
+ %or2 = or i8 %or1 , %and1
456
+ ret i8 %or2
457
+ }
458
+
459
+ ; ((D & A) | C) | (A & B)
460
+ define i8 @or_or_and_pat6 (i8 %a , i8 %b , i8 %c , i8 %d ) {
461
+ ; CHECK-LABEL: @or_or_and_pat6(
462
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
463
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
464
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
465
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
466
+ ; CHECK-NEXT: ret i8 [[OR2]]
467
+ ;
468
+ %and1 = and i8 %a , %b
469
+ %and2 = and i8 %d , %a
470
+ %or1 = or i8 %and2 , %c
471
+ %or2 = or i8 %or1 , %and1
472
+ ret i8 %or2
473
+ }
474
+
475
+ ; ((B & D) | C) | (A & B)
476
+ define i8 @or_or_and_pat7 (i8 %a , i8 %b , i8 %c , i8 %d ) {
477
+ ; CHECK-LABEL: @or_or_and_pat7(
478
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
479
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
480
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
481
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
482
+ ; CHECK-NEXT: ret i8 [[OR2]]
483
+ ;
484
+ %and1 = and i8 %a , %b
485
+ %and2 = and i8 %b , %d
486
+ %or1 = or i8 %and2 , %c
487
+ %or2 = or i8 %or1 , %and1
488
+ ret i8 %or2
489
+ }
490
+
491
+ ; ((D & B) | C) | (A & B)
492
+ define i8 @or_or_and_pat8 (i8 %a , i8 %b , i8 %c , i8 %d ) {
493
+ ; CHECK-LABEL: @or_or_and_pat8(
494
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
495
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
496
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
497
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
498
+ ; CHECK-NEXT: ret i8 [[OR2]]
499
+ ;
500
+ %and1 = and i8 %a , %b
501
+ %and2 = and i8 %d , %b
502
+ %or1 = or i8 %and2 , %c
503
+ %or2 = or i8 %or1 , %and1
504
+ ret i8 %or2
505
+ }
506
+
507
+ ; (A & B) | (C | (A & D))
508
+ define i8 @or_and_or_pat1 (i8 %a , i8 %b , i8 %c , i8 %d ) {
509
+ ; CHECK-LABEL: @or_and_or_pat1(
510
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
511
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
512
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
513
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
514
+ ; CHECK-NEXT: ret i8 [[OR2]]
515
+ ;
516
+ %and1 = and i8 %a , %b
517
+ %and2 = and i8 %a , %d
518
+ %or1 = or i8 %c , %and2
519
+ %or2 = or i8 %and1 , %or1
520
+ ret i8 %or2
521
+ }
522
+
523
+ ; (A & B) | (C | (D & A))
524
+ define i8 @or_and_or_pat2 (i8 %a , i8 %b , i8 %c , i8 %d ) {
525
+ ; CHECK-LABEL: @or_and_or_pat2(
526
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
527
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
528
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
529
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
530
+ ; CHECK-NEXT: ret i8 [[OR2]]
531
+ ;
532
+ %and1 = and i8 %a , %b
533
+ %and2 = and i8 %d , %a
534
+ %or1 = or i8 %c , %and2
535
+ %or2 = or i8 %and1 , %or1
536
+ ret i8 %or2
537
+ }
538
+
539
+ ; (A & B) | (C | (B & D))
540
+ define i8 @or_and_or_pat3 (i8 %a , i8 %b , i8 %c , i8 %d ) {
541
+ ; CHECK-LABEL: @or_and_or_pat3(
542
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
543
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
544
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
545
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
546
+ ; CHECK-NEXT: ret i8 [[OR2]]
547
+ ;
548
+ %and1 = and i8 %a , %b
549
+ %and2 = and i8 %b , %d
550
+ %or1 = or i8 %c , %and2
551
+ %or2 = or i8 %and1 , %or1
552
+ ret i8 %or2
553
+ }
554
+
555
+ ; (A & B) | (C | (D & B))
556
+ define i8 @or_and_or_pat4 (i8 %a , i8 %b , i8 %c , i8 %d ) {
557
+ ; CHECK-LABEL: @or_and_or_pat4(
558
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
559
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
560
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
561
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
562
+ ; CHECK-NEXT: ret i8 [[OR2]]
563
+ ;
564
+ %and1 = and i8 %a , %b
565
+ %and2 = and i8 %d , %b
566
+ %or1 = or i8 %c , %and2
567
+ %or2 = or i8 %and1 , %or1
568
+ ret i8 %or2
569
+ }
570
+
571
+ ; (A & B) | ((A & D) | C)
572
+ define i8 @or_and_or_pat5 (i8 %a , i8 %b , i8 %c , i8 %d ) {
573
+ ; CHECK-LABEL: @or_and_or_pat5(
574
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
575
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
576
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
577
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
578
+ ; CHECK-NEXT: ret i8 [[OR2]]
579
+ ;
580
+ %and1 = and i8 %a , %b
581
+ %and2 = and i8 %a , %d
582
+ %or1 = or i8 %and2 , %c
583
+ %or2 = or i8 %and1 , %or1
584
+ ret i8 %or2
585
+ }
586
+
587
+ ; (A & B) | ((D & A) | C)
588
+ define i8 @or_and_or_pat6 (i8 %a , i8 %b , i8 %c , i8 %d ) {
589
+ ; CHECK-LABEL: @or_and_or_pat6(
590
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
591
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
592
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
593
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
594
+ ; CHECK-NEXT: ret i8 [[OR2]]
595
+ ;
596
+ %and1 = and i8 %a , %b
597
+ %and2 = and i8 %d , %a
598
+ %or1 = or i8 %and2 , %c
599
+ %or2 = or i8 %and1 , %or1
600
+ ret i8 %or2
601
+ }
602
+
603
+ ; (A & B) | ((B & D) | C)
604
+ define i8 @or_and_or_pat7 (i8 %a , i8 %b , i8 %c , i8 %d ) {
605
+ ; CHECK-LABEL: @or_and_or_pat7(
606
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
607
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
608
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
609
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
610
+ ; CHECK-NEXT: ret i8 [[OR2]]
611
+ ;
612
+ %and1 = and i8 %a , %b
613
+ %and2 = and i8 %b , %d
614
+ %or1 = or i8 %and2 , %c
615
+ %or2 = or i8 %and1 , %or1
616
+ ret i8 %or2
617
+ }
618
+
619
+ ; (A & B) | ((D & B) | C)
620
+ define i8 @or_and_or_pat8 (i8 %a , i8 %b , i8 %c , i8 %d ) {
621
+ ; CHECK-LABEL: @or_and_or_pat8(
622
+ ; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
623
+ ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
624
+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
625
+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
626
+ ; CHECK-NEXT: ret i8 [[OR2]]
627
+ ;
628
+ %and1 = and i8 %a , %b
629
+ %and2 = and i8 %d , %b
630
+ %or1 = or i8 %and2 , %c
631
+ %or2 = or i8 %and1 , %or1
632
+ ret i8 %or2
633
+ }
0 commit comments