OSDN Git Service

2005-02-18 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Feb 2005 14:31:50 +0000 (14:31 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Feb 2005 14:31:50 +0000 (14:31 +0000)
        PR middle-end/20030
        * fold-const.c (fold_indirect_ref_1): Use the correct index for zero access,
        the lower bound of the array type if it exists.

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

gcc/ChangeLog
gcc/fold-const.c

index 61ea0ad..97c9e90 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-18  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR middle-end/20030
+       * fold-const.c (fold_indirect_ref_1): Use the correct index for zero access,
+       the lower bound of the array type if it exists.
+
 2005-02-18  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/20008
 2005-02-18  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/20008
index 27e16ae..a04c061 100644 (file)
@@ -11258,15 +11258,26 @@ fold_indirect_ref_1 (tree t)
       /* *(foo *)&fooarray => fooarray[0] */
       else if (TREE_CODE (optype) == ARRAY_TYPE
               && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
       /* *(foo *)&fooarray => fooarray[0] */
       else if (TREE_CODE (optype) == ARRAY_TYPE
               && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
-       return build4 (ARRAY_REF, type, op, size_zero_node, NULL_TREE, NULL_TREE);
+       {
+         tree type_domain = TYPE_DOMAIN (optype);
+         tree min_val = size_zero_node;
+         if (type_domain && TYPE_MIN_VALUE (type_domain))
+           min_val = TYPE_MIN_VALUE (type_domain);
+         return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
+       }
     }
 
   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
       && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
     {
     }
 
   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
   if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
       && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
     {
+      tree type_domain;
+      tree min_val = size_zero_node;
       sub = build_fold_indirect_ref (sub);
       sub = build_fold_indirect_ref (sub);
-      return build4 (ARRAY_REF, type, sub, size_zero_node, NULL_TREE, NULL_TREE);
+      type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
+      if (type_domain && TYPE_MIN_VALUE (type_domain))
+       min_val = TYPE_MIN_VALUE (type_domain);
+      return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
     }
 
   return NULL_TREE;
     }
 
   return NULL_TREE;