@@ -489,3 +489,127 @@ define void @test_scc_argmem_read_2(ptr %p) {
489489 call void @test_scc_argmem_read_1 (ptr %p )
490490 ret void
491491}
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+ }
0 commit comments