@@ -47,7 +47,6 @@ define dso_local void @foo3_writable(ptr %p) {
4747 ret void
4848}
4949
50-
5150define dso_local void @foo1_bar_aligned64_deref512 (ptr %p ) {
5251; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned64_deref512
5352; CHECK-SAME: (ptr [[P:%.*]]) {
@@ -333,6 +332,16 @@ define void @prop_param_nonnull_and_align(ptr %p) {
333332 ret void
334333}
335334
335+ define void @prop_param_nofree_and_align (ptr %p ) {
336+ ; CHECK-LABEL: define {{[^@]+}}@prop_param_nofree_and_align
337+ ; CHECK-SAME: (ptr [[P:%.*]]) {
338+ ; CHECK-NEXT: call void @bar1(ptr [[P]])
339+ ; CHECK-NEXT: ret void
340+ ;
341+ call void @foo1 (ptr nofree align 32 %p )
342+ ret void
343+ }
344+
336345define void @prop_param_deref_align_no_update (ptr %p ) {
337346; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_no_update
338347; CHECK-SAME: (ptr [[P:%.*]]) {
@@ -539,7 +548,6 @@ define void @prop_no_conflict_writable(ptr %p) {
539548 ret void
540549}
541550
542-
543551define void @prop_no_conflict_writable2 (ptr %p ) {
544552; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable2
545553; CHECK-SAME: (ptr [[P:%.*]]) {
@@ -600,3 +608,145 @@ define void @prop_byval_readonly2(ptr %p) {
600608 call void @foo_byval_readonly2 (ptr %p )
601609 ret void
602610}
611+
612+ declare void @bar5 (i32 )
613+
614+ define dso_local void @foo4_range_0_10 (i32 %v ) {
615+ ; CHECK-LABEL: define {{[^@]+}}@foo4_range_0_10
616+ ; CHECK-SAME: (i32 [[V:%.*]]) {
617+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
618+ ; CHECK-NEXT: ret void
619+ ;
620+ call void @bar5 (i32 range(i32 0 , 10 ) %v )
621+ ret void
622+ }
623+
624+ define dso_local void @foo4_range_10_40 (i32 %v ) {
625+ ; CHECK-LABEL: define {{[^@]+}}@foo4_range_10_40
626+ ; CHECK-SAME: (i32 [[V:%.*]]) {
627+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
628+ ; CHECK-NEXT: ret void
629+ ;
630+ call void @bar5 (i32 range(i32 10 , 40 ) %v )
631+ ret void
632+ }
633+
634+ define dso_local void @foo4_2_range_0_10 (i32 range(i32 0 , 10 ) %v ) {
635+ ; CHECK-LABEL: define {{[^@]+}}@foo4_2_range_0_10
636+ ; CHECK-SAME: (i32 range(i32 0, 10) [[V:%.*]]) {
637+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
638+ ; CHECK-NEXT: ret void
639+ ;
640+ call void @bar5 (i32 %v )
641+ ret void
642+ }
643+
644+ define dso_local void @foo4 (i32 %v ) {
645+ ; CHECK-LABEL: define {{[^@]+}}@foo4
646+ ; CHECK-SAME: (i32 [[V:%.*]]) {
647+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
648+ ; CHECK-NEXT: ret void
649+ ;
650+ call void @bar5 (i32 %v )
651+ ret void
652+ }
653+
654+ define void @prop_range_empty_intersect (i32 %v ) {
655+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_intersect
656+ ; CHECK-SAME: (i32 [[V:%.*]]) {
657+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
658+ ; CHECK-NEXT: ret void
659+ ;
660+ call void @foo4_range_0_10 (i32 range(i32 11 , 50 ) %v )
661+ ret void
662+ }
663+
664+ define void @prop_range_empty (i32 %v ) {
665+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty
666+ ; CHECK-SAME: (i32 [[V:%.*]]) {
667+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
668+ ; CHECK-NEXT: ret void
669+ ;
670+ call void @foo4 (i32 range(i32 1 , 0 ) %v )
671+ ret void
672+ }
673+
674+ define void @prop_range_empty_with_intersect (i32 %v ) {
675+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_with_intersect
676+ ; CHECK-SAME: (i32 [[V:%.*]]) {
677+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
678+ ; CHECK-NEXT: ret void
679+ ;
680+ call void @foo4_range_0_10 (i32 range(i32 1 , 0 ) %v )
681+ ret void
682+ }
683+
684+ define void @prop_range_intersect1 (i32 %v ) {
685+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect1
686+ ; CHECK-SAME: (i32 [[V:%.*]]) {
687+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
688+ ; CHECK-NEXT: ret void
689+ ;
690+ call void @foo4_range_0_10 (i32 range(i32 0 , 9 ) %v )
691+ ret void
692+ }
693+
694+ define void @prop_range_intersect2 (i32 %v ) {
695+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect2
696+ ; CHECK-SAME: (i32 [[V:%.*]]) {
697+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
698+ ; CHECK-NEXT: ret void
699+ ;
700+ call void @foo4_range_0_10 (i32 range(i32 1 , 9 ) %v )
701+ ret void
702+ }
703+
704+ define void @prop_range_intersect3 (i32 %v ) {
705+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect3
706+ ; CHECK-SAME: (i32 [[V:%.*]]) {
707+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
708+ ; CHECK-NEXT: ret void
709+ ;
710+ call void @foo4_2_range_0_10 (i32 range(i32 0 , 11 ) %v )
711+ ret void
712+ }
713+
714+ define void @prop_range_intersect4 (i32 %v ) {
715+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect4
716+ ; CHECK-SAME: (i32 [[V:%.*]]) {
717+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
718+ ; CHECK-NEXT: ret void
719+ ;
720+ call void @foo4_range_0_10 (i32 range(i32 40 , 5 ) %v )
721+ ret void
722+ }
723+
724+ define void @prop_range_intersect5 (i32 %v ) {
725+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect5
726+ ; CHECK-SAME: (i32 [[V:%.*]]) {
727+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
728+ ; CHECK-NEXT: ret void
729+ ;
730+ call void @foo4_range_10_40 (i32 range(i32 30 , 20 ) %v )
731+ ret void
732+ }
733+
734+ define void @prop_range_keep (i32 %v ) {
735+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_keep
736+ ; CHECK-SAME: (i32 [[V:%.*]]) {
737+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
738+ ; CHECK-NEXT: ret void
739+ ;
740+ call void @foo4_range_10_40 (i32 %v )
741+ ret void
742+ }
743+
744+ define void @prop_range_direct (i32 %v ) {
745+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_direct
746+ ; CHECK-SAME: (i32 [[V:%.*]]) {
747+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
748+ ; CHECK-NEXT: ret void
749+ ;
750+ call void @foo4 (i32 range(i32 1 , 11 ) %v )
751+ ret void
752+ }
0 commit comments