re PR tree-optimization/80032 (C++ excessive stack usage (no stack reuse))
authorRichard Biener <rguenther@suse.de>
Thu, 23 Mar 2017 08:33:41 +0000 (08:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 23 Mar 2017 08:33:41 +0000 (08:33 +0000)
2017-03-23  Richard Biener  <rguenther@suse.de>

PR tree-optimization/80032
* gimplify.c (gimple_push_cleanup): Forced unconditional
cleanups still have to go to the conditional_cleanups
sequence.

From-SVN: r246414

gcc/ChangeLog
gcc/gimplify.c

index 205de5cb24bd4c711096efbfcacc8efa83dee21b..ddf90e5cd67e59811bc73b792ae6408d24429bbb 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-23  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/80032
+       * gimplify.c (gimple_push_cleanup): Forced unconditional
+       cleanups still have to go to the conditional_cleanups
+       sequence.
+
 2017-03-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/80072
index f90ae94bc6960b25e0018bc2bb68a3a5a06adfcb..6deac4a987adaac580b404fa9a34b40de615144e 100644 (file)
@@ -6312,7 +6312,7 @@ gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p,
   if (seen_error ())
     return;
 
-  if (gimple_conditional_context () && ! force_uncond)
+  if (gimple_conditional_context ())
     {
       /* If we're in a conditional context, this is more complex.  We only
         want to run the cleanup if we actually ran the initialization that
@@ -6334,22 +6334,31 @@ gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p,
           }
           val
       */
-      tree flag = create_tmp_var (boolean_type_node, "cleanup");
-      gassign *ffalse = gimple_build_assign (flag, boolean_false_node);
-      gassign *ftrue = gimple_build_assign (flag, boolean_true_node);
+      if (force_uncond)
+       {
+         gimplify_stmt (&cleanup, &cleanup_stmts);
+         wce = gimple_build_wce (cleanup_stmts);
+         gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
+       }
+      else
+       {
+         tree flag = create_tmp_var (boolean_type_node, "cleanup");
+         gassign *ffalse = gimple_build_assign (flag, boolean_false_node);
+         gassign *ftrue = gimple_build_assign (flag, boolean_true_node);
 
-      cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
-      gimplify_stmt (&cleanup, &cleanup_stmts);
-      wce = gimple_build_wce (cleanup_stmts);
+         cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
+         gimplify_stmt (&cleanup, &cleanup_stmts);
+         wce = gimple_build_wce (cleanup_stmts);
 
-      gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
-      gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
-      gimplify_seq_add_stmt (pre_p, ftrue);
+         gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, ffalse);
+         gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
+         gimplify_seq_add_stmt (pre_p, ftrue);
 
-      /* Because of this manipulation, and the EH edges that jump
-        threading cannot redirect, the temporary (VAR) will appear
-        to be used uninitialized.  Don't warn.  */
-      TREE_NO_WARNING (var) = 1;
+         /* Because of this manipulation, and the EH edges that jump
+            threading cannot redirect, the temporary (VAR) will appear
+            to be used uninitialized.  Don't warn.  */
+         TREE_NO_WARNING (var) = 1;
+       }
     }
   else
     {