From: Aldy Hernandez Date: Thu, 8 Oct 2020 09:33:30 +0000 (+0200) Subject: Fix PR97315 (part 2 of 2) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=91ae6930ed4a87d7b8e25e10378388b3f0dc1729;p=gcc.git Fix PR97315 (part 2 of 2) gcc/ChangeLog: PR tree-optimization/97315 * range-op.cc (value_range_with_overflow): Change any non-overflow calculation in which both bounds are overflow/underflow to be undefined. gcc/testsuite/ChangeLog: * gcc.dg/pr97315-2.c: New test. --- diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 87c6d82f2ac..22bc23c1bbf 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -287,6 +287,15 @@ value_range_with_overflow (irange &r, tree type, } else { + // If both bounds either underflowed or overflowed, then the result + // is undefined. + if ((min_ovf == wi::OVF_OVERFLOW && max_ovf == wi::OVF_OVERFLOW) + || (min_ovf == wi::OVF_UNDERFLOW && max_ovf == wi::OVF_UNDERFLOW)) + { + r.set_undefined (); + return; + } + // If overflow does not wrap, saturate to [MIN, MAX]. wide_int new_lb, new_ub; if (min_ovf == wi::OVF_UNDERFLOW) diff --git a/gcc/testsuite/gcc.dg/pr97315-2.c b/gcc/testsuite/gcc.dg/pr97315-2.c new file mode 100644 index 00000000000..5dd1b6a3fc7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97315-2.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void c(int); + +int a; +void b() +{ + if (a >= 2147483647) + c(a + 1); +}