c++ - tres - Multiplicar por 0 optimización
multiplicaciones por tres cifras (2)
Depende de si el compilador implementa IEEE754. Ni C ni C ++ requieren que un compilador admita NaN
, pero IEEE754 sí.
Supongamos que tengo:
double f(const double *r) {
return 0*(r[0]*r[1]);
}
¿Debería el compilador ser capaz de optimizar el segmento, o aún tiene que realizar la operación, en caso de que los valores puedan ser inf o nan?
gcc -O3 -S test.c:
.file "test.c"
.text
.p2align 4,,15
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
movsd (%rdi), %xmm0
mulsd 8(%rdi), %xmm0
mulsd .LC0(%rip), %xmm0
ret
.cfi_endproc
.LFE0:
.size f, .-f
.section .rodata.cst8,"aM",@progbits,8
.align 8
.LC0:
.long 0
.long 0
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Parece que no hay eliminación?
aha
gcc -O3 -ffast-math -S test.c
.file "test.c"
.text
.p2align 4,,15
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
xorpd %xmm0, %xmm0
ret
.cfi_endproc
.LFE0:
.size f, .-f
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
No solo es inf
y NaN
que impide la optimización allí, también es el signo - 0.0
* algo negativo es -0.0
, de lo contrario es 0.0
, así que realmente tienes que calcular el signo de r[0]*r[1]
.