From 11cb15f8ed377940b4a705b0bef9faf20d55cc4b Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Mon, 10 Jun 2019 04:16:04 +0000 Subject: 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 --- llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 2 +- llvm/test/Transforms/FunctionAttrs/arg_returned.ll | 11 ++--------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index 28982d66d7d..9e95e796da6 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -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 diff --git a/llvm/test/Transforms/FunctionAttrs/arg_returned.ll b/llvm/test/Transforms/FunctionAttrs/arg_returned.ll index cc54dd9afde..dce0cc7319e 100644 --- a/llvm/test/Transforms/FunctionAttrs/arg_returned.ll +++ b/llvm/test/Transforms/FunctionAttrs/arg_returned.ll @@ -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 # -- cgit v1.2.3