From b75255a9b11ae672e569966860090d70ff10ffca Mon Sep 17 00:00:00 2001 From: Michael Ploujnikov Date: Fri, 30 Nov 2018 22:20:43 +0000 Subject: [PATCH] Make function assembly more independent. This is achieved by having clone_function_name assign unique clone numbers for each function independently. gcc: * cgraphclones.c: Replaced clone_fn_id_num with clone_fn_ids; hash map. (clone_function_name_numbered): Use clone_fn_ids. gcc/testsuite: * gcc.dg/independent-cloneids-1.c: New test. From-SVN: r266691 --- gcc/ChangeLog | 10 +++++++ gcc/cgraphclones.c | 10 +++++-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/independent-cloneids-1.c | 38 +++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/independent-cloneids-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 29e42c0..e47e2b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2018-11-30 Michael Ploujnikov + Make function assembly more independent. + + This is achieved by having clone_function_name assign unique clone + numbers for each function independently. + + * cgraphclones.c: Replaced clone_fn_id_num with clone_fn_ids; + hash map. + (clone_function_name_numbered): Use clone_fn_ids. + 2018-11-30 Vladimir Makarov PR rtl-optimization/88179 diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 0fbc7a9..a45722f 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -517,7 +517,7 @@ cgraph_node::create_clone (tree new_decl, profile_count prof_count, return new_node; } -static GTY(()) unsigned int clone_fn_id_num; +static GTY(()) hash_map *clone_fn_ids; /* Return a new assembler name for a clone of decl named NAME. Apart from the string SUFFIX, the new name will end with a unique (for @@ -529,7 +529,13 @@ static GTY(()) unsigned int clone_fn_id_num; tree clone_function_name_numbered (const char *name, const char *suffix) { - return clone_function_name (name, suffix, clone_fn_id_num++); + /* Initialize the function->counter mapping the first time it's + needed. */ + if (!clone_fn_ids) + clone_fn_ids = hash_map::create_ggc (64); + unsigned int &suffix_counter = clone_fn_ids->get_or_insert ( + IDENTIFIER_POINTER (get_identifier (name))); + return clone_function_name (name, suffix, suffix_counter++); } /* Return a new assembler name for a clone of DECL. Apart from string diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9ec4164..1c6a956 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-11-30 Michael Ploujnikov + + * gcc.dg/independent-cloneids-1.c: New test. + 2018-11-30 Jakub Jelinek PR debug/85550 diff --git a/gcc/testsuite/gcc.dg/independent-cloneids-1.c b/gcc/testsuite/gcc.dg/independent-cloneids-1.c new file mode 100644 index 0000000..3203895 --- /dev/null +++ b/gcc/testsuite/gcc.dg/independent-cloneids-1.c @@ -0,0 +1,38 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fipa-cp -fipa-cp-clone" } */ + +extern int printf (const char *, ...); + +static int __attribute__ ((noinline)) +foo (int arg) +{ + return 7 * arg; +} + +static int __attribute__ ((noinline)) +bar (int arg) +{ + return arg * arg; +} + +int +baz (int arg) +{ + printf("%d\n", bar (3)); + printf("%d\n", bar (4)); + printf("%d\n", foo (5)); + printf("%d\n", foo (6)); + /* adding or removing the following call should not affect foo + function's clone numbering */ + printf("%d\n", bar (7)); + return foo (8); +} + +/* { dg-final { scan-assembler-times {(?n)\m_*bar[.$_]constprop[.$_]0:} 1 } } */ +/* { dg-final { scan-assembler-times {(?n)\m_*bar[.$_]constprop[.$_]1:} 1 } } */ +/* { dg-final { scan-assembler-times {(?n)\m_*bar[.$_]constprop[.$_]2:} 1 } } */ +/* { dg-final { scan-assembler-times {(?n)\m_*foo[.$_]constprop[.$_]0:} 1 } } */ +/* { dg-final { scan-assembler-times {(?n)\m_*foo[.$_]constprop[.$_]1:} 1 } } */ +/* { dg-final { scan-assembler-times {(?n)\m_*foo[.$_]constprop[.$_]2:} 1 } } */ +/* { dg-final { scan-assembler-not {(?n)\m_*foo[.$_]constprop[.$_]3:} } } */ +/* { dg-final { scan-assembler-not {(?n)\m_*foo[.$_]constprop[.$_]4:} } } */ -- 2.7.4