aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Schmidt <wschmidt@linux.ibm.com>2012-08-01 14:00:35 +0000
committerWilliam Schmidt <wschmidt@gcc.gnu.org>2012-08-01 14:00:35 +0000
commit3cfd446903f49d549cc5f1a3ea07497834ece1b1 (patch)
tree48a51892eb9b02843f2560ab7a4943f9af7c8d7a
parent2749c8f6b3afbaae1e0d18c47ee5eb0b07ee9bb4 (diff)
downloadgcc-3cfd446903f49d549cc5f1a3ea07497834ece1b1.zip
gcc-3cfd446903f49d549cc5f1a3ea07497834ece1b1.tar.gz
gcc-3cfd446903f49d549cc5f1a3ea07497834ece1b1.tar.bz2
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
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/gimple-ssa-strength-reduction.c77
2 files changed, 59 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9549c83..f779010 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,25 @@
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
* gimple-ssa-strength-reduction.c (enum cand_kind): Add CAND_REF.
(base_cand_map): Change to hash table.
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index 5d79521..e6793a5 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -166,8 +166,8 @@ struct slsr_cand_d
/* The candidate statement S1. */
gimple cand_stmt;
- /* The base SSA name B. */
- tree base_name;
+ /* The base expression B: often an SSA name, but not always. */
+ tree base_expr;
/* The stride S. */
tree stride;
@@ -175,7 +175,7 @@ struct slsr_cand_d
/* The index constant i. */
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.
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
@@ -216,12 +216,13 @@ typedef struct slsr_cand_d slsr_cand, *slsr_cand_t;
typedef const struct slsr_cand_d *const_slsr_cand_t;
/* 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
{
- /* SSA name that serves as a base name for the chain of candidates. */
- tree base_name;
+ /* Base expression for the chain of candidates: often, but not
+ always, an SSA name. */
+ tree base_expr;
/* Pointer to a candidate. */
slsr_cand_t cand;
@@ -253,7 +254,7 @@ static struct pointer_map_t *stmt_cand_map;
/* Obstack for candidates. */
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;
/* Obstack for candidate chains. */
@@ -272,7 +273,7 @@ lookup_cand (cand_idx idx)
static hashval_t
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);
}
@@ -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 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
appear in a block that dominates the candidate statement and have
the same stride and type. If more than one possible basis exists,
@@ -308,7 +309,7 @@ find_basis_for_candidate (slsr_cand_t c)
cand_chain_t chain;
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);
for (; chain; chain = chain->next)
@@ -337,8 +338,8 @@ find_basis_for_candidate (slsr_cand_t c)
return 0;
}
-/* Record a mapping from the base name of C to C itself, indicating that
- C may potentially serve as a basis using that base name. */
+/* Record a mapping from the base expression of C to C itself, indicating that
+ C may potentially serve as a basis using that base expression. */
static void
record_potential_basis (slsr_cand_t c)
@@ -347,7 +348,7 @@ record_potential_basis (slsr_cand_t c)
void **slot;
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->next = NULL;
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,
slsr_cand_t c = (slsr_cand_t) obstack_alloc (&cand_obstack,
sizeof (slsr_cand));
c->cand_stmt = gs;
- c->base_name = base;
+ c->base_expr = base;
c->stride = stride;
c->index = index;
c->cand_type = ctype;
@@ -617,7 +618,7 @@ create_mul_ssa_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * Z
================
X = (B + i') * Z */
- base = base_cand->base_name;
+ base = base_cand->base_expr;
index = base_cand->index;
stride = stride_in;
ctype = base_cand->cand_type;
@@ -632,7 +633,7 @@ create_mul_ssa_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * Z
============================
X = B + ((i' * S) * Z) */
- base = base_cand->base_name;
+ base = base_cand->base_expr;
index = double_int_mul (base_cand->index,
tree_to_double_int (base_cand->stride));
stride = stride_in;
@@ -688,7 +689,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c
============================
X = (B + i') * (S * c) */
- base = base_cand->base_name;
+ base = base_cand->base_expr;
index = base_cand->index;
temp = double_int_mul (tree_to_double_int (base_cand->stride),
tree_to_double_int (stride_in));
@@ -705,7 +706,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c
===========================
X = (B + i') * c */
- base = base_cand->base_name;
+ base = base_cand->base_expr;
index = base_cand->index;
stride = stride_in;
ctype = base_cand->cand_type;
@@ -721,7 +722,7 @@ create_mul_imm_cand (gimple gs, tree base_in, tree stride_in, bool speed)
X = Y * c
===========================
X = (B + S) * c */
- base = base_cand->base_name;
+ base = base_cand->base_expr;
index = tree_to_double_int (base_cand->stride);
stride = stride_in;
ctype = base_cand->cand_type;
@@ -772,14 +773,14 @@ slsr_process_mul (gimple gs, tree rhs1, tree rhs2, bool speed)
if (TREE_CODE (rhs2) == SSA_NAME)
{
/* 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);
/* Add the first interpretation to the statement-candidate mapping. */
add_cand_for_stmt (gs, c);
/* 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);
c->next_interp = c2->cand_num;
}
@@ -826,7 +827,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in,
index = tree_to_double_int (addend_cand->stride);
if (subtract_p)
index = double_int_neg (index);
- stride = addend_cand->base_name;
+ stride = addend_cand->base_expr;
ctype = TREE_TYPE (SSA_NAME_VAR (base_in));
if (has_single_use (addend_in))
savings = (addend_cand->dead_savings
@@ -850,7 +851,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in,
X = Y +/- 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;
stride = addend_in;
ctype = base_cand->cand_type;
@@ -875,7 +876,7 @@ create_add_ssa_cand (gimple gs, tree base_in, tree addend_in,
base = base_in;
index = tree_to_double_int (subtrahend_cand->stride);
index = double_int_neg (index);
- stride = subtrahend_cand->base_name;
+ stride = subtrahend_cand->base_expr;
ctype = TREE_TYPE (SSA_NAME_VAR (base_in));
if (has_single_use (addend_in))
savings = (subtrahend_cand->dead_savings
@@ -944,7 +945,7 @@ create_add_imm_cand (gimple gs, tree base_in, double_int index_in, bool speed)
============================
X = (B + (i'+ k)) * S */
kind = base_cand->kind;
- base = base_cand->base_name;
+ base = base_cand->base_expr;
index = double_int_add (base_cand->index, multiple);
stride = base_cand->stride;
ctype = base_cand->cand_type;
@@ -986,7 +987,7 @@ slsr_process_add (gimple gs, tree rhs1, tree rhs2, bool speed)
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
stride to be a pointer, so don't record a candidate in that case. */
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)
return;
/* 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. */
if (!POINTER_TYPE_P (TREE_TYPE (SSA_NAME_VAR (rhs1))))
{
@@ -1139,7 +1140,7 @@ slsr_process_cast (gimple gs, tree rhs1, bool speed)
+ stmt_cost (base_cand->cand_stmt, speed));
c = alloc_cand_and_find_basis (base_cand->kind, gs,
- base_cand->base_name,
+ base_cand->base_expr,
base_cand->index, base_cand->stride,
ctype, savings);
if (base_cand->next_interp)
@@ -1196,7 +1197,7 @@ slsr_process_copy (gimple gs, tree rhs1, bool speed)
+ stmt_cost (base_cand->cand_stmt, speed));
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->cand_type, savings);
if (base_cand->next_interp)
@@ -1324,7 +1325,7 @@ dump_candidate (slsr_cand_t c)
{
case CAND_MULT:
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);
dump_double_int (dump_file, c->index, false);
fputs (") * ", dump_file);
@@ -1333,7 +1334,7 @@ dump_candidate (slsr_cand_t c)
break;
case CAND_ADD:
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);
dump_double_int (dump_file, c->index, false);
fputs (" * ", dump_file);
@@ -1342,7 +1343,7 @@ dump_candidate (slsr_cand_t c)
break;
case CAND_REF:
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);
print_generic_expr (dump_file, c->stride, 0);
fputs (") + ", dump_file);
@@ -1387,7 +1388,7 @@ base_cand_dump_callback (void **slot, void *ignored ATTRIBUTE_UNUSED)
const_cand_chain_t chain = *((const_cand_chain_t *) slot);
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);
for (p = chain->next; p; p = p->next)
@@ -1447,8 +1448,8 @@ unconditional_cands_with_known_stride_p (slsr_cand_t root)
static void
replace_ref (tree *expr, slsr_cand_t c)
{
- tree add_expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (c->base_name),
- c->base_name, c->stride);
+ tree add_expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (c->base_expr),
+ c->base_expr, c->stride);
tree mem_ref = fold_build2 (MEM_REF, TREE_TYPE (*expr), add_expr,
double_int_to_tree (c->cand_type, c->index));
@@ -1503,7 +1504,7 @@ cand_increment (slsr_cand_t c)
return c->index;
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);
}
@@ -1698,7 +1699,7 @@ execute_strength_reduction (void)
/* Create the obstack where candidate chains will reside. */
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_eq, base_cand_free);