]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR ipa/69241 (ICE with noreturn and function that return non-POD)
authorJakub Jelinek <jakub@redhat.com>
Wed, 10 Feb 2016 15:06:20 +0000 (16:06 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 10 Feb 2016 15:06:20 +0000 (16:06 +0100)
PR ipa/69241
PR c++/69649
* gimplify.c (gimplify_modify_expr): Set lhs even for noreturn
calls if the return type is TREE_ADDRESSABLE.
* cgraphunit.c (cgraph_node::expand_thunk): Likewise.
* ipa-split.c (split_function): Fix doubled "we" in comment.
Use void return type for the split part even if
!split_point->split_part_set_retval.

* g++.dg/ipa/pr69241-1.C: New test.
* g++.dg/ipa/pr69241-2.C: New test.
* g++.dg/ipa/pr69241-3.C: New test.
* g++.dg/ipa/pr69649.C: New test.

Co-Authored-By: Patrick Palka <ppalka@gcc.gnu.org>
From-SVN: r233271

gcc/ChangeLog
gcc/cgraphunit.c
gcc/gimplify.c
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr69241-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ipa/pr69241-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ipa/pr69241-3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ipa/pr69649.C [new file with mode: 0644]

index 092797cbfa5c775a0d5a24719cf21fc95e43def1..38cdb6db00fa07686ac6f5ccbd22b859628942c0 100644 (file)
@@ -1,3 +1,15 @@
+2016-02-10  Jakub Jelinek  <jakub@redhat.com>
+           Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR ipa/69241
+       PR c++/69649
+       * gimplify.c (gimplify_modify_expr): Set lhs even for noreturn
+       calls if the return type is TREE_ADDRESSABLE.
+       * cgraphunit.c (cgraph_node::expand_thunk): Likewise.
+       * ipa-split.c (split_function): Fix doubled "we" in comment.
+       Use void return type for the split part even if
+       !split_point->split_part_set_retval.
+
 2016-02-10  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/68021
index 2c49d7b0ac533d0e632566989229088e5503594f..0a745f0f473bc02ba31bcc9cafeb05c9703d7da6 100644 (file)
@@ -1701,7 +1701,8 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
       bsi = gsi_start_bb (bb);
 
       /* Build call to the function being thunked.  */
-      if (!VOID_TYPE_P (restype) && !alias_is_noreturn)
+      if (!VOID_TYPE_P (restype)
+         && (!alias_is_noreturn || TREE_ADDRESSABLE (restype)))
        {
          if (DECL_BY_REFERENCE (resdecl))
            {
@@ -1768,7 +1769,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
              || DECL_BY_REFERENCE (resdecl)))
         gimple_call_set_return_slot_opt (call, true);
 
-      if (restmp && !alias_is_noreturn)
+      if (restmp)
        {
           gimple_call_set_lhs (call, restmp);
          gcc_assert (useless_type_conversion_p (TREE_TYPE (restmp),
index b0ee27e9997f117f501045a79a04aba6170d8329..6aa9db2e9c6ba72734c35975eb4d00a9e3ef9a56 100644 (file)
@@ -4828,7 +4828,8 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
            }
        }
       notice_special_calls (call_stmt);
-      if (!gimple_call_noreturn_p (call_stmt))
+      if (!gimple_call_noreturn_p (call_stmt)
+         || TREE_ADDRESSABLE (TREE_TYPE (*to_p)))
        gimple_call_set_lhs (call_stmt, *to_p);
       assign = call_stmt;
     }
index 929119abd7e9f2b4a5c923487ab815335a4b7bcb..21fd46f50c8ae3cdc32f038f2cd4c55914e48e1b 100644 (file)
@@ -1254,7 +1254,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
       else
        main_part_return_p = true;
     }
-  /* The main part also returns if we we split on a fallthru edge
+  /* The main part also returns if we split on a fallthru edge
      and the split part returns.  */
   if (split_part_return_p)
     FOR_EACH_EDGE (e, ei, split_point->entry_bb->preds)
