mirror of git://gcc.gnu.org/git/gcc.git
re PR regression/40886 (No loop counter reversal for simple loops anymore)
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. Co-Authored-By: Changpeng Fang <changpeng.fang@amd.com> From-SVN: r156701
This commit is contained in:
parent
91753e21c3
commit
04eadb1326
|
@ -1,3 +1,12 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2010-02-11 Richard Guenther <rguenther@suse.de>
|
2010-02-11 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
PR lto/41664
|
PR lto/41664
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -fdump-tree-ivopts-details" } */
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
f2 ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-final { scan-tree-dump-times "!= 0" 4 "ivopts" } } */
|
||||||
|
/* { dg-final { cleanup-tree-dump "ivopts" } } */
|
|
@ -4089,6 +4089,7 @@ determine_use_iv_cost_condition (struct ivopts_data *data,
|
||||||
bitmap depends_on_elim = NULL, depends_on_express = NULL, depends_on;
|
bitmap depends_on_elim = NULL, depends_on_express = NULL, depends_on;
|
||||||
comp_cost elim_cost, express_cost, cost;
|
comp_cost elim_cost, express_cost, cost;
|
||||||
bool ok;
|
bool ok;
|
||||||
|
tree *control_var, *bound_cst;
|
||||||
|
|
||||||
/* Only consider real candidates. */
|
/* Only consider real candidates. */
|
||||||
if (!cand->iv)
|
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,
|
/* Try expressing the original giv. If it is compared with an invariant,
|
||||||
note that we cannot get rid of it. */
|
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);
|
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,
|
express_cost = get_computation_cost (data, use, cand, false,
|
||||||
&depends_on_express, NULL);
|
&depends_on_express, NULL);
|
||||||
fd_ivopts_data = data;
|
fd_ivopts_data = data;
|
||||||
|
|
Loading…
Reference in New Issue