re PR tree-optimization/79327 (wrong code at -O2 and -fprintf-return-value)
authorJakub Jelinek <jakub@redhat.com>
Fri, 17 Feb 2017 18:31:01 +0000 (19:31 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 17 Feb 2017 18:31:01 +0000 (19:31 +0100)
PR tree-optimization/79327
* gimple-ssa-sprintf.c (format_integer): Remove likely_adjust
variable, its initialization and use.

From-SVN: r245542

gcc/ChangeLog
gcc/gimple-ssa-sprintf.c

index 10eda1e4cff44a8d602f1aff08f541cc070566a7..b51b5d69ae980821d42509fb80197d8465b96dd1 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/79327
+       * gimple-ssa-sprintf.c (format_integer): Remove likely_adjust
+       variable, its initialization and use.
+
 2017-02-17  Julia Koval  <julia.koval@intel.com>
 
        * common/config/i386/i386-common.c (OPTION_MASK_ISA_RDPID_SET): New.
index a5fc3ffd725da1d14a05441deeb325264ec8067a..7688439aab70d299708ad656af02dbbc9fda2b23 100644 (file)
@@ -1232,10 +1232,6 @@ format_integer (const directive &dir, tree arg)
        of the format string by returning [-1, -1].  */
     return fmtresult ();
 
-  /* True if the LIKELY counter should be adjusted upward from the MIN
-     counter to account for arguments with unknown values.  */
-  bool likely_adjust = false;
-
   fmtresult res;
 
   /* Using either the range the non-constant argument is in, or its
@@ -1265,14 +1261,6 @@ format_integer (const directive &dir, tree arg)
 
          res.argmin = argmin;
          res.argmax = argmax;
-
-         /* Set the adjustment for an argument whose range includes
-            zero since that doesn't include the octal or hexadecimal
-            base prefix.  */
-         wide_int wzero = wi::zero (wi::get_precision (min));
-         if (wi::le_p (min, wzero, SIGNED)
-             && !wi::neg_p (max))
-           likely_adjust = true;
        }
       else if (range_type == VR_ANTI_RANGE)
        {
@@ -1307,11 +1295,6 @@ format_integer (const directive &dir, tree arg)
 
   if (!argmin)
     {
-      /* Set the adjustment for an argument whose range includes
-        zero since that doesn't include the octal or hexadecimal
-        base prefix.  */
-      likely_adjust = true;
-
       if (TREE_CODE (argtype) == POINTER_TYPE)
        {
          argmin = build_int_cst (pointer_sized_int_node, 0);
@@ -1364,14 +1347,20 @@ format_integer (const directive &dir, tree arg)
       res.range.max = MAX (max1, max2);
     }
 
-  /* Add the adjustment for an argument whose range includes zero
-     since it doesn't include the octal or hexadecimal base prefix.  */
+  /* If the range is known, use the maximum as the likely length.  */
   if (res.knownrange)
     res.range.likely = res.range.max;
   else
     {
+      /* Otherwise, use the minimum.  Except for the case where for %#x or
+         %#o the minimum is just for a single value in the range (0) and
+         for all other values it is something longer, like 0x1 or 01.
+         Use the length for value 1 in that case instead as the likely
+         length.  */
       res.range.likely = res.range.min;
-      if (likely_adjust && maybebase && base != 10)
+      if (maybebase
+         && base != 10
+         && (tree_int_cst_sgn (argmin) < 0 || tree_int_cst_sgn (argmax) > 0))
        {
          if (res.range.min == 1)
            res.range.likely += base == 8 ? 1 : 2;