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
This commit is contained in:
Alexandre Oliva 2004-12-13 21:03:47 +00:00 committed by Alexandre Oliva
parent b4418614a1
commit 04482133da
4 changed files with 48 additions and 1 deletions

View File

@ -1,3 +1,10 @@
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>
* basic-block.h (PROP_POSTRELOAD): Do not include PROP_AUTOINC, we

View File

@ -1,3 +1,8 @@
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>
PR middle-end/17564

View File

@ -0,0 +1,13 @@
/* 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);
}

View File

@ -655,6 +655,22 @@ copy_body (inline_data *id)
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
setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
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,
It is not big deal to prohibit constant propagation here as
we will constant propagate in DOM1 pass anyway. */
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);
return;