https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98891
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever confirmed|0 |1 CC| |jakub at gcc dot gnu.org, | |wilco at gcc dot gnu.org Last reconfirmed| |2021-03-17 --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Reduced testcase: extern unsigned long long a, b, c; void foo (void) { a = b | ~c; } Seems this is the usual dilemma between split double-word operations early vs. split it late, each has its advantages and serious disadvantages. By splitting early, combiner can't really do much with it, it is split into loads, not, or and store of the halves separately and combiner doesn't see the two halves together, one would need essentially vectorization on RTL to match that.