re PR ipa/68721 (wrong code at -Os and above on x86_64-linux-gnu)
authorRichard Biener <rguenther@suse.de>
Thu, 10 Dec 2015 09:05:58 +0000 (09:05 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 10 Dec 2015 09:05:58 +0000 (09:05 +0000)
2015-12-10  Richard Biener  <rguenther@suse.de>

PR ipa/68721
* ipa-split.c (split_function): Record return value properly
when the split part doesn't set it.

* gcc.dg/torture/pr68721.c: New testcase.

From-SVN: r231494

gcc/ChangeLog
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr68721.c [new file with mode: 0644]

index c990fc3fc6673de475efbd9690f9f7639a6396aa..b5ee0be9a537db4dcd709d845c020015570a8987 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-10  Richard Biener  <rguenther@suse.de>
+
+       PR ipa/68721
+       * ipa-split.c (split_function): Record return value properly
+       when the split part doesn't set it.
+
 2015-12-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68806
index 56c954b01b26050b485b69f68da75b6e3f7a28fd..f77ab52161de9f1cae7453957549f7a99af63175 100644 (file)
@@ -1281,7 +1281,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
      to return void instead of just outputting function with undefined return
      value.  For structures this affects quality of codegen.  */
   else if (!split_point->split_part_set_retval
-           && find_retval (return_bb))
+           && (retval = find_retval (return_bb)))
     {
       bool redirected = true;
       basic_block new_return_bb = create_basic_block (NULL, 0, return_bb);
@@ -1305,6 +1305,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
       e->count = new_return_bb->count;
       add_bb_to_loop (new_return_bb, current_loops->tree_root);
       bitmap_set_bit (split_point->split_bbs, new_return_bb->index);
+      retbnd = find_retbnd (return_bb);
     }
   /* When we pass around the value, use existing return block.  */
   else
index a24de4266cd0cc99ff5da33885bfa4b81b515097..7ac1418b9b8e0fd24a731405aed602434932c508 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-10  Richard Biener  <rguenther@suse.de>
+
+       PR ipa/68721
+       * gcc.dg/torture/pr68721.c: New testcase.
+
 2015-12-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68806
diff --git a/gcc/testsuite/gcc.dg/torture/pr68721.c b/gcc/testsuite/gcc.dg/torture/pr68721.c
new file mode 100644 (file)
index 0000000..297adab
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+int a, b, c, *d, **e = &d;
+
+int *
+fn1 ()
+{
+  for (;;)
+    {
+      for (; a;)
+       if (b)
+         abort ();
+      break;
+    }
+  for (; c;)
+    ;
+  return &a;
+}
+
+int
+main ()
+{
+  *e = fn1 ();
+
+  if (!d)
+    abort ();
+
+  return 0;
+}