From 50ba3acc9c05989e13d5f6dbf86bd8330741611f Mon Sep 17 00:00:00 2001 From: rsandifo Date: Sun, 18 Nov 2012 17:31:38 +0000 Subject: [PATCH] gcc/ * expr.c (expand_assignment): Don't set MEM_KEEP_ALIAS_SET_P here. * emit-rtl.c (set_mem_attributes_minus_bitpos): Handle DECL_BIT_FIELDs, using their size instead of the COMPONENT_REF's. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193599 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/emit-rtl.c | 32 ++++++++++++-------------------- gcc/expr.c | 2 -- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b6b063b..b9d7a75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-11-18 Richard Sandiford + + * expr.c (expand_assignment): Don't set MEM_KEEP_ALIAS_SET_P here. + * emit-rtl.c (set_mem_attributes_minus_bitpos): Handle DECL_BIT_FIELDs, + using their size instead of the COMPONENT_REF's. + 2012-11-17 Matthias Klose * config/mips/t-linux64: Add multiarch names in MULTILIB_OSDIRNAMES. diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index aac9b67..e16215d 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1678,11 +1678,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, attrs.align = MAX (attrs.align, TYPE_ALIGN (type)); /* If the size is known, we can set that. */ - if (TYPE_SIZE_UNIT (type) && host_integerp (TYPE_SIZE_UNIT (type), 1)) - { - attrs.size_known_p = true; - attrs.size = tree_low_cst (TYPE_SIZE_UNIT (type), 1); - } + tree new_size = TYPE_SIZE_UNIT (type); /* If T is not a type, we may be able to deduce some more information about the expression. */ @@ -1741,13 +1737,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, attrs.offset_known_p = true; attrs.offset = 0; apply_bitpos = bitpos; - if (DECL_SIZE_UNIT (t) && host_integerp (DECL_SIZE_UNIT (t), 1)) - { - attrs.size_known_p = true; - attrs.size = tree_low_cst (DECL_SIZE_UNIT (t), 1); - } - else - attrs.size_known_p = false; + new_size = DECL_SIZE_UNIT (t); attrs.align = DECL_ALIGN (t); align_computed = true; } @@ -1762,19 +1752,15 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, align_computed = true; } - /* If this is a field reference and not a bit-field, record it. */ - /* ??? There is some information that can be gleaned from bit-fields, - such as the word offset in the structure that might be modified. - But skip it for now. */ - else if (TREE_CODE (t) == COMPONENT_REF - && ! DECL_BIT_FIELD (TREE_OPERAND (t, 1))) + /* If this is a field reference, record it. */ + else if (TREE_CODE (t) == COMPONENT_REF) { attrs.expr = t; attrs.offset_known_p = true; attrs.offset = 0; apply_bitpos = bitpos; - /* ??? Any reason the field size would be different than - the size we got from the type? */ + if (DECL_BIT_FIELD (TREE_OPERAND (t, 1))) + new_size = DECL_SIZE_UNIT (TREE_OPERAND (t, 1)); } /* If this is an array reference, look for an outer field reference. */ @@ -1860,6 +1846,12 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, else as = TYPE_ADDR_SPACE (type); + if (host_integerp (new_size, 1)) + { + attrs.size_known_p = true; + attrs.size = tree_low_cst (new_size, 1); + } + /* If we modified OFFSET based on T, then subtract the outstanding bit position offset. Similarly, increase the size of the accessed object to contain the negative offset. */ diff --git a/gcc/expr.c b/gcc/expr.c index d1da390..48e2581 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -4818,8 +4818,6 @@ expand_assignment (tree to, tree from, bool nontemporal) done for MEM. Also set MEM_KEEP_ALIAS_SET_P if needed. */ if (volatilep) MEM_VOLATILE_P (to_rtx) = 1; - if (component_uses_parent_alias_set (to)) - MEM_KEEP_ALIAS_SET_P (to_rtx) = 1; } if (optimize_bitfield_assignment_op (bitsize, bitpos, -- 2.7.4