https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109249
Bug ID: 109249 Summary: Missed optimization for table lookups Product: gcc Version: 12.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: andre.schackier at gmail dot com Target Milestone: --- Example #1 - https://godbolt.org/z/95GjPo9bs gcc: GetTypeDamageMultiplier(Type, Type): sub rsp, 1184 movsx rax, edi movsx rdx, esi mov ecx, 162 lea rdi, [rsp-120] mov esi, OFFSET FLAT:.LC0 lea rax, [rax+rax*8] rep movsq lea rax, [rdx+rax*2] movss xmm0, DWORD PTR [rsp-120+rax*4] add rsp, 1184 ret clang: GetTypeDamageMultiplier(Type, Type): # @GetTypeDamageMultiplier(Type, Type) movsxd rax, edi lea rax, [rax + 8*rax] movsxd rcx, esi lea rax, [rcx + 2*rax] lea rcx, [rip + .L__const.GetTypeDamageMultiplier(Type, Type).table] movss xmm0, dword ptr [rcx + 4*rax] # xmm0 = mem[0],zero,zero,zero ret Example #2 - https://godbolt.org/z/sqocKjYco gcc: GetTypeDamageMultiplier(Type, Type): sub rsp, 144 movsx rdi, edi movsx rsi, esi movaps xmm1, XMMWORD PTR .LC2[rip] movss xmm0, DWORD PTR .LC1[rip] movaps xmm2, XMMWORD PTR .LC6[rip] lea rax, [rsi+rdi*8] movaps XMMWORD PTR [rsp-72], xmm1 movaps xmm1, XMMWORD PTR .LC3[rip] shufps xmm0, xmm0, 0 movaps XMMWORD PTR [rsp-120], xmm0 movaps XMMWORD PTR [rsp-104], xmm0 movaps XMMWORD PTR [rsp-88], xmm0 movaps XMMWORD PTR [rsp+8], xmm0 movaps xmm0, XMMWORD PTR .LC7[rip] movaps XMMWORD PTR [rsp-56], xmm1 movaps xmm1, XMMWORD PTR .LC4[rip] movaps XMMWORD PTR [rsp+24], xmm0 movaps xmm0, XMMWORD PTR .LC8[rip] movaps XMMWORD PTR [rsp-40], xmm1 movaps xmm1, XMMWORD PTR .LC5[rip] movaps XMMWORD PTR [rsp+40], xmm0 movaps xmm0, XMMWORD PTR .LC9[rip] movaps XMMWORD PTR [rsp-24], xmm1 movaps XMMWORD PTR [rsp+56], xmm1 movaps xmm1, XMMWORD PTR .LC10[rip] movaps XMMWORD PTR [rsp+72], xmm0 movaps XMMWORD PTR [rsp+104], xmm0 movaps xmm0, XMMWORD PTR .LC11[rip] movaps XMMWORD PTR [rsp-8], xmm2 movaps XMMWORD PTR [rsp+88], xmm1 movaps XMMWORD PTR [rsp+120], xmm0 movss xmm0, DWORD PTR [rsp-120+rax*4] add rsp, 144 ret clang: GetTypeDamageMultiplier(Type, Type): # @GetTypeDamageMultiplier(Type, Type) movsxd rax, edi movsxd rcx, esi lea rax, [rcx + 8*rax] lea rcx, [rip + .L__const.GetTypeDamageMultiplier(Type, Type).table] movss xmm0, dword ptr [rcx + 4*rax] # xmm0 = mem[0],zero,zero,zero ret