Hi,
this is fix I am testing (it solved the testcase)

gcc/ChangeLog:

2020-10-08  Jan Hubicka  <hubi...@ucw.cz>

        * ipa-modref.c (get_access): Fix handling of offsets.
        * tree-ssa-alias.c (modref_may_conflict): Watch for overflows.

diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index a5fa33a35de..5868aa97484 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -318,8 +318,7 @@ get_access (ao_ref *ref)
                          0, -1, false};
   if (TREE_CODE (base) == MEM_REF || TREE_CODE (base) == TARGET_MEM_REF)
     {
-      tree offset = TREE_CODE (base) == MEM_REF
-                   ? TREE_OPERAND (base, 1) : NULL_TREE;
+      tree memref = base;
       base = TREE_OPERAND (base, 0);
       if (TREE_CODE (base) == SSA_NAME
          && SSA_NAME_IS_DEFAULT_DEF (base)
@@ -336,8 +335,14 @@ get_access (ao_ref *ref)
                }
              a.parm_index++;
            }
-         a.parm_offset_known
-           = offset && wi::to_poly_offset (offset).to_shwi (&a.parm_offset);
+         if (TREE_CODE (memref) == MEM_REF)
+           {
+             a.parm_offset_known
+                = wi::to_poly_wide (TREE_OPERAND
+                                        (memref, 1)).to_shwi (&a.parm_offset);
+           }
+         else
+           a.parm_offset_known = false;
        }
       else
        a.parm_index = -1;
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 97dc4ac8814..d885f7157c5 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -2542,16 +2542,22 @@ modref_may_conflict (const gimple *stmt,
              else
                {
                  ao_ref ref2;
-
-                 ao_ref_init_from_ptr_and_range
-                        (&ref2, arg, true,
-                         access_node->offset
-                         + (access_node->parm_offset
-                            << LOG2_BITS_PER_UNIT), access_node->size,
-                         access_node->max_size);
-                 ref2.ref_alias_set = ref_set;
-                 ref2.base_alias_set = base_set;
-                 if (refs_may_alias_p_1 (&ref2, ref, tbaa_p))
+                 poly_offset_int off = (poly_offset_int)access_node->offset
+                       + ((poly_offset_int)access_node->parm_offset
+                          << LOG2_BITS_PER_UNIT);
+                 poly_int64 off2;
+                 if (off.to_shwi (&off2))
+                   {
+                     ao_ref_init_from_ptr_and_range
+                            (&ref2, arg, true, off2,
+                             access_node->size,
+                             access_node->max_size);
+                     ref2.ref_alias_set = ref_set;
+                     ref2.base_alias_set = base_set;
+                     if (refs_may_alias_p_1 (&ref2, ref, tbaa_p))
+                       return true;
+                   }
+                 else if (ptr_deref_may_alias_ref_p_1 (arg, ref))
                    return true;
                }
              num_tests++;

Reply via email to