Skip to content

Commit 559be8e

Browse files
committed
Reapply "[FunctionAttrs] Determine underlying object by getUnderlyingObjectAggressive (#100102)"
Added handling for `AllocaInst`. This reverts commit 1ee686a.
1 parent a5bc549 commit 559be8e

File tree

2 files changed

+184
-3
lines changed

2 files changed

+184
-3
lines changed

llvm/lib/Transforms/IPO/FunctionAttrs.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ static void addLocAccess(MemoryEffects &ME, const MemoryLocation &Loc,
118118
if (isNoModRef(MR))
119119
return;
120120

121-
const Value *UO = getUnderlyingObject(Loc.Ptr);
122-
assert(!isa<AllocaInst>(UO) &&
123-
"Should have been handled by getModRefInfoMask()");
121+
const Value *UO = getUnderlyingObjectAggressive(Loc.Ptr);
122+
if (isa<AllocaInst>(UO))
123+
return;
124124
if (isa<Argument>(UO)) {
125125
ME |= MemoryEffects::argMemOnly(MR);
126126
return;

llvm/test/Transforms/FunctionAttrs/argmemonly.ll

+181
Original file line numberDiff line numberDiff line change
@@ -489,3 +489,184 @@ 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+
}
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

Comments
 (0)