diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-06-30 20:45:18 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-06-30 20:45:18 +0200 |
commit | 55a0f21aba28fac542ec1b092089140f00eec2ed (patch) | |
tree | 346cd525dca5b49ae36a4d5075a82d931b2cc902 /gcc/tree-ssa-strlen.c | |
parent | 6245ad72d23867f979d0960bdde9a8427c6ba262 (diff) | |
download | gcc-55a0f21aba28fac542ec1b092089140f00eec2ed.zip gcc-55a0f21aba28fac542ec1b092089140f00eec2ed.tar.gz gcc-55a0f21aba28fac542ec1b092089140f00eec2ed.tar.bz2 |
re PR tree-optimization/71707 (ICE in get_stridx_plus_constant)
PR tree-optimization/71707
* tree-ssa-strlen.c (get_stridx_plus_constant): Handle already present
strinfo even for ADDR_EXPR ptr.
* gcc.dg/strlenopt-29.c: New test.
From-SVN: r237889
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r-- | gcc/tree-ssa-strlen.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 232594b..489c8f0 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -677,8 +677,14 @@ get_stridx_plus_constant (strinfo *basesi, HOST_WIDE_INT off, tree ptr) { if (r == 0) { - gcc_assert (TREE_CODE (ptr) == SSA_NAME); - ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] = si->idx; + if (TREE_CODE (ptr) == SSA_NAME) + ssa_ver_to_stridx[SSA_NAME_VERSION (ptr)] = si->idx; + else + { + int *pidx = addr_stridxptr (TREE_OPERAND (ptr, 0)); + if (pidx != NULL && *pidx == 0) + *pidx = si->idx; + } return si->idx; } break; |