On Tue, Nov 27, 2012 at 11:45 PM, Ramana Radhakrishnan <ramana....@googlemail.com> wrote: > On Tue, Nov 27, 2012 at 8:22 PM, Richard Sandiford > <rdsandif...@googlemail.com> wrote: >> Ramana Radhakrishnan <ramra...@arm.com> writes: >>>> Tested on x86_64-linux-gnu, powerpc64-linux-gnu and mipsisa64-elf. >>>> Also tested by making sure that there were no changes in assembly >>>> output for a set of gcc .ii files. On the other hand, the -march=octeon >>>> output for a set of mips64-linux-gnu gcc .ii files showed the optimisation >>>> kicking in as hoped. >>> >>> This sequence of patches caused a regression in >>> gcc.target/arm/volatile-bitfields-1.c . I haven't reviewed the patch >>> stack in great detail yet, but it looks like this sequence of patches >>> doesn't take the ARM volatile bitfields into account. (193600 is fine, >>> 193606 is not). >> >> Looks like I was wrong to drop the conditions from patch 5. >> Please could you try the attached? > > Fixes volatile-bitfields-1.c but appears to break volatile-bitfields-4.c :( .
Can arm folks please re-implement strict volatile bitfields in terms of DECL_BIT_FIELD_REPRESENTATIVE as I suggested elsewhere? Thus, adjust stor-layout.c to compute a proper representative honoring strict volatile bitfield semantics? Thanks, Richard. > Ramana > >> >> Richard >> >> >> gcc/ >> * expmed.c (adjust_bit_field_mem_for_reg): Add handling of volatile >> bitfields. >> >> Index: gcc/expmed.c >> =================================================================== >> --- gcc/expmed.c 2012-11-27 19:09:18.000000000 +0000 >> +++ gcc/expmed.c 2012-11-27 19:09:33.314634741 +0000 >> @@ -372,6 +372,15 @@ adjust_bit_field_mem_for_reg (enum extra >> bitregion_end, MEM_ALIGN (op0), >> MEM_VOLATILE_P (op0)); >> enum machine_mode best_mode; >> + if (MEM_VOLATILE_P (op0) && flag_strict_volatile_bitfields > 0) >> + { >> + while (iter.next_mode (&best_mode)) >> + if (GET_MODE_SIZE (best_mode) == MEM_SIZE (op0)) >> + return narrow_bit_field_mem (op0, best_mode, bitsize, bitnum, >> + new_bitnum); >> + return NULL_RTX; >> + } >> + >> if (iter.next_mode (&best_mode)) >> { >> /* We can use a memory in BEST_MODE. See whether this is true for