From bde63fdea41c6c9952ab3607eb497d5c698e85c3 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 31 May 2017 12:26:03 +0000 Subject: [PATCH] [1/2] Add get_next_strinfo helper function This patch just adds a helper function for getting the next strinfo in a chain, since part 2 adds another place where we do that. 2017-05-16 Richard Sandiford gcc/ * tree-ssa-strlen.c (get_next_strinfo): New function. (get_stridx_plus_constant): Use it. (zero_length_string): Likewise. (adjust_related_strinfos): Likewise. (adjust_last_stmt): Likewise. From-SVN: r248732 --- gcc/ChangeLog | 8 ++++++ gcc/tree-ssa-strlen.c | 59 +++++++++++++++++++------------------------ 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d5d0f6bfdc..01c06b16e1e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-05-31 Richard Sandiford + + * tree-ssa-strlen.c (get_next_strinfo): New function. + (get_stridx_plus_constant): Use it. + (zero_length_string): Likewise. + (adjust_related_strinfos): Likewise. + (adjust_last_stmt): Likewise. + 2017-05-31 Richard Biener PR target/80880 diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 141115ed12b..e4f18dba1e7 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -156,6 +156,19 @@ get_strinfo (int idx) return (*stridx_to_strinfo)[idx]; } +/* Get the next strinfo in the chain after SI, or null if none. */ + +static inline strinfo * +get_next_strinfo (strinfo *si) +{ + if (si->next == 0) + return NULL; + strinfo *nextsi = get_strinfo (si->next); + if (nextsi == NULL || nextsi->first != si->first || nextsi->prev != si->idx) + return NULL; + return nextsi; +} + /* Helper function for get_stridx. */ static int @@ -665,10 +678,8 @@ get_stridx_plus_constant (strinfo *basesi, HOST_WIDE_INT off, tree ptr) gcc_checking_assert (compare_tree_int (si->length, off) != -1); for (chainsi = si; chainsi->next; chainsi = si) { - si = get_strinfo (chainsi->next); + si = get_next_strinfo (chainsi); if (si == NULL - || si->first != chainsi->first - || si->prev != chainsi->idx || si->length == NULL_TREE || TREE_CODE (si->length) != INTEGER_CST) break; @@ -736,26 +747,18 @@ zero_length_string (tree ptr, strinfo *chainsi) si = verify_related_strinfos (chainsi); if (si) { - chainsi = si; - for (; chainsi->next; chainsi = si) + do { - if (chainsi->endptr == NULL_TREE) + gcc_assert (si->length || si->stmt); + if (si->endptr == NULL_TREE) { - chainsi = unshare_strinfo (chainsi); - chainsi->endptr = ptr; + si = unshare_strinfo (si); + si->endptr = ptr; } - si = get_strinfo (chainsi->next); - if (si == NULL - || si->first != chainsi->first - || si->prev != chainsi->idx) - break; - } - gcc_assert (chainsi->length || chainsi->stmt); - if (chainsi->endptr == NULL_TREE) - { - chainsi = unshare_strinfo (chainsi); - chainsi->endptr = ptr; + chainsi = si; + si = get_next_strinfo (si); } + while (si != NULL); if (chainsi->length && integer_zerop (chainsi->length)) { if (chainsi->next) @@ -833,12 +836,8 @@ adjust_related_strinfos (location_t loc, strinfo *origsi, tree adj) si->endptr = NULL_TREE; si->dont_invalidate = true; } - if (si->next == 0) - return; - nsi = get_strinfo (si->next); - if (nsi == NULL - || nsi->first != si->first - || nsi->prev != si->idx) + nsi = get_next_strinfo (si); + if (nsi == NULL) return; si = nsi; } @@ -995,15 +994,9 @@ adjust_last_stmt (strinfo *si, gimple *stmt, bool is_strcat) return; while (firstsi != lastsi) { - strinfo *nextsi; - if (firstsi->next == 0) - return; - nextsi = get_strinfo (firstsi->next); - if (nextsi == NULL - || nextsi->prev != firstsi->idx - || nextsi->first != si->first) + firstsi = get_next_strinfo (firstsi); + if (firstsi == NULL) return; - firstsi = nextsi; } } -- 2.30.2