Fix handling of parm_offset in ipa-modref on 32bit targets.
authorJan Hubicka <jh@suse.cz>
Thu, 8 Oct 2020 12:13:54 +0000 (14:13 +0200)
committerJan Hubicka <jh@suse.cz>
Thu, 8 Oct 2020 12:13:54 +0000 (14:13 +0200)
* ipa-modref.c (get_access): Fix handling of offsets.
* tree-ssa-alias.c (modref_may_conflict): Watch for overflows.

gcc/ipa-modref.c
gcc/tree-ssa-alias.c

index a5fa33a35de04152474ab9317eed42184ea25ad7..5868aa97484d31c902f62423eca4d62280773c50 100644 (file)
@@ -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;
index d85f378a8ae0c2a4658a343ad283340d48ccf9e0..97255987e79bca2ca5afaa39a618de286f69d5ad 100644 (file)
@@ -2546,16 +2546,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++;