https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98255
--- Comment #7 from Martin Jambor <jamborm at gcc dot gnu.org> ---
Even our constant folding thinks the unsigned expression wraps around.  If I
tell SRA to fold the expression if the base is a string_cst, the invalid
dereference is avoided.  My experiment was (I am not proposing this, but it
illustrates the point):

diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index d177f1ba11c..d33c0ab63f7 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -99,6 +99,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "dbgcnt.h"
 #include "builtins.h"
 #include "tree-sra.h"
+#include "gimple-fold.h"


 /* Enumeration of all aggregate reductions we can do.  */
@@ -1696,6 +1697,14 @@ build_ref_for_model (location_t loc, tree base,
HOST_WIDE_INT offset,
   else
     { 
       tree res;
+      if (TREE_CODE (base) == STRING_CST)
+       {
+         res = build_ref_for_offset (loc, base, offset, model->reverse,
+                                     model->type, gsi, insert_after);
+         res = fold_const_aggregate_ref (res);
+         return res;
+       }
+      
       if (model->grp_same_access_path
          && !TREE_THIS_VOLATILE (base)
          && (TYPE_ADDR_SPACE (TREE_TYPE (base))

Reply via email to