summaryrefslogtreecommitdiff
path: root/gcc/gimple-ssa-sprintf.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-11-30 08:01:47 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-11-30 08:01:47 +0000
commit57330dbd2c33ec58bae292c4d0b9f7ed4012d0d7 (patch)
tree32e6db300320c3e02dd024fac38653a3c9a6b981 /gcc/gimple-ssa-sprintf.c
parent526134f1ce85daadcd162127791b61922ffd6d4c (diff)
downloadgcc-57330dbd2c33ec58bae292c4d0b9f7ed4012d0d7.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@242998 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimple-ssa-sprintf.c')
-rw-r--r--gcc/gimple-ssa-sprintf.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index 732bc42a767..99a635a77fb 100644
--- a/gcc/gimple-ssa-sprintf.c
+++ b/gcc/gimple-ssa-sprintf.c
@@ -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;
}