http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54146
--- Comment #19 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-08-06 08:45:12 UTC --- (In reply to comment #17) > (In reply to comment #14) > > if-conversion : 177.26 (but due to loop_optimizer_init) > > Hmm, this is not loop_optimizer_init. All time is spent in the two memset > calls > in cond_move_process_if_block: > > /* Build a mapping for each block to the value used for each > register. */ > max_reg = max_reg_num (); > size = (max_reg + 1) * sizeof (rtx); > then_vals = (rtx *) alloca (size); > else_vals = (rtx *) alloca (size); > memset (then_vals, 0, size); > memset (else_vals, 0, size); > > There are O(1e6) registers in the test case, and O(1e5) basic blocks. So we > end > up memset'ing O(10)MB X O(1e5)times = O(1e6)MB (assuming 64 bits pointers so > that each rtx is O(10) bytes). > > I have a few ideas to fix this problem. Ick, I suppose similar issues exist on the tree level for passes that think that memory / compile-time usage O(number-of-ssa-names or basic-blocks) is "ok" (and I suppose it really _is_ ok ...?)