aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2020-03-25 09:39:50 -0600
committerJeff Law <law@redhat.com>2020-03-25 09:39:50 -0600
commit05c13c439903eb78f109bcab62fd9a74f03a3c9b (patch)
tree96a1286aa6c51248a3e3c702fbaa3bba67522500 /gcc/tree-ssa-strlen.c
parent0fca105f8ca95747fad3d3315e642ea9dc6936e0 (diff)
downloadgcc-05c13c439903eb78f109bcab62fd9a74f03a3c9b.zip
gcc-05c13c439903eb78f109bcab62fd9a74f03a3c9b.tar.gz
gcc-05c13c439903eb78f109bcab62fd9a74f03a3c9b.tar.bz2
PR tree-optimization/94131 - ICE on printf with a VLA string and -fno-tree-ccp
gcc/testsuite/ChangeLog: PR tree-optimization/94131 * gcc.dg/pr94131.c: New test. gcc/ChangeLog: PR tree-optimization/94131 * gimple-fold.c (get_range_strlen_tree): Fail for variable-length types and decls. * tree-ssa-strlen.c (get_range_strlen_dynamic): Avoid assuming types have constant sizes.
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 6dd37fb..93d095e 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -1140,10 +1140,16 @@ get_range_strlen_dynamic (tree src, c_strlen_data *pdata, bitmap *visited,
{
tree basetype = TREE_TYPE (base);
tree size = TYPE_SIZE_UNIT (basetype);
- ++off; /* Increment for the terminating nul. */
- pdata->maxlen = fold_build2 (MINUS_EXPR, size_type_node, size,
- build_int_cst (size_type_node, off));
- pdata->maxbound = pdata->maxlen;
+ if (TREE_CODE (size) == INTEGER_CST)
+ {
+ ++off; /* Increment for the terminating nul. */
+ tree toffset = build_int_cst (size_type_node, off);
+ pdata->maxlen = fold_build2 (MINUS_EXPR, size_type_node, size,
+ toffset);
+ pdata->maxbound = pdata->maxlen;
+ }
+ else
+ pdata->maxlen = build_all_ones_cst (size_type_node);
}
else
pdata->maxlen = build_all_ones_cst (size_type_node);