On Wed, Nov 26, 2025 at 3:52 PM Uros Bizjak <[email protected]> wrote: > > On Wed, Nov 26, 2025 at 8:26 AM H.J. Lu <[email protected]> wrote: > > > > > The reasons for try_combine_insn are that > > > > > > > > 1. When general_operand is called, instruction info isn't available. > > > > 2. Only recog_for_combine_1 calls init_recog_no_volatile and > > > > tries memory operands. > > > But if we make stores work sensibly, then we no longer need the > > > instruction, right? It's the mere need to track the instruction that > > > seems rather hokey/hackish to me right now. > > > > > > jeff > > > > For > > > > volatile unsigned char u8; > > > > void test (void) > > { > > u8 = u8 + u8; > > u8 = u8 - u8; > > } > > > > When volatile store is allowed, we generate > > > > (insn 8 7 9 2 (parallel [ > > (set (mem/v/c:QI (symbol_ref:DI ("u8") [flags 0x2] > > <var_decl 0x7fe9719d6e40 u8>) [0 u8+0 S1 A8]) > > (ashift:QI (mem/v/c:QI (symbol_ref:DI ("u8") [flags > > 0x2] <var_decl 0x7fe9719d6e40 u8>) [0 u8+0 S1 A8]) > > (const_int 1 [0x1]))) > > (clobber (reg:CC 17 flags)) > > ]) > > "/export/gnu/import/git/gitlab/x86-gcc-test/gcc/testsuite/gcc.dg/pr86617.c":7:6 > > 1139 {*ashlqi3_1} > > (expr_list:REG_UNUSED (reg:CC 17 flags) > > (nil))) > > > > on x86 which leads to > > > > salb u8(%rip) > > > > instead of 2 loads. Without the instruction, we don't know if a > > memory reference > > should be allowed for stores. > > combine pass doesn't handle volatiles correctly in all cases, this is > the reason I think this propagation should be done in late-combine. We > are interested only in propagations of memory loads/stores into > instructions, and late-combine does exactly that. > > Uros.
late combine doesn't try to combine memory references at all. -- H.J.
