]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/40999 (ICE in extract_component, at tree-complex.c:625)
authorRichard Guenther <rguenther@suse.de>
Fri, 7 Aug 2009 17:02:43 +0000 (17:02 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 7 Aug 2009 17:02:43 +0000 (17:02 +0000)
2009-08-07  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/40999
* tree-ssa-ccp.c (get_symbol_constant_value): Handle CONST_DECLs.
(maybe_fold_reference): Lookup constant initializers.
(fold_gimple_assign): Likewise.

* gfortran.dg/pr40999.f: New testcase.

From-SVN: r150572

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr40999.f [new file with mode: 0644]
gcc/tree-ssa-ccp.c

index b9304a156bcee9664acc02160954fc0dfd0ca5fd..3a43fe3dd8e5836c9abe8fccf908a47c005dffcf 100644 (file)
@@ -1,3 +1,10 @@
+2009-08-07  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/40999
+       * tree-ssa-ccp.c (get_symbol_constant_value): Handle CONST_DECLs.
+       (maybe_fold_reference): Lookup constant initializers.
+       (fold_gimple_assign): Likewise.
+
 2009-08-07  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa.c (useless_type_conversion_p_1): Only for types
index 4d3f9b0077a0dbec1f6514241154e343be973071..cbaf780b5f893ec5229db5429b3d7447a0d7d9fd 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-07  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/40999
+       * gfortran.dg/pr40999.f: New testcase.
+
 2009-08-07  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.dg/tree-prof/partition1.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr40999.f b/gcc/testsuite/gfortran.dg/pr40999.f
new file mode 100644 (file)
index 0000000..0d93069
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-options "-O3 -fwhole-file" }
+
+      SUBROUTINE ZLARFG( ALPHA )
+        ALPHA = ZLADIV( DCMPLX( 1.0D+0 ) )
+      END
+      COMPLEX*16 FUNCTION ZLADIV( X )
+        COMPLEX*16         X
+        CALL DLADIV( DBLE( X ), DIMAG( X ) )
+      END
+
index c507f4572e628d536a1498807e6ead65794ca75b..f39d272964bbc96f3f970c4e8528e4b0307d7f28 100644 (file)
@@ -276,7 +276,8 @@ tree
 get_symbol_constant_value (tree sym)
 {
   if (TREE_STATIC (sym)
-      && TREE_READONLY (sym))
+      && (TREE_READONLY (sym)
+         || TREE_CODE (sym) == CONST_DECL))
     {
       tree val = DECL_INITIAL (sym);
       if (val)
@@ -288,7 +289,11 @@ get_symbol_constant_value (tree sym)
                {
                  tree base = get_base_address (TREE_OPERAND (val, 0));
                  if (base && TREE_CODE (base) == VAR_DECL)
-                   add_referenced_var (base);
+                   {
+                     TREE_ADDRESSABLE (base) = 1;
+                     if (gimple_referenced_vars (cfun))
+                       add_referenced_var (base);
+                   }
                }
              return val;
            }
@@ -2337,6 +2342,19 @@ maybe_fold_reference (tree expr, bool is_lhs)
          return expr;
        }
     }
+  else if (!is_lhs
+          && DECL_P (*t))
+    {
+      tree tem = get_symbol_constant_value (*t);
+      if (tem)
+       {
+         *t = tem;
+         tem = maybe_fold_reference (expr, is_lhs);
+         if (tem)
+           return tem;
+         return expr;
+       }
+    }
 
   return NULL_TREE;
 }
@@ -2739,6 +2757,9 @@ fold_gimple_assign (gimple_stmt_iterator *si)
                                           CONSTRUCTOR_ELTS (rhs));
          }
 
+       else if (DECL_P (rhs))
+         return get_symbol_constant_value (rhs);
+
         /* If we couldn't fold the RHS, hand over to the generic
            fold routines.  */
         if (result == NULL_TREE)