diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-11-30 08:01:47 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-11-30 08:01:47 +0000 |
commit | 57330dbd2c33ec58bae292c4d0b9f7ed4012d0d7 (patch) | |
tree | 32e6db300320c3e02dd024fac38653a3c9a6b981 /gcc/gimple-ssa-sprintf.c | |
parent | 526134f1ce85daadcd162127791b61922ffd6d4c (diff) | |
download | gcc-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.c | 31 |
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; } |