------- Comment #8 from steven at gcc dot gnu dot org 2007-10-27 11:34 ------- After making hoist_code look down the dominator tree a bit further, and fixing --param max-gcse-passes for code hoisting, the next problem surfaces.
When we hoist an expression, we replace the expression with the reaching reg, _and_ we add a REG_EQUAL note for the original expression. Because we add expressions from REG_EQUAL notes to the hash table, expressions that were already hoisted in a previous pass still look very busy in the subsequent passes. Thus, we hoist and hoist and hoist and ... the same expression all over again. Solution: prune VBEOUT with AVAIL_OUT. GCC doesn't compute AVAIL_OUT for code hoisting at the moment. Even local doen-safety is not computed. The trick that PRE uses for this can be used for code hoisting as well: Compute AE_KILL as ~(TRANSP | COMP). The result can be fed to compute_available(), and used for pruning VBEOUT in compute_code_hoist_data(). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33828