diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2012-11-18 17:31:38 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2012-11-18 17:31:38 +0000 |
commit | a787ccc38817dac21d8b09fd180f17028d0ee19b (patch) | |
tree | 83179683634ebcdb0a796f5d430da437a6d28e8b /gcc | |
parent | 3808f68ef811f22a3fd2dc0c8507b9b3e3dadb4e (diff) | |
download | gcc-a787ccc38817dac21d8b09fd180f17028d0ee19b.zip gcc-a787ccc38817dac21d8b09fd180f17028d0ee19b.tar.gz gcc-a787ccc38817dac21d8b09fd180f17028d0ee19b.tar.bz2 |
expr.c (expand_assignment): Don't set MEM_KEEP_ALIAS_SET_P here.
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.
From-SVN: r193599
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 32 | ||||
-rw-r--r-- | 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 <rdsandiford@googlemail.com> + + * 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 <doko@ubuntu.com> * 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. */ @@ -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, |