¿Evitando la sobrecarga de la función gc

Recientemente he encontrado muchas funciones en las que gcc genera un código realmente malo en x86. Todos se ajustan a un patrón de:

if (some_condition) {
    /* do something really simple and return */
} else {
    /* something complex that needs lots of registers */
}

Piense en un caso simple como algo tan pequeño que la mitad o más del trabajo se gasta presionando y haciendo estallar registros que no se modificarán en absoluto. Si estuviera escribiendo el asm a mano, guardaría y restauraría los registros de llamadas guardadas en el interior del caso complejo, y evitaría tocar el puntero de la pila en el caso simple.

¿Hay alguna forma de hacer que gcc sea un poco más inteligente y hacer esto por sí mismo? Preferiblemente con opciones de línea de comandos en lugar de hacks feos en la fuente ...

Editar Para hacerlo concreto, aquí hay algo muy parecido a algunas de las funciones con las que estoy tratando:

if (buf->pos < buf->end) {
    return *buf->pos++;
} else {
    /* fill buffer */
}

y otro

if (!initialized) {
    /* complex initialization procedure */
}
return &initialized_object;

y otro

if (mutex->type == SIMPLE) {
    return atomic_swap(&mutex->lock, 1);
} else {
    /* deal with ownership, etc. */
}

Edit 2: Debería haber mencionado para empezar: estas funciones no se pueden incorporar. Tienen enlace externo y son código de biblioteca. Permitir que se incluyan en la aplicación generaría todo tipo de problemas.

Respuestas a la pregunta(5)

Su respuesta a la pregunta