@@ -565,6 +565,138 @@ e.2:
565
565
ret void
566
566
}
567
567
568
+ define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_multiple_predecessors (ptr %A , ptr %B , i1 %c ) nosync nofree {
569
+ ; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_multiple_predecessors'
570
+ ; CHECK-NEXT: loop.header:
571
+ ; CHECK-NEXT: Memory dependences are safe with run-time checks
572
+ ; CHECK-NEXT: Dependences:
573
+ ; CHECK-NEXT: Run-time memory checks:
574
+ ; CHECK-NEXT: Check 0:
575
+ ; CHECK-NEXT: Comparing group GRP0:
576
+ ; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
577
+ ; CHECK-NEXT: Against group GRP1:
578
+ ; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
579
+ ; CHECK-NEXT: Grouped accesses:
580
+ ; CHECK-NEXT: Group GRP0:
581
+ ; CHECK-NEXT: (Low: %B High: (2000 + %B))
582
+ ; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
583
+ ; CHECK-NEXT: Group GRP1:
584
+ ; CHECK-NEXT: (Low: %A High: (2000 + %A))
585
+ ; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
586
+ ; CHECK-EMPTY:
587
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
588
+ ; CHECK-NEXT: SCEV assumptions:
589
+ ; CHECK-EMPTY:
590
+ ; CHECK-NEXT: Expressions re-written:
591
+ ;
592
+ entry:
593
+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %A , i64 2000 ) ]
594
+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %B , i64 2000 ) ]
595
+ br i1 %c , label %then , label %else
596
+
597
+ then:
598
+ br label %loop.header
599
+
600
+ else:
601
+ br label %loop.header
602
+
603
+ loop.header:
604
+ %iv = phi i64 [ 0 , %then ], [ 0 , %else ], [ %iv.next , %latch ]
605
+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
606
+ %gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
607
+ %l = load i32 , ptr %gep.A , align 4
608
+ store i32 0 , ptr %gep.B , align 4
609
+ %cntable.c.1 = icmp ult i64 %iv , 1000
610
+ %iv.next = add nuw nsw i64 %iv , 1
611
+ br i1 %cntable.c.1 , label %b2 , label %e.1
612
+
613
+ b2:
614
+ %uncntable.c.0 = icmp eq i32 %l , 0
615
+ br i1 %uncntable.c.0 , label %e.2 , label %b3
616
+
617
+ b3:
618
+ %cntable.c.2 = icmp eq i64 %iv.next , 500
619
+ br i1 %cntable.c.2 , label %cleanup4 , label %latch
620
+
621
+ latch:
622
+ br label %loop.header
623
+
624
+ cleanup4:
625
+ ret void
626
+
627
+ e.1 :
628
+ ret void
629
+
630
+ e.2 :
631
+ ret void
632
+ }
633
+
634
+ define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_multiple_predecessors_no_valid (ptr %A , ptr %B , i1 %c ) nosync nofree {
635
+ ; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_multiple_predecessors_no_valid'
636
+ ; CHECK-NEXT: loop.header:
637
+ ; CHECK-NEXT: Memory dependences are safe with run-time checks
638
+ ; CHECK-NEXT: Dependences:
639
+ ; CHECK-NEXT: Run-time memory checks:
640
+ ; CHECK-NEXT: Check 0:
641
+ ; CHECK-NEXT: Comparing group GRP0:
642
+ ; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
643
+ ; CHECK-NEXT: Against group GRP1:
644
+ ; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
645
+ ; CHECK-NEXT: Grouped accesses:
646
+ ; CHECK-NEXT: Group GRP0:
647
+ ; CHECK-NEXT: (Low: %B High: inttoptr (i64 -1 to ptr))
648
+ ; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
649
+ ; CHECK-NEXT: Group GRP1:
650
+ ; CHECK-NEXT: (Low: %A High: (2000 + %A))
651
+ ; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
652
+ ; CHECK-EMPTY:
653
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
654
+ ; CHECK-NEXT: SCEV assumptions:
655
+ ; CHECK-EMPTY:
656
+ ; CHECK-NEXT: Expressions re-written:
657
+ ;
658
+ entry:
659
+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %A , i64 2000 ) ]
660
+ br i1 %c , label %then , label %else
661
+
662
+ then:
663
+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %B , i64 2000 ) ]
664
+ br label %loop.header
665
+
666
+ else:
667
+ br label %loop.header
668
+
669
+ loop.header:
670
+ %iv = phi i64 [ 0 , %then ], [ 0 , %else ], [ %iv.next , %latch ]
671
+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
672
+ %gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
673
+ %l = load i32 , ptr %gep.A , align 4
674
+ store i32 0 , ptr %gep.B , align 4
675
+ %cntable.c.1 = icmp ult i64 %iv , 1000
676
+ %iv.next = add nuw nsw i64 %iv , 1
677
+ br i1 %cntable.c.1 , label %b2 , label %e.1
678
+
679
+ b2:
680
+ %uncntable.c.0 = icmp eq i32 %l , 0
681
+ br i1 %uncntable.c.0 , label %e.2 , label %b3
682
+
683
+ b3:
684
+ %cntable.c.2 = icmp eq i64 %iv.next , 500
685
+ br i1 %cntable.c.2 , label %cleanup4 , label %latch
686
+
687
+ latch:
688
+ br label %loop.header
689
+
690
+ cleanup4:
691
+ ret void
692
+
693
+ e.1 :
694
+ ret void
695
+
696
+ e.2 :
697
+ ret void
698
+ }
699
+
568
700
define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_deref_via_assumption_too_small (ptr %A , ptr %B ) nosync nofree {
569
701
; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations_deref_via_assumption_too_small'
570
702
; CHECK-NEXT: loop.header:
0 commit comments