OSDN Git Service

(find_best_addr): Limit number of cse_gen_binary calls to
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Feb 1994 00:02:12 +0000 (00:02 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Feb 1994 00:02:12 +0000 (00:02 +0000)
20 per iteration.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@6449 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cse.c

index 13de40c..45e7d44 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2649,9 +2649,17 @@ find_best_addr (insn, loc)
          int best_rtx_cost = (COST (*loc) + 1) >> 1;
          struct table_elt *best_elt = elt; 
          rtx best_rtx = *loc;
+         int count;
+
+         /* This is at worst case an O(n^2) algorithm, so limit our search
+            to the first 32 elements on the list.  This avoids trouble
+            compiling code with very long basic blocks that can easily
+            call cse_gen_binary so many times that we run out of memory.  */
 
          found_better = 0;
-         for (p = elt->first_same_value; p; p = p->next_same_value)
+         for (p = elt->first_same_value, count = 0;
+              p && count < 32;
+              p = p->next_same_value, count++)
            if (! p->flag
                && (GET_CODE (p->exp) == REG
                    || exp_equiv_p (p->exp, p->exp, 1, 0)))