Commit 7e140280 by Richard Henderson Committed by Richard Henderson

re PR tree-optimization/15454 (tree-ccp generates wrong code for nested functions)

        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.
	* gcc.c-torture/execute/20040520-1.c: New.

From-SVN: r82064
parent 5ce7d75d
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> 2004-05-20 Andrew Pinski <pinskia@physics.uc.edu>
* rs6000.c (print_operand) <case 'z'>: Call * rs6000.c (print_operand) <case 'z'>: Call
......
...@@ -6565,12 +6565,15 @@ expand_function_start (tree subr, int parms_have_cleanups) ...@@ -6565,12 +6565,15 @@ expand_function_start (tree subr, int parms_have_cleanups)
/* If function gets a static chain arg, store it. */ /* If function gets a static chain arg, store it. */
if (cfun->static_chain_decl) 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); emit_move_insn (local, static_chain_incoming_rtx);
x = expand_expr (cfun->static_chain_decl, NULL_RTX,
VOIDmode, EXPAND_WRITE);
emit_move_insn (x, static_chain_incoming_rtx);
} }
/* If the function receives a non-local goto, then store the /* If the function receives a non-local goto, then store the
......
...@@ -286,7 +286,7 @@ create_artificial_label (void) ...@@ -286,7 +286,7 @@ create_artificial_label (void)
static GTY(()) unsigned int tmp_var_id_num; static GTY(()) unsigned int tmp_var_id_num;
static tree tree
create_tmp_var_name (const char *prefix) create_tmp_var_name (const char *prefix)
{ {
char *tmp_name; char *tmp_name;
......
/* 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;
}
...@@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA. */
#include "tree-iterator.h" #include "tree-iterator.h"
extern tree create_tmp_var_raw (tree, const char *); 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 tree create_tmp_var (tree, const char *);
extern bool is_gimple_tmp_var (tree); extern bool is_gimple_tmp_var (tree);
extern tree get_initialized_tmp_var (tree, tree *, tree *); extern tree get_initialized_tmp_var (tree, tree *, tree *);
......
...@@ -306,15 +306,16 @@ get_chain_decl (struct nesting_info *info) ...@@ -306,15 +306,16 @@ get_chain_decl (struct nesting_info *info)
/* Note that this variable is *not* entered into any BIND_EXPR; /* Note that this variable is *not* entered into any BIND_EXPR;
the construction of this variable is handled specially in the construction of this variable is handled specially in
expand_function_start and initialize_inlined_parameters. */ expand_function_start and initialize_inlined_parameters.
decl = create_tmp_var_raw (type, "CHAIN"); 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_CONTEXT (decl) = info->context;
decl->decl.seen_in_bind_expr = 1; DECL_ARG_TYPE (decl) = type;
/* 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;
/* Tell tree-inline.c that we never write to this variable, so /* Tell tree-inline.c that we never write to this variable, so
it can copy-prop the replacement value immediately. */ it can copy-prop the replacement value immediately. */
......
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