+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.
{
/* 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;
{
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
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;
&& ! 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;