diff options
author | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-02-11 15:45:27 +0000 |
---|---|---|
committer | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-02-11 15:45:27 +0000 |
commit | 168561ef65d7f576f6f9e25223b5b4c39c2eb8d2 (patch) | |
tree | 816517506e1c41ef333a3003809df242999218a4 /gcc/tree-ssa-loop-ivopts.c | |
parent | 67817f0fb1a998e7fc4acd8229e128b4d0e5dc89 (diff) | |
download | gcc-168561ef65d7f576f6f9e25223b5b4c39c2eb8d2.tar.gz |
Fix PR40886.
2010-02-11 Sebastian Pop <sebastian.pop@amd.com>
Changpeng Fang <changpeng.fang@amd.com>
PR middle-end/40886
* tree-ssa-loop-ivopts.c (determine_use_iv_cost_condition): Decrement
the cost of an IV candidate when the IV is used in a test against zero.
* gcc.dg/tree-ssa/ivopts-3.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156701 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 436e6ce8fc4..74dadf77897 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -4089,6 +4089,7 @@ determine_use_iv_cost_condition (struct ivopts_data *data, bitmap depends_on_elim = NULL, depends_on_express = NULL, depends_on; comp_cost elim_cost, express_cost, cost; bool ok; + tree *control_var, *bound_cst; /* Only consider real candidates. */ if (!cand->iv) @@ -4110,9 +4111,21 @@ determine_use_iv_cost_condition (struct ivopts_data *data, /* Try expressing the original giv. If it is compared with an invariant, note that we cannot get rid of it. */ - ok = extract_cond_operands (data, use->stmt, NULL, NULL, NULL, &cmp_iv); + ok = extract_cond_operands (data, use->stmt, &control_var, &bound_cst, + NULL, &cmp_iv); gcc_assert (ok); + /* When the condition is a comparison of the candidate IV against + zero, prefer this IV. + + TODO: The constant that we're substracting from the cost should + be target-dependent. This information should be added to the + target costs for each backend. */ + if (integer_zerop (*bound_cst) + && (operand_equal_p (*control_var, cand->var_after, 0) + || operand_equal_p (*control_var, cand->var_before, 0))) + elim_cost.cost -= 1; + express_cost = get_computation_cost (data, use, cand, false, &depends_on_express, NULL); fd_ivopts_data = data; |