[r11-3641 Regression] FAIL: gcc.dg/torture/pta-ptrarith-1.c -Os scan-tree-dump alias "ESCAPED = {[^\n}]* i f [^\n}]*}" on Linux/x86_64 (-m32 -march=cascadelake)

Jan Hubicka hubicka@ucw.cz
Thu Oct 8 08:21:47 GMT 2020


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

gcc/ChangeLog:

2020-10-08  Jan Hubicka  <hubicka@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++;


More information about the Gcc-regression mailing list