diff options
author | Martin Sebor <msebor@redhat.com> | 2020-03-25 09:39:50 -0600 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2020-03-25 09:39:50 -0600 |
commit | 05c13c439903eb78f109bcab62fd9a74f03a3c9b (patch) | |
tree | 96a1286aa6c51248a3e3c702fbaa3bba67522500 /gcc/tree-ssa-strlen.c | |
parent | 0fca105f8ca95747fad3d3315e642ea9dc6936e0 (diff) | |
download | gcc-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.c | 14 |
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); |