Do not derive no-recurse attribute if function does not have exact definition.

This is fix for https://bugs.llvm.org/show_bug.cgi?id=41336

Reviewers: jdoerfert
Reviewed by: jdoerfert

Differential Revision: https://reviews.llvm.org/D63045

llvm-svn: 362918
This commit is contained in:
Vivek Pandya 2019-06-10 04:16:04 +00:00
parent 3f3bae33a2
commit 11cb15f8ed
2 changed files with 3 additions and 10 deletions

View File

@ -1300,7 +1300,7 @@ static bool addNoRecurseAttrs(const SCCNodeSet &SCCNodes) {
return false;
Function *F = *SCCNodes.begin();
if (!F || F->isDeclaration() || F->doesNotRecurse())
if (!F || !F->hasExactDefinition() || F->doesNotRecurse())
return false;
// If all of the calls in F are identifiable and are to norecurse functions, F

View File

@ -308,17 +308,11 @@ define i32* @calls_unknown_fn(i32* %r) #0 {
;
; Verify the maybe-redefined function is not annotated:
;
; CHECK: Function Attrs: noinline norecurse nounwind uwtable
; CHECK: Function Attrs: noinline nounwind uwtable
; CHECK: define linkonce_odr i32* @maybe_redefined_fn(i32* %r)
; FIXME: We should not derive norecurse for potentially redefined functions!
; Function Attrs: noinline nounwind uwtable
; define linkonce_odr i32* @maybe_redefined_fn(i32* %r)
;
; CHECK: Function Attrs: noinline norecurse nounwind uwtable
; CHECK: Function Attrs: noinline nounwind uwtable
; CHECK: define i32* @calls_maybe_redefined_fn(i32* returned %r)
; FIXME: We should not derive norecurse for potentially redefined functions!
; Function Attrs: noinline nounwind uwtable
; define i32* @calls_maybe_redefined_fn(i32* returned %r)
define linkonce_odr i32* @maybe_redefined_fn(i32* %r) #0 {
entry:
ret i32* %r
@ -586,5 +580,4 @@ attributes #0 = { noinline nounwind uwtable }
; CHECK-DAG: attributes #{{[0-9]*}} = { noinline nounwind readnone uwtable }
; CHECK-DAG: attributes #{{[0-9]*}} = { noinline nounwind readonly uwtable }
; CHECK-DAG: attributes #{{[0-9]*}} = { noinline nounwind uwtable }
; CHECK-DAG: attributes #{{[0-9]*}} = { noinline norecurse nounwind uwtable }
; CHECK-NOT: attributes #