aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-ccp.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-04-08 16:33:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-04-08 16:33:08 +0000
commit75ccc1e7fa591f7a6c88ddd04b97169bcf04e5ff (patch)
tree3b276fc4543ee33b2bc43f554a23fcf7da9cf60f /gcc/tree-ssa-ccp.c
parentf6f5e3a1cc294a064bf87250db3dee449a24f278 (diff)
downloadgcc-75ccc1e7fa591f7a6c88ddd04b97169bcf04e5ff.zip
gcc-75ccc1e7fa591f7a6c88ddd04b97169bcf04e5ff.tar.gz
gcc-75ccc1e7fa591f7a6c88ddd04b97169bcf04e5ff.tar.bz2
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
Diffstat (limited to 'gcc/tree-ssa-ccp.c')
-rw-r--r--gcc/tree-ssa-ccp.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index 2f39658..a678504 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -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;