Commit 053d5e0c by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/78586 (Wrong code caused by printf-return-value)

	PR tree-optimization/78586
	* gimple-ssa-sprintf.c (format_integer): Use TYPE_MAX_VALUE or
	TYPE_MIN_VALUE or build_all_ones_cst instead of folding LSHIFT_EXPR.
	Don't build_int_cst min/max twice.  Formatting fix.

	* gcc.c-torture/execute/pr78586.c: New test.

From-SVN: r242998
parent ced17de6
2016-11-30 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/78586
* gimple-ssa-sprintf.c (format_integer): Use TYPE_MAX_VALUE or
TYPE_MIN_VALUE or build_all_ones_cst instead of folding LSHIFT_EXPR.
Don't build_int_cst min/max twice. Formatting fix.
2016-11-30 Markus Trippelsdorf <markus@trippelsdorf.de> 2016-11-30 Markus Trippelsdorf <markus@trippelsdorf.de>
PR rtl-optimization/78588 PR rtl-optimization/78588
...@@ -995,7 +995,8 @@ format_integer (const conversion_spec &spec, tree arg) ...@@ -995,7 +995,8 @@ format_integer (const conversion_spec &spec, tree arg)
tree argmin = NULL_TREE; tree argmin = NULL_TREE;
tree argmax = NULL_TREE; tree argmax = NULL_TREE;
if (arg && TREE_CODE (arg) == SSA_NAME if (arg
&& TREE_CODE (arg) == SSA_NAME
&& TREE_CODE (argtype) == INTEGER_TYPE) && TREE_CODE (argtype) == INTEGER_TYPE)
{ {
/* Try to determine the range of values of the integer argument /* Try to determine the range of values of the integer argument
...@@ -1017,12 +1018,8 @@ format_integer (const conversion_spec &spec, tree arg) ...@@ -1017,12 +1018,8 @@ format_integer (const conversion_spec &spec, tree arg)
the upper bound for %i but -3 for %u. */ the upper bound for %i but -3 for %u. */
if (wi::neg_p (min) && !wi::neg_p (max)) if (wi::neg_p (min) && !wi::neg_p (max))
{ {
argmin = build_int_cst (argtype, wi::fits_uhwi_p (min) argmin = res.argmin;
? min.to_uhwi () : min.to_shwi ()); argmax = res.argmax;
argmax = build_int_cst (argtype, wi::fits_uhwi_p (max)
? max.to_uhwi () : max.to_shwi ());
int minbytes = format_integer (spec, res.argmin).range.min; int minbytes = format_integer (spec, res.argmin).range.min;
int maxbytes = format_integer (spec, res.argmax).range.max; int maxbytes = format_integer (spec, res.argmax).range.max;
if (maxbytes < minbytes) if (maxbytes < minbytes)
...@@ -1081,21 +1078,25 @@ format_integer (const conversion_spec &spec, tree arg) ...@@ -1081,21 +1078,25 @@ format_integer (const conversion_spec &spec, tree arg)
int typeprec = TYPE_PRECISION (dirtype); int typeprec = TYPE_PRECISION (dirtype);
int argprec = TYPE_PRECISION (argtype); int argprec = TYPE_PRECISION (argtype);
if (argprec < typeprec || POINTER_TYPE_P (argtype)) if (argprec < typeprec)
{ {
if (TYPE_UNSIGNED (argtype)) if (POINTER_TYPE_P (argtype))
argmax = build_all_ones_cst (argtype); argmax = build_all_ones_cst (argtype);
else if (TYPE_UNSIGNED (argtype))
argmax = TYPE_MAX_VALUE (argtype);
else else
argmax = fold_build2 (LSHIFT_EXPR, argtype, integer_one_node, argmax = TYPE_MIN_VALUE (argtype);
build_int_cst (integer_type_node,
argprec - 1));
} }
else else
{ {
argmax = fold_build2 (LSHIFT_EXPR, dirtype, integer_one_node, if (POINTER_TYPE_P (dirtype))
build_int_cst (integer_type_node, argmax = build_all_ones_cst (dirtype);
typeprec - 1)); else if (TYPE_UNSIGNED (dirtype))
argmax = TYPE_MAX_VALUE (dirtype);
else
argmax = TYPE_MIN_VALUE (dirtype);
} }
res.argmin = argmin; res.argmin = argmin;
res.argmax = argmax; res.argmax = argmax;
} }
......
2016-11-30 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/78586
* gcc.c-torture/execute/pr78586.c: New test.
2016-11-30 Janus Weil <janus@gcc.gnu.org> 2016-11-30 Janus Weil <janus@gcc.gnu.org>
PR fortran/78573 PR fortran/78573
......
/* PR tree-optimization/78586 */
void
foo (unsigned long x)
{
char a[30];
unsigned long b = __builtin_sprintf (a, "%lu", x);
if (b != 4)
__builtin_abort ();
}
int
main ()
{
foo (1000);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment