diff options
author | Martin Sebor <msebor@redhat.com> | 2018-07-27 17:06:44 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2018-07-27 11:06:44 -0600 |
commit | e4bbeea27ee88bca0261978ad389f2aff9a6b7fb (patch) | |
tree | f125c9ab7545a42ce51f366b544cb0f0564585c2 /gcc/tree-ssa-strlen.c | |
parent | 254c23d3f40c2832670c90de179630e903755252 (diff) | |
download | gcc-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.c | 15 |
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; |