Hi, When address iv uses grouping was introduced, I also introduced memory leak and wrong computation of depends_on bitmap. The intention is to skip `depends_on' computation for sub address type iv uses. Unfortunately, the code is wrong because depends_on is freed in subsequent calls to get_computation_cost for a grouped iv use. This results in loss of depends_on information, as well memory leaks for depends_on bitmap.
I think this is an obvious fix to the issue. Bootstrap and test on x86_64. OK? Thanks, bin 2015-10-27 Bin Cheng <bin.ch...@arm.com> * tree-ssa-loop-ivopts.c (split_address_cost): Check depends_on. (get_computation_cost_at): Ditto. (determine_use_iv_cost_address): Pass NULL for arguments depends_on and inv_expr_id.
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 945d34b..91f7284 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -4328,7 +4328,9 @@ split_address_cost (struct ivopts_data *data, *symbol_present = false; *var_present = true; fd_ivopts_data = data; - walk_tree (&addr, find_depends, depends_on, NULL); + if (depends_on) + walk_tree (&addr, find_depends, depends_on, NULL); + return new_cost (target_spill_cost[data->speed], 0); } @@ -4616,7 +4618,8 @@ get_computation_cost_at (struct ivopts_data *data, ? TYPE_MODE (TREE_TYPE (*use->op_p)) : VOIDmode); - *depends_on = NULL; + if (depends_on) + *depends_on = NULL; /* Only consider real candidates. */ if (!cand->iv) @@ -4908,9 +4911,9 @@ determine_use_iv_cost_address (struct ivopts_data *data, sub_use && !infinite_cost_p (cost); sub_use = sub_use->next) { - sub_cost = get_computation_cost (data, sub_use, cand, true, &depends_on, - &can_autoinc, &inv_expr_id); - cost = add_costs (cost, sub_cost); + sub_cost = get_computation_cost (data, sub_use, cand, true, NULL, + &can_autoinc, NULL); + cost = add_costs (cost, sub_cost); } set_use_iv_cost (data, use, cand, cost, depends_on, NULL_TREE, ERROR_MARK,