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
This commit is contained in:
Jeff Law 2018-02-20 11:59:22 -07:00 committed by Jeff Law
parent 04946c6b90
commit e506dc87a0
5 changed files with 45 additions and 7 deletions

View File

@ -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

View File

@ -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

View File

@ -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 <jakub@redhat.com>

View File

@ -0,0 +1,20 @@
/* { dg-do compile } */
/* { dg-options "-O2 -Wall -fno-strict-overflow -Wstrict-overflow=2 -fsanitize=signed-integer-overflow" } */
#include <stdio.h>
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;
}

View File

@ -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);
}