Skip to content

Commit 70dbb5a

Browse files
committed
InstCombine: Add tests to show or-and scenarios which can be possibly be combined generically
1 parent 089a1d9 commit 70dbb5a

File tree

1 file changed

+258
-46
lines changed

1 file changed

+258
-46
lines changed

llvm/test/Transforms/InstCombine/and-or.ll

Lines changed: 258 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -335,52 +335,8 @@ define i8 @and_or_do_not_hoist_mask(i8 %a, i8 %b) {
335335
ret i8 %extra_use_of_or
336336
}
337337

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(
384340
; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[I:%.*]], 8
385341
; CHECK-NEXT: [[SHL:%.*]] = and i64 [[TMP1]], 71776119061217280
386342
; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[I]], 8
@@ -419,3 +375,259 @@ define i64 @or_or_or_and_complex(i64 noundef %i) {
419375
%or27 = or i64 %or23, %shl26
420376
ret i64 %or27
421377
}
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

Comments
 (0)