re PR ipa/63580 (ICE : error: invalid argument to gimple call)
authorMartin Liska <mliska@suse.cz>
Fri, 7 Nov 2014 13:37:41 +0000 (14:37 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 7 Nov 2014 13:37:41 +0000 (13:37 +0000)
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

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr63580.C [new file with mode: 0644]

index 6e721a68b205ade515d300991394a3c6e73cfd8f..c418283e84a94feebacdf93402e1734754de3560 100644 (file)
@@ -1,3 +1,9 @@
+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
index 75d414024a74974697e78a3ebf50d9b0048703a7..25af2347f42844a27d7f48dc8009ce78d8ad33cc 100644 (file)
@@ -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;
 
index 036d59d3013420cce4d04dede826dd19093e3d5b..6bd9aed5ec28815ddfa381fb2f81a6d1f479b2a4 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/ipa/pr63580.C b/gcc/testsuite/g++.dg/ipa/pr63580.C
new file mode 100644 (file)
index 0000000..904195a
--- /dev/null
@@ -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" } } */