https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93565
Wilco <wilco at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |segher at kernel dot crashing.org Summary|Combine duplicates count |[9/10 regression] Combine |trailing zero instructions |duplicates instructions --- Comment #8 from Wilco <wilco at gcc dot gnu.org> --- Here is a much simpler example: void f (int *p, int y) { int a = y & 14; *p = a | p[a]; } Trunk and GCC9.1 for x64: mov eax, esi and esi, 14 and eax, 14 or eax, DWORD PTR [rdi+rsi*4] mov DWORD PTR [rdi], eax ret and AArch64: and x2, x1, 14 and w1, w1, 14 ldr w2, [x0, x2, lsl 2] orr w1, w2, w1 str w1, [x0] ret However GCC8.2 does: and w1, w1, 14 ldr w2, [x0, w1, sxtw 2] orr w2, w2, w1 str w2, [x0] ret So it is a 9 regression...