Commit cda4d053 by Richard Biener Committed by Richard Biener

re PR tree-optimization/80032 (C++ excessive stack usage (no stack reuse))

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
parent d1b8f791
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> 2017-03-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/80072 PR tree-optimization/80072
......
...@@ -6312,7 +6312,7 @@ gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p, ...@@ -6312,7 +6312,7 @@ gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p,
if (seen_error ()) if (seen_error ())
return; return;
if (gimple_conditional_context () && ! force_uncond) if (gimple_conditional_context ())
{ {
/* If we're in a conditional context, this is more complex. We only /* 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 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, ...@@ -6334,22 +6334,31 @@ gimple_push_cleanup (tree var, tree cleanup, bool eh_only, gimple_seq *pre_p,
} }
val val
*/ */
tree flag = create_tmp_var (boolean_type_node, "cleanup"); if (force_uncond)
gassign *ffalse = gimple_build_assign (flag, boolean_false_node); {
gassign *ftrue = gimple_build_assign (flag, boolean_true_node); 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); cleanup = build3 (COND_EXPR, void_type_node, flag, cleanup, NULL);
gimplify_stmt (&cleanup, &cleanup_stmts); gimplify_stmt (&cleanup, &cleanup_stmts);
wce = gimple_build_wce (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, ffalse);
gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce); gimplify_seq_add_stmt (&gimplify_ctxp->conditional_cleanups, wce);
gimplify_seq_add_stmt (pre_p, ftrue); gimplify_seq_add_stmt (pre_p, ftrue);
/* Because of this manipulation, and the EH edges that jump /* Because of this manipulation, and the EH edges that jump
threading cannot redirect, the temporary (VAR) will appear threading cannot redirect, the temporary (VAR) will appear
to be used uninitialized. Don't warn. */ to be used uninitialized. Don't warn. */
TREE_NO_WARNING (var) = 1; TREE_NO_WARNING (var) = 1;
}
} }
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment