summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-alias.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-10 14:10:57 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-10 14:10:57 +0000
commit608927af6397cf6f7171a014c65f462ff60306ec (patch)
treefbc36a8e81a99186a057a1438ffb4e9d47919bfc /gcc/tree-ssa-alias.c
parent74ad6d83e4e7e6164825d157a48ed8034f8bd45a (diff)
downloadgcc-608927af6397cf6f7171a014c65f462ff60306ec.tar.gz
2014-06-10 Richard Biener <rguenther@suse.de>
PR middle-end/61456 * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): Do not use the main variant for the type comparison. (ncr_compar): Likewise. (nonoverlapping_component_refs_p): Likewise. * g++.dg/opt/pr61456.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211411 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r--gcc/tree-ssa-alias.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index f18cb486f20..5cc9cb58f75 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -835,8 +835,8 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
/* ??? We cannot simply use the type of operand #0 of the refs here
as the Fortran compiler smuggles type punning into COMPONENT_REFs
for common blocks instead of using unions like everyone else. */
- tree type1 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field1));
- tree type2 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field2));
+ tree type1 = DECL_CONTEXT (field1);
+ tree type2 = DECL_CONTEXT (field2);
/* We cannot disambiguate fields in a union or qualified union. */
if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE)
@@ -866,10 +866,8 @@ 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)));
+ unsigned int uid1 = TYPE_UID (DECL_FIELD_CONTEXT (field1));
+ unsigned int uid2 = TYPE_UID (DECL_FIELD_CONTEXT (field2));
if (uid1 < uid2)
return -1;
else if (uid1 > uid2)
@@ -893,7 +891,7 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y)
while (TREE_CODE (x) == COMPONENT_REF)
{
tree field = TREE_OPERAND (x, 1);
- tree type = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field));
+ tree type = DECL_FIELD_CONTEXT (field);
if (TREE_CODE (type) == RECORD_TYPE)
fieldsx.safe_push (field);
x = TREE_OPERAND (x, 0);
@@ -904,7 +902,7 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y)
while (TREE_CODE (y) == COMPONENT_REF)
{
tree field = TREE_OPERAND (y, 1);
- tree type = TYPE_MAIN_VARIANT (DECL_FIELD_CONTEXT (field));
+ tree type = DECL_FIELD_CONTEXT (field);
if (TREE_CODE (type) == RECORD_TYPE)
fieldsy.safe_push (TREE_OPERAND (y, 1));
y = TREE_OPERAND (y, 0);
@@ -915,8 +913,8 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y)
/* 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])))
+ return ((DECL_FIELD_CONTEXT (fieldsx[0])
+ == DECL_FIELD_CONTEXT (fieldsy[0]))
&& fieldsx[0] != fieldsy[0]
&& !(DECL_BIT_FIELD (fieldsx[0]) && DECL_BIT_FIELD (fieldsy[0])));
@@ -949,8 +947,8 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y)
{
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));
+ tree typex = DECL_FIELD_CONTEXT (fieldx);
+ tree typey = DECL_FIELD_CONTEXT (fieldy);
if (typex == typey)
{
/* We're left with accessing different fields of a structure,