diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-04-15 16:04:11 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-04-15 16:04:11 +0000 |
commit | f270d2a043d99c263a0af840a012bd1ef11fbd2e (patch) | |
tree | ac84e759ec57e0db2ae1879fdf728930ca885649 /gcc/alias.c | |
parent | 7c97e5c249331544f09d118512899c4a1e5728cc (diff) | |
download | gcc-f270d2a043d99c263a0af840a012bd1ef11fbd2e.tar.gz |
2014-04-15 Richard Biener <rguenther@suse.de>
PR rtl-optimization/56965
* alias.c (ncr_compar, nonoverlapping_component_refs_p): Move ...
* tree-ssa-alias.c (ncr_compar, nonoverlapping_component_refs_p):
... here.
* alias.c (true_dependence_1): Do not call
nonoverlapping_component_refs_p.
* tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Call
nonoverlapping_component_refs_p.
(indirect_refs_may_alias_p): Likewise.
* gcc.dg/torture/pr56965-1.c: New testcase.
* gcc.dg/torture/pr56965-2.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209423 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 124 |
1 files changed, 0 insertions, 124 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index 4b32fcb027b..5f374029193 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -157,7 +157,6 @@ static rtx find_base_value (rtx); static int mems_in_disjoint_alias_sets_p (const_rtx, const_rtx); static int insert_subset_children (splay_tree_node, void*); static alias_set_entry get_alias_set_entry (alias_set_type); -static bool nonoverlapping_component_refs_p (const_rtx, const_rtx); static tree decl_for_component_ref (tree); static int write_dependence_p (const_rtx, const_rtx, enum machine_mode, rtx, @@ -2248,126 +2247,6 @@ read_dependence (const_rtx mem, const_rtx x) return false; } -/* qsort compare function to sort FIELD_DECLs after their - DECL_FIELD_CONTEXT TYPE_UID. */ - -static inline int -ncr_compar (const void *field1_, const void *field2_) -{ - const_tree field1 = *(const_tree *) const_cast <void *>(field1_); - const_tree field2 = *(const_tree *) const_cast <void *>(field2_); - unsigned int uid1 - = TYPE_UID (TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field1))); - unsigned int uid2 - = TYPE_UID (TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field2))); - if (uid1 < uid2) - return -1; - else if (uid1 > uid2) - return 1; - return 0; -} - -/* Return true if we can determine that the fields referenced cannot - overlap for any pair of objects. */ - -static bool -nonoverlapping_component_refs_p (const_rtx rtlx, const_rtx rtly) -{ - const_tree x = MEM_EXPR (rtlx), y = MEM_EXPR (rtly); - - if (!flag_strict_aliasing - || !x || !y - || TREE_CODE (x) != COMPONENT_REF - || TREE_CODE (y) != COMPONENT_REF) - return false; - - auto_vec<const_tree, 16> fieldsx; - while (TREE_CODE (x) == COMPONENT_REF) - { - tree field = TREE_OPERAND (x, 1); - tree type = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field)); - if (TREE_CODE (type) == RECORD_TYPE) - fieldsx.safe_push (field); - x = TREE_OPERAND (x, 0); - } - if (fieldsx.length () == 0) - return false; - auto_vec<const_tree, 16> fieldsy; - while (TREE_CODE (y) == COMPONENT_REF) - { - tree field = TREE_OPERAND (y, 1); - tree type = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field)); - if (TREE_CODE (type) == RECORD_TYPE) - fieldsy.safe_push (TREE_OPERAND (y, 1)); - y = TREE_OPERAND (y, 0); - } - if (fieldsy.length () == 0) - return false; - - /* Most common case first. */ - if (fieldsx.length () == 1 - && fieldsy.length () == 1) - return ((TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldsx[0])) - == TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldsy[0]))) - && fieldsx[0] != fieldsy[0] - && !(DECL_BIT_FIELD (fieldsx[0]) && DECL_BIT_FIELD (fieldsy[0]))); - - if (fieldsx.length () == 2) - { - if (ncr_compar (&fieldsx[0], &fieldsx[1]) == 1) - { - const_tree tem = fieldsx[0]; - fieldsx[0] = fieldsx[1]; - fieldsx[1] = tem; - } - } - else - fieldsx.qsort (ncr_compar); - - if (fieldsy.length () == 2) - { - if (ncr_compar (&fieldsy[0], &fieldsy[1]) == 1) - { - const_tree tem = fieldsy[0]; - fieldsy[0] = fieldsy[1]; - fieldsy[1] = tem; - } - } - else - fieldsy.qsort (ncr_compar); - - unsigned i = 0, j = 0; - do - { - const_tree fieldx = fieldsx[i]; - const_tree fieldy = fieldsy[j]; - tree typex = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldx)); - tree typey = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (fieldy)); - if (typex == typey) - { - /* We're left with accessing different fields of a structure, - no possible overlap, unless they are both bitfields. */ - if (fieldx != fieldy) - return !(DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy)); - } - if (TYPE_UID (typex) < TYPE_UID (typey)) - { - i++; - if (i == fieldsx.length ()) - break; - } - else - { - j++; - if (j == fieldsy.length ()) - break; - } - } - while (1); - - return false; -} - /* Look at the bottom of the COMPONENT_REF list for a DECL, and return it. */ static tree @@ -2643,9 +2522,6 @@ true_dependence_1 (const_rtx mem, enum machine_mode mem_mode, rtx mem_addr, if (nonoverlapping_memrefs_p (mem, x, false)) return 0; - if (nonoverlapping_component_refs_p (mem, x)) - return 0; - return rtx_refs_may_alias_p (x, mem, true); } |