Hi!

This PR is about ubsan error on the c - cx1 + cy1 evaluation in the first
hunk.

The following patch hopefully fixes that by doing the additions/subtractions
in poly_uint64 rather than poly_int64.  Or shall we instead perform it in
offset_int and watch for overflows and punt somehow for those?

Or shall we just treat this way only the first case where it is
adding/subtracting 3 numbers and not just 2, so there is at least a chance
the overflow is just temporary?

Bootstrapped/regtested on x86_64-linux and i686-linux (but just normal
bootstrap, not ubsan one), ok for trunk?

2025-02-26  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/118819
        * alias.cc (memrefs_conflict_p): Perform arithmetics on c in
        poly_uint64 type rather than poly_int64 to avoid compile time
        UB.

--- gcc/alias.cc.jj     2025-01-02 11:23:24.000000000 +0100
+++ gcc/alias.cc        2025-02-25 12:43:16.655507666 +0100
@@ -2537,12 +2537,14 @@ memrefs_conflict_p (poly_int64 xsize, rt
            {
              if (poly_int_rtx_p (y1, &cy1))
                return memrefs_conflict_p (xsize, x0, ysize, y0,
-                                          c - cx1 + cy1);
+                                          (poly_uint64) c - cx1 + cy1);
              else
-               return memrefs_conflict_p (xsize, x0, ysize, y, c - cx1);
+               return memrefs_conflict_p (xsize, x0, ysize, y,
+                                          (poly_uint64) c - cx1);
            }
          else if (poly_int_rtx_p (y1, &cy1))
-           return memrefs_conflict_p (xsize, x, ysize, y0, c + cy1);
+           return memrefs_conflict_p (xsize, x, ysize, y0,
+                                      (poly_uint64) c + cy1);
 
          return -1;
        }
@@ -2563,7 +2565,8 @@ memrefs_conflict_p (poly_int64 xsize, rt
 
       poly_int64 cy1;
       if (poly_int_rtx_p (y1, &cy1))
-       return memrefs_conflict_p (xsize, x, ysize, y0, c + cy1);
+       return memrefs_conflict_p (xsize, x, ysize, y0,
+                                  (poly_uint64) c + cy1);
       else
        return -1;
     }
@@ -2643,7 +2646,7 @@ memrefs_conflict_p (poly_int64 xsize, rt
       poly_int64 cx, cy;
       if (poly_int_rtx_p (x, &cx) && poly_int_rtx_p (y, &cy))
        {
-         c += cy - cx;
+         c += (poly_uint64) cy - cx;
          return offset_overlap_p (c, xsize, ysize);
        }
 

        Jakub

Reply via email to