Evitar sobrecarga de prólogo da função gcc?

Ultimamente encontrei muitas funções em que o gcc gera um código muito ruim no x86. Todos eles se encaixam em um padrão de:

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

Pense no caso simples como algo tão pequeno que metade ou mais do trabalho é gasto pressionando e aparando registros que não serão modificados. Se eu estivesse escrevendo o asm manualmente, salvaria e restauraria os registros salvos através de chamadas dentro do caso complexo e evitaria tocar no ponteiro da pilha, no caso simple

Existe alguma maneira de fazer com que o gcc seja um pouco mais inteligente e faça isso sozinho? De preferência com opções de linha de comando, em vez de hacks feios na fonte ...

Editar Para torná-lo concreto, aqui está algo muito próximo de algumas das funções com as quais estou lidando:

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

e um outro

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

e outro

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

Edit 2: Eu deveria ter mencionado antes: essas funções não podem ser incorporadas. Eles têm ligação externa e são código de biblioteca. Permitir que eles sejam incorporados no aplicativo resultaria em todos os tipos de problema