https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113106
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Component|c |rtl-optimization
Ever confirmed|0 |1
Keywords| |missed-optimization
Last reconfirmed| |2023-12-21
Status|UNCONFIRMED |NEW
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Uroš Bizjak from comment #4)
> (In reply to Richard Biener from comment #3)
> > The situation with address-spaces isn't valid as we need to preserve the
> > second load because it's volatile. I think we simply refuse to combine
> > volatile loads out of caution in the first case.
>
> int __seg_gs b;
> return *(volatile __seg_gs int *) &b + b;
>
> But the above is the same w.r.t to volatile as:
>
> int a;
> return *(volatile int *) &a + a;
>
> ?
>
> BTW: I also checked with clang, and it creates expected code in all cases.
But you don't get
movl %gs:b(%rip), %eax
addl %eax, %eax
or
movl b(%rip), %eax
addl %eax, %eax
which I think would be wrong. The volatile access doesn't need to yield
the same value as the non-volatile one so we can't value-number them the
same.
The combine issue remains of course. But GCCs point was always that
trying to optimize volatile is wasted time.