Selectively trap if ranger and vr-values disagree on range builtins.
authorAldy Hernandez <aldyh@redhat.com>
Thu, 22 Oct 2020 06:39:04 +0000 (08:39 +0200)
committerAldy Hernandez <aldyh@redhat.com>
Thu, 29 Oct 2020 14:40:39 +0000 (15:40 +0100)
commit054d7b9f6f6816a83dcadfdfe2532795cae04ff3
treebe3549bfa69218a49dea3d40d55c1acb40a2b4a2
parent8fe9869083d9835ba5f3a47c61e4ea8f6a8eb9c6
Selectively trap if ranger and vr-values disagree on range builtins.

The UBSAN builtins degrade into PLUS/MINUS/MULT and call
extract_range_from_binary_expr, which as the PR shows, can special
case some symbolics which the ranger doesn't currently handle.

Looking at vr_values::extract_range_builtin(), I see that every single
place where we ask for a range, we bail on non-integers (symbolics,
etc).  That is, with the exception of the UBSAN builtins.

Since this seems to be particular to UBSAN, we could still go with the
original plan of removing the duplicity in ranger vs vr-values, but
leave in the UBSAN builtin handling.  This isn't ideal, as we'd like
to remove all the common code, but I'd be willing to put up with UBSAN
duplication for the time being.

This patch disables the assert on the UBSAN builtins, while still
trapping if any other differences are found between the vr_values and
the ranger versions of builtin range handling.

As a follow-up, once Fedora can test this approach, I'll remove all
the builtin code from extract_range_builtin, with the exception of the
UBSAN stuff (renaming it to extract_range_ubsan_builtin).

Since the builtin code has proven fickle across architectures, I've
tested this with {-m32,-m64,-fsanitize=signed-integer-overflow} on
x86, ppc64le, and aarch64.  I think this should be enough.  If it
isn't, we can revert the patch, and leave the duplicate code until
the next release cycle when hopefully vr_values, evrp, and friends
will all be overhauled.

gcc/ChangeLog:

PR tree-optimization/97505
* vr-values.c (vr_values::extract_range_basic): Enable
trap again for everything except UBSAN builtins.
gcc/vr-values.c