aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-iterate.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-06-18 20:23:51 +0000
committerRichard Stallman <rms@gnu.org>1993-06-18 20:23:51 +0000
commit09aab2de6b53a7897a1f150a17d3b24a4a53de93 (patch)
tree9c6cf35f545d52c4dd9154ffe58feda18a6a9421 /gcc/c-iterate.c
parent1c0015c23bbf59c3a365824db7361c496a7c9843 (diff)
downloadgcc-09aab2de6b53a7897a1f150a17d3b24a4a53de93.zip
gcc-09aab2de6b53a7897a1f150a17d3b24a4a53de93.tar.gz
gcc-09aab2de6b53a7897a1f150a17d3b24a4a53de93.tar.bz2
(save_exprs): New variable.
(collect_iterators): Don't process a SAVE_EXPR twice. (iterator_expand): Clear save_exprs. From-SVN: r4693
Diffstat (limited to 'gcc/c-iterate.c')
-rw-r--r--gcc/c-iterate.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/gcc/c-iterate.c b/gcc/c-iterate.c
index 0325026..09df3e4 100644
--- a/gcc/c-iterate.c
+++ b/gcc/c-iterate.c
@@ -31,7 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "rtl.h"
static void expand_stmt_with_iterators_1 ();
-static tree collect_iterators();
+static tree collect_iterators ();
static void iterator_loop_prologue ();
static void iterator_loop_epilogue ();
static void add_ixpansion ();
@@ -97,6 +97,9 @@ struct iter_stack_node
struct iter_stack_node *iter_stack;
struct iter_stack_node sublevel_ixpansions;
+
+/* During collect_iterators, a list of SAVE_EXPRs already scanned. */
+static tree save_exprs;
/* Initialize our obstack once per compilation. */
@@ -144,7 +147,9 @@ void
iterator_expand (stmt)
tree stmt;
{
- tree iter_list = collect_iterators (stmt, NULL_TREE);
+ tree iter_list;
+ save_exprs = NULL_TREE;
+ iter_list = collect_iterators (stmt, NULL_TREE);
expand_stmt_with_iterators_1 (stmt, iter_list);
istack_sublevel_to_current ();
}
@@ -202,6 +207,17 @@ collect_iterators (exp, list)
return list;
}
+ case SAVE_EXPR:
+ /* In each scan, scan a given save_expr only once. */
+ {
+ tree tail;
+ for (tail = save_exprs; tail; tail = TREE_CHAIN (tail))
+ if (TREE_VALUE (tail) == exp)
+ return list;
+ }
+ save_exprs = tree_cons (NULL_TREE, exp, save_exprs);
+ return collect_iterators (TREE_OPERAND (exp, 0), list);
+
/* we do not automatically iterate blocks -- one must */
/* use the FOR construct to do that */
@@ -229,7 +245,6 @@ collect_iterators (exp, list)
/* Some tree codes have RTL, not trees, as operands. */
switch (TREE_CODE (exp))
{
- case SAVE_EXPR:
case CALL_EXPR:
num_args = 2;
break;