diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2011-10-11 18:39:51 +0000 |
---|---|---|
committer | William Schmidt <wschmidt@gcc.gnu.org> | 2011-10-11 18:39:51 +0000 |
commit | f0286f957326b588ba6f49d1fed0c14c19033830 (patch) | |
tree | 803e8c8cc1dd3344c6f689cf8f616f8cd19d145f /gcc/tree-ssa-address.c | |
parent | 8efab2c5eafbe0e3d43dccd13cbc57f62a4e672f (diff) | |
download | gcc-f0286f957326b588ba6f49d1fed0c14c19033830.zip gcc-f0286f957326b588ba6f49d1fed0c14c19033830.tar.gz gcc-f0286f957326b588ba6f49d1fed0c14c19033830.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-address.c')
-rw-r--r-- | gcc/tree-ssa-address.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c index 34479b3..2727ea4 100644 --- a/gcc/tree-ssa-address.c +++ b/gcc/tree-ssa-address.c @@ -832,6 +832,69 @@ copy_mem_ref_info (tree to, tree 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 mem ref if anything changes, NULL_TREE otherwise. */ |