aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-05-31 12:26:03 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-05-31 12:26:03 +0000
commitbde63fdea41c6c9952ab3607eb497d5c698e85c3 (patch)
treebded8b42d9c1dd7f594f3f10734dd4f18d2ec0c1 /gcc/tree-ssa-strlen.c
parent89c88990a86d03d9c01fee81ef662d993c35f5e9 (diff)
downloadgcc-bde63fdea41c6c9952ab3607eb497d5c698e85c3.zip
gcc-bde63fdea41c6c9952ab3607eb497d5c698e85c3.tar.gz
gcc-bde63fdea41c6c9952ab3607eb497d5c698e85c3.tar.bz2
[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 <richard.sandiford@linaro.org> 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
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c59
1 files changed, 26 insertions, 33 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 141115e..e4f18db 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;
}
}