mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 18:11:15 +08:00
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:
parent
b4418614a1
commit
04482133da
@ -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
|
||||
|
@ -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
|
||||
|
13
gcc/testsuite/gcc.c-torture/compile/20041211-1.c
Normal file
13
gcc/testsuite/gcc.c-torture/compile/20041211-1.c
Normal 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);
|
||||
}
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user