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;
}