Skip to content

Commit a213edd

Browse files
authored
[FunctionAttrs] Determine underlying object by getUnderlyingObjectAggressive (#100102)
Thanks to #99509, we can fix rust-lang/rust#119573 too.
1 parent c747300 commit a213edd

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

llvm/lib/Transforms/IPO/FunctionAttrs.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ static void addLocAccess(MemoryEffects &ME, const MemoryLocation &Loc,
118118
if (isNoModRef(MR))
119119
return;
120120

121-
const Value *UO = getUnderlyingObject(Loc.Ptr);
121+
const Value *UO = getUnderlyingObjectAggressive(Loc.Ptr);
122122
assert(!isa<AllocaInst>(UO) &&
123123
"Should have been handled by getModRefInfoMask()");
124124
if (isa<Argument>(UO)) {

llvm/test/Transforms/FunctionAttrs/argmemonly.ll

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)