gimple-fold.c (get_range_strlen): Only set *nonstr when an unterminated string is discovered.

* 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
This commit is contained in:
Jeff Law 2018-10-03 11:23:15 -06:00
parent 2e103ae213
commit 78125561e3
2 changed files with 17 additions and 3 deletions

View 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.

View 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)
{