Commit 3cfd4469 by Bill Schmidt Committed by William Schmidt

gimple-ssa-strength-reduction.c (struct slsr_cand_d): Change base_name to base_expr.

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

	* gimple-ssa-strength-reduction.c (struct slsr_cand_d): Change
	base_name to base_expr.
	(struct cand_chain_d): Likewise.
	(base_cand_hash): Likewise.
	(base_cand_eq): Likewise.
	(record_potential_basis): Likewise.
	(alloc_cand_and_find_basis): Likewise.
	(create_mul_ssa_cand): Likewise.
	(create_mul_imm_cand): Likewise.
	(create_add_ssa_cand): Likewise.
	(create_add_imm_cand): Likewise.
	(slsr_process_cast): Likewise.
	(slsr_process_copy): Likewise.
	(dump_candidate): Likewise.
	(base_cand_dump_callback): Likewise.
	(unconditional_cands_with_known_stride_p): Likewise.
	(cand_increment): Likewise.

From-SVN: r190038
parent 2749c8f6
2012-08-01 Bill Schmidt <wschmidt@linux.ibm.com> 2012-08-01 Bill Schmidt <wschmidt@linux.ibm.com>
* gimple-ssa-strength-reduction.c (struct slsr_cand_d): Change
base_name to base_expr.
(struct cand_chain_d): Likewise.
(base_cand_hash): Likewise.
(base_cand_eq): Likewise.
(record_potential_basis): Likewise.
(alloc_cand_and_find_basis): Likewise.
(create_mul_ssa_cand): Likewise.
(create_mul_imm_cand): Likewise.
(create_add_ssa_cand): Likewise.
(create_add_imm_cand): Likewise.
(slsr_process_cast): Likewise.
(slsr_process_copy): Likewise.
(dump_candidate): Likewise.
(base_cand_dump_callback): Likewise.
(unconditional_cands_with_known_stride_p): Likewise.
(cand_increment): Likewise.
2012-08-01 Bill Schmidt <wschmidt@linux.ibm.com>
PR tree-optimization/46556 PR tree-optimization/46556
* gimple-ssa-strength-reduction.c (enum cand_kind): Add CAND_REF. * gimple-ssa-strength-reduction.c (enum cand_kind): Add CAND_REF.
(base_cand_map): Change to hash table. (base_cand_map): Change to hash table.
......
...@@ -166,8 +166,8 @@ struct slsr_cand_d ...@@ -166,8 +166,8 @@ struct slsr_cand_d
/* The candidate statement S1. */ /* The candidate statement S1. */
gimple cand_stmt; gimple cand_stmt;
/* The base SSA name B. */ /* The base expression B: often an SSA name, but not always. */
tree base_name; tree base_expr;
/* The stride S. */ /* The stride S. */
tree stride; tree stride;
...@@ -175,7 +175,7 @@ struct slsr_cand_d ...@@ -175,7 +175,7 @@ struct slsr_cand_d
/* The index constant i. */ /* The index constant i. */
double_int index; double_int index;
/* The type of the candidate. This is normally the type of base_name, /* The type of the candidate. This is normally the type of base_expr,
but casts may have occurred when combining feeding instructions. but casts may have occurred when combining feeding instructions.
A candidate can only be a basis for candidates of the same final type. A candidate can only be a basis for candidates of the same final type.
(For CAND_REFs, this is the type to be used for operand 1 of the (For CAND_REFs, this is the type to be used for operand 1 of the
...@@ -216,12 +216,13 @@ typedef struct slsr_cand_d slsr_cand, *slsr_cand_t; ...@@ -216,12 +216,13 @@ typedef struct slsr_cand_d slsr_cand, *slsr_cand_t;
typedef const struct slsr_cand_d *const_slsr_cand_t; typedef const struct slsr_cand_d *const_slsr_cand_t;
/* Pointers to candidates are chained together as part of a mapping /* Pointers to candidates are chained together as part of a mapping
from SSA names to the candidates that use them as a base name. */ from base expressions to the candidates that use them. */
struct cand_chain_d struct cand_chain_d
{ {
/* SSA name that serves as a base name for the chain of candidates. */ /* Base expression for the chain of candidates: often, but not
tree base_name; always, an SSA name. */
tree base_expr;
/* Pointer to a candidate. */ /* Pointer to a candidate. */
slsr_cand_t cand; slsr_cand_t cand;
...@@ -253,7 +254,7 @@ static struct pointer_map_t *stmt_cand_map; ...@@ -253,7 +254,7 @@ static struct pointer_map_t *stmt_cand_map;
/* Obstack for candidates. */ /* Obstack for candidates. */
static struct obstack cand_obstack; static struct obstack cand_obstack;
/* Hash table embodying a mapping from base names to chains of candidates. */ /* Hash table embodying a mapping from base exprs to chains of candidates. */
static htab_t base_cand_map; static htab_t base_cand_map;
/* Obstack for candidate chains. */ /* Obstack for candidate chains. */
...@@ -272,7 +273,7 @@ lookup_cand (cand_idx idx) ...@@ -272,7 +273,7 @@ lookup_cand (cand_idx idx)
static hashval_t static hashval_t
base_cand_hash (const void *p) base_cand_hash (const void *p)
{ {
tree base_expr = ((const_cand_chain_t) p)->base_name; tree base_expr = ((const_cand_chain_t) p)->base_expr;
return iterative_hash_expr (base_expr, 0); return iterative_hash_expr (base_expr, 0);
} }
...@@ -291,10 +292,10 @@ base_cand_eq (const void *p1, const void *p2) ...@@ -291,10 +292,10 @@ base_cand_eq (const void *p1, const void *p2)
{ {
const_cand_chain_t const chain1 = (const_cand_chain_t) p1; const_cand_chain_t const chain1 = (const_cand_chain_t) p1;
const_cand_chain_t const chain2 = (const_cand_chain_t) p2; const_cand_chain_t const chain2 = (const_cand_chain_t) p2;
return operand_equal_p (chain1->base_name, chain2->base_name, 0); return operand_equal_p (chain1->base_expr, chain2->base_expr, 0);
} }
/* Use the base name from candidate C to look for possible candidates /* Use the base expr from candidate C to look for possible candidates
that can serve as a basis for C. Each potential basis must also that can serve as a basis for C. Each potential basis must also
appear in a block that dominates the candidate statement and have appear in a block that dominates the candidate statement and have
the same stride and type. If more than one possible basis exists, the same stride and type. If more than one possible basis exists,
...@@ -308,7 +309,7 @@ find_basis_for_candidate (slsr_cand_t c) ...@@ -308,7 +309,7 @@ find_basis_for_candidate (slsr_cand_t c)
cand_chain_t chain; cand_chain_t chain;
slsr_cand_t basis = NULL; slsr_cand_t basis = NULL;
mapping_key.base_name = c->base_name; mapping_key.base_expr = c->base_expr;
chain = (cand_chain_t) htab_find (base_cand_map, &mapping_key); chain = (cand_chain_t) htab_find (base_cand_map, &mapping_key);
for (; chain; chain = chain->next) for (; chain; chain = chain->next)
...@@ -337,8 +338,8 @@ find_basis_for_candidate (slsr_cand_t c) ...@@ -337,8 +338,8 @@ find_basis_for_candidate (slsr_cand_t c)
return 0; return 0;
} }
/* Record a mapping from the base name of C to C itself, indicating that /* Record a mapping from the base expression of C to C itself, indicating that
C may potentially serve as a basis using that base name. */ C may potentially serve as a basis using that base expression. */
static void static void
record_potential_basis (slsr_cand_t c) record_potential_basis (slsr_cand_t c)
...@@ -347,7 +348,7 @@ record_potential_basis (slsr_cand_t c) ...@@ -347,7 +348,7 @@ record_potential_basis (slsr_cand_t c)
void **slot; void **slot;
node = (cand_chain_t) obstack_alloc (&chain_obstack, sizeof (cand_chain)); node = (cand_chain_t) obstack_alloc (&chain_obstack, sizeof (cand_chain));
node->base_name = c->base_name; node->base_expr = c->base_expr;
node->cand = c; node->cand = c;
node->next = NULL; node->next = NULL;
slot = htab_find_slot (base_cand_map, node, INSERT); slot = htab_find_slot (base_cand_map, node, INSERT);
...@@ -373,7 +374,7 @@ alloc_cand_and_find_basis (enum cand_kind kind, gimple gs, tree base, ...@@ -373,7 +374,7 @@ alloc_cand_and_find_basis (enum cand_kind kind, gimple gs, tree base,
slsr_cand_t c = (slsr_cand_t) obstack_alloc (&cand_obstack, slsr_cand_t c = (slsr_cand_t) obstack_alloc (&cand_obstack,
sizeof (slsr_cand)); sizeof (slsr_cand));
c->cand_stmt = gs; c->cand_stmt = gs;
c->base_name = base; c->base_expr = base;
c->stride = stride; c->stride = stride;
c->index = index; c->index = index;
c->cand_type = ctype; c->cand_type = ctype;
...@@ -617,7 +618,7 @@ create_mul_ssa_cand (gimple gs, tree base_in, tree stride_in, bool speed) ...@@ -617,7 +618,7 @@ create_mul_ssa_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * Z X = Y * Z
================ ================
X = (B + i') * Z */ X = (B + i') * Z */
base = base_cand->base_name; base = base_cand->base_expr;
index = base_cand->index; index = base_cand->index;
stride = stride_in; stride = stride_in;
ctype = base_cand->cand_type; ctype = base_cand->cand_type;
...@@ -632,7 +633,7 @@ create_mul_ssa_cand (gimple gs, tree base_in, tree stride_in, bool speed) ...@@ -632,7 +633,7 @@ create_mul_ssa_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * Z X = Y * Z
============================ ============================
X = B + ((i' * S) * Z) */ X = B + ((i' * S) * Z) */
base = base_cand->base_name; base = base_cand->base_expr;
index = double_int_mul (base_cand->index, index = double_int_mul (base_cand->index,
tree_to_double_int (base_cand->stride)); tree_to_double_int (base_cand->stride));
stride = stride_in; stride = stride_in;
...@@ -688,7 +689,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed) ...@@ -688,7 +689,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c X = Y * c
============================ ============================
X = (B + i') * (S * c) */ X = (B + i') * (S * c) */
base = base_cand->base_name; base = base_cand->base_expr;
index = base_cand->index; index = base_cand->index;
temp = double_int_mul (tree_to_double_int (base_cand->stride), temp = double_int_mul (tree_to_double_int (base_cand->stride),
tree_to_double_int (stride_in)); tree_to_double_int (stride_in));
...@@ -705,7 +706,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed) ...@@ -705,7 +706,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c X = Y * c
=========================== ===========================
X = (B + i') * c */ X = (B + i') * c */
base = base_cand->base_name; base = base_cand->base_expr;
index = base_cand->index; index = base_cand->index;
stride = stride_in; stride = stride_in;
ctype = base_cand->cand_type; ctype = base_cand->cand_type;
...@@ -721,7 +722,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed) ...@@ -721,7 +722,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c X = Y * c
=========================== ===========================
X = (B + S) * c */ X = (B + S) * c */
base = base_cand->base_name; base = base_cand->base_expr;
index = tree_to_double_int (base_cand->stride); index = tree_to_double_int (base_cand->stride);
stride = stride_in; stride = stride_in;
ctype = base_cand->cand_type; ctype = base_cand->cand_type;
...@@ -772,14 +773,14 @@ slsr_process_mul (gimple gs, tree rhs1, tree rhs2, bool speed) ...@@ -772,14 +773,14 @@ slsr_process_mul (gimple gs, tree rhs1, tree rhs2, bool speed)
if (TREE_CODE (rhs2) == SSA_NAME) if (TREE_CODE (rhs2) == SSA_NAME)
{ {
/* Record an interpretation of this statement in the candidate table /* Record an interpretation of this statement in the candidate table
assuming RHS1 is the base name and RHS2 is the stride. */ assuming RHS1 is the base expression and RHS2 is the stride. */
c = create_mul_ssa_cand (gs, rhs1, rhs2, speed); c = create_mul_ssa_cand (gs, rhs1, rhs2, speed);
/* Add the first interpretation to the statement-candidate mapping. */ /* Add the first interpretation to the statement-candidate mapping. */
add_cand_for_stmt (gs, c); add_cand_for_stmt (gs, c);
/* Record another interpretation of this statement assuming RHS1 /* Record another interpretation of this statement assuming RHS1
is the stride and RHS2 is the base name. */ is the stride and RHS2 is the base expression. */
c2 = create_mul_ssa_cand (gs, rhs2, rhs1, speed); c2 = create_mul_ssa_cand (gs, rhs2, rhs1, speed);
c->next_interp = c2->cand_num; c->next_interp = c2->cand_num;
} }
...@@ -826,7 +827,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in, ...@@ -826,7 +827,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in,
index = tree_to_double_int (addend_cand->stride); index = tree_to_double_int (addend_cand->stride);
if (subtract_p) if (subtract_p)
index = double_int_neg (index); index = double_int_neg (index);
stride = addend_cand->base_name; stride = addend_cand->base_expr;
ctype = TREE_TYPE (SSA_NAME_VAR (base_in)); ctype = TREE_TYPE (SSA_NAME_VAR (base_in));
if (has_single_use (addend_in)) if (has_single_use (addend_in))
savings = (addend_cand->dead_savings savings = (addend_cand->dead_savings
...@@ -850,7 +851,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in, ...@@ -850,7 +851,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in,
X = Y +/- Z X = Y +/- Z
============================ ============================
X = B + (+/-1 * Z) */ X = B + (+/-1 * Z) */
base = base_cand->base_name; base = base_cand->base_expr;
index = subtract_p ? double_int_minus_one : double_int_one; index = subtract_p ? double_int_minus_one : double_int_one;
stride = addend_in; stride = addend_in;
ctype = base_cand->cand_type; ctype = base_cand->cand_type;
...@@ -875,7 +876,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in, ...@@ -875,7 +876,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in,
base = base_in; base = base_in;
index = tree_to_double_int (subtrahend_cand->stride); index = tree_to_double_int (subtrahend_cand->stride);
index = double_int_neg (index); index = double_int_neg (index);
stride = subtrahend_cand->base_name; stride = subtrahend_cand->base_expr;
ctype = TREE_TYPE (SSA_NAME_VAR (base_in)); ctype = TREE_TYPE (SSA_NAME_VAR (base_in));
if (has_single_use (addend_in)) if (has_single_use (addend_in))
savings = (subtrahend_cand->dead_savings savings = (subtrahend_cand->dead_savings
...@@ -944,7 +945,7 @@ create_add_imm_cand (gimple gs, tree base_in, double_int index_in, bool speed) ...@@ -944,7 +945,7 @@ create_add_imm_cand (gimple gs, tree base_in, double_int index_in, bool speed)
============================ ============================
X = (B + (i'+ k)) * S */ X = (B + (i'+ k)) * S */
kind = base_cand->kind; kind = base_cand->kind;
base = base_cand->base_name; base = base_cand->base_expr;
index = double_int_add (base_cand->index, multiple); index = double_int_add (base_cand->index, multiple);
stride = base_cand->stride; stride = base_cand->stride;
ctype = base_cand->cand_type; ctype = base_cand->cand_type;
...@@ -986,7 +987,7 @@ slsr_process_add (gimple gs, tree rhs1, tree rhs2, bool speed) ...@@ -986,7 +987,7 @@ slsr_process_add (gimple gs, tree rhs1, tree rhs2, bool speed)
if (TREE_CODE (rhs2) == SSA_NAME) if (TREE_CODE (rhs2) == SSA_NAME)
{ {
/* First record an interpretation assuming RHS1 is the base name /* First record an interpretation assuming RHS1 is the base expression
and RHS2 is the stride. But it doesn't make sense for the and RHS2 is the stride. But it doesn't make sense for the
stride to be a pointer, so don't record a candidate in that case. */ stride to be a pointer, so don't record a candidate in that case. */
if (!POINTER_TYPE_P (TREE_TYPE (SSA_NAME_VAR (rhs2)))) if (!POINTER_TYPE_P (TREE_TYPE (SSA_NAME_VAR (rhs2))))
...@@ -1004,7 +1005,7 @@ slsr_process_add (gimple gs, tree rhs1, tree rhs2, bool speed) ...@@ -1004,7 +1005,7 @@ slsr_process_add (gimple gs, tree rhs1, tree rhs2, bool speed)
return; return;
/* Otherwise, record another interpretation assuming RHS2 is the /* Otherwise, record another interpretation assuming RHS2 is the
base name and RHS1 is the stride, again provided that the base expression and RHS1 is the stride, again provided that the
stride is not a pointer. */ stride is not a pointer. */
if (!POINTER_TYPE_P (TREE_TYPE (SSA_NAME_VAR (rhs1)))) if (!POINTER_TYPE_P (TREE_TYPE (SSA_NAME_VAR (rhs1))))
{ {
...@@ -1139,7 +1140,7 @@ slsr_process_cast (gimple gs, tree rhs1, bool speed) ...@@ -1139,7 +1140,7 @@ slsr_process_cast (gimple gs, tree rhs1, bool speed)
+ stmt_cost (base_cand->cand_stmt, speed)); + stmt_cost (base_cand->cand_stmt, speed));
c = alloc_cand_and_find_basis (base_cand->kind, gs, c = alloc_cand_and_find_basis (base_cand->kind, gs,
base_cand->base_name, base_cand->base_expr,
base_cand->index, base_cand->stride, base_cand->index, base_cand->stride,
ctype, savings); ctype, savings);
if (base_cand->next_interp) if (base_cand->next_interp)
...@@ -1196,7 +1197,7 @@ slsr_process_copy (gimple gs, tree rhs1, bool speed) ...@@ -1196,7 +1197,7 @@ slsr_process_copy (gimple gs, tree rhs1, bool speed)
+ stmt_cost (base_cand->cand_stmt, speed)); + stmt_cost (base_cand->cand_stmt, speed));
c = alloc_cand_and_find_basis (base_cand->kind, gs, c = alloc_cand_and_find_basis (base_cand->kind, gs,
base_cand->base_name, base_cand->base_expr,
base_cand->index, base_cand->stride, base_cand->index, base_cand->stride,
base_cand->cand_type, savings); base_cand->cand_type, savings);
if (base_cand->next_interp) if (base_cand->next_interp)
...@@ -1324,7 +1325,7 @@ dump_candidate (slsr_cand_t c) ...@@ -1324,7 +1325,7 @@ dump_candidate (slsr_cand_t c)
{ {
case CAND_MULT: case CAND_MULT:
fputs (" MULT : (", dump_file); fputs (" MULT : (", dump_file);
print_generic_expr (dump_file, c->base_name, 0); print_generic_expr (dump_file, c->base_expr, 0);
fputs (" + ", dump_file); fputs (" + ", dump_file);
dump_double_int (dump_file, c->index, false); dump_double_int (dump_file, c->index, false);
fputs (") * ", dump_file); fputs (") * ", dump_file);
...@@ -1333,7 +1334,7 @@ dump_candidate (slsr_cand_t c) ...@@ -1333,7 +1334,7 @@ dump_candidate (slsr_cand_t c)
break; break;
case CAND_ADD: case CAND_ADD:
fputs (" ADD : ", dump_file); fputs (" ADD : ", dump_file);
print_generic_expr (dump_file, c->base_name, 0); print_generic_expr (dump_file, c->base_expr, 0);
fputs (" + (", dump_file); fputs (" + (", dump_file);
dump_double_int (dump_file, c->index, false); dump_double_int (dump_file, c->index, false);
fputs (" * ", dump_file); fputs (" * ", dump_file);
...@@ -1342,7 +1343,7 @@ dump_candidate (slsr_cand_t c) ...@@ -1342,7 +1343,7 @@ dump_candidate (slsr_cand_t c)
break; break;
case CAND_REF: case CAND_REF:
fputs (" REF : ", dump_file); fputs (" REF : ", dump_file);
print_generic_expr (dump_file, c->base_name, 0); print_generic_expr (dump_file, c->base_expr, 0);
fputs (" + (", dump_file); fputs (" + (", dump_file);
print_generic_expr (dump_file, c->stride, 0); print_generic_expr (dump_file, c->stride, 0);
fputs (") + ", dump_file); fputs (") + ", dump_file);
...@@ -1387,7 +1388,7 @@ base_cand_dump_callback (void **slot, void *ignored ATTRIBUTE_UNUSED) ...@@ -1387,7 +1388,7 @@ base_cand_dump_callback (void **slot, void *ignored ATTRIBUTE_UNUSED)
const_cand_chain_t chain = *((const_cand_chain_t *) slot); const_cand_chain_t chain = *((const_cand_chain_t *) slot);
cand_chain_t p; cand_chain_t p;
print_generic_expr (dump_file, chain->base_name, 0); print_generic_expr (dump_file, chain->base_expr, 0);
fprintf (dump_file, " -> %d", chain->cand->cand_num); fprintf (dump_file, " -> %d", chain->cand->cand_num);
for (p = chain->next; p; p = p->next) for (p = chain->next; p; p = p->next)
...@@ -1447,8 +1448,8 @@ unconditional_cands_with_known_stride_p (slsr_cand_t root) ...@@ -1447,8 +1448,8 @@ unconditional_cands_with_known_stride_p (slsr_cand_t root)
static void static void
replace_ref (tree *expr, slsr_cand_t c) replace_ref (tree *expr, slsr_cand_t c)
{ {
tree add_expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (c->base_name), tree add_expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (c->base_expr),
c->base_name, c->stride); c->base_expr, c->stride);
tree mem_ref = fold_build2 (MEM_REF, TREE_TYPE (*expr), add_expr, tree mem_ref = fold_build2 (MEM_REF, TREE_TYPE (*expr), add_expr,
double_int_to_tree (c->cand_type, c->index)); double_int_to_tree (c->cand_type, c->index));
...@@ -1503,7 +1504,7 @@ cand_increment (slsr_cand_t c) ...@@ -1503,7 +1504,7 @@ cand_increment (slsr_cand_t c)
return c->index; return c->index;
basis = lookup_cand (c->basis); basis = lookup_cand (c->basis);
gcc_assert (operand_equal_p (c->base_name, basis->base_name, 0)); gcc_assert (operand_equal_p (c->base_expr, basis->base_expr, 0));
return double_int_sub (c->index, basis->index); return double_int_sub (c->index, basis->index);
} }
...@@ -1698,7 +1699,7 @@ execute_strength_reduction (void) ...@@ -1698,7 +1699,7 @@ execute_strength_reduction (void)
/* Create the obstack where candidate chains will reside. */ /* Create the obstack where candidate chains will reside. */
gcc_obstack_init (&chain_obstack); gcc_obstack_init (&chain_obstack);
/* Allocate the mapping from base names to candidate chains. */ /* Allocate the mapping from base expressions to candidate chains. */
base_cand_map = htab_create (500, base_cand_hash, base_cand_map = htab_create (500, base_cand_hash,
base_cand_eq, base_cand_free); base_cand_eq, base_cand_free);
......
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