Commit 32be32af by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/51761 (ICE in verify_gimple_stmt, at tree-cfg.c:4241)

	PR middle-end/51761
	* gimple.h (struct gimplify_ctx): Add in_cleanup_point_expr
	field.
	* gimplify.c (gimplify_cleanup_point_expr): Save and set
	in_cleanup_point_expr before gimplify_stmt call and restore it
	afterwards.
	(gimplify_target_expr): Don't add {CLOBBER} cleanup if
	in_cleanup_point_expr is false.

	* gcc.c-torture/compile/pr51761.c: New test.

From-SVN: r182914
parent 5720c0dc
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51761
* gimple.h (struct gimplify_ctx): Add in_cleanup_point_expr
field.
* gimplify.c (gimplify_cleanup_point_expr): Save and set
in_cleanup_point_expr before gimplify_stmt call and restore it
afterwards.
(gimplify_target_expr): Don't add {CLOBBER} cleanup if
in_cleanup_point_expr is false.
2012-01-05 Richard Guenther <rguenther@suse.de> 2012-01-05 Richard Guenther <rguenther@suse.de>
PR middle-end/51764 PR middle-end/51764
/* Gimple IR definitions. /* Gimple IR definitions.
Copyright 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Copyright 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
Contributed by Aldy Hernandez <aldyh@redhat.com> Contributed by Aldy Hernandez <aldyh@redhat.com>
This file is part of GCC. This file is part of GCC.
...@@ -1092,6 +1092,7 @@ struct gimplify_ctx ...@@ -1092,6 +1092,7 @@ struct gimplify_ctx
bool save_stack; bool save_stack;
bool into_ssa; bool into_ssa;
bool allow_rhs_cond_expr; bool allow_rhs_cond_expr;
bool in_cleanup_point_expr;
}; };
extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *, extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *,
......
/* Tree lowering pass. This pass converts the GENERIC functions-as-trees /* Tree lowering pass. This pass converts the GENERIC functions-as-trees
tree representation into the GIMPLE form. tree representation into the GIMPLE form.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
Free Software Foundation, Inc. 2012 Free Software Foundation, Inc.
Major work done by Sebastian Pop <s.pop@laposte.net>, Major work done by Sebastian Pop <s.pop@laposte.net>,
Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>. Diego Novillo <dnovillo@redhat.com> and Jason Merrill <jason@redhat.com>.
...@@ -5226,13 +5226,16 @@ gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p) ...@@ -5226,13 +5226,16 @@ gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p)
any cleanups collected outside the CLEANUP_POINT_EXPR. */ any cleanups collected outside the CLEANUP_POINT_EXPR. */
int old_conds = gimplify_ctxp->conditions; int old_conds = gimplify_ctxp->conditions;
gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups; gimple_seq old_cleanups = gimplify_ctxp->conditional_cleanups;
bool old_in_cleanup_point_expr = gimplify_ctxp->in_cleanup_point_expr;
gimplify_ctxp->conditions = 0; gimplify_ctxp->conditions = 0;
gimplify_ctxp->conditional_cleanups = NULL; gimplify_ctxp->conditional_cleanups = NULL;
gimplify_ctxp->in_cleanup_point_expr = true;
gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence); gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence);
gimplify_ctxp->conditions = old_conds; gimplify_ctxp->conditions = old_conds;
gimplify_ctxp->conditional_cleanups = old_cleanups; gimplify_ctxp->conditional_cleanups = old_cleanups;
gimplify_ctxp->in_cleanup_point_expr = old_in_cleanup_point_expr;
for (iter = gsi_start (body_sequence); !gsi_end_p (iter); ) for (iter = gsi_start (body_sequence); !gsi_end_p (iter); )
{ {
...@@ -5408,7 +5411,8 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) ...@@ -5408,7 +5411,8 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
/* Add a clobber for the temporary going out of scope, like /* Add a clobber for the temporary going out of scope, like
gimplify_bind_expr. */ gimplify_bind_expr. */
if (needs_to_live_in_memory (temp)) if (gimplify_ctxp->in_cleanup_point_expr
&& needs_to_live_in_memory (temp))
{ {
tree clobber = build_constructor (TREE_TYPE (temp), NULL); tree clobber = build_constructor (TREE_TYPE (temp), NULL);
TREE_THIS_VOLATILE (clobber) = true; TREE_THIS_VOLATILE (clobber) = true;
......
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/51761
* gcc.c-torture/compile/pr51761.c: New test.
2012-01-05 Richard Guenther <rguenther@suse.de> 2012-01-05 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51760 PR tree-optimization/51760
......
/* PR middle-end/51761 */
struct S { unsigned int len; };
struct S foo (struct S);
struct S
bar (struct S x)
{
return ({ struct S a = x; foo (a); });
}
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