On Thu, Aug 20, 2026 at 10:32 AM Andrea Pinski <[email protected]> wrote: > > On Thu, Aug 20, 2026 at 4:57 AM <[email protected]> wrote: > > > > From: Kyrylo Tkachov <[email protected]> > > > > UBSan instruments signed integral vector arithmetic. However, > > TYPE_OVERFLOW_SANITIZED only accepts scalar integral types. Folding can use > > the false result to remove a vector operation before UBSan instruments it. > > For example: > > > > typedef int v4si __attribute__ ((vector_size (16))); > > > > v4si f (v4si x) { return -(-x); } > > > > Both negations can overflow. The scalar-only predicate lets fold-const > > reduce > > the function to x and remove both diagnostics. > > > > aarch64 -O2 -fsanitize=signed-integer-overflow > > -fsanitize-trap=signed-integer-overflow before: > > > > f: > > ret > > > > After: > > > > f: > > fmov w0, s0 > > negs w0, w0 > > bvs .L27 > > ... > > neg v31.4s, v0.4s > > fmov w0, s31 > > negs w0, w0 > > bvs .L27 > > ... > > ret > > .L27: > > brk #1000 > > > > Use ANY_INTEGRAL_TYPE_P so the predicate also accepts integral vector types. > > The test checks that both vector negations remain for UBSan instrumentation. > > > > Bootstrapped and tested on aarch64-none-linux-gnu and x86_64-pc-linux-gnu. > > Ok for trunk? > > Ok.
I think this might the step forward in fixing https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88109 too. > > > Thanks, > > Kyrill > > > > gcc/ChangeLog: > > > > * tree.h (TYPE_OVERFLOW_SANITIZED): Use ANY_INTEGRAL_TYPE_P. > > > > gcc/testsuite/ChangeLog: > > > > * c-c++-common/ubsan/overflow-vec-3.c: New test. > > > > Signed-off-by: Kyrylo Tkachov <[email protected]> > > --- > > gcc/testsuite/c-c++-common/ubsan/overflow-vec-3.c | 12 ++++++++++++ > > gcc/tree.h | 2 +- > > 2 files changed, 13 insertions(+), 1 deletion(-) > > create mode 100644 gcc/testsuite/c-c++-common/ubsan/overflow-vec-3.c > > > > diff --git a/gcc/testsuite/c-c++-common/ubsan/overflow-vec-3.c > > b/gcc/testsuite/c-c++-common/ubsan/overflow-vec-3.c > > new file mode 100644 > > index 00000000000..56b00e81a76 > > --- /dev/null > > +++ b/gcc/testsuite/c-c++-common/ubsan/overflow-vec-3.c > > @@ -0,0 +1,12 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O2 -Wno-psabi -fsanitize=signed-integer-overflow > > -fdump-tree-ubsan" } */ > > + > > +typedef int v4si __attribute__ ((vector_size (4 * sizeof (int)))); > > + > > +v4si > > +f (v4si x) > > +{ > > + return -(-x); > > +} > > + > > +/* { dg-final { scan-tree-dump-times "\\.UBSAN_CHECK_SUB" 2 "ubsan" } } */ > > diff --git a/gcc/tree.h b/gcc/tree.h > > index e079082a81a..6e1bea14406 100644 > > --- a/gcc/tree.h > > +++ b/gcc/tree.h > > @@ -1005,7 +1005,7 @@ extern void omp_clause_range_check_failed > > (const_tree, const char *, int, > > > > /* True if an overflow is to be preserved for sanitization. */ > > #define TYPE_OVERFLOW_SANITIZED(TYPE) \ > > - (INTEGRAL_TYPE_P (TYPE) \ > > + (ANY_INTEGRAL_TYPE_P (TYPE) \ > > && !TYPE_OVERFLOW_WRAPS (TYPE) \ > > && (flag_sanitize & SANITIZE_SI_OVERFLOW)) > > > > -- > > 2.50.1 (Apple Git-155) > >
