@@ -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:%.*]]) {
@@ -559,3 +567,145 @@ define void @prop_byval_readonly(ptr %p) {
559
567
call void @foo_byval_readonly (ptr %p )
560
568
ret void
561
569
}
570
+
571
+ declare void @bar5 (i32 )
572
+
573
+ define dso_local void @foo4_range_0_10 (i32 %v ) {
574
+ ; CHECK-LABEL: define {{[^@]+}}@foo4_range_0_10
575
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
576
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
577
+ ; CHECK-NEXT: ret void
578
+ ;
579
+ call void @bar5 (i32 range(i32 0 , 10 ) %v )
580
+ ret void
581
+ }
582
+
583
+ define dso_local void @foo4_range_10_40 (i32 %v ) {
584
+ ; CHECK-LABEL: define {{[^@]+}}@foo4_range_10_40
585
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
586
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
587
+ ; CHECK-NEXT: ret void
588
+ ;
589
+ call void @bar5 (i32 range(i32 10 , 40 ) %v )
590
+ ret void
591
+ }
592
+
593
+ define dso_local void @foo4_2_range_0_10 (i32 range(i32 0 , 10 ) %v ) {
594
+ ; CHECK-LABEL: define {{[^@]+}}@foo4_2_range_0_10
595
+ ; CHECK-SAME: (i32 range(i32 0, 10) [[V:%.*]]) {
596
+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
597
+ ; CHECK-NEXT: ret void
598
+ ;
599
+ call void @bar5 (i32 %v )
600
+ ret void
601
+ }
602
+
603
+ define dso_local void @foo4 (i32 %v ) {
604
+ ; CHECK-LABEL: define {{[^@]+}}@foo4
605
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
606
+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
607
+ ; CHECK-NEXT: ret void
608
+ ;
609
+ call void @bar5 (i32 %v )
610
+ ret void
611
+ }
612
+
613
+ define void @prop_range_empty_intersect (i32 %v ) {
614
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_intersect
615
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
616
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
617
+ ; CHECK-NEXT: ret void
618
+ ;
619
+ call void @foo4_range_0_10 (i32 range(i32 11 , 50 ) %v )
620
+ ret void
621
+ }
622
+
623
+ define void @prop_range_empty (i32 %v ) {
624
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty
625
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
626
+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
627
+ ; CHECK-NEXT: ret void
628
+ ;
629
+ call void @foo4 (i32 range(i32 1 , 0 ) %v )
630
+ ret void
631
+ }
632
+
633
+ define void @prop_range_empty_with_intersect (i32 %v ) {
634
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_with_intersect
635
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
636
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
637
+ ; CHECK-NEXT: ret void
638
+ ;
639
+ call void @foo4_range_0_10 (i32 range(i32 1 , 0 ) %v )
640
+ ret void
641
+ }
642
+
643
+ define void @prop_range_intersect1 (i32 %v ) {
644
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect1
645
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
646
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
647
+ ; CHECK-NEXT: ret void
648
+ ;
649
+ call void @foo4_range_0_10 (i32 range(i32 0 , 9 ) %v )
650
+ ret void
651
+ }
652
+
653
+ define void @prop_range_intersect2 (i32 %v ) {
654
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect2
655
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
656
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
657
+ ; CHECK-NEXT: ret void
658
+ ;
659
+ call void @foo4_range_0_10 (i32 range(i32 1 , 9 ) %v )
660
+ ret void
661
+ }
662
+
663
+ define void @prop_range_intersect3 (i32 %v ) {
664
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect3
665
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
666
+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
667
+ ; CHECK-NEXT: ret void
668
+ ;
669
+ call void @foo4_2_range_0_10 (i32 range(i32 0 , 11 ) %v )
670
+ ret void
671
+ }
672
+
673
+ define void @prop_range_intersect4 (i32 %v ) {
674
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect4
675
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
676
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])
677
+ ; CHECK-NEXT: ret void
678
+ ;
679
+ call void @foo4_range_0_10 (i32 range(i32 40 , 5 ) %v )
680
+ ret void
681
+ }
682
+
683
+ define void @prop_range_intersect5 (i32 %v ) {
684
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect5
685
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
686
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
687
+ ; CHECK-NEXT: ret void
688
+ ;
689
+ call void @foo4_range_10_40 (i32 range(i32 30 , 20 ) %v )
690
+ ret void
691
+ }
692
+
693
+ define void @prop_range_keep (i32 %v ) {
694
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_keep
695
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
696
+ ; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])
697
+ ; CHECK-NEXT: ret void
698
+ ;
699
+ call void @foo4_range_10_40 (i32 %v )
700
+ ret void
701
+ }
702
+
703
+ define void @prop_range_direct (i32 %v ) {
704
+ ; CHECK-LABEL: define {{[^@]+}}@prop_range_direct
705
+ ; CHECK-SAME: (i32 [[V:%.*]]) {
706
+ ; CHECK-NEXT: call void @bar5(i32 [[V]])
707
+ ; CHECK-NEXT: ret void
708
+ ;
709
+ call void @foo4 (i32 range(i32 1 , 11 ) %v )
710
+ ret void
711
+ }
0 commit comments