[Bug c/80410] New: Improve merging of identical branches
pascal_cuoq at hotmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Apr 12 09:22:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80410
Bug ID: 80410
Summary: Improve merging of identical branches
Product: gcc
Version: 7.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: pascal_cuoq at hotmail dot com
Target Milestone: ---
Consider the following code:
va_list ap;
void *result;
va_start(ap, ptr_type);
switch (ptr_type) {
case 0: result = va_arg(ap, int*); break;
case 1: result = va_arg(ap, char*); break;
case 2: result = va_arg(ap, short*); break;
default: result = va_arg(ap, void*); break;
}
va_end(ap);
GCC correctly recognizes that the assembly code for the cases 0, 1, 2 is
identical, which is the difficult part (the source code for the branches is
different and cannot be merged by the programmer unless
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80409 is resolved). At the time of
writing, the Compiler Explorer trunk version produces:
movq %rax, -56(%rsp)
je .L15
cmpl $2, %edi
je .L15
testl %edi, %edi
je .L16
.L15:
movq -56(%rsp), %rax
.L16:
(Compiler Explorer link: https://godbolt.org/g/0NvnSX )
It would be nice if GCC was able to omit all the conditional branches, since
they all lead to doing the same thing at the assembly level.
More information about the Gcc-bugs
mailing list