summaryrefslogtreecommitdiff
path: root/gcc/c-iterate.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1993-03-03 00:01:48 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1993-03-03 00:01:48 +0000
commit5e9cfe47d59fec796c5f02e4f405b70732cc55f9 (patch)
tree9f6382f4940740ef79be67d142603c1126f7ed1f /gcc/c-iterate.c
parentbff0cb4797971b6fff8e0fbe88cfa8755b7bdc9a (diff)
downloadgcc-5e9cfe47d59fec796c5f02e4f405b70732cc55f9.tar.gz
(collect_iterators): Handle simple expressions quickly.
Don't try to interpret operands that are RTL as if they were trees. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@3616 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-iterate.c')
-rw-r--r--gcc/c-iterate.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/c-iterate.c b/gcc/c-iterate.c
index 04d4b7073ff..91d9c3598f7 100644
--- a/gcc/c-iterate.c
+++ b/gcc/c-iterate.c
@@ -212,14 +212,37 @@ collect_iterators (exp, list)
switch (TREE_CODE_CLASS (TREE_CODE (exp)))
{
case '1':
+ return collect_iterators (TREE_OPERAND (exp, 0), list);
+
case '2':
case '<':
+ return collect_iterators (TREE_OPERAND (exp, 0),
+ collect_iterators (TREE_OPERAND (exp, 1),
+ list));
+
case 'e':
case 'r':
{
int num_args = tree_code_length[TREE_CODE (exp)];
int i;
+ /* Some tree codes have RTL, not trees, as operands. */
+ switch (TREE_CODE (exp))
+ {
+ case SAVE_EXPR:
+ case CALL_EXPR:
+ num_args = 2;
+ break;
+ case METHOD_CALL_EXPR:
+ num_args = 3;
+ break;
+ case WITH_CLEANUP_EXPR:
+ num_args = 1;
+ break;
+ case RTL_EXPR:
+ return list;
+ }
+
for (i = 0; i < num_args; i++)
list = collect_iterators (TREE_OPERAND (exp, i), list);
return list;