aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2018-07-27 17:06:44 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2018-07-27 11:06:44 -0600
commite4bbeea27ee88bca0261978ad389f2aff9a6b7fb (patch)
treef125c9ab7545a42ce51f366b544cb0f0564585c2 /gcc/tree-ssa-strlen.c
parent254c23d3f40c2832670c90de179630e903755252 (diff)
downloadgcc-e4bbeea27ee88bca0261978ad389f2aff9a6b7fb.zip
gcc-e4bbeea27ee88bca0261978ad389f2aff9a6b7fb.tar.gz
gcc-e4bbeea27ee88bca0261978ad389f2aff9a6b7fb.tar.bz2
PR tree-optimization/86696 - ICE in handle_char_store at gcc/tree-ssa-strlen.c:3332
gcc/ChangeLog: PR tree-optimization/86696 * tree-ssa-strlen.c (get_min_string_length): Handle all integer types, including enums. (handle_char_store): Be prepared for the above function to fail. gcc/testsuite/ChangeLog: PR tree-optimization/86696 * gcc.dg/pr86696.C: New test. From-SVN: r263032
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index eca88a5..1eaa9c5 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -3150,7 +3150,7 @@ handle_pointer_plus (gimple_stmt_iterator *gsi)
static HOST_WIDE_INT
get_min_string_length (tree rhs, bool *full_string_p)
{
- if (TREE_CODE (TREE_TYPE (rhs)) == INTEGER_TYPE)
+ if (INTEGRAL_TYPE_P (TREE_TYPE (rhs)))
{
if (tree_expr_nonzero_p (rhs))
{
@@ -3315,9 +3315,16 @@ handle_char_store (gimple_stmt_iterator *gsi)
Otherwise, we're storing an unknown value at offset OFFSET,
so need to clip the nonzero_chars to OFFSET. */
bool full_string_p = storing_all_zeros_p;
- HOST_WIDE_INT len = (storing_nonzero_p
- ? get_min_string_length (rhs, &full_string_p)
- : 1);
+ HOST_WIDE_INT len = 1;
+ if (storing_nonzero_p)
+ {
+ /* Try to get the minimum length of the string (or
+ individual character) being stored. If it fails,
+ STORING_NONZERO_P guarantees it's at least 1. */
+ len = get_min_string_length (rhs, &full_string_p);
+ if (len < 0)
+ len = 1;
+ }
location_t loc = gimple_location (stmt);
tree oldlen = si->nonzero_chars;