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
This commit is contained in:
parent
d1b8f79164
commit
cda4d053eb
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue