@@ -489,3 +489,184 @@ define void @test_scc_argmem_read_2(ptr %p) {
489
489
call void @test_scc_argmem_read_1 (ptr %p )
490
490
ret void
491
491
}
492
+
493
+ define i64 @select_same_obj (i1 %c , ptr %p , i64 %x ) {
494
+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)
495
+ ; FNATTRS-LABEL: define i64 @select_same_obj
496
+ ; FNATTRS-SAME: (i1 [[C:%.*]], ptr nocapture readonly [[P:%.*]], i64 [[X:%.*]]) #[[ATTR1]] {
497
+ ; FNATTRS-NEXT: entry:
498
+ ; FNATTRS-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 [[X]]
499
+ ; FNATTRS-NEXT: [[P3:%.*]] = select i1 [[C]], ptr [[P]], ptr [[P2]]
500
+ ; FNATTRS-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
501
+ ; FNATTRS-NEXT: ret i64 [[R]]
502
+ ;
503
+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
504
+ ; ATTRIBUTOR-LABEL: define i64 @select_same_obj
505
+ ; ATTRIBUTOR-SAME: (i1 [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]], i64 [[X:%.*]]) #[[ATTR0]] {
506
+ ; ATTRIBUTOR-NEXT: entry:
507
+ ; ATTRIBUTOR-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 [[X]]
508
+ ; ATTRIBUTOR-NEXT: [[P3:%.*]] = select i1 [[C]], ptr [[P]], ptr [[P2]]
509
+ ; ATTRIBUTOR-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
510
+ ; ATTRIBUTOR-NEXT: ret i64 [[R]]
511
+ ;
512
+ entry:
513
+ %p2 = getelementptr i8 , ptr %p , i64 %x
514
+ %p3 = select i1 %c , ptr %p , ptr %p2
515
+ %r = load i64 , ptr %p3
516
+ ret i64 %r
517
+ }
518
+
519
+ ; FIXME: This could be `memory(argmem: read)`.
520
+ define i64 @select_different_obj (i1 %c , ptr %p , ptr %p2 ) {
521
+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read, inaccessiblemem: none)
522
+ ; FNATTRS-LABEL: define i64 @select_different_obj
523
+ ; FNATTRS-SAME: (i1 [[C:%.*]], ptr nocapture readonly [[P:%.*]], ptr nocapture readonly [[P2:%.*]]) #[[ATTR3]] {
524
+ ; FNATTRS-NEXT: entry:
525
+ ; FNATTRS-NEXT: [[P3:%.*]] = select i1 [[C]], ptr [[P]], ptr [[P2]]
526
+ ; FNATTRS-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
527
+ ; FNATTRS-NEXT: ret i64 [[R]]
528
+ ;
529
+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
530
+ ; ATTRIBUTOR-LABEL: define i64 @select_different_obj
531
+ ; ATTRIBUTOR-SAME: (i1 [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]], ptr nocapture nofree readonly [[P2:%.*]]) #[[ATTR0]] {
532
+ ; ATTRIBUTOR-NEXT: entry:
533
+ ; ATTRIBUTOR-NEXT: [[P3:%.*]] = select i1 [[C]], ptr [[P]], ptr [[P2]]
534
+ ; ATTRIBUTOR-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
535
+ ; ATTRIBUTOR-NEXT: ret i64 [[R]]
536
+ ;
537
+ entry:
538
+ %p3 = select i1 %c , ptr %p , ptr %p2
539
+ %r = load i64 , ptr %p3
540
+ ret i64 %r
541
+ }
542
+
543
+ define i64 @phi_same_obj (i1 %c , ptr %p , i64 %x ) {
544
+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)
545
+ ; FNATTRS-LABEL: define i64 @phi_same_obj
546
+ ; FNATTRS-SAME: (i1 [[C:%.*]], ptr nocapture readonly [[P:%.*]], i64 [[X:%.*]]) #[[ATTR1]] {
547
+ ; FNATTRS-NEXT: entry:
548
+ ; FNATTRS-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 [[X]]
549
+ ; FNATTRS-NEXT: br i1 [[C]], label [[IF:%.*]], label [[JOIN:%.*]]
550
+ ; FNATTRS: if:
551
+ ; FNATTRS-NEXT: br label [[JOIN]]
552
+ ; FNATTRS: join:
553
+ ; FNATTRS-NEXT: [[P3:%.*]] = phi ptr [ [[P]], [[IF]] ], [ [[P2]], [[ENTRY:%.*]] ]
554
+ ; FNATTRS-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
555
+ ; FNATTRS-NEXT: ret i64 [[R]]
556
+ ;
557
+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)
558
+ ; ATTRIBUTOR-LABEL: define i64 @phi_same_obj
559
+ ; ATTRIBUTOR-SAME: (i1 [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]], i64 [[X:%.*]]) #[[ATTR1]] {
560
+ ; ATTRIBUTOR-NEXT: entry:
561
+ ; ATTRIBUTOR-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 [[X]]
562
+ ; ATTRIBUTOR-NEXT: br i1 [[C]], label [[IF:%.*]], label [[JOIN:%.*]]
563
+ ; ATTRIBUTOR: if:
564
+ ; ATTRIBUTOR-NEXT: br label [[JOIN]]
565
+ ; ATTRIBUTOR: join:
566
+ ; ATTRIBUTOR-NEXT: [[P3:%.*]] = phi ptr [ [[P]], [[IF]] ], [ [[P2]], [[ENTRY:%.*]] ]
567
+ ; ATTRIBUTOR-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
568
+ ; ATTRIBUTOR-NEXT: ret i64 [[R]]
569
+ ;
570
+ entry:
571
+ %p2 = getelementptr i8 , ptr %p , i64 %x
572
+ br i1 %c , label %if , label %join
573
+ if:
574
+ br label %join
575
+ join:
576
+ %p3 = phi ptr [ %p , %if ], [ %p2 , %entry ]
577
+ %r = load i64 , ptr %p3
578
+ ret i64 %r
579
+ }
580
+
581
+ ; FIXME: This could be `memory(argmem: read)`.
582
+ define i64 @phi_different_obj (i1 %c , ptr %p , ptr %p2 ) {
583
+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read, inaccessiblemem: none)
584
+ ; FNATTRS-LABEL: define i64 @phi_different_obj
585
+ ; FNATTRS-SAME: (i1 [[C:%.*]], ptr nocapture readonly [[P:%.*]], ptr nocapture readonly [[P2:%.*]]) #[[ATTR3]] {
586
+ ; FNATTRS-NEXT: entry:
587
+ ; FNATTRS-NEXT: br i1 [[C]], label [[IF:%.*]], label [[JOIN:%.*]]
588
+ ; FNATTRS: if:
589
+ ; FNATTRS-NEXT: br label [[JOIN]]
590
+ ; FNATTRS: join:
591
+ ; FNATTRS-NEXT: [[P3:%.*]] = phi ptr [ [[P]], [[IF]] ], [ [[P2]], [[ENTRY:%.*]] ]
592
+ ; FNATTRS-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
593
+ ; FNATTRS-NEXT: ret i64 [[R]]
594
+ ;
595
+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)
596
+ ; ATTRIBUTOR-LABEL: define i64 @phi_different_obj
597
+ ; ATTRIBUTOR-SAME: (i1 [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]], ptr nocapture nofree readonly [[P2:%.*]]) #[[ATTR1]] {
598
+ ; ATTRIBUTOR-NEXT: entry:
599
+ ; ATTRIBUTOR-NEXT: br i1 [[C]], label [[IF:%.*]], label [[JOIN:%.*]]
600
+ ; ATTRIBUTOR: if:
601
+ ; ATTRIBUTOR-NEXT: br label [[JOIN]]
602
+ ; ATTRIBUTOR: join:
603
+ ; ATTRIBUTOR-NEXT: [[P3:%.*]] = phi ptr [ [[P]], [[IF]] ], [ [[P2]], [[ENTRY:%.*]] ]
604
+ ; ATTRIBUTOR-NEXT: [[R:%.*]] = load i64, ptr [[P3]], align 4
605
+ ; ATTRIBUTOR-NEXT: ret i64 [[R]]
606
+ ;
607
+ entry:
608
+ br i1 %c , label %if , label %join
609
+ if:
610
+ br label %join
611
+ join:
612
+ %p3 = phi ptr [ %p , %if ], [ %p2 , %entry ]
613
+ %r = load i64 , ptr %p3
614
+ ret i64 %r
615
+ }
616
+
617
+ ; An `alloca` that won't be handled by `getModRefInfoMask`
618
+ define i64 @alloca_with_phis (i64 %arg , i1 %cmp ) {
619
+ ; COMMON: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
620
+ ; COMMON-LABEL: define i64 @alloca_with_phis
621
+ ; COMMON-SAME: (i64 [[ARG:%.*]], i1 [[CMP:%.*]]) #[[ATTR0]] {
622
+ ; COMMON-NEXT: bb:
623
+ ; COMMON-NEXT: [[I:%.*]] = alloca i64, align 8
624
+ ; COMMON-NEXT: store i64 [[ARG]], ptr [[I]], align 4
625
+ ; COMMON-NEXT: br i1 [[CMP]], label [[BB1:%.*]], label [[BB4:%.*]]
626
+ ; COMMON: bb1:
627
+ ; COMMON-NEXT: br i1 [[CMP]], label [[BB8:%.*]], label [[BB2:%.*]]
628
+ ; COMMON: bb2:
629
+ ; COMMON-NEXT: br i1 [[CMP]], label [[BB8]], label [[BB3:%.*]]
630
+ ; COMMON: bb3:
631
+ ; COMMON-NEXT: br i1 [[CMP]], label [[BB8]], label [[BB6:%.*]]
632
+ ; COMMON: bb4:
633
+ ; COMMON-NEXT: br i1 [[CMP]], label [[BB8]], label [[BB5:%.*]]
634
+ ; COMMON: bb5:
635
+ ; COMMON-NEXT: br i1 [[CMP]], label [[BB8]], label [[BB6]]
636
+ ; COMMON: bb6:
637
+ ; COMMON-NEXT: [[I7:%.*]] = phi ptr [ [[I]], [[BB3]] ], [ [[I]], [[BB5]] ]
638
+ ; COMMON-NEXT: br label [[BB8]]
639
+ ; COMMON: bb8:
640
+ ; COMMON-NEXT: [[I9:%.*]] = phi ptr [ [[I]], [[BB1]] ], [ [[I]], [[BB2]] ], [ [[I]], [[BB3]] ], [ [[I]], [[BB4]] ], [ [[I]], [[BB5]] ], [ [[I7]], [[BB6]] ]
641
+ ; COMMON-NEXT: [[RET:%.*]] = load i64, ptr [[I9]], align 4
642
+ ; COMMON-NEXT: ret i64 [[RET]]
643
+ ;
644
+ bb:
645
+ %i = alloca i64
646
+ store i64 %arg , ptr %i
647
+ br i1 %cmp , label %bb1 , label %bb4
648
+
649
+ bb1: ; preds = %bb
650
+ br i1 %cmp , label %bb8 , label %bb2
651
+
652
+ bb2: ; preds = %bb1
653
+ br i1 %cmp , label %bb8 , label %bb3
654
+
655
+ bb3: ; preds = %bb2
656
+ br i1 %cmp , label %bb8 , label %bb6
657
+
658
+ bb4: ; preds = %bb
659
+ br i1 %cmp , label %bb8 , label %bb5
660
+
661
+ bb5: ; preds = %bb4
662
+ br i1 %cmp , label %bb8 , label %bb6
663
+
664
+ bb6: ; preds = %bb5, %bb3
665
+ %i7 = phi ptr [ %i , %bb3 ], [ %i , %bb5 ]
666
+ br label %bb8
667
+
668
+ bb8: ; preds = %bb6, %bb5, %bb4, %bb3, %bb2, %bb1
669
+ %i9 = phi ptr [ %i , %bb1 ], [ %i , %bb2 ], [ %i , %bb3 ], [ %i , %bb4 ], [ %i , %bb5 ], [ %i7 , %bb6 ]
670
+ %ret = load i64 , ptr %i9
671
+ ret i64 %ret
672
+ }
0 commit comments