From: Bin Cheng Date: Thu, 11 May 2017 09:55:56 +0000 (+0000) Subject: tree-ssa-loop-ivopts.c (compare_cost_pair): New. X-Git-Tag: upstream/12.2.0~39592 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e292d60603794a494b130475e247123018e3b104;p=platform%2Fupstream%2Fgcc.git tree-ssa-loop-ivopts.c (compare_cost_pair): New. * tree-ssa-loop-ivopts.c (compare_cost_pair): New. (iv_ca_more_deps): Renamed to ... (iv_ca_compare_deps): ... this. (iv_ca_extend): Extend iv_ca if NEW_CP is cheaper than OLD_CP. From-SVN: r247897 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0b5b6f3..9064bed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2017-05-11 Bin Cheng + * tree-ssa-loop-ivopts.c (compare_cost_pair): New. + (iv_ca_more_deps): Renamed to ... + (iv_ca_compare_deps): ... this. + (iv_ca_extend): Extend iv_ca if NEW_CP is cheaper than OLD_CP. + +2017-05-11 Bin Cheng + * tree-ssa-loop-ivopts.c (find_interesting_uses): Move inv vars dump to ... (determine_group_iv_costs): ... here. diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index f95e01e..553310b 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -5627,6 +5627,19 @@ cheaper_cost_pair (struct cost_pair *a, struct cost_pair *b) return false; } +/* Compare if A is a more expensive cost pair than B. Return 1, 0 and -1 + for more expensive, equal and cheaper respectively. */ + +static int +compare_cost_pair (struct cost_pair *a, struct cost_pair *b) +{ + if (cheaper_cost_pair (a, b)) + return -1; + if (cheaper_cost_pair (b, a)) + return 1; + + return 0; +} /* Returns candidate by that USE is expressed in IVS. */ @@ -5812,13 +5825,14 @@ iv_ca_cost (struct iv_ca *ivs) return ivs->cost; } -/* Returns true if applying NEW_CP to GROUP for IVS introduces more - invariants than OLD_CP. */ +/* Compare if applying NEW_CP to GROUP for IVS introduces more invariants + than OLD_CP. Return 1, 0 and -1 for more, equal and fewer invariants + respectively. */ -static bool -iv_ca_more_deps (struct ivopts_data *data, struct iv_ca *ivs, - struct iv_group *group, struct cost_pair *old_cp, - struct cost_pair *new_cp) +static int +iv_ca_compare_deps (struct ivopts_data *data, struct iv_ca *ivs, + struct iv_group *group, struct cost_pair *old_cp, + struct cost_pair *new_cp) { gcc_assert (old_cp && new_cp && old_cp != new_cp); unsigned old_n_invs = ivs->n_invs; @@ -5826,7 +5840,7 @@ iv_ca_more_deps (struct ivopts_data *data, struct iv_ca *ivs, unsigned new_n_invs = ivs->n_invs; iv_ca_set_cp (data, ivs, group, old_cp); - return (new_n_invs > old_n_invs); + return new_n_invs > old_n_invs ? 1 : (new_n_invs < old_n_invs ? -1 : 0); } /* Creates change of expressing GROUP by NEW_CP instead of OLD_CP and chains @@ -6058,11 +6072,18 @@ iv_ca_extend (struct ivopts_data *data, struct iv_ca *ivs, if (!new_cp) continue; - if (!min_ncand && iv_ca_more_deps (data, ivs, group, old_cp, new_cp)) - continue; + if (!min_ncand) + { + int cmp_invs = iv_ca_compare_deps (data, ivs, group, old_cp, new_cp); + /* Skip if new_cp depends on more invariants. */ + if (cmp_invs > 0) + continue; - if (!min_ncand && !cheaper_cost_pair (new_cp, old_cp)) - continue; + int cmp_cost = compare_cost_pair (new_cp, old_cp); + /* Skip if new_cp is not cheaper. */ + if (cmp_cost > 0 || (cmp_cost == 0 && cmp_invs == 0)) + continue; + } *delta = iv_ca_delta_add (group, old_cp, new_cp, *delta); }