diff options
author | Martin Liska <mliska@suse.cz> | 2014-11-07 14:37:41 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2014-11-07 13:37:41 +0000 |
commit | d862b3439d1996c99a532476a181b6f3c0c69257 (patch) | |
tree | 44b0f6f1cd72bc93601e630fc040c05a75668f33 | |
parent | 6343f5d75ba50fb9620a8faaf410d2f5648f62df (diff) | |
download | gcc-d862b3439d1996c99a532476a181b6f3c0c69257.zip gcc-d862b3439d1996c99a532476a181b6f3c0c69257.tar.gz gcc-d862b3439d1996c99a532476a181b6f3c0c69257.tar.bz2 |
re PR ipa/63580 (ICE : error: invalid argument to gimple call)
PR ipa/63580
* cgraphunit.c (cgraph_node::create_wrapper):
TREE_ADDRESSABLE is set to false for a newly created thunk.
* g++.dg/ipa/pr63580.C: New test.
From-SVN: r217222
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr63580.C | 26 |
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e721a6..c418283 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2014-11-07 Martin Liska <mliska@suse.cz> + PR ipa/63580 + * cgraphunit.c (cgraph_node::create_wrapper): + TREE_ADDRESSABLE is set to false for a newly created thunk. + +2014-11-07 Martin Liska <mliska@suse.cz> + PR ipa/63747 * ipa-icf-gimple.c (func_checker::compare_gimple_switch): Missing checking for CASE_LOW and CASE_HIGH added. diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 75d4140..25af234 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -2369,6 +2369,14 @@ cgraph_node::create_wrapper (cgraph_node *target) cgraph_edge *e = create_edge (target, NULL, 0, CGRAPH_FREQ_BASE); + tree arguments = DECL_ARGUMENTS (decl); + + while (arguments) + { + TREE_ADDRESSABLE (arguments) = false; + arguments = TREE_CHAIN (arguments); + } + expand_thunk (false, true); e->call_stmt_cannot_inline_p = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 036d59d3..6bd9aed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2014-11-07 Martin Liska <mliska@suse.cz> + PR ipa/63580 + * g++.dg/ipa/pr63580.C: New test. + +2014-11-07 Martin Liska <mliska@suse.cz> + PR ipa/63747 * gcc.dg/ipa/pr63747.c: New test. diff --git a/gcc/testsuite/g++.dg/ipa/pr63580.C b/gcc/testsuite/g++.dg/ipa/pr63580.C new file mode 100644 index 0000000..904195a --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr63580.C @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-ipa-icf" } */ + +struct A +{ +}; +template <class L, class R> A operator%(L, R); +template <class A0, class A1, class A2, class A3> +void make_tuple (A0 &, A1, A2, A3); +A +bar (int p1, char p2, int p3, double p4) +{ + A a; + make_tuple (p1, p2, p3, p4); + return "int; char; string; double; " % a; +} +A +foo (int p1, char p2, int p3, double p4) +{ + A b; + make_tuple (p1, p2, p3, p4); + return "int; char; string; double; " % b; +} + +/* { dg-final { scan-ipa-dump "Equal symbols: 1" "icf" } } */ +/* { dg-final { cleanup-ipa-dump "icf" } } */ |