Commit 96ddb7ec by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/59011 (ICE in make_decl_rtl, at varasm.c:1147)

	PR middle-end/59011
	* gimplify.c (nonlocal_vla_vars): New variable.
	(gimplify_var_or_parm_decl): Put VAR_DECLs for VLAs into
	nonlocal_vla_vars chain.
	(gimplify_body): Call declare_vars on nonlocal_vla_vars chain
	if outer_bind has DECL_INITIAL (current_function_decl) block.

	* gcc.dg/pr59011.c: New test.

From-SVN: r205621
parent 7f2f0a01
2013-12-03 Jakub Jelinek <jakub@redhat.com> 2013-12-03 Jakub Jelinek <jakub@redhat.com>
PR middle-end/59011
* gimplify.c (nonlocal_vla_vars): New variable.
(gimplify_var_or_parm_decl): Put VAR_DECLs for VLAs into
nonlocal_vla_vars chain.
(gimplify_body): Call declare_vars on nonlocal_vla_vars chain
if outer_bind has DECL_INITIAL (current_function_decl) block.
PR target/58864 PR target/58864
* dojump.c (save_pending_stack_adjust, restore_pending_stack_adjust): * dojump.c (save_pending_stack_adjust, restore_pending_stack_adjust):
New functions. New functions.
...@@ -1689,6 +1689,9 @@ gimplify_conversion (tree *expr_p) ...@@ -1689,6 +1689,9 @@ gimplify_conversion (tree *expr_p)
/* Nonlocal VLAs seen in the current function. */ /* Nonlocal VLAs seen in the current function. */
static struct pointer_set_t *nonlocal_vlas; static struct pointer_set_t *nonlocal_vlas;
/* The VAR_DECLs created for nonlocal VLAs for debug info purposes. */
static tree nonlocal_vla_vars;
/* Gimplify a VAR_DECL or PARM_DECL. Return GS_OK if we expanded a /* Gimplify a VAR_DECL or PARM_DECL. Return GS_OK if we expanded a
DECL_VALUE_EXPR, and it's worth re-examining things. */ DECL_VALUE_EXPR, and it's worth re-examining things. */
...@@ -1737,14 +1740,13 @@ gimplify_var_or_parm_decl (tree *expr_p) ...@@ -1737,14 +1740,13 @@ gimplify_var_or_parm_decl (tree *expr_p)
ctx = ctx->outer_context; ctx = ctx->outer_context;
if (!ctx && !pointer_set_insert (nonlocal_vlas, decl)) if (!ctx && !pointer_set_insert (nonlocal_vlas, decl))
{ {
tree copy = copy_node (decl), block; tree copy = copy_node (decl);
lang_hooks.dup_lang_specific_decl (copy); lang_hooks.dup_lang_specific_decl (copy);
SET_DECL_RTL (copy, 0); SET_DECL_RTL (copy, 0);
TREE_USED (copy) = 1; TREE_USED (copy) = 1;
block = DECL_INITIAL (current_function_decl); DECL_CHAIN (copy) = nonlocal_vla_vars;
DECL_CHAIN (copy) = BLOCK_VARS (block); nonlocal_vla_vars = copy;
BLOCK_VARS (block) = copy;
SET_DECL_VALUE_EXPR (copy, unshare_expr (value_expr)); SET_DECL_VALUE_EXPR (copy, unshare_expr (value_expr));
DECL_HAS_VALUE_EXPR_P (copy) = 1; DECL_HAS_VALUE_EXPR_P (copy) = 1;
} }
...@@ -8562,6 +8564,21 @@ gimplify_body (tree fndecl, bool do_parms) ...@@ -8562,6 +8564,21 @@ gimplify_body (tree fndecl, bool do_parms)
if (nonlocal_vlas) if (nonlocal_vlas)
{ {
if (nonlocal_vla_vars)
{
/* tree-nested.c may later on call declare_vars (..., true);
which relies on BLOCK_VARS chain to be the tail of the
gimple_bind_vars chain. Ensure we don't violate that
assumption. */
if (gimple_bind_block (outer_bind)
== DECL_INITIAL (current_function_decl))
declare_vars (nonlocal_vla_vars, outer_bind, true);
else
BLOCK_VARS (DECL_INITIAL (current_function_decl))
= chainon (BLOCK_VARS (DECL_INITIAL (current_function_decl)),
nonlocal_vla_vars);
nonlocal_vla_vars = NULL_TREE;
}
pointer_set_destroy (nonlocal_vlas); pointer_set_destroy (nonlocal_vlas);
nonlocal_vlas = NULL; nonlocal_vlas = NULL;
} }
......
2013-12-03 Jakub Jelinek <jakub@redhat.com> 2013-12-03 Jakub Jelinek <jakub@redhat.com>
PR middle-end/59011
* gcc.dg/pr59011.c: New test.
PR target/58864 PR target/58864
* g++.dg/opt/pr58864.C: New test. * g++.dg/opt/pr58864.C: New test.
......
/* PR middle-end/59011 */
/* { dg-do compile } */
/* { dg-options "-std=gnu99" } */
void
foo (int m)
{
int a[m];
void
bar (void)
{
{
int
baz (void)
{
return a[0];
}
}
a[0] = 42;
}
bar ();
}
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