+2016-06-28 Richard Biener <rguenther@suse.de>
+
+ * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
+ Properly handle DECL_BIT_FIELD_REPRESENTATIVE occuring as
+ COMPONENT_REF operand.
+ (nonoverlapping_component_refs_p): Likewise.
+ * stor-layout.c (start_bitfield_representative): Mark
+ DECL_BIT_FIELD_REPRESENTATIVE as DECL_NONADDRESSABLE_P.
+
2016-06-28 Jakub Jelinek <jakub@redhat.com>
* Makefile.in: Don't cat ../stage_current if it does not exist.
DECL_SIZE_UNIT (repr) = DECL_SIZE_UNIT (field);
DECL_PACKED (repr) = DECL_PACKED (field);
DECL_CONTEXT (repr) = DECL_CONTEXT (field);
+ /* There are no indirect accesses to this field. If we introduce
+ some then they have to use the record alias set. This makes
+ sure to properly conflict with [indirect] accesses to addressable
+ fields of the bitfield group. */
+ DECL_NONADDRESSABLE_P (repr) = 1;
return repr;
}
if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE)
goto may_overlap;
- /* Different fields of the same record type cannot overlap.
- ??? Bitfields can overlap at RTL level so punt on them. */
if (field1 != field2)
{
component_refs1.release ();
component_refs2.release ();
- return !(DECL_BIT_FIELD (field1) && DECL_BIT_FIELD (field2));
+ /* A field and its representative need to be considered the
+ same. */
+ if (DECL_BIT_FIELD_REPRESENTATIVE (field1) == field2
+ || DECL_BIT_FIELD_REPRESENTATIVE (field2) == field1)
+ return false;
+ /* Different fields of the same record type cannot overlap.
+ ??? Bitfields can overlap at RTL level so punt on them. */
+ if (DECL_BIT_FIELD (field1) && DECL_BIT_FIELD (field2))
+ return false;
+ return true;
}
}
if (typex == typey)
{
/* We're left with accessing different fields of a structure,
- no possible overlap, unless they are both bitfields. */
+ no possible overlap. */
if (fieldx != fieldy)
- return !(DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy));
+ {
+ /* A field and its representative need to be considered the
+ same. */
+ if (DECL_BIT_FIELD_REPRESENTATIVE (fieldx) == fieldy
+ || DECL_BIT_FIELD_REPRESENTATIVE (fieldy) == fieldx)
+ return false;
+ /* Different fields of the same record type cannot overlap.
+ ??? Bitfields can overlap at RTL level so punt on them. */
+ if (DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy))
+ return false;
+ return true;
+ }
}
if (TYPE_UID (typex) < TYPE_UID (typey))
{