Commit 04482133 by Alexandre Oliva Committed by Alexandre Oliva

re PR tree-optimization/16951 (ICE in make_decl_rtl with recursion in C++ constructor (-O1))

gcc/ChangeLog:
PR tree-opt/16951
* tree-inline.c (setup_one_parameter): Don't directly map a
parameter to the address of another variable of the same
function.
gcc/testsuite/ChangeLog:
PR tree-opt/16951
* gcc.c-torture/compile/20041211-1.c: New.

From-SVN: r92106
parent b4418614
2004-12-13 Alexandre Oliva <aoliva@redhat.com>
PR tree-opt/16951
* tree-inline.c (setup_one_parameter): Don't directly map a
parameter to the address of another variable of the same
function.
2004-13-12 Steven Bosscher <stevenb@suse.de> 2004-13-12 Steven Bosscher <stevenb@suse.de>
* basic-block.h (PROP_POSTRELOAD): Do not include PROP_AUTOINC, we * basic-block.h (PROP_POSTRELOAD): Do not include PROP_AUTOINC, we
......
2004-12-13 Alexandre Oliva <aoliva@redhat.com>
PR tree-opt/16951
* gcc.c-torture/compile/20041211-1.c: New.
2004-12-12 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> 2004-12-12 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR middle-end/17564 PR middle-end/17564
......
/* PR tree-optimization/16951 */
void dummy_use(const char *p);
__inline void f(const char *const p) {
const char q;
dummy_use(p);
f(&q);
}
void crash() {
f(0);
}
...@@ -655,6 +655,22 @@ copy_body (inline_data *id) ...@@ -655,6 +655,22 @@ copy_body (inline_data *id)
return body; return body;
} }
/* Return true if VALUE is an ADDR_EXPR of an automatic variable
defined in function FN, or of a data member thereof. */
static bool
self_inlining_addr_expr (tree value, tree fn)
{
tree var;
if (TREE_CODE (value) != ADDR_EXPR)
return false;
var = get_base_address (TREE_OPERAND (value, 0));
return var && lang_hooks.tree_inlining.auto_var_in_fn_p (var, fn);
}
static void static void
setup_one_parameter (inline_data *id, tree p, tree value, tree fn, setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
tree *init_stmts, tree *vars, bool *gimplify_init_stmts_p) tree *init_stmts, tree *vars, bool *gimplify_init_stmts_p)
...@@ -679,7 +695,13 @@ setup_one_parameter (inline_data *id, tree p, tree value, tree fn, ...@@ -679,7 +695,13 @@ setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
It is not big deal to prohibit constant propagation here as It is not big deal to prohibit constant propagation here as
we will constant propagate in DOM1 pass anyway. */ we will constant propagate in DOM1 pass anyway. */
if (is_gimple_min_invariant (value) if (is_gimple_min_invariant (value)
&& lang_hooks.types_compatible_p (TREE_TYPE (value), TREE_TYPE (p))) && lang_hooks.types_compatible_p (TREE_TYPE (value), TREE_TYPE (p))
/* We have to be very careful about ADDR_EXPR. Make sure
the base variable isn't a local variable of the inlined
function, e.g., when doing recursive inlining, direct or
mutually-recursive or whatever, which is why we don't
just test whether fn == current_function_decl. */
&& ! self_inlining_addr_expr (value, fn))
{ {
insert_decl_map (id, p, value); insert_decl_map (id, p, value);
return; return;
......
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