From: Jeff Law Date: Tue, 20 Feb 2018 18:59:22 +0000 (-0700) Subject: re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e506dc87a0d7d0f55a6b727885e170dcc2948014;p=gcc.git re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars) PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c (format_integer): Query EVRP range analyzer for range data rather than using global data. * gcc.dg/pr81592.c: New test. * gcc.dg/pr82123.c: New test. From-SVN: r257857 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 161c9aa5051..77d0dc3a3de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,8 @@ PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 + * gimple-ssa-sprintf.c (format_integer): Query EVRP range analyzer + for range data rather than using global data. * gimple-ssa-sprintf.c (get_int_range): Query EVRP range analyzer for range data rather than using global data. * gimple-ssa-sprintf.c (get_int_range): Accept vr_values parameter diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index b3ffaec3ba6..1189d9fea35 100644 --- a/gcc/gimple-ssa-sprintf.c +++ b/gcc/gimple-ssa-sprintf.c @@ -1451,12 +1451,13 @@ format_integer (const directive &dir, tree arg, vr_values *vr_values) { /* Try to determine the range of values of the integer argument (range information is not available for pointers). */ - wide_int min, max; - enum value_range_type range_type = get_range_info (arg, &min, &max); - if (range_type == VR_RANGE) + value_range *vr = vr_values->get_value_range (arg); + if (vr->type == VR_RANGE + && TREE_CODE (vr->min) == INTEGER_CST + && TREE_CODE (vr->max) == INTEGER_CST) { - argmin = wide_int_to_tree (argtype, min); - argmax = wide_int_to_tree (argtype, max); + argmin = vr->min; + argmax = vr->max; /* Set KNOWNRANGE if the argument is in a known subrange of the directive's type and neither width nor precision @@ -1469,11 +1470,12 @@ format_integer (const directive &dir, tree arg, vr_values *vr_values) res.argmin = argmin; res.argmax = argmax; } - else if (range_type == VR_ANTI_RANGE) + else if (vr->type == VR_ANTI_RANGE) { /* Handle anti-ranges if/when bug 71690 is resolved. */ } - else if (range_type == VR_VARYING) + else if (vr->type == VR_VARYING + || vr->type == VR_UNDEFINED) { /* The argument here may be the result of promoting the actual argument to int. Try to determine the type of the actual diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6351dd56db7..035e48d16c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -9,6 +9,8 @@ PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 + * gcc.dg/pr81592.c: New test. + * gcc.dg/pr82123.c: New test. * gcc.dg/builtin-unreachable-6.c: Turn off VRP. 2018-02-20 Jakub Jelinek diff --git a/gcc/testsuite/gcc.dg/pr81592.c b/gcc/testsuite/gcc.dg/pr81592.c new file mode 100644 index 00000000000..a37703af497 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr81592.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall -fno-strict-overflow -Wstrict-overflow=2 -fsanitize=signed-integer-overflow" } */ + +#include + +int proc_keys_show(long expiry, long now) +{ + unsigned long timo; + char xbuf[4]; + + if (now < expiry) { + timo = expiry - now; + if (timo < 60) + sprintf(xbuf, "%lus", timo); + } + + return 0; +} + + diff --git a/gcc/testsuite/gcc.dg/pr82123.c b/gcc/testsuite/gcc.dg/pr82123.c new file mode 100644 index 00000000000..34109f1aec4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr82123.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wformat-overflow=1" } */ + +void acpi_gpiochip_request_interrupt(unsigned short s) +{ + char name[3]; + unsigned int pin = s; + + if (pin <= 255) + __builtin_sprintf(name, "%02X", pin); +} +