diff options
author | Richard Guenther <rguenther@suse.de> | 2009-04-08 16:33:08 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-04-08 16:33:08 +0000 |
commit | 75ccc1e7fa591f7a6c88ddd04b97169bcf04e5ff (patch) | |
tree | 3b276fc4543ee33b2bc43f554a23fcf7da9cf60f /gcc/tree-ssa-ccp.c | |
parent | f6f5e3a1cc294a064bf87250db3dee449a24f278 (diff) | |
download | gcc-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.c | 22 |
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; |