Commit 7d4cdbd4 by Richard Biener Committed by Richard Biener

tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): Properly handle…

tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p): Properly handle DECL_BIT_FIELD_REPRESENTATIVE occuring as COMPONENT_REF operand.

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.

From-SVN: r237818
parent e9ac1f86
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.
......
......@@ -1808,6 +1808,11 @@ start_bitfield_representative (tree field)
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;
}
......
......@@ -929,13 +929,20 @@ nonoverlapping_component_refs_of_decl_p (tree ref1, tree ref2)
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;
}
}
......@@ -1031,9 +1038,20 @@ nonoverlapping_component_refs_p (const_tree x, const_tree y)
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))
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment