https://gcc.gnu.org/g:c06979ff95748559da0c2d3aa4eda9d5999eaaf6
commit r16-1647-gc06979ff95748559da0c2d3aa4eda9d5999eaaf6 Author: hongtao.liu <hongtao....@intel.com> Date: Wed Mar 5 12:25:32 2025 +0100 Don't duplicate setup code cost when do group-candidate cost calucalution. - /* Uses in a group can share setup code, so only add setup cost once. */ - cost -= cost.scratch; It looks like the original code took into account avoiding double counting, but unfortunately cost is reset inside the follow loop which invalidates the upper code, and makes same setup code cost duplicated in each use of the group. The patch fix the issue. It can also improve 548.exchange_r by 6% with -march=x86-64-v3 -O2 due to better ivopt on EMR. No big performance impact for SPEC2017 on graviton4/SPR with -mcpu=native -Ofast -fomit-framepointer -flto=auto. gcc/ChangeLog: PR target/115842 * tree-ssa-loop-ivopts.cc (determine_group_iv_cost_address): Don't recalculate inv_expr when group-candidate cost calucalution. Diff: --- gcc/tree-ssa-loop-ivopts.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc index a2150818a43f..8a6726f19889 100644 --- a/gcc/tree-ssa-loop-ivopts.cc +++ b/gcc/tree-ssa-loop-ivopts.cc @@ -5015,8 +5015,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++) { @@ -5032,7 +5030,12 @@ determine_group_iv_cost_address (struct ivopts_data *data, if (!inv_exprs) inv_exprs = BITMAP_ALLOC (NULL); - bitmap_set_bit (inv_exprs, inv_expr->id); + /* 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; }