aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.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/gimple-fold.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/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index c5939f1..55b78fa 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -1378,7 +1378,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind,
/* Fail when the array bound is unknown or zero. */
val = TYPE_SIZE_UNIT (optype);
- if (!val || integer_zerop (val))
+ if (!val
+ || TREE_CODE (val) != INTEGER_CST
+ || integer_zerop (val))
return false;
val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
@@ -1412,7 +1414,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind,
/* Fail when the array bound is unknown or zero. */
val = TYPE_SIZE_UNIT (optype);
- if (!val || integer_zerop (val))
+ if (!val
+ || TREE_CODE (val) != INTEGER_CST
+ || integer_zerop (val))
return false;
val = fold_build2 (MINUS_EXPR, TREE_TYPE (val), val,
integer_one_node);
@@ -1448,7 +1452,9 @@ get_range_strlen_tree (tree arg, bitmap *visited, strlen_range_kind rkind,
/* Fail if the offset is out of bounds. Such accesses
should be diagnosed at some point. */
val = DECL_SIZE_UNIT (ref);
- if (!val || integer_zerop (val))
+ if (!val
+ || TREE_CODE (val) != INTEGER_CST
+ || integer_zerop (val))
return false;
poly_offset_int psiz = wi::to_offset (val);