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>
|
||||
|
||||
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;
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue