[Bug middle-end/91899] New: Merge constant literals

antoshkka at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Sep 25 13:01:00 GMT 2019


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.


More information about the Gcc-bugs mailing list