@@ -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:%.*]]) {
@@ -580,3 +588,145 @@ define ptr @callee_bad_param_prop(ptr readonly %x) {
580588 %r = tail call ptr @llvm.ptrmask (ptr %x , i64 -1 )
581589 ret ptr %r
582590}
591+
592+ declare void @bar5 (i32 )
593+
594+ define dso_local void @foo4_range_0_10 (i32 %v ) {
595+ ; CHECK-LABEL: define {{[^@]+}}@foo4_range_0_10
596+ ; CHECK-SAME: (i32 [[V:%.*]]) {
597+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
598+ ; CHECK-NEXT: ret void
599+ ;
600+ call void @bar5 (i32 range(i32 0 , 10 ) %v )
601+ ret void
602+ }
603+
604+ define dso_local void @foo4_range_10_40 (i32 %v ) {
605+ ; CHECK-LABEL: define {{[^@]+}}@foo4_range_10_40
606+ ; CHECK-SAME: (i32 [[V:%.*]]) {
607+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
608+ ; CHECK-NEXT: ret void
609+ ;
610+ call void @bar5 (i32 range(i32 10 , 40 ) %v )
611+ ret void
612+ }
613+
614+ define dso_local void @foo4_2_range_0_10 (i32 range(i32 0 , 10 ) %v ) {
615+ ; CHECK-LABEL: define {{[^@]+}}@foo4_2_range_0_10
616+ ; CHECK-SAME: (i32 range(i32 0, 10) [[V:%.*]]) {
617+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
618+ ; CHECK-NEXT: ret void
619+ ;
620+ call void @bar5 (i32 %v )
621+ ret void
622+ }
623+
624+ define dso_local void @foo4 (i32 %v ) {
625+ ; CHECK-LABEL: define {{[^@]+}}@foo4
626+ ; CHECK-SAME: (i32 [[V:%.*]]) {
627+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
628+ ; CHECK-NEXT: ret void
629+ ;
630+ call void @bar5 (i32 %v )
631+ ret void
632+ }
633+
634+ define void @prop_range_empty_intersect (i32 %v ) {
635+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_intersect
636+ ; CHECK-SAME: (i32 [[V:%.*]]) {
637+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
638+ ; CHECK-NEXT: ret void
639+ ;
640+ call void @foo4_range_0_10 (i32 range(i32 11 , 50 ) %v )
641+ ret void
642+ }
643+
644+ define void @prop_range_empty (i32 %v ) {
645+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty
646+ ; CHECK-SAME: (i32 [[V:%.*]]) {
647+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
648+ ; CHECK-NEXT: ret void
649+ ;
650+ call void @foo4 (i32 range(i32 1 , 0 ) %v )
651+ ret void
652+ }
653+
654+ define void @prop_range_empty_with_intersect (i32 %v ) {
655+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_with_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 1 , 0 ) %v )
661+ ret void
662+ }
663+
664+ define void @prop_range_intersect1 (i32 %v ) {
665+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect1
666+ ; CHECK-SAME: (i32 [[V:%.*]]) {
667+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
668+ ; CHECK-NEXT: ret void
669+ ;
670+ call void @foo4_range_0_10 (i32 range(i32 0 , 9 ) %v )
671+ ret void
672+ }
673+
674+ define void @prop_range_intersect2 (i32 %v ) {
675+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect2
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 , 9 ) %v )
681+ ret void
682+ }
683+
684+ define void @prop_range_intersect3 (i32 %v ) {
685+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect3
686+ ; CHECK-SAME: (i32 [[V:%.*]]) {
687+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
688+ ; CHECK-NEXT: ret void
689+ ;
690+ call void @foo4_2_range_0_10 (i32 range(i32 0 , 11 ) %v )
691+ ret void
692+ }
693+
694+ define void @prop_range_intersect4 (i32 %v ) {
695+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect4
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 40 , 5 ) %v )
701+ ret void
702+ }
703+
704+ define void @prop_range_intersect5 (i32 %v ) {
705+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect5
706+ ; CHECK-SAME: (i32 [[V:%.*]]) {
707+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
708+ ; CHECK-NEXT: ret void
709+ ;
710+ call void @foo4_range_10_40 (i32 range(i32 30 , 20 ) %v )
711+ ret void
712+ }
713+
714+ define void @prop_range_keep (i32 %v ) {
715+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_keep
716+ ; CHECK-SAME: (i32 [[V:%.*]]) {
717+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
718+ ; CHECK-NEXT: ret void
719+ ;
720+ call void @foo4_range_10_40 (i32 %v )
721+ ret void
722+ }
723+
724+ define void @prop_range_direct (i32 %v ) {
725+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_direct
726+ ; CHECK-SAME: (i32 [[V:%.*]]) {
727+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
728+ ; CHECK-NEXT: ret void
729+ ;
730+ call void @foo4 (i32 range(i32 1 , 11 ) %v )
731+ ret void
732+ }
0 commit comments