diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-06-10 14:10:57 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-06-10 14:10:57 +0000 |
commit | 608927af6397cf6f7171a014c65f462ff60306ec (patch) | |
tree | fbc36a8e81a99186a057a1438ffb4e9d47919bfc /gcc/tree-ssa-alias.c | |
parent | 74ad6d83e4e7e6164825d157a48ed8034f8bd45a (diff) | |
download | gcc-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.c | 22 |
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, |