tree.h (copy_ref_info): Expose existing function.

2011-10-11  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	* tree.h (copy_ref_info): Expose existing function.
	* tree-ssa-loop-ivopts.c (copy_ref_info): Move function to...
	* tree-ssa-address.c (copy_ref_info): ...here, and remove static token.

From-SVN: r179818
This commit is contained in:
Bill Schmidt 2011-10-11 18:39:51 +00:00 committed by William Schmidt
parent 8efab2c5ea
commit f0286f9573
4 changed files with 70 additions and 58 deletions

View File

@ -1,3 +1,9 @@
2011-10-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* tree.h (copy_ref_info): Expose existing function.
* tree-ssa-loop-ivopts.c (copy_ref_info): Move function to...
* tree-ssa-address.c (copy_ref_info): ...here, and remove static token.
2011-10-11 Georg-Johann Lay <avr@gjlay.de> 2011-10-11 Georg-Johann Lay <avr@gjlay.de>
* config/avr/avr-protos.h (avr_mode_code_base_reg_class): New prototype. * config/avr/avr-protos.h (avr_mode_code_base_reg_class): New prototype.

View File

@ -832,6 +832,69 @@ copy_mem_ref_info (tree to, tree from)
TREE_THIS_VOLATILE (to) = TREE_THIS_VOLATILE (from); TREE_THIS_VOLATILE (to) = TREE_THIS_VOLATILE (from);
} }
/* Copies the reference information from OLD_REF to NEW_REF, where
NEW_REF should be either a MEM_REF or a TARGET_MEM_REF. */
void
copy_ref_info (tree new_ref, tree old_ref)
{
tree new_ptr_base = NULL_TREE;
gcc_assert (TREE_CODE (new_ref) == MEM_REF
|| TREE_CODE (new_ref) == TARGET_MEM_REF);
TREE_SIDE_EFFECTS (new_ref) = TREE_SIDE_EFFECTS (old_ref);
TREE_THIS_VOLATILE (new_ref) = TREE_THIS_VOLATILE (old_ref);
new_ptr_base = TREE_OPERAND (new_ref, 0);
/* We can transfer points-to information from an old pointer
or decl base to the new one. */
if (new_ptr_base
&& TREE_CODE (new_ptr_base) == SSA_NAME
&& !SSA_NAME_PTR_INFO (new_ptr_base))
{
tree base = get_base_address (old_ref);
if (!base)
;
else if ((TREE_CODE (base) == MEM_REF
|| TREE_CODE (base) == TARGET_MEM_REF)
&& TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
&& SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)))
{
struct ptr_info_def *new_pi;
duplicate_ssa_name_ptr_info
(new_ptr_base, SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)));
new_pi = SSA_NAME_PTR_INFO (new_ptr_base);
/* We have to be careful about transfering alignment information. */
if (TREE_CODE (old_ref) == MEM_REF
&& !(TREE_CODE (new_ref) == TARGET_MEM_REF
&& (TMR_INDEX2 (new_ref)
|| (TMR_STEP (new_ref)
&& (TREE_INT_CST_LOW (TMR_STEP (new_ref))
< new_pi->align)))))
{
new_pi->misalign += double_int_sub (mem_ref_offset (old_ref),
mem_ref_offset (new_ref)).low;
new_pi->misalign &= (new_pi->align - 1);
}
else
{
new_pi->align = 1;
new_pi->misalign = 0;
}
TREE_THIS_NOTRAP (new_ref) = TREE_THIS_NOTRAP (base);
}
else if (TREE_CODE (base) == VAR_DECL
|| TREE_CODE (base) == PARM_DECL
|| TREE_CODE (base) == RESULT_DECL)
{
struct ptr_info_def *pi = get_ptr_info (new_ptr_base);
pt_solution_set_var (&pi->pt, base);
}
}
}
/* Move constants in target_mem_ref REF to offset. Returns the new target /* Move constants in target_mem_ref REF to offset. Returns the new target
mem ref if anything changes, NULL_TREE otherwise. */ mem ref if anything changes, NULL_TREE otherwise. */

View File

@ -6278,64 +6278,6 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
} }
} }
/* Copies the reference information from OLD_REF to NEW_REF. */
static void
copy_ref_info (tree new_ref, tree old_ref)
{
tree new_ptr_base = NULL_TREE;
TREE_SIDE_EFFECTS (new_ref) = TREE_SIDE_EFFECTS (old_ref);
TREE_THIS_VOLATILE (new_ref) = TREE_THIS_VOLATILE (old_ref);
new_ptr_base = TREE_OPERAND (new_ref, 0);
/* We can transfer points-to information from an old pointer
or decl base to the new one. */
if (new_ptr_base
&& TREE_CODE (new_ptr_base) == SSA_NAME
&& !SSA_NAME_PTR_INFO (new_ptr_base))
{
tree base = get_base_address (old_ref);
if (!base)
;
else if ((TREE_CODE (base) == MEM_REF
|| TREE_CODE (base) == TARGET_MEM_REF)
&& TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME
&& SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)))
{
struct ptr_info_def *new_pi;
duplicate_ssa_name_ptr_info
(new_ptr_base, SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)));
new_pi = SSA_NAME_PTR_INFO (new_ptr_base);
/* We have to be careful about transfering alignment information. */
if (TREE_CODE (old_ref) == MEM_REF
&& !(TREE_CODE (new_ref) == TARGET_MEM_REF
&& (TMR_INDEX2 (new_ref)
|| (TMR_STEP (new_ref)
&& (TREE_INT_CST_LOW (TMR_STEP (new_ref))
< new_pi->align)))))
{
new_pi->misalign += double_int_sub (mem_ref_offset (old_ref),
mem_ref_offset (new_ref)).low;
new_pi->misalign &= (new_pi->align - 1);
}
else
{
new_pi->align = 1;
new_pi->misalign = 0;
}
}
else if (TREE_CODE (base) == VAR_DECL
|| TREE_CODE (base) == PARM_DECL
|| TREE_CODE (base) == RESULT_DECL)
{
struct ptr_info_def *pi = get_ptr_info (new_ptr_base);
pt_solution_set_var (&pi->pt, base);
}
}
}
/* Performs a peephole optimization to reorder the iv update statement with /* Performs a peephole optimization to reorder the iv update statement with
a mem ref to enable instruction combining in later phases. The mem ref uses a mem ref to enable instruction combining in later phases. The mem ref uses
the iv value before the update, so the reordering transformation requires the iv value before the update, so the reordering transformation requires

View File

@ -5777,6 +5777,7 @@ tree target_for_debug_bind (tree);
/* In tree-ssa-address.c. */ /* In tree-ssa-address.c. */
extern tree tree_mem_ref_addr (tree, tree); extern tree tree_mem_ref_addr (tree, tree);
extern void copy_mem_ref_info (tree, tree); extern void copy_mem_ref_info (tree, tree);
extern void copy_ref_info (tree, tree);
/* In tree-vrp.c */ /* In tree-vrp.c */
extern bool ssa_name_nonnegative_p (const_tree); extern bool ssa_name_nonnegative_p (const_tree);