From f8d4be5756bdb8b65f6efb03ea4988deca9270b9 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Tue, 8 Apr 2003 00:23:17 +0000 Subject: [PATCH] re PR c/9516 (Internal error when using a big array) PR c/9516 * expr.c (safe_from_p): Rearrange to avoid deep recursion in favour of looping and tail recursion for TREE_LIST and binops. Co-Authored-By: Richard Henderson From-SVN: r65363 --- gcc/ChangeLog | 7 +++++++ gcc/expr.c | 27 ++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 351251363e1..5f294afc926 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-04-07 Christian Ehrhardt + Richard Henderson + + PR c/9516 + * expr.c (safe_from_p): Rearrange to avoid deep recursion in + favour of looping and tail recursion for TREE_LIST and binops. + 2003-04-08 Zdenek Dvorak * loop.h (REGNO_FIRST_LUID, REGNO_LAST_LUID): Provide defaults diff --git a/gcc/expr.c b/gcc/expr.c index e9d0ee52c92..075de49f819 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6093,22 +6093,31 @@ safe_from_p (x, exp, top_p) case 'x': if (TREE_CODE (exp) == TREE_LIST) - return ((TREE_VALUE (exp) == 0 - || safe_from_p (x, TREE_VALUE (exp), 0)) - && (TREE_CHAIN (exp) == 0 - || safe_from_p (x, TREE_CHAIN (exp), 0))); + { + while (1) + { + if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0)) + return 0; + exp = TREE_CHAIN (exp); + if (!exp) + return 1; + if (TREE_CODE (exp) != TREE_LIST) + return safe_from_p (x, exp, 0); + } + } else if (TREE_CODE (exp) == ERROR_MARK) return 1; /* An already-visited SAVE_EXPR? */ else return 0; - case '1': - return safe_from_p (x, TREE_OPERAND (exp, 0), 0); - case '2': case '<': - return (safe_from_p (x, TREE_OPERAND (exp, 0), 0) - && safe_from_p (x, TREE_OPERAND (exp, 1), 0)); + if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0)) + return 0; + /* FALLTHRU */ + + case '1': + return safe_from_p (x, TREE_OPERAND (exp, 0), 0); case 'e': case 'r':