https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69368

--- Comment #72 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 23 Feb 2016, Richard Biener wrote:

> On Tue, 23 Feb 2016, jakub at gcc dot gnu.org wrote:
> 
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69368
> > 
> > --- Comment #70 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> > If you want to go this way, I'd at least key it off DECL_COMMON on the decl.
> > And instead of multiplying max_size by 2 perhaps just add BITS_PER_UNIT?
> 
> Works for me.
> 
> > And only if it is equal to size?
> 
> That's already done.

Patch as posted passed bootstrap & regtest.  Adjusted according to 
comments but not tested otherwise - please somebody throw at
unpatched 416.gamess.

Index: gcc/tree-dfa.c
===================================================================
--- gcc/tree-dfa.c      (revision 233620)
+++ gcc/tree-dfa.c      (working copy)
@@ -617,7 +617,20 @@ get_ref_base_and_extent (tree exp, HOST_
       if (maxsize == -1
          && DECL_SIZE (exp)
          && TREE_CODE (DECL_SIZE (exp)) == INTEGER_CST)
-       maxsize = wi::to_offset (DECL_SIZE (exp)) - bit_offset;
+       {
+         maxsize = wi::to_offset (DECL_SIZE (exp)) - bit_offset;
+         /* If we've seen a variable array ref and the above adjusted
+            maxsize to size make sure the caller doesn't mistake this
+            as a non-variable access by adjusting maxsize slightly.
+            ???  This is strictly pessimizing the case where a
+            one element array is accessed with a variable index
+            which should be a rare case in practice but hits legacy
+            fortran code - see PR69368 for example.  */
+         if (seen_variable_array_ref
+             && maxsize == bitsize
+             && DECL_COMMON (exp))
+           maxsize += BITS_PER_UNIT;
+       }
     }
   else if (CONSTANT_CLASS_P (exp))
     {

Reply via email to