This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix alias machinery to deal with DECL_BIT_FIELD_REPRESENTATIVE in COMPONENT_REFs


The following patch is necessary to make DECL_BIT_FIELD_REPRESENTATIVE
useable in COMPONENT_REFs (which is the easiest way to get
some bitfield lowering).

An earlier patch passed bootstrapped and testing on 
x86_64-unknown-linux-gnu (with bitfield lowering), re-testing
after minor changes.

2013-11-11  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.
	* alias.c (nonoverlapping_component_refs_p): Likewise.
	* stor-layout.c (start_bitfield_representative): Mark
	DECL_BIT_FIELD_REPRESENTATIVE as DECL_NONADDRESSABLE_P.

Index: gcc/tree-ssa-alias.c
===================================================================
*** gcc/tree-ssa-alias.c.orig	2013-11-11 10:32:25.000000000 +0100
--- gcc/tree-ssa-alias.c	2013-11-11 11:35:16.042386275 +0100
*************** nonoverlapping_component_refs_of_decl_p
*** 829,841 ****
        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));
  	}
      }
  
--- 829,848 ----
        if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE)
  	 goto may_overlap;
  
        if (field1 != field2)
  	{
  	  component_refs1.release ();
  	  component_refs2.release ();
! 	  /* 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;
  	}
      }
  
Index: gcc/stor-layout.c
===================================================================
*** gcc/stor-layout.c.orig	2013-11-11 12:05:16.000000000 +0100
--- gcc/stor-layout.c	2013-11-11 13:42:14.947161958 +0100
*************** start_bitfield_representative (tree fiel
*** 1747,1752 ****
--- 1747,1757 ----
    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;
  }
  
Index: gcc/alias.c
===================================================================
*** gcc/alias.c.orig	2013-11-11 15:29:12.000000000 +0100
--- gcc/alias.c	2013-11-11 15:29:17.054068720 +0100
*************** nonoverlapping_component_refs_p (const_r
*** 2302,2310 ****
  
      found:
        /* If we're left with accessing different fields of a structure, then no
! 	 possible overlap, unless they are both bitfields.  */
        if (TREE_CODE (typex) == RECORD_TYPE && fieldx != fieldy)
! 	return !(DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy));
  
        /* The comparison on the current field failed.  If we're accessing
  	 a very nested structure, look at the next outer level.  */
--- 2302,2316 ----
  
      found:
        /* If we're left with accessing different fields of a structure, then no
! 	 possible overlap, unless they are both bitfields or one is
! 	 the representative of the other.  */
        if (TREE_CODE (typex) == RECORD_TYPE && fieldx != fieldy)
! 	{
! 	  if (DECL_BIT_FIELD_REPRESENTATIVE (fieldx) == fieldy
! 	      || DECL_BIT_FIELD_REPRESENTATIVE (fieldy) == fieldx)
! 	    return false;
! 	  return !(DECL_BIT_FIELD (fieldx) && DECL_BIT_FIELD (fieldy));
! 	}
  
        /* The comparison on the current field failed.  If we're accessing
  	 a very nested structure, look at the next outer level.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]