Conditional sibcalls?
Konstantin Vladimirov
konstantin.vladimirov@gmail.com
Thu Feb 21 11:57:00 GMT 2013
Hi,
Discovered this optimization possibilty on private backend, but can
easily reproduce on x86
Consider code, say test.c:
static __attribute__((noinline)) unsigned int*
proxy1( unsigned int* codeBuffer, unsigned int oper, unsigned int a, unsigned in
{
return codeBuffer;
}
static __attribute__((noinline)) unsigned int*
proxy2( unsigned int* codeBuffer, unsigned int oper, unsigned int a, unsigned in
{
return codeBuffer;
}
__attribute__((noinline)) unsigned int*
myFunc( unsigned int* codeBuffer, unsigned int oper)
{
if( (oper & 0xF) == 14)
{
return proxy1( codeBuffer, oper, 0x22, 0x2102400b);
}
else
{
return proxy2( codeBuffer, oper, 0x22, 0x1102400b);
}
}
With ~/x86-toolchain-4.7.2/bin/gcc -O2 -fomit-frame-pointer -S test.c,
gcc yields:
myFunc:
.LFB2:
.cfi_startproc
andl $15, %esi
cmpl $14, %esi
je .L6
jmp proxy2.isra.1
.p2align 4,,10
.p2align 3
.L6:
jmp proxy1.isra.0
Which can be simplified to:
myFunc:
.LFB2:
.cfi_startproc
andl $15, %esi
cmpl $14, %esi
je proxy2.isra.1 // <--- conditional sibling call here
.p2align 4,,10
.p2align 3
jmp proxy1.isra.0
I want to somehow introduce conditional sibling calls in my backend.
What approach would you advise as the best?
Target GCC is 4.7.2 (with some patches from 4.7.3 trunk).
---
With best regards, Konstantin
More information about the Gcc
mailing list