gimple-fold.c (get_range_strlen): Only set *nonstr when an unterminated string is...
authorJeff Law <law@gcc.gnu.org>
Wed, 3 Oct 2018 17:23:15 +0000 (11:23 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 3 Oct 2018 17:23:15 +0000 (11:23 -0600)
* gimple-fold.c (get_range_strlen): Only set *nonstr when
an unterminated string is discovered.  Bubble up range
even for unterminated strings.
(gimple_fold_builtin_strlen): Do not fold if get_range_strlen
indicates the string was not terminated via NONSTR.

From-SVN: r264816

gcc/ChangeLog
gcc/gimple-fold.c

index 6acb077b35758cf17d7e1bfd6a28e50614ed0831..aa10aa07269f984b325f119375f6c5e7ec9ba3ae 100644 (file)
@@ -1,4 +1,12 @@
-2018-10-3  Aldy Hernandez  <aldyh@redhat.com>
+2018-10-02  Jeff Law  <law@redhat.com>
+
+       * gimple-fold.c (get_range_strlen): Only set *nonstr when
+       an unterminated string is discovered.  Bubble up range
+       even for unterminated strings.
+       (gimple_fold_builtin_strlen): Do not fold if get_range_strlen
+       indicates the string was not terminated via NONSTR.
+
+2018-10-03  Aldy Hernandez  <aldyh@redhat.com>
 
        * tree-vrp.c (extract_range_from_unary_expr): Special case all
        pointer conversions.
index fa1fc60876c06d3d857e83e7fb9dbc61fd22935c..fe6bc08bdd986e27002a050438eeea43b7dda430 100644 (file)
@@ -1344,8 +1344,13 @@ get_range_strlen (tree arg, tree length[2], bitmap *visited, int type,
 
          /* If we potentially had a non-terminated string, then
             bubble that information up to the caller.  */
-         if (!val)
-           *nonstr = data.decl;
+         if (!val && data.decl)
+           {
+             *nonstr = data.decl;
+             *minlen = data.len;
+             *maxlen = data.len;
+             return type == 0 ? false : true;
+           }
        }
 
       if (!val && fuzzy)
@@ -3596,6 +3601,7 @@ gimple_fold_builtin_strlen (gimple_stmt_iterator *gsi)
   tree nonstr;
   tree lenrange[2];
   if (!get_range_strlen (arg, lenrange, 1, true, &nonstr)
+      && !nonstr
       && lenrange[0] && TREE_CODE (lenrange[0]) == INTEGER_CST
       && lenrange[1] && TREE_CODE (lenrange[1]) == INTEGER_CST)
     {