From 32be32afefa07a6a060568da4200421f03d4fb39 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 5 Jan 2012 16:10:26 +0100 Subject: 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 --- gcc/gimplify.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'gcc/gimplify.c') diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 14d627e7254..5f2cbf3c769 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1,7 +1,7 @@ /* Tree lowering pass. This pass converts the GENERIC functions-as-trees tree representation into the GIMPLE form. - Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, + 2012 Free Software Foundation, Inc. Major work done by Sebastian Pop , Diego Novillo and Jason Merrill . @@ -5226,13 +5226,16 @@ gimplify_cleanup_point_expr (tree *expr_p, gimple_seq *pre_p) any cleanups collected outside the CLEANUP_POINT_EXPR. */ int old_conds = gimplify_ctxp->conditions; 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->conditional_cleanups = NULL; + gimplify_ctxp->in_cleanup_point_expr = true; gimplify_stmt (&TREE_OPERAND (*expr_p, 0), &body_sequence); gimplify_ctxp->conditions = old_conds; 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); ) { @@ -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 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_THIS_VOLATILE (clobber) = true; -- cgit v1.2.1