@@ -1364,8 +1364,9 @@ split_function (basic_block return_bb, struct split_point *split_point,
   /* Now create the actual clone.  */
   cgraph_edge::rebuild_edges ();
   node = cur_node->create_version_clone_with_body
-    (vNULL, NULL, args_to_skip, !split_part_return_p, split_point->split_bbs,
-     split_point->entry_bb, "part");
+    (vNULL, NULL, args_to_skip,
+     !split_part_return_p || !split_point->split_part_set_retval,
+     split_point->split_bbs, split_point->entry_bb, "part");
 
   node->split_part = true;
 
index 63e39b081e8d83316856e9cda2a96561b1047588..5475bec275a69d4e5af7fa760d0dc96e13563752 100644 (file)
@@ -1,3 +1,13 @@
+2016-02-10  Jakub Jelinek  <jakub@redhat.com>
+           Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR ipa/69241
+       PR c++/69649
+       * g++.dg/ipa/pr69241-1.C: New test.
+       * g++.dg/ipa/pr69241-2.C: New test.
+       * g++.dg/ipa/pr69241-3.C: New test.
+       * g++.dg/ipa/pr69649.C: New test.
+
 2016-02-10  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.dg/tree-ssa/sra-17.c: Add -mcpu=ev4 for target alpha*-*-*.
diff --git a/gcc/testsuite/g++.dg/ipa/pr69241-1.C b/gcc/testsuite/g++.dg/ipa/pr69241-1.C
new file mode 100644 (file)
index 0000000..3e0502a
--- /dev/null
@@ -0,0 +1,12 @@
+// PR ipa/69241
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct R { R (const R &) {} };
+__attribute__ ((noreturn)) R bar ();
+
+R
+foo ()
+{
+  bar ();
+}
diff --git a/gcc/testsuite/g++.dg/ipa/pr69241-2.C b/gcc/testsuite/g++.dg/ipa/pr69241-2.C
new file mode 100644 (file)
index 0000000..bc79bbc
--- /dev/null
@@ -0,0 +1,18 @@
+// PR ipa/69241
+// { dg-do compile }
+// { dg-options "-O2" }
+
+__attribute__((noreturn)) void foo (int);
+struct R { R (const R &) {} };
+
+R
+bar ()
+{
+  foo (0);
+}
+
+R
+baz ()
+{
+  foo (0);
+}
diff --git a/gcc/testsuite/g++.dg/ipa/pr69241-3.C b/gcc/testsuite/g++.dg/ipa/pr69241-3.C
new file mode 100644 (file)
index 0000000..3894dc3
--- /dev/null
@@ -0,0 +1,12 @@
+// PR ipa/69241
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct R { int x[100]; };
+__attribute__ ((noreturn)) R bar ();
+
+void
+foo ()
+{
+  bar ();
+}
diff --git a/gcc/testsuite/g++.dg/ipa/pr69649.C b/gcc/testsuite/g++.dg/ipa/pr69649.C
new file mode 100644 (file)
index 0000000..1ad70dc
--- /dev/null
@@ -0,0 +1,36 @@
+// PR c++/69649
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A { virtual void m1 (); };
+struct C : A { void m1 () { m1 (); } };
+template <class T> struct B
+{
+  T *t;
+  B (T *x) : t (x) { if (t) t->m1 (); }
+  B (const B &);
+};
+struct D : public C {};
+struct F : public D
+{
+  virtual B<D> m2 ();
+  virtual B<D> m3 ();
+  int m4 ();
+};
+struct G : F
+{
+  B<D> m2 ();
+  B<D> m3 ();
+};
+B<D> G::m2 ()
+{
+  if (m4 () == 0)
+    return this;
+  return 0;
+}
+B<D> G::m3 ()
+{
+  if (m4 () == 0)
+    return this;
+  return 0;
+}