summaryrefslogtreecommitdiff
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-04-15 16:04:11 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-04-15 16:04:11 +0000
commitf270d2a043d99c263a0af840a012bd1ef11fbd2e (patch)
treeac84e759ec57e0db2ae1879fdf728930ca885649 /gcc/alias.c
parent7c97e5c249331544f09d118512899c4a1e5728cc (diff)
downloadgcc-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.c124
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);
}