Commit 88ca9ea1 by Bill Schmidt Committed by William Schmidt

gimple-ssa-strength-reduction.c (struct incr_info_d): New struct.

gcc:

2012-08-07  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* gimple-ssa-strength-reduction.c (struct incr_info_d): New struct.
	(incr_vec): New static var.
	(incr_vec_len): Likewise.
	(address_arithmetic_p): Likewise.
	(stmt_cost): Remove dead assignment.
	(dump_incr_vec): New function.
	(cand_abs_increment): Likewise.
	(lazy_create_slsr_reg): Likewise.
	(incr_vec_index): Likewise.
	(count_candidates): Likewise.
	(record_increment): Likewise.
	(record_increments): Likewise.
	(unreplaced_cand_in_tree): Likewise.
	(optimize_cands_for_speed_p): Likewise.
	(lowest_cost_path): Likewise.
	(total_savings): Likewise.
	(analyze_increments): Likewise.
	(ncd_for_two_cands): Likewise.
	(nearest_common_dominator_for_cands): Likewise.
	(profitable_increment_p): Likewise.
	(insert_initializers): Likewise.
	(introduce_cast_before_cand): Likewise.
	(replace_rhs_if_not_dup): Likewise.
	(replace_one_candidate): Likewise.
	(replace_profitable_candidates): Likewise.
	(analyze_candidates_and_replace): Handle candidates with SSA-name
	strides.

gcc/testsuite:

2012-08-07  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* gcc.dg/tree-ssa/slsr-5.c: New.
	* gcc.dg/tree-ssa/slsr-6.c: New.
	* gcc.dg/tree-ssa/slsr-7.c: New.
	* gcc.dg/tree-ssa/slsr-8.c: New.
	* gcc.dg/tree-ssa/slsr-9.c: New.
	* gcc.dg/tree-ssa/slsr-10.c: New.
	* gcc.dg/tree-ssa/slsr-11.c: New.
	* gcc.dg/tree-ssa/slsr-12.c: New.
	* gcc.dg/tree-ssa/slsr-13.c: New.
	* gcc.dg/tree-ssa/slsr-14.c: New.
	* gcc.dg/tree-ssa/slsr-15.c: New.
	* gcc.dg/tree-ssa/slsr-16.c: New.
	* gcc.dg/tree-ssa/slsr-17.c: New.
	* gcc.dg/tree-ssa/slsr-18.c: New.
	* gcc.dg/tree-ssa/slsr-19.c: New.
	* gcc.dg/tree-ssa/slsr-20.c: New.
	* gcc.dg/tree-ssa/slsr-21.c: New.
	* gcc.dg/tree-ssa/slsr-22.c: New.
	* gcc.dg/tree-ssa/slsr-23.c: New.
	* gcc.dg/tree-ssa/slsr-24.c: New.
	* gcc.dg/tree-ssa/slsr-25.c: New.
	* gcc.dg/tree-ssa/slsr-26.c: New.
	* gcc.dg/tree-ssa/slsr-30.c: New.
	* gcc.dg/tree-ssa/slsr-31.c: New.

