https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122919

            Bug ID: 122919
           Summary: Unnecessary duplication of shifts with computed goto
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tkoenig at gcc dot gnu.org
  Target Milestone: ---

This test case was originally submitted with a wrong reduction as PR122911.

The test case below yields assembly which reads in part, with -O2 with a
recent trunk,

.L46:
        movabsq $-3689348814741910323, %rax
        movq    %rdi, %rsi
        mulq    %rdi
        movq    %rdx, %rdi
        shrq    $3, %rdx
        shrq    $3, %rdi
        movq    %rdx, spc(%rip)
        leaq    (%rdi,%rdi,4), %rax
        addq    %rax, %rax
        subq    %rax, %rsi
        movq    %rsi, %rdi
        jmp     *%rcx

where %rdi would not have to be used with the shift.

Note that this test case is fragile (maybe due to the reduction from a
large original source file), deleting one of the labels makes the compiler
optimize away the whole section above. Reducing the test case turned out to
be difficult. The original source is also attached.


typedef void *Label;
Label real_ca;
long spc;
void foo(long spb) {
  long u3;
  Label symbols[] = {
      &&H__p170, &&H__p171, &&H__p172, &&H__p173, &&H__p174, &&H__p175,
      &&H__p176, &&H__p177, &&H__p178, &&H__p179, &&H__p180, &&H__p181,
      &&H__p182, &&H__p183, &&H__p184, &&H__p185, &&H__p186, &&H__p187,
      &&H__p188, &&H__p189, &&H__p190, &&H__p191, &&H__p192, &&H__p193,
      &&H__p194, &&H__p195, &&H__p196, &&H__p197, &&H__p198, &&H__p199,
      &&H__p329, &&H__p330, &&H__p331, &&H__p332, &&H__p333, &&H__p334,
      &&H__p335, &&H__p336, &&H__p337, &&H__p338, &&H__p339, &&H__p340,
      &&H__p341, &&H__p342, &&H__p343, &&H__p344, &&H__p345, &&H__p346,
      &&H__p347, &&H__p348, &&H__p349, &&H__p350, &&H__p351, &&H__p352,
      &&H__p353, &&H__p354, &&H__p355, &&H__p356, &&H__p357, &&H__p358,
      &&H__p359, &&H__p360, &&H__p361, &&H__p362, &&H__p363, &&H__p364,
      &&H__p365, &&H__p366, &&H__p367, &&H__p368, &&H__p369, &&H__p370,
      &&H__p371, &&H__p372, &&H__p373, &&H__p374, &&H__p375, &&H__p376,
      &&H__p377, &&H__p378, &&H__p379, &&H__p380, &&H__p381, &&H__p382,
      &&H__p383, &&H__p384, &&H__p385, &&H__p386, &&H__p387, &&H__p388,
      &&H__p389, &&H__p390, &&H__p391, &&H__p392, &&H__p393, &&H__p394,
      &&H__p395, &&H__p396, &&H__p397, &&H__p398, &&H__p399};
  goto *real_ca;
H__p170:
H__p171:
H__p172:
H__p173:
H__p174:
H__p175:
H__p176:
H__p177:
H__p178:
H__p179:
H__p180:
H__p181:
H__p182:
H__p183:
H__p184:
H__p185:
H__p186:
H__p187:
H__p188:
H__p189:
H__p190:
H__p191:
H__p192:
H__p193:
H__p194:
H__p195:
H__p196:
H__p197:
H__p198:
H__p199:
H__p329:
H__p330:
H__p331:
H__p332:
H__p333:
H__p334:
H__p335:
H__p336:
H__p337:
H__p338:
H__p339:
H__p340:
H__p341:
H__p342:
H__p343:
  goto *real_ca;
H__p344:
  unsigned long u1;
  unsigned long u4;
  u1 = spb;
  u4 = u1 / 10;
  u3 = u1 % 10;
  spb = u3;
  spc = u4;
H__p345:
H__p346:
H__p347:
H__p348:
H__p349:
H__p350:
H__p351:
H__p352:
H__p353:
H__p354:
H__p355:
H__p356:
H__p357:
H__p358:
H__p359:
H__p360:
H__p361:
H__p362:
H__p363:
H__p364:
H__p365:
H__p366:
H__p367:
H__p368:
H__p369:
H__p370:
H__p371:
H__p372:
H__p373:
H__p374:
H__p375:
H__p376:
H__p377:
H__p378:
H__p379:
H__p380:
H__p381:
H__p382:
H__p383:
H__p384:
H__p385:
H__p386:
H__p387:
H__p388:
H__p389:
H__p390:
H__p391:
H__p392:
H__p393:
H__p394:
H__p395:
H__p396:
H__p397:
H__p398:
H__p399:
  goto *real_ca;
}

Reply via email to