El atributo de función [[clang::minsize]] no funciona como se espera
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:
Espero algo vagamente similar al [[gnu::optimize("s")]]
de GCC, ¡que funciona muy bien!
Cuando clang está configurado con Os:
ASM
ASM
foo():
push rax
call bar()
add eax, 129345
pop rcx
ret
````
Sin embargo, con O0 + el atributo:
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
“`
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 atributominsize
, 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.