https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115842
--- Comment #6 from Hongtao Liu <liuhongt at gcc dot gnu.org> --- I noticed some double-counting of cost in group-candidate (regarding loop invariant expressions), this modification reduces the number of instructions executed by ~8% for exchange_r binary compiled with -march=x86-64-v3 -O2. diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc index e37b24062f7..d68d54d299e 100644 --- a/gcc/tree-ssa-loop-ivopts.cc +++ b/gcc/tree-ssa-loop-ivopts.cc @@ -5016,8 +5016,6 @@ determine_group_iv_cost_address (struct ivopts_data *data, sum_cost = infinite_cost; } - /* Uses in a group can share setup code, so only add setup cost once. */ - cost -= cost.scratch; /* Compute and add costs for rest uses of this group. */ for (i = 1; i < group->vuses.length () && !sum_cost.infinite_cost_p (); i++) { @@ -5033,6 +5031,10 @@ determine_group_iv_cost_address (struct ivopts_data *data, if (!inv_exprs) inv_exprs = BITMAP_ALLOC (NULL); + /* Uses in a group can share setup code, so only add setup cost once. */ + if (bitmap_bit_p (inv_exprs, inv_expr->id)) + cost -= cost.scratch; + else bitmap_set_bit (inv_exprs, inv_expr->id); } sum_cost += cost;