es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El atributo de función [[clang::minsize]] no funciona como se espera

[[clang::minsize]]:

Este atributo sugiere que las operaciones de optimización y generación de código tomen decisiones que mantengan el tamaño del código de esta función lo más pequeño posible y realicen optimizaciones que pueden sacrificar el rendimiento en tiempo de ejecución para minimizar el tamaño del código generado.

Con el siguiente código:

[[gnu::noinline]] int bar()
{
    return rand();
}</p>

<p>[[gnu::noinline]] int laa()
{
    return 129345;
}</p>

<p>[[clang::minsize]] int foo()
{
    return bar() + laa();
}

Cuando se utiliza el atributo minsize, no parece realizar ninguna optimización:

ejemplo de clang

Espero algo vagamente similar al [[gnu::optimize("s")]] de GCC, ¡que funciona muy bien!

ejemplo de gcc

Cuando clang está configurado con Os:

ASM
foo():
push rax
call bar()
add eax, 129345
pop rcx
ret
````
Sin embargo, con O0 + el atributo:
ASM
foo():
push rbp
mov rbp, rsp
sub rsp, 16
call bar()
mov dword ptr [rbp – 4], eax # 4-byte Spill
call laa()
mov ecx, eax
mov eax, dword ptr [rbp – 4] # 4-byte Reload
add eax, ecx
add rsp, 16
pop rbp
ret
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la documentación de referencia de LLVM LangRef, el atributo [[clang::minsize]] sugiere que los pasos de optimización y los pasos del generador de código toman decisiones que mantienen el tamaño del código de la función lo más pequeño posible, incluso si eso significa sacrificar el rendimiento en tiempo de ejecución para minimizar el tamaño del código generado.

    Cuando se utiliza el atributo minsize con el ejemplo de código dado, no parece realizar ninguna optimización, como se evidencia en el ejemplo de Godbolt. Sin embargo, cuando clang está configurado con -Os, el código generado se optimiza para el tamaño.

    Curiosamente, cuando se usa -O0 junto con el atributo minsize, el código generado sigue siendo más grande que el código optimizado con solo -Os habilitado. Esto sugiere que el atributo solo puede no ser suficiente para minimizar el tamaño del código y que es posible que se deban considerar otras opciones de optimización.

    En general, el atributo [[clang::minsize]] puede ser útil para reducir el tamaño del código de una función, pero su efectividad puede depender de la configuración de optimización específica y del código que se esté utilizando.

Comments are closed.