@@ -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.
@@ -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)
{