Commit 04eadb13 by Sebastian Pop Committed by Sebastian Pop

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
parent 91753e21
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
......
/* { 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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment