https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93582
luoxhu at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |luoxhu at gcc dot gnu.org
--- Comment #30 from luoxhu at gcc dot gnu.org ---
Hi Jakub, thanks for your information, seems this test case from Linux kernel
could be added to your future fix patch.
struct page
{
union
{
unsigned counters;
struct
{
union
{
struct
{
unsigned inuse : 16;
unsigned objects : 15;
unsigned frozen : 1;
};
};
};
};
};
void
foo1 (struct page *page, unsigned long counters_new)
{
struct page tmp;
tmp.counters = counters_new;
page->inuse = tmp.inuse;
page->objects = tmp.objects;
page->frozen = tmp.frozen;
}
Tried gcc(r10-6717) with -O3 on powerpcle, the asm is:
Disassembly of section .text:
0000000000000000 <foo1>:
0: 3e 84 89 54 rlwinm r9,r4,16,16,31
4: 00 00 83 b0 sth r4,0(r3)
8: 02 00 23 b1 sth r9,2(r3)
c: 20 00 80 4e blr
...
1c: 00 00 42 60 ori r2,r2,0
It is expected to emit only one store stw instruction(Also two half store
instructions emitted for x86 platforms!).
I am not sure whether the fre pass could check consecutive store and do the
merge similar to store-merging pass as the input parameter counters_new is not
a constant. :)