Commit f0286f95 by Bill Schmidt Committed by William Schmidt

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
parent 8efab2c5
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.
...@@ -832,6 +832,69 @@ copy_mem_ref_info (tree to, tree from) ...@@ -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. */
......
...@@ -6278,64 +6278,6 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data, ...@@ -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
......
...@@ -5777,6 +5777,7 @@ tree target_for_debug_bind (tree); ...@@ -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);
......
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