From 91ae6930ed4a87d7b8e25e10378388b3f0dc1729 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Thu, 8 Oct 2020 11:33:30 +0200 Subject: [PATCH] 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. --- gcc/range-op.cc | 9 +++++++++ gcc/testsuite/gcc.dg/pr97315-2.c | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr97315-2.c diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 87c6d82..22bc23c 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 0000000..5dd1b6a --- /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); +} -- 2.7.4