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 PR59047


The following fixes PR59047 - data-ref and bitfields.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

Index: gcc/tree-predcom.c
===================================================================
*** gcc/tree-predcom.c	(revision 204561)
--- gcc/tree-predcom.c	(working copy)
*************** ref_at_iteration (data_reference_p dr, i
*** 1353,1362 ****
    tree addr = fold_build_pointer_plus (DR_BASE_ADDRESS (dr), off);
    addr = force_gimple_operand_1 (addr, stmts, is_gimple_mem_ref_addr,
  				 NULL_TREE);
!   return fold_build2 (MEM_REF, TREE_TYPE (DR_REF (dr)),
! 		      addr,
! 		      fold_convert (reference_alias_ptr_type (DR_REF (dr)),
! 				    coff));
  }
  
  /* Get the initialization expression for the INDEX-th temporary variable
--- 1353,1376 ----
    tree addr = fold_build_pointer_plus (DR_BASE_ADDRESS (dr), off);
    addr = force_gimple_operand_1 (addr, stmts, is_gimple_mem_ref_addr,
  				 NULL_TREE);
!   tree alias_ptr = fold_convert (reference_alias_ptr_type (DR_REF (dr)), coff);
!   /* While data-ref analysis punts on bit offsets it still handles
!      bitfield accesses at byte boundaries.  Cope with that.  Note that
!      we cannot simply re-apply the outer COMPONENT_REF because the
!      byte-granular portion of it is already applied via DR_INIT and
!      DR_OFFSET, so simply build a BIT_FIELD_REF knowing that the bits
!      start at offset zero.  */
!   if (TREE_CODE (DR_REF (dr)) == COMPONENT_REF
!       && DECL_BIT_FIELD (TREE_OPERAND (DR_REF (dr), 1)))
!     {
!       tree field = TREE_OPERAND (DR_REF (dr), 1);
!       return build3 (BIT_FIELD_REF, TREE_TYPE (DR_REF (dr)),
! 		     build2 (MEM_REF, DECL_BIT_FIELD_TYPE (field),
! 			     addr, alias_ptr),
! 		     DECL_SIZE (field), bitsize_zero_node);
!     }
!   else
!     return fold_build2 (MEM_REF, TREE_TYPE (DR_REF (dr)), addr, alias_ptr);
  }
  
  /* Get the initialization expression for the INDEX-th temporary variable
Index: gcc/testsuite/gcc.dg/torture/pr59047.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr59047.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr59047.c	(working copy)
***************
*** 0 ****
--- 1,39 ----
+ /* { dg-do run } */
+ 
+ extern void abort (void);
+ 
+ struct
+ {
+   int f0;
+   int f1:1;
+   int f2:2;
+ } a = {0, 0, 1};
+ 
+ int b, c, *d, e, f;
+ 
+ int
+ fn1 ()
+ {
+   for (; b < 1; ++b)
+     {
+       for (e = 0; e < 1; e = 1)
+ 	{
+ 	  int **g = &d;
+ 	  *g = &c;
+ 	} 
+       *d = 0;
+       f = a.f1;
+       if (f)
+ 	return 0;
+     }
+   return 0;
+ }
+ 
+ int
+ main ()
+ {
+   fn1 ();
+   if (b != 1)
+     abort ();
+   return 0;
+ }


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