aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2012-10-23 16:29:03 +0000
committerMichael Matz <matz@gcc.gnu.org>2012-10-23 16:29:03 +0000
commit4b671e64d4d84a4090ce484e638c6032ed5ba17a (patch)
treedfe78d2bb02f7a92114b50acf3f8662a56351922
parent85fc19ad7e950cd015f02b0a4ae8c756727f1398 (diff)
downloadgcc-4b671e64d4d84a4090ce484e638c6032ed5ba17a.zip
gcc-4b671e64d4d84a4090ce484e638c6032ed5ba17a.tar.gz
gcc-4b671e64d4d84a4090ce484e638c6032ed5ba17a.tar.bz2
tree-ssa-operands.h (struct def_optype_d, [...]): Remove.
* tree-ssa-operands.h (struct def_optype_d, def_optype_p): Remove. (ssa_operands.free_defs): Remove. (DEF_OP_PTR, DEF_OP): Remove. (struct ssa_operand_iterator_d): Remove 'defs', add 'flags' members, rename 'phi_stmt' to 'stmt', 'phi_i' to 'i' and 'num_phi' to 'numops'. * gimple.h (gimple_statement_with_ops.def_ops): Remove. (gimple_def_ops, gimple_set_def_ops): Remove. (gimple_vdef_op): Don't take const gimple, adjust. (gimple_asm_input_op, gimple_asm_input_op_ptr, gimple_asm_set_input_op, gimple_asm_output_op, gimple_asm_output_op_ptr, gimple_asm_set_output_op): Adjust asserts, and rewrite to move def operands to front. (gimple_asm_clobber_op, gimple_asm_set_clobber_op, gimple_asm_label_op, gimple_asm_set_label_op): Correct asserts. * tree-ssa-operands.c (build_defs): Remove. (init_ssa_operands): Don't initialize it. (fini_ssa_operands): Don't free it. (cleanup_build_arrays): Don't truncate it. (finalize_ssa_stmt_operands): Don't assert on it. (alloc_def, add_def_op, append_def): Remove. (finalize_ssa_defs): Remove building of def_ops list. (finalize_ssa_uses): Don't mark for SSA renaming here, ... (add_stmt_operand): ... but here, don't call append_def. (get_indirect_ref_operands): Remove recurse_on_base argument. (get_expr_operands): Adjust call to get_indirect_ref_operands. (verify_ssa_operands): Don't check def operands. (free_stmt_operands): Don't free def operands. * gimple.c (gimple_copy): Don't clear def operands. * tree-flow-inline.h (op_iter_next_use): Adjust to explicitely handle def operand. (op_iter_next_tree, op_iter_next_def): Ditto. (clear_and_done_ssa_iter): Clear new fields. (op_iter_init): Adjust to setup new iterator structure. (op_iter_init_phiuse): Adjust. From-SVN: r192721
-rw-r--r--gcc/ChangeLog38
-rw-r--r--gcc/gimple.c1
-rw-r--r--gcc/gimple.h99
-rw-r--r--gcc/tree-flow-inline.h101
-rw-r--r--gcc/tree-ssa-operands.c154
-rw-r--r--gcc/tree-ssa-operands.h22
6 files changed, 165 insertions, 250 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b830bb1..0a9707a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,41 @@
+2012-10-23 Michael Matz <matz@suse.de>
+
+ * tree-ssa-operands.h (struct def_optype_d, def_optype_p): Remove.
+ (ssa_operands.free_defs): Remove.
+ (DEF_OP_PTR, DEF_OP): Remove.
+ (struct ssa_operand_iterator_d): Remove 'defs', add 'flags'
+ members, rename 'phi_stmt' to 'stmt', 'phi_i' to 'i' and 'num_phi'
+ to 'numops'.
+ * gimple.h (gimple_statement_with_ops.def_ops): Remove.
+ (gimple_def_ops, gimple_set_def_ops): Remove.
+ (gimple_vdef_op): Don't take const gimple, adjust.
+ (gimple_asm_input_op, gimple_asm_input_op_ptr,
+ gimple_asm_set_input_op, gimple_asm_output_op,
+ gimple_asm_output_op_ptr, gimple_asm_set_output_op): Adjust asserts,
+ and rewrite to move def operands to front.
+ (gimple_asm_clobber_op, gimple_asm_set_clobber_op,
+ gimple_asm_label_op, gimple_asm_set_label_op): Correct asserts.
+ * tree-ssa-operands.c (build_defs): Remove.
+ (init_ssa_operands): Don't initialize it.
+ (fini_ssa_operands): Don't free it.
+ (cleanup_build_arrays): Don't truncate it.
+ (finalize_ssa_stmt_operands): Don't assert on it.
+ (alloc_def, add_def_op, append_def): Remove.
+ (finalize_ssa_defs): Remove building of def_ops list.
+ (finalize_ssa_uses): Don't mark for SSA renaming here, ...
+ (add_stmt_operand): ... but here, don't call append_def.
+ (get_indirect_ref_operands): Remove recurse_on_base argument.
+ (get_expr_operands): Adjust call to get_indirect_ref_operands.
+ (verify_ssa_operands): Don't check def operands.
+ (free_stmt_operands): Don't free def operands.
+ * gimple.c (gimple_copy): Don't clear def operands.
+ * tree-flow-inline.h (op_iter_next_use): Adjust to explicitely
+ handle def operand.
+ (op_iter_next_tree, op_iter_next_def): Ditto.
+ (clear_and_done_ssa_iter): Clear new fields.
+ (op_iter_init): Adjust to setup new iterator structure.
+ (op_iter_init_phiuse): Adjust.
+
2012-10-23 Greta Yorsh <Greta.Yorsh@arm.com>
* config/arm/arm.c (offset_ok_for_ldrd_strd): Return false for
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 6088682..a5c16da 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -2345,7 +2345,6 @@ gimple_copy (gimple stmt)
/* Clear out SSA operand vectors on COPY. */
if (gimple_has_ops (stmt))
{
- gimple_set_def_ops (copy, NULL);
gimple_set_use_ops (copy, NULL);
/* SSA operands need to be updated. */
diff --git a/gcc/gimple.h b/gcc/gimple.h
index c4cdb1a..bca1e14 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -220,12 +220,11 @@ struct GTY(()) gimple_statement_with_ops_base
/* [ WORD 1-6 ] */
struct gimple_statement_base gsbase;
- /* [ WORD 7-8 ]
+ /* [ WORD 7 ]
SSA operand vectors. NOTE: It should be possible to
amalgamate these vectors with the operand vector OP. However,
the SSA operand vectors are organized differently and contain
more information (like immediate use chaining). */
- struct def_optype_d GTY((skip (""))) *def_ops;
struct use_optype_d GTY((skip (""))) *use_ops;
};
@@ -234,10 +233,10 @@ struct GTY(()) gimple_statement_with_ops_base
struct GTY(()) gimple_statement_with_ops
{
- /* [ WORD 1-8 ] */
+ /* [ WORD 1-7 ] */
struct gimple_statement_with_ops_base opbase;
- /* [ WORD 9 ]
+ /* [ WORD 8 ]
Operand vector. NOTE! This must always be the last field
of this structure. In particular, this means that this
structure cannot be embedded inside another one. */
@@ -249,10 +248,10 @@ struct GTY(()) gimple_statement_with_ops
struct GTY(()) gimple_statement_with_memory_ops_base
{
- /* [ WORD 1-8 ] */
+ /* [ WORD 1-7 ] */
struct gimple_statement_with_ops_base opbase;
- /* [ WORD 9-10 ]
+ /* [ WORD 8-9 ]
Virtual operands for this statement. The GC will pick them
up via the ssa_names array. */
tree GTY((skip (""))) vdef;
@@ -264,10 +263,10 @@ struct GTY(()) gimple_statement_with_memory_ops_base
struct GTY(()) gimple_statement_with_memory_ops
{
- /* [ WORD 1-10 ] */
+ /* [ WORD 1-9 ] */
struct gimple_statement_with_memory_ops_base membase;
- /* [ WORD 11 ]
+ /* [ WORD 10 ]
Operand vector. NOTE! This must always be the last field
of this structure. In particular, this means that this
structure cannot be embedded inside another one. */
@@ -279,20 +278,20 @@ struct GTY(()) gimple_statement_with_memory_ops
struct GTY(()) gimple_statement_call
{
- /* [ WORD 1-10 ] */
+ /* [ WORD 1-9 ] */
struct gimple_statement_with_memory_ops_base membase;
- /* [ WORD 11-14 ] */
+ /* [ WORD 10-13 ] */
struct pt_solution call_used;
struct pt_solution call_clobbered;
- /* [ WORD 15 ] */
+ /* [ WORD 14 ] */
union GTY ((desc ("%1.membase.opbase.gsbase.subcode & GF_CALL_INTERNAL"))) {
tree GTY ((tag ("0"))) fntype;
enum internal_fn GTY ((tag ("GF_CALL_INTERNAL"))) internal_fn;
} u;
- /* [ WORD 16 ]
+ /* [ WORD 15 ]
Operand vector. NOTE! This must always be the last field
of this structure. In particular, this means that this
structure cannot be embedded inside another one. */
@@ -464,21 +463,21 @@ struct GTY(()) gimple_statement_wce {
struct GTY(()) gimple_statement_asm
{
- /* [ WORD 1-10 ] */
+ /* [ WORD 1-9 ] */
struct gimple_statement_with_memory_ops_base membase;
- /* [ WORD 11 ]
+ /* [ WORD 10 ]
__asm__ statement. */
const char *string;
- /* [ WORD 12 ]
+ /* [ WORD 11 ]
Number of inputs, outputs, clobbers, labels. */
unsigned char ni;
unsigned char no;
unsigned char nc;
unsigned char nl;
- /* [ WORD 13 ]
+ /* [ WORD 12 ]
Operand vector. NOTE! This must always be the last field
of this structure. In particular, this means that this
structure cannot be embedded inside another one. */
@@ -669,13 +668,13 @@ struct GTY(()) gimple_statement_omp_atomic_store {
struct GTY(()) gimple_statement_transaction
{
- /* [ WORD 1-10 ] */
+ /* [ WORD 1-9 ] */
struct gimple_statement_with_memory_ops_base gsbase;
- /* [ WORD 11 ] */
+ /* [ WORD 10 ] */
gimple_seq body;
- /* [ WORD 12 ] */
+ /* [ WORD 11 ] */
tree label;
};
@@ -1372,27 +1371,6 @@ gimple_has_mem_ops (const_gimple g)
}
-/* Return the set of DEF operands for statement G. */
-
-static inline struct def_optype_d *
-gimple_def_ops (const_gimple g)
-{
- if (!gimple_has_ops (g))
- return NULL;
- return g->gsops.opbase.def_ops;
-}
-
-
-/* Set DEF to be the set of DEF operands for statement G. */
-
-static inline void
-gimple_set_def_ops (gimple g, struct def_optype_d *def)
-{
- gcc_gimple_checking_assert (gimple_has_ops (g));
- g->gsops.opbase.def_ops = def;
-}
-
-
/* Return the set of USE operands for statement G. */
static inline struct use_optype_d *
@@ -1432,15 +1410,12 @@ gimple_vuse_op (const_gimple g)
/* Return the set of VDEF operand for statement G. */
static inline def_operand_p
-gimple_vdef_op (const_gimple g)
+gimple_vdef_op (gimple g)
{
- struct def_optype_d *ops;
if (!gimple_has_mem_ops (g))
return NULL_DEF_OPERAND_P;
- ops = g->gsops.opbase.def_ops;
- if (ops
- && DEF_OP_PTR (ops) == &g->gsmembase.vdef)
- return DEF_OP_PTR (ops);
+ if (g->gsmembase.vdef)
+ return &g->gsmembase.vdef;
return NULL_DEF_OPERAND_P;
}
@@ -2941,8 +2916,8 @@ static inline tree
gimple_asm_input_op (const_gimple gs, unsigned index)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.ni);
- return gimple_op (gs, index);
+ gcc_gimple_checking_assert (index < gs->gimple_asm.ni);
+ return gimple_op (gs, index + gs->gimple_asm.no);
}
/* Return a pointer to input operand INDEX of GIMPLE_ASM GS. */
@@ -2951,8 +2926,8 @@ static inline tree *
gimple_asm_input_op_ptr (const_gimple gs, unsigned index)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.ni);
- return gimple_op_ptr (gs, index);
+ gcc_gimple_checking_assert (index < gs->gimple_asm.ni);
+ return gimple_op_ptr (gs, index + gs->gimple_asm.no);
}
@@ -2962,9 +2937,9 @@ static inline void
gimple_asm_set_input_op (gimple gs, unsigned index, tree in_op)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.ni
+ gcc_gimple_checking_assert (index < gs->gimple_asm.ni
&& TREE_CODE (in_op) == TREE_LIST);
- gimple_set_op (gs, index, in_op);
+ gimple_set_op (gs, index + gs->gimple_asm.no, in_op);
}
@@ -2974,8 +2949,8 @@ static inline tree
gimple_asm_output_op (const_gimple gs, unsigned index)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.no);
- return gimple_op (gs, index + gs->gimple_asm.ni);
+ gcc_gimple_checking_assert (index < gs->gimple_asm.no);
+ return gimple_op (gs, index);
}
/* Return a pointer to output operand INDEX of GIMPLE_ASM GS. */
@@ -2984,8 +2959,8 @@ static inline tree *
gimple_asm_output_op_ptr (const_gimple gs, unsigned index)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.no);
- return gimple_op_ptr (gs, index + gs->gimple_asm.ni);
+ gcc_gimple_checking_assert (index < gs->gimple_asm.no);
+ return gimple_op_ptr (gs, index);
}
@@ -2995,9 +2970,9 @@ static inline void
gimple_asm_set_output_op (gimple gs, unsigned index, tree out_op)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.no
+ gcc_gimple_checking_assert (index < gs->gimple_asm.no
&& TREE_CODE (out_op) == TREE_LIST);
- gimple_set_op (gs, index + gs->gimple_asm.ni, out_op);
+ gimple_set_op (gs, index, out_op);
}
@@ -3007,7 +2982,7 @@ static inline tree
gimple_asm_clobber_op (const_gimple gs, unsigned index)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.nc);
+ gcc_gimple_checking_assert (index < gs->gimple_asm.nc);
return gimple_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.no);
}
@@ -3018,7 +2993,7 @@ static inline void
gimple_asm_set_clobber_op (gimple gs, unsigned index, tree clobber_op)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.nc
+ gcc_gimple_checking_assert (index < gs->gimple_asm.nc
&& TREE_CODE (clobber_op) == TREE_LIST);
gimple_set_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.no, clobber_op);
}
@@ -3029,7 +3004,7 @@ static inline tree
gimple_asm_label_op (const_gimple gs, unsigned index)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.nl);
+ gcc_gimple_checking_assert (index < gs->gimple_asm.nl);
return gimple_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.nc);
}
@@ -3039,7 +3014,7 @@ static inline void
gimple_asm_set_label_op (gimple gs, unsigned index, tree label_op)
{
GIMPLE_CHECK (gs, GIMPLE_ASM);
- gcc_gimple_checking_assert (index <= gs->gimple_asm.nl
+ gcc_gimple_checking_assert (index < gs->gimple_asm.nl
&& TREE_CODE (label_op) == TREE_LIST);
gimple_set_op (gs, index + gs->gimple_asm.ni + gs->gimple_asm.nc, label_op);
}
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h
index 6c55da6..64177ce 100644
--- a/gcc/tree-flow-inline.h
+++ b/gcc/tree-flow-inline.h
@@ -580,9 +580,9 @@ op_iter_next_use (ssa_op_iter *ptr)
ptr->uses = ptr->uses->next;
return use_p;
}
- if (ptr->phi_i < ptr->num_phi)
+ if (ptr->i < ptr->numops)
{
- return PHI_ARG_DEF_PTR (ptr->phi_stmt, (ptr->phi_i)++);
+ return PHI_ARG_DEF_PTR (ptr->stmt, (ptr->i)++);
}
ptr->done = true;
return NULL_USE_OPERAND_P;
@@ -592,14 +592,33 @@ op_iter_next_use (ssa_op_iter *ptr)
static inline def_operand_p
op_iter_next_def (ssa_op_iter *ptr)
{
- def_operand_p def_p;
gcc_checking_assert (ptr->iter_type == ssa_op_iter_def);
- if (ptr->defs)
+ if (ptr->flags & SSA_OP_VDEF)
{
- def_p = DEF_OP_PTR (ptr->defs);
- ptr->defs = ptr->defs->next;
- return def_p;
+ tree *p;
+ ptr->flags &= ~SSA_OP_VDEF;
+ p = gimple_vdef_ptr (ptr->stmt);
+ if (p && *p)
+ return p;
}
+ if (ptr->flags & SSA_OP_DEF)
+ {
+ while (ptr->i < ptr->numops)
+ {
+ tree *val = gimple_op_ptr (ptr->stmt, ptr->i);
+ ptr->i++;
+ if (*val)
+ {
+ if (TREE_CODE (*val) == TREE_LIST)
+ val = &TREE_VALUE (*val);
+ if (TREE_CODE (*val) == SSA_NAME
+ || is_gimple_reg (*val))
+ return val;
+ }
+ }
+ ptr->flags &= ~SSA_OP_DEF;
+ }
+
ptr->done = true;
return NULL_DEF_OPERAND_P;
}
@@ -616,16 +635,32 @@ op_iter_next_tree (ssa_op_iter *ptr)
ptr->uses = ptr->uses->next;
return val;
}
- if (ptr->defs)
+ if (ptr->flags & SSA_OP_VDEF)
{
- val = DEF_OP (ptr->defs);
- ptr->defs = ptr->defs->next;
- return val;
+ ptr->flags &= ~SSA_OP_VDEF;
+ if ((val = gimple_vdef (ptr->stmt)))
+ return val;
+ }
+ if (ptr->flags & SSA_OP_DEF)
+ {
+ while (ptr->i < ptr->numops)
+ {
+ val = gimple_op (ptr->stmt, ptr->i);
+ ptr->i++;
+ if (val)
+ {
+ if (TREE_CODE (val) == TREE_LIST)
+ val = TREE_VALUE (val);
+ if (TREE_CODE (val) == SSA_NAME
+ || is_gimple_reg (val))
+ return val;
+ }
+ }
+ ptr->flags &= ~SSA_OP_DEF;
}
ptr->done = true;
return NULL_TREE;
-
}
@@ -636,13 +671,13 @@ op_iter_next_tree (ssa_op_iter *ptr)
static inline void
clear_and_done_ssa_iter (ssa_op_iter *ptr)
{
- ptr->defs = NULL;
+ ptr->i = 0;
+ ptr->numops = 0;
ptr->uses = NULL;
ptr->iter_type = ssa_op_iter_none;
- ptr->phi_i = 0;
- ptr->num_phi = 0;
- ptr->phi_stmt = NULL;
+ ptr->stmt = NULL;
ptr->done = true;
+ ptr->flags = 0;
}
/* Initialize the iterator PTR to the virtual defs in STMT. */
@@ -655,21 +690,34 @@ op_iter_init (ssa_op_iter *ptr, gimple stmt, int flags)
gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI
&& (!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF))
&& (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE)));
- ptr->defs = (flags & (SSA_OP_DEF|SSA_OP_VDEF)) ? gimple_def_ops (stmt) : NULL;
- if (!(flags & SSA_OP_VDEF)
- && ptr->defs
- && gimple_vdef (stmt) != NULL_TREE)
- ptr->defs = ptr->defs->next;
+ ptr->numops = 0;
+ if (flags & (SSA_OP_DEF | SSA_OP_VDEF))
+ {
+ switch (gimple_code (stmt))
+ {
+ case GIMPLE_ASSIGN:
+ case GIMPLE_CALL:
+ ptr->numops = 1;
+ break;
+ case GIMPLE_ASM:
+ ptr->numops = gimple_asm_noutputs (stmt);
+ break;
+ default:
+ ptr->numops = 0;
+ flags &= ~(SSA_OP_DEF | SSA_OP_VDEF);
+ break;
+ }
+ }
ptr->uses = (flags & (SSA_OP_USE|SSA_OP_VUSE)) ? gimple_use_ops (stmt) : NULL;
if (!(flags & SSA_OP_VUSE)
&& ptr->uses
&& gimple_vuse (stmt) != NULL_TREE)
ptr->uses = ptr->uses->next;
ptr->done = false;
+ ptr->i = 0;
- ptr->phi_i = 0;
- ptr->num_phi = 0;
- ptr->phi_stmt = NULL;
+ ptr->stmt = stmt;
+ ptr->flags = flags;
}
/* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
@@ -839,9 +887,10 @@ op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags)
return NULL_USE_OPERAND_P;
}
- ptr->phi_stmt = phi;
- ptr->num_phi = gimple_phi_num_args (phi);
+ ptr->stmt = phi;
+ ptr->numops = gimple_phi_num_args (phi);
ptr->iter_type = ssa_op_iter_use;
+ ptr->flags = flags;
return op_iter_next_use (ptr);
}
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 421b35e..ef4dba5 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -106,9 +106,6 @@ along with GCC; see the file COPYING3. If not see
/* Operand is in a place where opf_non_addressable does not apply. */
#define opf_not_non_addressable (1 << 4)
-/* Array for building all the def operands. */
-static VEC(tree,heap) *build_defs;
-
/* Array for building all the use operands. */
static VEC(tree,heap) *build_uses;
@@ -185,7 +182,6 @@ init_ssa_operands (struct function *fn)
{
if (!n_initialized++)
{
- build_defs = VEC_alloc (tree, heap, 5);
build_uses = VEC_alloc (tree, heap, 10);
build_vuse = NULL_TREE;
build_vdef = NULL_TREE;
@@ -210,13 +206,11 @@ fini_ssa_operands (void)
if (!--n_initialized)
{
- VEC_free (tree, heap, build_defs);
VEC_free (tree, heap, build_uses);
build_vdef = NULL_TREE;
build_vuse = NULL_TREE;
}
- gimple_ssa_operands (cfun)->free_defs = NULL;
gimple_ssa_operands (cfun)->free_uses = NULL;
while ((ptr = gimple_ssa_operands (cfun)->operand_memory) != NULL)
@@ -242,8 +236,7 @@ ssa_operand_alloc (unsigned size)
{
char *ptr;
- gcc_assert (size == sizeof (struct use_optype_d)
- || size == sizeof (struct def_optype_d));
+ gcc_assert (size == sizeof (struct use_optype_d));
if (gimple_ssa_operands (cfun)->operand_memory_index + size
>= gimple_ssa_operands (cfun)->ssa_operand_mem_size)
@@ -282,25 +275,6 @@ ssa_operand_alloc (unsigned size)
}
-/* Allocate a DEF operand. */
-
-static inline struct def_optype_d *
-alloc_def (void)
-{
- struct def_optype_d *ret;
- if (gimple_ssa_operands (cfun)->free_defs)
- {
- ret = gimple_ssa_operands (cfun)->free_defs;
- gimple_ssa_operands (cfun)->free_defs
- = gimple_ssa_operands (cfun)->free_defs->next;
- }
- else
- ret = (struct def_optype_d *)
- ssa_operand_alloc (sizeof (struct def_optype_d));
- return ret;
-}
-
-
/* Allocate a USE operand. */
static inline struct use_optype_d *
@@ -320,21 +294,6 @@ alloc_use (void)
}
-/* Adds OP to the list of defs after LAST. */
-
-static inline def_optype_p
-add_def_op (tree *op, def_optype_p last)
-{
- def_optype_p new_def;
-
- new_def = alloc_def ();
- DEF_OP_PTR (new_def) = op;
- last->next = new_def;
- new_def->next = NULL;
- return new_def;
-}
-
-
/* Adds OP to the list of uses of statement STMT after LAST. */
static inline use_optype_p
@@ -358,14 +317,6 @@ add_use_op (gimple stmt, tree *op, use_optype_p last)
static inline void
finalize_ssa_defs (gimple stmt)
{
- unsigned new_i;
- struct def_optype_d new_list;
- def_optype_p old_ops, last;
- unsigned int num = VEC_length (tree, build_defs);
-
- /* There should only be a single real definition per assignment. */
- gcc_assert ((stmt && gimple_code (stmt) != GIMPLE_ASSIGN) || num <= 1);
-
/* Pre-pend the vdef we may have built. */
if (build_vdef != NULL_TREE)
{
@@ -375,17 +326,8 @@ finalize_ssa_defs (gimple stmt)
oldvdef = SSA_NAME_VAR (oldvdef);
if (oldvdef != build_vdef)
gimple_set_vdef (stmt, build_vdef);
- VEC_safe_insert (tree, heap, build_defs, 0, (tree)gimple_vdef_ptr (stmt));
- ++num;
}
- new_list.next = NULL;
- last = &new_list;
-
- old_ops = gimple_def_ops (stmt);
-
- new_i = 0;
-
/* Clear and unlink a no longer necessary VDEF. */
if (build_vdef == NULL_TREE
&& gimple_vdef (stmt) != NULL_TREE)
@@ -405,30 +347,6 @@ finalize_ssa_defs (gimple stmt)
cfun->gimple_df->rename_vops = 1;
cfun->gimple_df->ssa_renaming_needed = 1;
}
-
- /* Check for the common case of 1 def that hasn't changed. */
- if (old_ops && old_ops->next == NULL && num == 1
- && (tree *) VEC_index (tree, build_defs, 0) == DEF_OP_PTR (old_ops))
- return;
-
- /* If there is anything in the old list, free it. */
- if (old_ops)
- {
- old_ops->next = gimple_ssa_operands (cfun)->free_defs;
- gimple_ssa_operands (cfun)->free_defs = old_ops;
- }
-
- /* If there is anything remaining in the build_defs list, simply emit it. */
- for ( ; new_i < num; new_i++)
- {
- tree *op = (tree *) VEC_index (tree, build_defs, new_i);
- if (DECL_P (*op))
- cfun->gimple_df->ssa_renaming_needed = 1;
- last = add_def_op (op, last);
- }
-
- /* Now set the stmt's operands. */
- gimple_set_def_ops (stmt, new_list.next);
}
@@ -488,8 +406,6 @@ finalize_ssa_uses (gimple stmt)
for (new_i = 0; new_i < VEC_length (tree, build_uses); new_i++)
{
tree *op = (tree *) VEC_index (tree, build_uses, new_i);
- if (DECL_P (*op))
- cfun->gimple_df->ssa_renaming_needed = 1;
last = add_use_op (stmt, op, last);
}
@@ -506,7 +422,6 @@ cleanup_build_arrays (void)
{
build_vdef = NULL_TREE;
build_vuse = NULL_TREE;
- VEC_truncate (tree, build_defs, 0);
VEC_truncate (tree, build_uses, 0);
}
@@ -527,22 +442,12 @@ finalize_ssa_stmt_operands (gimple stmt)
static inline void
start_ssa_stmt_operands (void)
{
- gcc_assert (VEC_length (tree, build_defs) == 0);
gcc_assert (VEC_length (tree, build_uses) == 0);
gcc_assert (build_vuse == NULL_TREE);
gcc_assert (build_vdef == NULL_TREE);
}
-/* Add DEF_P to the list of pointers to operands. */
-
-static inline void
-append_def (tree *def_p)
-{
- VEC_safe_push (tree, heap, build_defs, (tree) def_p);
-}
-
-
/* Add USE_P to the list of pointers to operands. */
static inline void
@@ -620,9 +525,11 @@ add_stmt_operand (tree *var_p, gimple stmt, int flags)
{
/* The variable is a GIMPLE register. Add it to real operands. */
if (flags & opf_def)
- append_def (var_p);
+ ;
else
append_use (var_p);
+ if (DECL_P (*var_p))
+ cfun->gimple_df->ssa_renaming_needed = 1;
}
else
{
@@ -669,15 +576,10 @@ mark_address_taken (tree ref)
STMT is the statement being processed, EXPR is the MEM_REF
that got us here.
- FLAGS is as in get_expr_operands.
-
- RECURSE_ON_BASE should be set to true if we want to continue
- calling get_expr_operands on the base pointer, and false if
- something else will do it for us. */
+ FLAGS is as in get_expr_operands. */
static void
-get_indirect_ref_operands (gimple stmt, tree expr, int flags,
- bool recurse_on_base)
+get_indirect_ref_operands (gimple stmt, tree expr, int flags)
{
tree *pptr = &TREE_OPERAND (expr, 0);
@@ -689,10 +591,9 @@ get_indirect_ref_operands (gimple stmt, tree expr, int flags,
add_virtual_operand (stmt, flags);
/* If requested, add a USE operand for the base pointer. */
- if (recurse_on_base)
- get_expr_operands (stmt, pptr,
- opf_non_addressable | opf_use
- | (flags & (opf_no_vops|opf_not_non_addressable)));
+ get_expr_operands (stmt, pptr,
+ opf_non_addressable | opf_use
+ | (flags & (opf_no_vops|opf_not_non_addressable)));
}
@@ -853,7 +754,7 @@ get_expr_operands (gimple stmt, tree *expr_p, int flags)
return;
case MEM_REF:
- get_indirect_ref_operands (stmt, expr, flags, true);
+ get_indirect_ref_operands (stmt, expr, flags);
return;
case TARGET_MEM_REF:
@@ -1126,31 +1027,6 @@ verify_ssa_operands (gimple stmt)
return true;
}
- FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_DEF)
- {
- FOR_EACH_VEC_ELT (tree, build_defs, i, def)
- {
- if (def_p == (tree *)def)
- {
- VEC_replace (tree, build_defs, i, NULL_TREE);
- break;
- }
- }
- if (i == VEC_length (tree, build_defs))
- {
- error ("excess def operand for stmt");
- debug_generic_expr (DEF_FROM_PTR (def_p));
- return true;
- }
- }
- FOR_EACH_VEC_ELT (tree, build_defs, i, def)
- if (def != NULL_TREE)
- {
- error ("def operand missing for stmt");
- debug_generic_expr (*(tree *)def);
- return true;
- }
-
if (gimple_has_volatile_ops (stmt) != volatile_p)
{
error ("stmt volatile flag not up-to-date");
@@ -1168,18 +1044,8 @@ verify_ssa_operands (gimple stmt)
void
free_stmt_operands (gimple stmt)
{
- def_optype_p defs = gimple_def_ops (stmt), last_def;
use_optype_p uses = gimple_use_ops (stmt), last_use;
- if (defs)
- {
- for (last_def = defs; last_def->next; last_def = last_def->next)
- continue;
- last_def->next = gimple_ssa_operands (cfun)->free_defs;
- gimple_ssa_operands (cfun)->free_defs = defs;
- gimple_set_def_ops (stmt, NULL);
- }
-
if (uses)
{
for (last_use = uses; last_use->next; last_use = last_use->next)
diff --git a/gcc/tree-ssa-operands.h b/gcc/tree-ssa-operands.h
index 76a8bd8..ccacd28 100644
--- a/gcc/tree-ssa-operands.h
+++ b/gcc/tree-ssa-operands.h
@@ -34,14 +34,6 @@ typedef ssa_use_operand_t *use_operand_p;
#define NULL_USE_OPERAND_P ((use_operand_p)NULL)
#define NULL_DEF_OPERAND_P ((def_operand_p)NULL)
-/* This represents the DEF operands of a stmt. */
-struct def_optype_d
-{
- struct def_optype_d *next;
- tree *def_ptr;
-};
-typedef struct def_optype_d *def_optype_p;
-
/* This represents the USE operands of a stmt. */
struct use_optype_d
{
@@ -68,7 +60,6 @@ struct GTY(()) ssa_operands {
bool ops_active;
- struct def_optype_d * GTY ((skip (""))) free_defs;
struct use_optype_d * GTY ((skip (""))) free_uses;
};
@@ -82,9 +73,6 @@ struct GTY(()) ssa_operands {
#define USE_OP_PTR(OP) (&((OP)->use_ptr))
#define USE_OP(OP) (USE_FROM_PTR (USE_OP_PTR (OP)))
-#define DEF_OP_PTR(OP) ((OP)->def_ptr)
-#define DEF_OP(OP) (DEF_FROM_PTR (DEF_OP_PTR (OP)))
-
#define PHI_RESULT_PTR(PHI) gimple_phi_result_ptr (PHI)
#define PHI_RESULT(PHI) DEF_FROM_PTR (PHI_RESULT_PTR (PHI))
#define SET_PHI_RESULT(PHI, V) SET_DEF (PHI_RESULT_PTR (PHI), (V))
@@ -133,13 +121,13 @@ enum ssa_op_iter_type {
typedef struct ssa_operand_iterator_d
{
- bool done;
enum ssa_op_iter_type iter_type;
- def_optype_p defs;
+ bool done;
+ int flags;
+ unsigned i;
+ unsigned numops;
use_optype_p uses;
- int phi_i;
- int num_phi;
- gimple phi_stmt;
+ gimple stmt;
} ssa_op_iter;
/* These flags are used to determine which operands are returned during