This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR59047
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 8 Nov 2013 13:39:51 +0100 (CET)
- Subject: [PATCH] Fix PR59047
- Authentication-results: sourceware.org; auth=none
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;
+ }