https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106280
--- Comment #1 from Andrew Macleod <amacleod at redhat dot com> --- Created attachment 53300 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53300&action=edit proposed patch See if this helps. All of the lookup routines check to see first is there is an existing relation for an SSA_NAME before deciding what to do. I forgot to do that with the transitive code. So, this patch does 2 things. 1) If a relation is being registered which already exist, the set routine now returns NULL for the record as there will be no new work to do 2) IF this is a new relation, before calling register_transitives checks if either operand was in a relation before (its just a quick bitmap check). If neither was, there is no possibility of a transitive relation, so no need to look. This eliminates a lot of unnecessary work, and based on the pass times spits out at the end, appears to save a lot of time in the various VRP passes (over 50% time reduction) in your test case. It also makes some marginal improvements in GCC source files compilation.