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