https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38474
--- Comment #92 from Richard Biener <rguenth at gcc dot gnu.org> --- Simple and stupid like the below works and does store merging : 0.42 ( 1%) 0.00 ( 0%) 0.43 ( 1%) 3858k ( 1%) TOTAL : 56.86 0.56 57.45 557M we have a limit of 64 stores in a single chain, so the product of both limits limit the number of alias queries done in terminate_all_aliasing_chains. I'll polish it up tomorrow (and will refrain from trying to avoid the linear walk here and keeping a counter or even a pointer to the last element). diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c index f0f4a068de5..c6ec6b2cbce 100644 --- a/gcc/gimple-ssa-store-merging.c +++ b/gcc/gimple-ssa-store-merging.c @@ -5175,6 +5175,19 @@ pass_store_merging::process_store (gimple *stmt) /* Store aliases any existing chain? */ ret |= terminate_all_aliasing_chains (NULL, stmt); + unsigned cnt = 0; + imm_store_chain_info **e = &m_stores_head; + while (*e) + if (++cnt > 16) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Too many chains, terminating oldest before " + "starting a new chain.\n"); + terminate_and_process_chain (*e); + } + else + e = &(*e)->next; + /* Start a new chain. */ class imm_store_chain_info *new_chain = new imm_store_chain_info (m_stores_head, base_addr);