Skip to content

Commit a2f96a1

Browse files
committed
[ConstraintElimination] Add tests with logical ANDs.
1 parent 5635456 commit a2f96a1

File tree

1 file changed

+175
-0
lines changed
  • llvm/test/Transforms/ConstraintElimination

1 file changed

+175
-0
lines changed

llvm/test/Transforms/ConstraintElimination/and.ll

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,178 @@ exit:
452452
ret i1 %r.10
453453
}
454454

455+
define i1 @test_and_chain_select_ule(i4 %x, i4 %y, i4 %z, i4 %a) {
456+
; CHECK-LABEL: @test_and_chain_select_ule(
457+
; CHECK-NEXT: entry:
458+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
459+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
460+
; CHECK-NEXT: [[C_3:%.*]] = icmp ule i4 3, [[X]]
461+
; CHECK-NEXT: [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
462+
; CHECK-NEXT: [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
463+
; CHECK-NEXT: [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
464+
; CHECK-NEXT: [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
465+
; CHECK-NEXT: br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
466+
; CHECK: bb1:
467+
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
468+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i4 [[X]], [[Y]]
469+
; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[T_1]], [[T_2]]
470+
; CHECK-NEXT: [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
471+
; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
472+
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i4 3, [[X]]
473+
; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[T_4]]
474+
; CHECK-NEXT: [[T_5:%.*]] = icmp ule i4 3, [[A]]
475+
; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[T_5]]
476+
; CHECK-NEXT: [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
477+
; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
478+
; CHECK-NEXT: ret i1 [[R_5]]
479+
; CHECK: exit:
480+
; CHECK-NEXT: [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
481+
; CHECK-NEXT: [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
482+
; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
483+
; CHECK-NEXT: [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
484+
; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
485+
; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
486+
; CHECK-NEXT: [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
487+
; CHECK-NEXT: [[C_10:%.*]] = icmp ule i4 3, [[X]]
488+
; CHECK-NEXT: [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
489+
; CHECK-NEXT: [[C_11:%.*]] = icmp ule i4 3, [[A]]
490+
; CHECK-NEXT: [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
491+
; CHECK-NEXT: ret i1 [[R_10]]
492+
;
493+
entry:
494+
%c.1 = icmp ule i4 %x, %y
495+
%c.2 = icmp ule i4 %y, %z
496+
%c.3 = icmp ule i4 3, %x
497+
%c.4 = icmp ule i4 3, %a
498+
%and.1 = select i1 %c.1, i1 %c.1, i1 false
499+
%and.2 = select i1 %and.1, i1 %c.3, i1 false
500+
%and.3 = select i1 %c.4, i1 %and.2, i1 false
501+
br i1 %and.3, label %bb1, label %exit
502+
503+
bb1:
504+
%t.1 = icmp ule i4 %x, %z
505+
%t.2 = icmp ule i4 %x, %y
506+
%r.1 = xor i1 %t.1, %t.2
507+
508+
%t.3 = icmp ule i4 %y, %z
509+
%r.2 = xor i1 %r.1, %t.3
510+
511+
%t.4 = icmp ule i4 3, %x
512+
%r.3 = xor i1 %r.2, %t.4
513+
514+
%t.5 = icmp ule i4 3, %a
515+
%r.4 = xor i1 %r.3, %t.5
516+
517+
%c.5 = icmp ule i4 %x, %a
518+
%r.5 = xor i1 %r.4, %c.5
519+
520+
ret i1 %r.5
521+
522+
exit:
523+
%c.6 = icmp ule i4 %x, %z
524+
%c.7 = icmp ule i4 %x, %a
525+
%r.6 = xor i1 %c.6, %c.7
526+
527+
%c.8 = icmp ule i4 %x, %y
528+
%r.7 = xor i1 %r.6, %c.8
529+
530+
%c.9 = icmp ule i4 %y, %z
531+
%r.8 = xor i1 %r.7, %c.9
532+
533+
%c.10 = icmp ule i4 3, %x
534+
%r.9 = xor i1 %r.8, %c.10
535+
536+
%c.11 = icmp ule i4 3, %a
537+
%r.10 = xor i1 %r.9, %c.11
538+
539+
ret i1 %r.10
540+
}
541+
542+
define i1 @test_and_chain_select_ule_logical_or(i4 %x, i4 %y, i4 %z, i4 %a) {
543+
; CHECK-LABEL: @test_and_chain_select_ule_logical_or(
544+
; CHECK-NEXT: entry:
545+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
546+
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
547+
; CHECK-NEXT: [[C_3:%.*]] = icmp ule i4 3, [[X]]
548+
; CHECK-NEXT: [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
549+
; CHECK-NEXT: [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
550+
; CHECK-NEXT: [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
551+
; CHECK-NEXT: [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
552+
; CHECK-NEXT: [[AND_4:%.*]] = select i1 [[AND_3]], i1 true, i1 false
553+
; CHECK-NEXT: br i1 [[AND_4]], label [[BB1:%.*]], label [[EXIT:%.*]]
554+
; CHECK: bb1:
555+
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
556+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i4 [[X]], [[Y]]
557+
; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[T_1]], [[T_2]]
558+
; CHECK-NEXT: [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
559+
; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
560+
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i4 3, [[X]]
561+
; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[T_4]]
562+
; CHECK-NEXT: [[T_5:%.*]] = icmp ule i4 3, [[A]]
563+
; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[T_5]]
564+
; CHECK-NEXT: [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
565+
; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
566+
; CHECK-NEXT: ret i1 [[R_5]]
567+
; CHECK: exit:
568+
; CHECK-NEXT: [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
569+
; CHECK-NEXT: [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
570+
; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
571+
; CHECK-NEXT: [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
572+
; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
573+
; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
574+
; CHECK-NEXT: [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
575+
; CHECK-NEXT: [[C_10:%.*]] = icmp ule i4 3, [[X]]
576+
; CHECK-NEXT: [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
577+
; CHECK-NEXT: [[C_11:%.*]] = icmp ule i4 3, [[A]]
578+
; CHECK-NEXT: [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
579+
; CHECK-NEXT: ret i1 [[R_10]]
580+
;
581+
entry:
582+
%c.1 = icmp ule i4 %x, %y
583+
%c.2 = icmp ule i4 %y, %z
584+
%c.3 = icmp ule i4 3, %x
585+
%c.4 = icmp ule i4 3, %a
586+
%and.1 = select i1 %c.1, i1 %c.1, i1 false
587+
%and.2 = select i1 %and.1, i1 %c.3, i1 false
588+
%and.3 = select i1 %c.4, i1 %and.2, i1 false
589+
%and.4 = select i1 %and.3, i1 true, i1 false
590+
br i1 %and.4, label %bb1, label %exit
591+
592+
bb1:
593+
%t.1 = icmp ule i4 %x, %z
594+
%t.2 = icmp ule i4 %x, %y
595+
%r.1 = xor i1 %t.1, %t.2
596+
597+
%t.3 = icmp ule i4 %y, %z
598+
%r.2 = xor i1 %r.1, %t.3
599+
600+
%t.4 = icmp ule i4 3, %x
601+
%r.3 = xor i1 %r.2, %t.4
602+
603+
%t.5 = icmp ule i4 3, %a
604+
%r.4 = xor i1 %r.3, %t.5
605+
606+
%c.5 = icmp ule i4 %x, %a
607+
%r.5 = xor i1 %r.4, %c.5
608+
609+
ret i1 %r.5
610+
611+
exit:
612+
%c.6 = icmp ule i4 %x, %z
613+
%c.7 = icmp ule i4 %x, %a
614+
%r.6 = xor i1 %c.6, %c.7
615+
616+
%c.8 = icmp ule i4 %x, %y
617+
%r.7 = xor i1 %r.6, %c.8
618+
619+
%c.9 = icmp ule i4 %y, %z
620+
%r.8 = xor i1 %r.7, %c.9
621+
622+
%c.10 = icmp ule i4 3, %x
623+
%r.9 = xor i1 %r.8, %c.10
624+
625+
%c.11 = icmp ule i4 3, %a
626+
%r.10 = xor i1 %r.9, %c.11
627+
628+
ret i1 %r.10
629+
}

0 commit comments

Comments
 (0)