https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91899
Bug ID: 91899 Summary: Merge constant literals Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: antoshkka at gmail dot com Target Milestone: --- Consider the example: static const char data1[] = {'t','e','s','t'}; static const char data2[] = "test test"; bool index0(const char* cmp) { return cmp == data1 || cmp == data2; } Right now GCC generates suboptimal assembly: index0(char const*): mov eax, offset data1 cmp rdi, rax sete cl mov eax, offset data2 cmp rdi, rax sete al or al, cl ret data1: .ascii "test" data2: .asciz "test test" A more efficient way to generate the code is to merge `data1` and `data2`: index0(char const*): mov eax, offset data cmp rdi, rax sete al ret data: .ascii "test test" Constant literals merging significantly reduces binary size and cache misses.