This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PR55547] fix alias regression on alpha on misaligned symbols


On 01/15/2013 08:29 PM, Alexandre Oliva wrote:
    if (rtx_equal_for_memref_p (x, y))
      {
-      if (xsize <= 0 || ysize <= 0)
+      if (xsize == 0 || ysize == 0)
  	return 1;
-      if (c >= 0 && xsize > c)
+      if (c >= 0 && abs (xsize) - c > 0)
  	return 1;
-      if (c < 0 && ysize+c > 0)
+      if (c < 0 && abs (ysize) + c > 0)
  	return 1;
        return 0;
      }
@@ -2063,7 +2063,8 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
  	  y0 = canon_rtx (XEXP (y, 0));
  	  if (rtx_equal_for_memref_p (x0, y0))
  	    return (xsize == 0 || ysize == 0
-		    || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+		    || (c >= 0 && abs (xsize) - c > 0)
+		    || (c < 0 && abs (ysize) + c > 0));

  	  /* Can't properly adjust our sizes.  */
  	  if (!CONST_INT_P (x1))
@@ -2119,8 +2120,9 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c)
        if (CONST_INT_P (x) && CONST_INT_P (y))
  	{
  	  c += (INTVAL (y) - INTVAL (x));
-	  return (xsize <= 0 || ysize <= 0
-		  || (c >= 0 && xsize > c) || (c < 0 && ysize+c > 0));
+	  return (xsize == 0 || ysize == 0
+		  || (c >= 0 && abs (xsize) - c > 0)
+		  || (c < 0 && abs (ysize) + c > 0));
  	}

I notice that these expressions (including the first hunk that uses ifs) are now all the same. It would seem extremely prudent to pull this out to a function so that they stay the same.


That said, I question the change of <= to == 0. If negative, we don't know how much overlap there is as far as I can see.



if (GET_CODE (x) == CONST) @@ -2139,7 +2141,8 @@ memrefs_conflict_p (int xsize, rtx x, int ysize, rtx y, HOST_WIDE_INT c) if (CONSTANT_P (y)) return (xsize <= 0 || ysize <= 0 || (rtx_equal_for_memref_p (x, y) - && ((c >= 0 && xsize > c) || (c < 0 && ysize+c > 0)))); + && ((c >= 0 && abs (xsize) - c > 0) + || (c < 0 && abs (ysize) + c > 0))));

This hunk is not needed, as we begin by eliminating <= 0. So the abs is certain to do nothing.



r~



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]