From: Martin Jambor Date: Thu, 14 Mar 2019 16:54:43 +0000 (+0100) Subject: Zero local estimated benefit for cloning extern inline function X-Git-Tag: releases/gcc-7.5.0~540 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=618e48ada6183eaf6846e8b0cbc866f9de094ac8;p=thirdparty%2Fgcc.git Zero local estimated benefit for cloning extern inline function 2019-03-14 Martin Jambor Backport from mainline 2019-03-07 Martin Jambor PR lto/87525 * ipa-cp.c (perform_estimation_of_a_value): Account zero time benefit for extern inline functions. testsuite/ * gcc.dg/ipa/ipcp-5.c: New test. From-SVN: r269688 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d3f9e5b1fd76..288c1ac1fff7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-03-14 Martin Jambor + + Backport from mainline + 2019-03-07 Martin Jambor + + PR lto/87525 + * ipa-cp.c (perform_estimation_of_a_value): Account zero time benefit + for extern inline functions. + 2019-03-14 Richard Biener Backport from mainline diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index b42cfb0f6e02..56a95754c7f2 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -2819,11 +2819,18 @@ perform_estimation_of_a_value (cgraph_node *node, vec known_csts, estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts, known_aggs_ptrs, &size, &time, &hints); - time_benefit = base_time - time - + devirtualization_time_bonus (node, known_csts, known_contexts, - known_aggs_ptrs) - + hint_time_bonus (hints) - + removable_params_cost + est_move_cost; + + /* Extern inline functions have no cloning local time benefits because they + will be inlined anyway. The only reason to clone them is if it enables + optimization in any of the functions they call. */ + if (DECL_EXTERNAL (node->decl) && DECL_DECLARED_INLINE_P (node->decl)) + time_benefit = 0; + else + time_benefit = base_time - time + + devirtualization_time_bonus (node, known_csts, known_contexts, + known_aggs_ptrs) + + hint_time_bonus (hints) + + removable_params_cost + est_move_cost; gcc_checking_assert (size >=0); /* The inliner-heuristics based estimates may think that in certain diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6061fba0b365..c4312ffa2710 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-03-14 Martin Jambor + + Backport from mainline + 2019-03-07 Martin Jambor + + PR lto/87525 + * gcc.dg/ipa/ipcp-5.c: New test. + 2019-03-14 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-5.c b/gcc/testsuite/gcc.dg/ipa/ipcp-5.c new file mode 100644 index 000000000000..6786c5145434 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipcp-5.c @@ -0,0 +1,45 @@ +/* Test that estimated local cloning time benefit of extern inline functions is + zero. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-ipa-cp -fno-early-inlining" } */ +/* { dg-add-options bind_pic_locally } */ + +extern int get_int (void); +extern void use_stuff (int); + +int arr[10]; + +inline void +f (int a) +{ + arr[0] += a + 5; + arr[1] += a + 50; + arr[2] += a - 3; + arr[3] += a; + arr[4] += a + 21; + arr[5] += a + 900; + arr[6] += a + 2; + arr[7] += a + 3456; + arr[8] += a + 3; + arr[9] += a + 32; + use_stuff (a); +} + + +int +entry (void) +{ + int i; + for (i = 0; i < 100; i++) + f (7); + for (i = 0; i < 100; i++) + f (get_int ()); + return 0; +} + + +/* { dg-final { scan-ipa-dump "loc_time: 0" "cp" } } */ +/* { dg-final { scan-ipa-dump-not "replacing param.*with const" "cp" } } */ + +