https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118235
Bug ID: 118235 Summary: generate strange code to access const, but not static array with doubles via index Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: dushistov at mail dot ru Target Milestone: --- Online demo available here https://godbolt.org/z/6jdKK1K7n . For code like this: ``` enum class MyEnum { A, B, C, D }; double f(MyEnum mode) { const double factors[] = { 2.0, 1.5, 0.5, 0.67 }; return factors[static_cast<unsigned int>(mode)]; } ``` gcc (trunk and all previous versions) on x86-64 generates really strange code: ``` f(MyEnum): movapd xmm0, XMMWORD PTR .LC0[rip] mov edi, edi movaps XMMWORD PTR [rsp-40], xmm0 movapd xmm0, XMMWORD PTR .LC1[rip] movaps XMMWORD PTR [rsp-24], xmm0 movsd xmm0, QWORD PTR [rsp-40+rdi*8] ret .LC0: .long 0 .long 1073741824 .long 0 .long 1073217536 .LC1: .long 0 .long 1071644672 .long -687194767 .long 1072001187 ``` while clang generates: ``` f(MyEnum): mov eax, edi lea rcx, [rip + .L__const.f(MyEnum).factors] movsd xmm0, qword ptr [rcx + 8*rax] ret .L__const.f(MyEnum).factors: .quad 0x4000000000000000 .quad 0x3ff8000000000000 .quad 0x3fe0000000000000 .quad 0x3fe570a3d70a3d71 ``` gcc generates almost the same code as clang if mark `factors` array with `static` keyword.