From-SVN: r190220
parent 02044923
2012-08-07 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gimple-ssa-strength-reduction.c (struct incr_info_d): New struct.
(incr_vec): New static var.
(incr_vec_len): Likewise.
(address_arithmetic_p): Likewise.
(stmt_cost): Remove dead assignment.
(dump_incr_vec): New function.
(cand_abs_increment): Likewise.
(lazy_create_slsr_reg): Likewise.
(incr_vec_index): Likewise.
(count_candidates): Likewise.
(record_increment): Likewise.
(record_increments): Likewise.
(unreplaced_cand_in_tree): Likewise.
(optimize_cands_for_speed_p): Likewise.
(lowest_cost_path): Likewise.
(total_savings): Likewise.
(analyze_increments): Likewise.
(ncd_for_two_cands): Likewise.
(nearest_common_dominator_for_cands): Likewise.
(profitable_increment_p): Likewise.
(insert_initializers): Likewise.
(introduce_cast_before_cand): Likewise.
(replace_rhs_if_not_dup): Likewise.
(replace_one_candidate): Likewise.
(replace_profitable_candidates): Likewise.
(analyze_candidates_and_replace): Handle candidates with SSA-name
strides.
2012-08-07 Steven Bosscher <steven@gcc.gnu.org>
* cfg.c (debug_bb): Do not set TDF_BLOCKS.
......
2012-08-07 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.dg/tree-ssa/slsr-5.c: New.
* gcc.dg/tree-ssa/slsr-6.c: New.
* gcc.dg/tree-ssa/slsr-7.c: New.
* gcc.dg/tree-ssa/slsr-8.c: New.
* gcc.dg/tree-ssa/slsr-9.c: New.
* gcc.dg/tree-ssa/slsr-10.c: New.
* gcc.dg/tree-ssa/slsr-11.c: New.
* gcc.dg/tree-ssa/slsr-12.c: New.
* gcc.dg/tree-ssa/slsr-13.c: New.
* gcc.dg/tree-ssa/slsr-14.c: New.
* gcc.dg/tree-ssa/slsr-15.c: New.
* gcc.dg/tree-ssa/slsr-16.c: New.
* gcc.dg/tree-ssa/slsr-17.c: New.
* gcc.dg/tree-ssa/slsr-18.c: New.
* gcc.dg/tree-ssa/slsr-19.c: New.
* gcc.dg/tree-ssa/slsr-20.c: New.
* gcc.dg/tree-ssa/slsr-21.c: New.
* gcc.dg/tree-ssa/slsr-22.c: New.
* gcc.dg/tree-ssa/slsr-23.c: New.
* gcc.dg/tree-ssa/slsr-24.c: New.
* gcc.dg/tree-ssa/slsr-25.c: New.
* gcc.dg/tree-ssa/slsr-26.c: New.
* gcc.dg/tree-ssa/slsr-30.c: New.
* gcc.dg/tree-ssa/slsr-31.c: New.
2012-08-07 Steven Bosscher <steven@gcc.gnu.org>
* gcc.dg/tree-prof/update-loopch.c: Ask for dump with blocks info.
......
/* Verify straight-line strength reduction for simple integer addition
with stride reversed on 1st and 3rd instances. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a1, a2, a3, x1, x2, x3, x;
a1 = 2 * s;
x1 = a1 + c;
a2 = 4 * s;
x2 = c + a2;
a3 = 6 * s;
x3 = a3 + c;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for simple integer addition
with casts thrown in. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
long
f (int s, long c)
{
int a1, a2, a3;
long x1, x2, x3, x;
a1 = 2 * s;
x1 = c + a1;
a2 = 4 * s;
x2 = c + a2;
a3 = 6 * s;
x3 = c + a3;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify that no straight-line strength reduction occurs across sibling
blocks. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a1, a2, a3, x1, x2, x3, x;
if (c > 0)
{
a1 = 2 * s;
x1 = c + a1;
}
else
{
a1 = 4 * s;
x1 = c + a1;
}
a2 = 6 * s;
x2 = c + a2;
x = x1 + x2;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 3 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* x2 and x3 will be strength-reduced based on the same statement
but with different variables as the stride. Note that they will
be strength-reduced by introducing an initializer 4*s which is
cheaper than 5*s; similar for 4*c and 5*c. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a2, a3, x1, x2, x3, x;
x1 = c + s;
a2 = 5 * s;
x2 = c + a2;
a3 = 5 * c;
x3 = s + a3;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* 4" 2 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 5" 0 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Straight-line strength reduction control flow variation. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int c, int s)
{
int a1, a2, x, x1, x2, x3, x4;
a1 = 2 * s;
if (n > 64)
{
x1 = c + a1;
a2 = 4 * s;
x2 = c + a2;
x = x1 + x2;
}
else
{
x3 = c + a1;
a2 = 4 * s;
x4 = c + a2;
x = x4 / x3;
}
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Straight-line strength reduction control flow variation. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int c, int s)
{
int a, x1, x2, x3;
x1 = x2 = x3 = c;
if (n > 64)
{
a = 2 * s;
x1 = c + a;
a = 4 * s;
x2 = c + a;
a = 6 * s;
x3 = c + a;
}
return x1 + x2 + x3;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Straight-line strength reduction control flow variation. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int c, int s)
{
int a2, a3, a4, x1, x2, x3, x4;
x1 = c + s;
a2 = 3 * s;
x2 = c + a2;
x3 = x4 = c;
if (n > 64)
{
a3 = 5 * s;
x3 = c + a3;
a4 = 7 * s;
x4 = c + a4;
}
return x1 + x2 + x3 + x4;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Straight-line strength reduction control flow variation with incr = 1. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int c, int s)
{
int a2, a3, a4, x1, x2, x3, x4;
x1 = c + s;
x2 = x3 = x4 = c;
if (n > 64)
{
a2 = 2 * s;
x2 = c + a2;
a3 = 3 * s;
x3 = c + a3;
}
else
{
a4 = 2 * s;
x4 = c + a4;
}
return x1 + x2 + x3 + x4;
}
/* { dg-final { scan-tree-dump-times " \\* " 0 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Straight-line strength reduction control flow variation with incr = -1. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int c, int s)
{
int a1, a2, a3, a4, x1, x2, x3, x4;
a1 = 4 * s;
x1 = c + a1;
x2 = x3 = x4 = c;
if (n > 64)
{
a2 = 3 * s;
x2 = c + a2;
a3 = 2 * s;
x3 = c + a3;
}
else
{
a4 = 3 * s;
x4 = c + a4;
}
return x1 + x2 + x3 + x4;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with stride in RHS1 position. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int c, int s)
{
int x1, x2, y1, y2;
y1 = c + 2;
x1 = s * y1;
y2 = y1 + 2;
x2 = s * y2;
return x1 + x2;
}
/* { dg-final { scan-tree-dump-times " \\* y" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 2" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with stride in inconsistent positions. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int c, int s)
{
int x1, x2, y1, y2;
y1 = c + 2;
x1 = y1 * s;
y2 = y1 + 2;
x2 = s * y2;
return x1 + x2;
}
/* { dg-final { scan-tree-dump-times " \\* s" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 2" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with variable stride and control flow. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int x, int stride)
{
int a, x1, x2, x3;
a = x * stride;
if (n > 64)
{
x1 = x + 3;
a += x1 * stride;
x2 = x1 + 3;
a += x2 * stride;
}
else
{
x3 = x + 3;
a += x3 * stride;
}
return a;
}
/* { dg-final { scan-tree-dump-times " \\* stride" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 3" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with variable stride and control flow. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int x, int stride)
{
int a, x1, x2, x3;
a = x * stride;
if (n > 64)
{
x1 = x + 3;
a += x1 * stride;
x2 = x1 + 3;
a += x2 * stride;
x3 = x2 + 3;
a += x3 * stride;
}
return a;
}
/* { dg-final { scan-tree-dump-times " \\* stride" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 3" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with variable stride and control flow. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int x, int stride)
{
int a, x1, x2, x3;
a = x * stride;
x1 = x + 3;
a += x1 * stride;
if (n > 64)
{
x2 = x1 + 3;
a += x2 * stride;
x3 = x2 + 3;
a += x3 * stride;
}
return a;
}
/* { dg-final { scan-tree-dump-times " \\* stride" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 3" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with variable stride and control flow, increment = 1. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int x, int stride)
{
int a, x1, x2, x3;
a = x * stride;
if (n > 64)
{
x1 = x + 1;
a += x1 * stride;
x2 = x1 + 1;
a += x2 * stride;
}
else
{
x3 = x + 1;
a += x3 * stride;
}
return a;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with variable stride and control flow, increment = -1. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int x, int stride)
{
int a, x1, x2, x3;
a = x * stride;
if (n > 64)
{
x1 = x - 1;
a += x1 * stride;
x2 = x1 - 1;
a += x2 * stride;
}
else
{
x3 = x - 1;
a += x3 * stride;
}
return a;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for multiply candidates
with variable stride and control flow, increment = -3. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int n, int x, int stride)
{
int a, x1, x2, x3;
a = x * stride;
if (n > 64)
{
x1 = x - 3;
a += x1 * stride;
x2 = x1 - 3;
a += x2 * stride;
}
else
{
x3 = x - 3;
a += x3 * stride;
}
return a;
}
/* { dg-final { scan-tree-dump-times " \\* stride" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* 3" 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction fails for simple integer addition
with casts thrown in when -fwrapv is used. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-dom2 -fwrapv" } */
/* { dg-skip-if "" { ilp32 } { "-m32" } { "" } } */
long
f (int s, long c)
{
int a1, a2, a3;
long x1, x2, x3, x;
a1 = 2 * s;
x1 = c + a1;
a2 = 4 * s;
x2 = c + a2;
a3 = 6 * s;
x3 = c + a3;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 3 "dom2" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for add candidates in
which the stride is unknown and increments appear that differ
only in sign. Verify the increments are shared. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a1, a2, a3, a4, x1, x2, x3, x4, x;
a1 = 2 * s;
x1 = c + a1;
a2 = 4 * s; /* incr = +2 */
x2 = c + a2;
a3 = 7 * s;
x3 = c + a3;
a4 = 5 * s; /* incr = -2 */
x4 = c + a4;
x = x1 + x2 + x3 + x4;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* 2" 1 "optimized" } } */
/* { dg-final { scan-tree-dump-times " \\* -2" 0 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for simple add candidates. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a1, a2, a3, x1, x2, x3, x;
a1 = 2 * s;
x1 = c + a1;
a2 = 4 * s;
x2 = c + a2;
a3 = 6 * s;
x3 = c + a3;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for simple add candidates,
pointer version. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
void
f (int s, char *c, char *x1, char *x2, char *x3)
{
int a1, a2, a3;
a1 = 2 * s;
x1 = c + a1;
*x1 = 1;
a2 = 4 * s;
x2 = c + a2;
*x2 = 2;
a3 = 6 * s;
x3 = c + a3;
*x3 = 3;
}
/* There will be four ' * ' instances for the parms, one in the code. */
/* { dg-final { scan-tree-dump-times " \\* " 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for simple integer subtraction. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a1, a2, a3, x1, x2, x3, x;
a1 = 2 * s;
x1 = c - a1;
a2 = 4 * s;
x2 = c - a2;
a3 = 6 * s;
x3 = c - a3;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for simple pointer subtraction. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int*
f (int s, int *c)
{
int a1, a2, a3, *x1, *x2, *x3;
a1 = 2 * s;
x1 = c - a1;
a2 = 4 * s;
x2 = c - a2;
a3 = 6 * s;
x3 = c - a3;
return x1 ? x2 : x3;
}
/* There are 2 ' * ' instances in the decls (since "int * x3;" is
optimized out), 1 parm, 2 in the code. */
/* { dg-final { scan-tree-dump-times " \\* " 5 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
/* Verify straight-line strength reduction for simple integer addition
with stride reversed. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
int
f (int s, int c)
{
int a1, a2, a3, x1, x2, x3, x;
a1 = 2 * s;
x1 = a1 + c;
a2 = 4 * s;
x2 = a2 + c;
a3 = 6 * s;
x3 = a3 + c;
x = x1 + x2 + x3;
return x;
}
/* { dg-final { scan-tree-dump-times " \\* " 1 "optimized" } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
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