aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2014-11-07 14:37:41 +0100
committerMartin Liska <marxin@gcc.gnu.org>2014-11-07 13:37:41 +0000
commitd862b3439d1996c99a532476a181b6f3c0c69257 (patch)
tree44b0f6f1cd72bc93601e630fc040c05a75668f33 /gcc
parent6343f5d75ba50fb9620a8faaf410d2f5648f62df (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraphunit.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr63580.C26
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" } } */