https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101555
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- OK, so most of the time is spent in ANTIC compute, specifically PHI translation and there translate_vuse_through_block doing the (rate limited) stmt_may_clobber_ref_p_1 query. It's a bit fishy that we're doing these things "twice", in particular we are supposed to translate ANTIC_IN to the predecessor ANTIC_OUT, thus all VUSEs should be already top-of-block. But then in compute_antic_aux we're doing /* Prune expressions that are clobbered in block and thus become invalid if translated from ANTIC_OUT to ANTIC_IN. */ prune_clobbered_mems (ANTIC_OUT, block); which is supposed to do the "translation" through the block but that does not adjust VUSEs of expressions. That uses value_dies_in_block_x, something with a cache but also following a somewhat different logic with respect to the VUSEs in the expression. The main complication here is that the expression set we start from is taken from the VN tables which may put "pre-translated" VUSEs in rather than starting with the VUSEs as they were.