re PR ipa/65236 (IPA ICF causes miscompilation in Chromium built with -Os)
authorJan Hubicka <hubicka@ucw.cz>
Sat, 28 Feb 2015 20:32:15 +0000 (21:32 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 28 Feb 2015 20:32:15 +0000 (20:32 +0000)
PR ipa/65236
* g++.dg/ipa/ipa-icf-6.C: New testcase.
* cgraphunit.c (cgraph_node::expand_thunk): Enable return slot
opt.

From-SVN: r221077

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

index 5540fb6d4a8c4e1ed92e5db95d8e76d60012835c..2c8c9a58b740078475e83765bcd984d2b646b629 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-28  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/65236
+       * cgraphunit.c (cgraph_node::expand_thunk): Enable return slot
+       opt.
+
 2015-02-28  Xingxing Pan  <xxingpan@marvell.com>
 
        * config/aarch64/aarch64.md: (mov<mode>_aarch64): Change type
index 9f6878a19e3b41d4ebda30f29ee63401d8a8f750..e640907550d0fbe9107cbde5f4ee09dbe574de6e 100644 (file)
@@ -1680,6 +1680,14 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
       callees->call_stmt = call;
       gimple_call_set_from_thunk (call, true);
       gimple_call_set_with_bounds (call, instrumentation_clone);
+
+      /* Return slot optimization is always possible and in fact requred to
+         return values with DECL_BY_REFERENCE.  */
+      if (aggregate_value_p (resdecl, TREE_TYPE (thunk_fndecl))
+         && (!is_gimple_reg_type (TREE_TYPE (resdecl))
+             || DECL_BY_REFERENCE (resdecl)))
+        gimple_call_set_return_slot_opt (call, true);
+
       if (restmp && !alias_is_noreturn)
        {
           gimple_call_set_lhs (call, restmp);
index 27b6a4ac21815b143df311740f82f4fa16bfc2cb..bf0978e957fac2db483b007924dca056b9b97361 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-28  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/65236
+       * g++.dg/ipa/ipa-icf-6.C: New testcase.
+
 2015-02-27  Pat Haugen <pthaugen@us.ibm.com>
 
        * gcc.dg/vect/pr59354.c: Move vector producing code to separate function.
diff --git a/gcc/testsuite/g++.dg/ipa/ipa-icf-6.C b/gcc/testsuite/g++.dg/ipa/ipa-icf-6.C
new file mode 100644 (file)
index 0000000..933ab5d
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -fdump-ipa-icf"  } */
+
+struct A {                                                                      
+  A() {ptr=&b;}                                                                 
+  A(const A &a) {ptr = &b;}                                                     
+  void test() { if (ptr != &b) __builtin_abort ();}                             
+  int b;                                                                        
+  int *ptr;                                                                     
+};                                                                              
+
+A test1(A a)
+{
+  a.test();
+  return a;
+}
+A test2(A a)
+{
+  a.test();
+  return a;
+}
+__attribute__ ((noinline))
+static void
+test_me (A (*t)(A))
+{
+  struct A a, b=t(a);
+  b.test ();
+}
+int
+main()
+{
+  test_me (test1);
+  test_me (test2);
+  return 0;
+}
+/* { dg-final { scan-ipa-dump-times "Unified; Wrapper has been created" 1 "icf"  } } */
+/* { dg-final { cleanup-ipa-dump "icf" } } */