------- Comment #20 from rearnsha at gcc dot gnu dot org 2010-01-29 10:18 ------- (In reply to comment #18) > Function that seems to cost the most time is add_functions(), which is one big > basic block of ~7500 insns (~500 of them call insns). > > List scheduling is quadratic in the number of insns per basic block. I don't > know the scheduler very well, but I would expect GCC has some kind of moving > window to limit the number of insns we consider for scheduling within a basic > block. If so, then this is broken now. >
Sched-deps.c contains the following chunk of code: if (!deps->readonly && ((deps->pending_read_list_length + deps->pending_write_list_length) > MAX_PENDING_LIST_LENGTH)) { /* Flush all pending reads and writes to prevent the pending lists from getting any larger. Insn scheduling runs too slowly when these lists get long. When compiling GCC with itself, this flush occurs 8 times for sparc, and 10 times for m88k using the default value of 32. */ flush_pending_lists (deps, insn, false, true); } but presumably this is not being triggered any more. > That doesn't explain why only ARM seems to be hit by this, though. > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41399