re PR tree-optimization/36291 (GCC is slow and memory-hungry building sipQtGuipart...
authorRichard Guenther <rguenther@suse.de>
Wed, 8 Apr 2009 16:33:08 +0000 (16:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 8 Apr 2009 16:33:08 +0000 (16:33 +0000)
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

gcc/ChangeLog
gcc/tree-dfa.c
gcc/tree-ssa-ccp.c

index 7934933..cdb96fb 100644 (file)
@@ -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.
index d50b7dd..1738dd0 100644 (file)
@@ -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;
index 2f39658..a678504 100644 (file)
@@ -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;