re PR tree-optimization/36291 (GCC is slow and memory-hungry building sipQtGuipart.cpp)
2009-04-08 Richard Guenther <rguenther@suse.de> PR middle-end/36291 * tree-dfa.c (add_referenced_var): Do not recurse into global initializers. * tree-ssa-ccp.c (get_symbol_constant_value): Add newly exposed variables. (fold_const_aggregate_ref): Likewise. From-SVN: r145757
This commit is contained in:
parent
f6f5e3a1cc
commit
75ccc1e7fa
3 changed files with 34 additions and 7 deletions
|
@ -1,3 +1,12 @@
|
|||
2009-04-08 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/36291
|
||||
* tree-dfa.c (add_referenced_var): Do not recurse into
|
||||
global initializers.
|
||||
* tree-ssa-ccp.c (get_symbol_constant_value): Add newly
|
||||
exposed variables.
|
||||
(fold_const_aggregate_ref): Likewise.
|
||||
|
||||
2009-04-08 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
* recog.c (ordered_comparison_operator): New.
|
||||
|
|
|
@ -600,13 +600,11 @@ add_referenced_var (tree var)
|
|||
{
|
||||
/* Scan DECL_INITIAL for pointer variables as they may contain
|
||||
address arithmetic referencing the address of other
|
||||
variables.
|
||||
Even non-constant initializers need to be walked, because
|
||||
IPA passes might prove that their are invariant later on. */
|
||||
variables. As we are only interested in directly referenced
|
||||
globals or referenced locals restrict this to initializers
|
||||
than can refer to local variables. */
|
||||
if (DECL_INITIAL (var)
|
||||
/* Initializers of external variables are not useful to the
|
||||
optimizers. */
|
||||
&& !DECL_EXTERNAL (var))
|
||||
&& DECL_CONTEXT (var) == current_function_decl)
|
||||
walk_tree (&DECL_INITIAL (var), find_vars_r, NULL, 0);
|
||||
|
||||
return true;
|
||||
|
|
|
@ -281,7 +281,15 @@ get_symbol_constant_value (tree sym)
|
|||
{
|
||||
STRIP_USELESS_TYPE_CONVERSION (val);
|
||||
if (is_gimple_min_invariant (val))
|
||||
return val;
|
||||
{
|
||||
if (TREE_CODE (val) == ADDR_EXPR)
|
||||
{
|
||||
tree base = get_base_address (TREE_OPERAND (val, 0));
|
||||
if (base && TREE_CODE (base) == VAR_DECL)
|
||||
add_referenced_var (base);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
}
|
||||
/* Variables declared 'const' without an initializer
|
||||
have zero as the initializer if they may not be
|
||||
|
@ -1243,6 +1251,12 @@ fold_const_aggregate_ref (tree t)
|
|||
if (tree_int_cst_equal (cfield, idx))
|
||||
{
|
||||
STRIP_USELESS_TYPE_CONVERSION (cval);
|
||||
if (TREE_CODE (cval) == ADDR_EXPR)
|
||||
{
|
||||
tree base = get_base_address (TREE_OPERAND (cval, 0));
|
||||
if (base && TREE_CODE (base) == VAR_DECL)
|
||||
add_referenced_var (base);
|
||||
}
|
||||
return cval;
|
||||
}
|
||||
break;
|
||||
|
@ -1286,6 +1300,12 @@ fold_const_aggregate_ref (tree t)
|
|||
&& ! DECL_BIT_FIELD (cfield))
|
||||
{
|
||||
STRIP_USELESS_TYPE_CONVERSION (cval);
|
||||
if (TREE_CODE (cval) == ADDR_EXPR)
|
||||
{
|
||||
tree base = get_base_address (TREE_OPERAND (cval, 0));
|
||||
if (base && TREE_CODE (base) == VAR_DECL)
|
||||
add_referenced_var (base);
|
||||
}
|
||||
return cval;
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue