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; + }