OSDN Git Service

* tree-sra.c (maybe_lookup_element_for_expr) <COMPONENT_REF>: Return
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2007 18:47:15 +0000 (18:47 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Sep 2007 18:47:15 +0000 (18:47 +0000)
NULL for variable-sized records too.
(sra_walk_expr) <COMPONENT_REF>: Stop at variable-sized records too.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128553 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-sra.c

index 72ab679..2d4575a 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-17  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-sra.c (maybe_lookup_element_for_expr) <COMPONENT_REF>: Return
+       NULL for variable-sized records too.
+       (sra_walk_expr) <COMPONENT_REF>: Stop at variable-sized records too.
+
 2007-09-17  Tom Tromey  <tromey@redhat.com>
 
        * c-decl.c (pushdecl): Don't set DECL_LANG_SPECIFIC.
index 5d69a49..4a3924b 100644 (file)
@@ -636,10 +636,17 @@ maybe_lookup_element_for_expr (tree expr)
       break;
 
     case COMPONENT_REF:
-      /* Don't look through unions.  */
-      if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) != RECORD_TYPE)
-       return NULL;
-      child = TREE_OPERAND (expr, 1);
+      {
+       tree type = TREE_TYPE (TREE_OPERAND (expr, 0));
+       /* Don't look through unions.  */
+       if (TREE_CODE (type) != RECORD_TYPE)
+         return NULL;
+       /* Neither through variable-sized records.  */
+       if (TYPE_SIZE (type) == NULL_TREE
+           || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+         return NULL;
+       child = TREE_OPERAND (expr, 1);
+      }
       break;
 
     case REALPART_EXPR:
@@ -789,14 +796,17 @@ sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
        break;
 
       case COMPONENT_REF:
-       /* A reference to a union member constitutes a reference to the
-          entire union.  */
-       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (inner, 0))) != RECORD_TYPE)
-         goto use_all;
-       /* ??? See above re non-constant stride.  */
-       if (TREE_OPERAND (inner, 2))
-         goto use_all;
-       inner = TREE_OPERAND (inner, 0);
+       {
+         tree type = TREE_TYPE (TREE_OPERAND (inner, 0));
+         /* Don't look through unions.  */
+         if (TREE_CODE (type) != RECORD_TYPE)
+           goto use_all;
+         /* Neither through variable-sized records.  */
+         if (TYPE_SIZE (type) == NULL_TREE
+             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+           goto use_all;
+         inner = TREE_OPERAND (inner, 0);
+       }
        break;
 
       case REALPART_EXPR: