diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82e5d0a9510ebeb5177872699ad3de870679f567..8d00704e86f0ed4dc37f29ea72ff9278acbbfb8b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-05-20 Richard Henderson <rth@redhat.com> + + PR 15454 + * tree-nested.c (get_chain_decl): Create a PARM_DECL by hand. + * function.c (expand_function_start): Expand static_chain_decl by hand. + * gimplify.c (create_tmp_var_name): Export. + * tree-gimple.h (create_tmp_var_name): Declare. + 2004-05-20 Andrew Pinski <pinskia@physics.uc.edu> * rs6000.c (print_operand) <case 'z'>: Call diff --git a/gcc/function.c b/gcc/function.c index 4c535c713836852e8b04ede4d1d29732657d4a38..c34c191062d310ddd3c15f8d48f9aa9aa28b0a7f 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6565,12 +6565,15 @@ expand_function_start (tree subr, int parms_have_cleanups) /* If function gets a static chain arg, store it. */ if (cfun->static_chain_decl) { - rtx x; + tree parm = cfun->static_chain_decl; + rtx local = gen_reg_rtx (Pmode); + + set_decl_incoming_rtl (parm, static_chain_incoming_rtx); + SET_DECL_RTL (parm, local); + maybe_set_unchanging (local, parm); + mark_reg_pointer (local, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm)))); - expand_var (cfun->static_chain_decl); - x = expand_expr (cfun->static_chain_decl, NULL_RTX, - VOIDmode, EXPAND_WRITE); - emit_move_insn (x, static_chain_incoming_rtx); + emit_move_insn (local, static_chain_incoming_rtx); } /* If the function receives a non-local goto, then store the diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 907d443dca579c559ff2b2ff7f24b284f7576484..21cf0141d5048dbc479e885b9b1a0272e55aff0b 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -286,7 +286,7 @@ create_artificial_label (void) static GTY(()) unsigned int tmp_var_id_num; -static tree +tree create_tmp_var_name (const char *prefix) { char *tmp_name; diff --git a/gcc/testsuite/gcc.c-torture/execute/20040520-1.c b/gcc/testsuite/gcc.c-torture/execute/20040520-1.c new file mode 100644 index 0000000000000000000000000000000000000000..b42483714375887a1877da0322b54ee0e062dc06 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20040520-1.c @@ -0,0 +1,17 @@ +/* PR 15454 */ + +void abort (); +int main () { + int foo; + int bar (void) + { + int baz = 0; + if (foo!=45) + baz = foo; + return baz; + } + foo = 1; + if (!bar ()) + abort (); + return 0; +} diff --git a/gcc/tree-gimple.h b/gcc/tree-gimple.h index d2c91032031af59ff3343ffd3a6444fe145c7b55..59cb3b365ac2f2ad9c79c9b2f6c10155a87f00b1 100644 --- a/gcc/tree-gimple.h +++ b/gcc/tree-gimple.h @@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA. */ #include "tree-iterator.h" extern tree create_tmp_var_raw (tree, const char *); +extern tree create_tmp_var_name (const char *); extern tree create_tmp_var (tree, const char *); extern bool is_gimple_tmp_var (tree); extern tree get_initialized_tmp_var (tree, tree *, tree *); diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index 1a00ff30f864fed5dc11740f1db38d4fac81ed71..14d2c3cb9ff5f77ff5c13d83d6cd314de66924df 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -306,15 +306,16 @@ get_chain_decl (struct nesting_info *info) /* Note that this variable is *not* entered into any BIND_EXPR; the construction of this variable is handled specially in - expand_function_start and initialize_inlined_parameters. */ - decl = create_tmp_var_raw (type, "CHAIN"); + expand_function_start and initialize_inlined_parameters. + Note also that it's represented as a parameter. This is more + close to the truth, since the initial value does come from + the caller. */ + decl = build_decl (PARM_DECL, create_tmp_var_name ("CHAIN"), type); + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; + TREE_USED (decl) = 1; DECL_CONTEXT (decl) = info->context; - decl->decl.seen_in_bind_expr = 1; - - /* The initialization of CHAIN is not visible to the tree-ssa - analyzers and optimizers. Thus we do not want to issue - warnings for CHAIN. */ - TREE_NO_WARNING (decl) = 1; + DECL_ARG_TYPE (decl) = type; /* Tell tree-inline.c that we never write to this variable, so it can copy-prop the replacement value immediately. */