re PR tree-optimization/34683 (SSA rewriting in the loop unroller causes quadratic behavior)

2008-01-08  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/34683
	* tree-ssa-operands.c (operand_build_cmp): Export.
	* tree-ssa-operands.h (operand_build_cmp): Declare.
	* tree-vn.c (vuses_compare): Remove.
	(sort_vuses): Use operand_build_cmp.
	(sort_vuses_heap): Likewise.
	* tree-ssa-sccvn.c (vuses_to_vec): Use VEC_reserve, not VEC_alloc
	to re-use old VEC if available.  Do not sort already sorted VUSEs.
	(vdefs_to_vec): Do not sort already sorted VDEFs.

From-SVN: r131400
This commit is contained in:
Richard Guenther 2008-01-08 16:29:14 +00:00 committed by Richard Biener
parent 0f3e711eef
commit a9990582a8
5 changed files with 18 additions and 23 deletions

View File

@ -1,3 +1,15 @@
2008-01-08 Richard Guenther <rguenther@suse.de>
PR tree-optimization/34683
* tree-ssa-operands.c (operand_build_cmp): Export.
* tree-ssa-operands.h (operand_build_cmp): Declare.
* tree-vn.c (vuses_compare): Remove.
(sort_vuses): Use operand_build_cmp.
(sort_vuses_heap): Likewise.
* tree-ssa-sccvn.c (vuses_to_vec): Use VEC_reserve, not VEC_alloc
to re-use old VEC if available. Do not sort already sorted VUSEs.
(vdefs_to_vec): Do not sort already sorted VDEFs.
2008-01-08 Jakub Jelinek <jakub@redhat.com>
PR middle-end/34694

View File

@ -210,7 +210,7 @@ get_name_decl (const_tree t)
/* Comparison function for qsort used in operand_build_sort_virtual. */
static int
int
operand_build_cmp (const void *p, const void *q)
{
const_tree const e1 = *((const_tree const *)p);

View File

@ -210,6 +210,7 @@ extern void free_stmt_operands (tree);
extern bool verify_imm_links (FILE *f, tree var);
extern void copy_virtual_operands (tree, tree);
extern int operand_build_cmp (const void *, const void *);
extern void create_ssa_artificial_load_stmt (tree, tree, bool);
extern void dump_immediate_uses (FILE *file);

View File

@ -389,13 +389,11 @@ vuses_to_vec (tree stmt, VEC (tree, gc) **result)
if (!stmt)
return;
*result = VEC_alloc (tree, gc, num_ssa_operands (stmt, SSA_OP_VIRTUAL_USES));
VEC_reserve_exact (tree, gc, *result,
num_ssa_operands (stmt, SSA_OP_VIRTUAL_USES));
FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VIRTUAL_USES)
VEC_quick_push (tree, *result, vuse);
if (VEC_length (tree, *result) > 1)
sort_vuses (*result);
}
@ -427,9 +425,6 @@ vdefs_to_vec (tree stmt, VEC (tree, gc) **result)
FOR_EACH_SSA_TREE_OPERAND (vdef, stmt, iter, SSA_OP_VIRTUAL_DEFS)
VEC_quick_push (tree, *result, vdef);
if (VEC_length (tree, *result) > 1)
sort_vuses (*result);
}
/* Copy the names of vdef results in STMT into a vector, and return

View File

@ -107,19 +107,6 @@ set_value_handle (tree e, tree v)
gcc_assert (is_gimple_min_invariant (e));
}
/* A comparison function for use in qsort to compare vuses. Simply
subtracts version numbers. */
static int
vuses_compare (const void *pa, const void *pb)
{
const tree vusea = *((const tree *)pa);
const tree vuseb = *((const tree *)pb);
int sn = SSA_NAME_VERSION (vusea) - SSA_NAME_VERSION (vuseb);
return sn;
}
/* Print out the "Created value <x> for <Y>" statement to the
dump_file.
This is factored because both versions of lookup use it, and it
@ -161,7 +148,7 @@ sort_vuses (VEC (tree,gc) *vuses)
qsort (VEC_address (tree, vuses),
VEC_length (tree, vuses),
sizeof (tree),
vuses_compare);
operand_build_cmp);
}
/* Sort the VUSE array so that we can do equality comparisons
@ -174,7 +161,7 @@ sort_vuses_heap (VEC (tree,heap) *vuses)
qsort (VEC_address (tree, vuses),
VEC_length (tree, vuses),
sizeof (tree),
vuses_compare);
operand_build_cmp);
}
/* Insert EXPR into VALUE_TABLE with value VAL, and add expression
EXPR to the value set for value VAL. */