diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-03-03 00:01:48 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1993-03-03 00:01:48 +0000 |
commit | 5e9cfe47d59fec796c5f02e4f405b70732cc55f9 (patch) | |
tree | 9f6382f4940740ef79be67d142603c1126f7ed1f /gcc/c-iterate.c | |
parent | bff0cb4797971b6fff8e0fbe88cfa8755b7bdc9a (diff) | |
download | gcc-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.c | 23 |
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; |