@@ -624,3 +624,129 @@ e.1:
624624e.2 :
625625 ret void
626626}
627+
628+ define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_nofree_via_context (ptr %A , ptr %B ) nosync {
629+ ; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_nofree_via_context'
630+ ; CHECK-NEXT: loop.header:
631+ ; CHECK-NEXT: Memory dependences are safe with run-time checks
632+ ; CHECK-NEXT: Dependences:
633+ ; CHECK-NEXT: Run-time memory checks:
634+ ; CHECK-NEXT: Check 0:
635+ ; CHECK-NEXT: Comparing group GRP0:
636+ ; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
637+ ; CHECK-NEXT: Against group GRP1:
638+ ; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
639+ ; CHECK-NEXT: Grouped accesses:
640+ ; CHECK-NEXT: Group GRP0:
641+ ; CHECK-NEXT: (Low: %B High: (2000 + %B))
642+ ; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
643+ ; CHECK-NEXT: Group GRP1:
644+ ; CHECK-NEXT: (Low: %A High: (2000 + %A))
645+ ; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
646+ ; CHECK-EMPTY:
647+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
648+ ; CHECK-NEXT: SCEV assumptions:
649+ ; CHECK-EMPTY:
650+ ; CHECK-NEXT: Expressions re-written:
651+ ;
652+ entry:
653+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %A , i64 2000 ) ]
654+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %B , i64 2000 ) ]
655+ br label %loop.header
656+
657+ loop.header:
658+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %latch ]
659+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
660+ %gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
661+ %l = load i32 , ptr %gep.A , align 4
662+ store i32 0 , ptr %gep.B , align 4
663+ %cntable.c.1 = icmp ult i64 %iv , 1000
664+ %iv.next = add nuw nsw i64 %iv , 1
665+ br i1 %cntable.c.1 , label %b2 , label %e.1
666+
667+ b2:
668+ %uncntable.c.0 = icmp eq i32 %l , 0
669+ br i1 %uncntable.c.0 , label %e.2 , label %b3
670+
671+ b3:
672+ %cntable.c.2 = icmp eq i64 %iv.next , 500
673+ br i1 %cntable.c.2 , label %cleanup4 , label %latch
674+
675+ latch:
676+ br label %loop.header
677+
678+ cleanup4:
679+ ret void
680+
681+ e.1 :
682+ ret void
683+
684+ e.2 :
685+ ret void
686+ }
687+
688+ define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_missing_nofree_multiple_predecessors (ptr %A , ptr %B , i1 %c ) nosync {
689+ ; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations_known_deref_via_assumption_missing_nofree_multiple_predecessors'
690+ ; CHECK-NEXT: loop.header:
691+ ; CHECK-NEXT: Memory dependences are safe with run-time checks
692+ ; CHECK-NEXT: Dependences:
693+ ; CHECK-NEXT: Run-time memory checks:
694+ ; CHECK-NEXT: Check 0:
695+ ; CHECK-NEXT: Comparing group GRP0:
696+ ; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
697+ ; CHECK-NEXT: Against group GRP1:
698+ ; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
699+ ; CHECK-NEXT: Grouped accesses:
700+ ; CHECK-NEXT: Group GRP0:
701+ ; CHECK-NEXT: (Low: %B High: inttoptr (i64 -1 to ptr))
702+ ; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
703+ ; CHECK-NEXT: Group GRP1:
704+ ; CHECK-NEXT: (Low: %A High: inttoptr (i64 -1 to ptr))
705+ ; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
706+ ; CHECK-EMPTY:
707+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
708+ ; CHECK-NEXT: SCEV assumptions:
709+ ; CHECK-EMPTY:
710+ ; CHECK-NEXT: Expressions re-written:
711+ ;
712+ entry:
713+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %A , i64 2000 ) ]
714+ call void @llvm.assume (i1 true ) [ "dereferenceable" (ptr %B , i64 2000 ) ]
715+ br i1 %c , label %then , label %else
716+
717+ then:
718+ br label %loop.header
719+
720+ else:
721+ br label %loop.header
722+
723+ loop.header:
724+ %iv = phi i64 [ 0 , %then ], [ 0 , %else ], [ %iv.next , %latch ]
725+ %gep.A = getelementptr inbounds i32 , ptr %A , i64 %iv
726+ %gep.B = getelementptr inbounds i32 , ptr %B , i64 %iv
727+ %l = load i32 , ptr %gep.A , align 4
728+ store i32 0 , ptr %gep.B , align 4
729+ %cntable.c.1 = icmp ult i64 %iv , 1000
730+ %iv.next = add nuw nsw i64 %iv , 1
731+ br i1 %cntable.c.1 , label %b2 , label %e.1
732+
733+ b2:
734+ %uncntable.c.0 = icmp eq i32 %l , 0
735+ br i1 %uncntable.c.0 , label %e.2 , label %b3
736+
737+ b3:
738+ %cntable.c.2 = icmp eq i64 %iv.next , 500
739+ br i1 %cntable.c.2 , label %cleanup4 , label %latch
740+
741+ latch:
742+ br label %loop.header
743+
744+ cleanup4:
745+ ret void
746+
747+ e.1 :
748+ ret void
749+
750+ e.2 :
751+ ret void
752+ }
0 commit comments