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>
PR rtl-optimization/78588
......@@ -995,7 +995,8 @@ format_integer (const conversion_spec &spec, tree arg)
tree argmin = 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)
{
/* Try to determine the range of values of the integer argument
......@@ -1017,12 +1018,8 @@ format_integer (const conversion_spec &spec, tree arg)
the upper bound for %i but -3 for %u. */
if (wi::neg_p (min) && !wi::neg_p (max))
{
argmin = build_int_cst (argtype, wi::fits_uhwi_p (min)
? min.to_uhwi () : min.to_shwi ());
argmax = build_int_cst (argtype, wi::fits_uhwi_p (max)
? max.to_uhwi () : max.to_shwi ());
argmin = res.argmin;
argmax = res.argmax;
int minbytes = format_integer (spec, res.argmin).range.min;
int maxbytes = format_integer (spec, res.argmax).range.max;
if (maxbytes < minbytes)
......@@ -1081,21 +1078,25 @@ format_integer (const conversion_spec &spec, tree arg)
int typeprec = TYPE_PRECISION (dirtype);
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);
else if (TYPE_UNSIGNED (argtype))
argmax = TYPE_MAX_VALUE (argtype);
else
argmax = fold_build2 (LSHIFT_EXPR, argtype, integer_one_node,
build_int_cst (integer_type_node,
argprec - 1));
argmax = TYPE_MIN_VALUE (argtype);
}
else
{
argmax = fold_build2 (LSHIFT_EXPR, dirtype, integer_one_node,
build_int_cst (integer_type_node,
typeprec - 1));
if (POINTER_TYPE_P (dirtype))
argmax = build_all_ones_cst (dirtype);
else if (TYPE_UNSIGNED (dirtype))
argmax = TYPE_MAX_VALUE (dirtype);
else
argmax = TYPE_MIN_VALUE (dirtype);
}
res.argmin = argmin;
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>
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