@@ -47,7 +47,6 @@ define dso_local void @foo3_writable(ptr %p) {
47
47
ret void
48
48
}
49
49
50
-
51
50
define dso_local void @foo1_bar_aligned64_deref512 (ptr %p ) {
52
51
; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned64_deref512
53
52
; CHECK-SAME: (ptr [[P:%.*]]) {
@@ -333,6 +332,16 @@ define void @prop_param_nonnull_and_align(ptr %p) {
333
332
ret void
334
333
}
335
334
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
+
336
345
define void @prop_param_deref_align_no_update (ptr %p ) {
337
346
; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_no_update
338
347
; CHECK-SAME: (ptr [[P:%.*]]) {
@@ -539,7 +548,6 @@ define void @prop_no_conflict_writable(ptr %p) {
539
548
ret void
540
549
}
541
550
542
-
543
551
define void @prop_no_conflict_writable2 (ptr %p ) {
544
552
; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable2
545
553
; CHECK-SAME: (ptr [[P:%.*]]) {
@@ -580,3 +588,145 @@ define ptr @callee_bad_param_prop(ptr readonly %x) {
580
588
%r = tail call ptr @llvm.ptrmask (ptr %x , i64 -1 )
581
589
ret ptr %r
582
590
}
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