[Bug target/91721] New: Missed optimization for checking nan and comparison
antoshkka at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Sep 10 13:07:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91721
Bug ID: 91721
Summary: Missed optimization for checking nan and comparison
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: antoshkka at gmail dot com
Target Milestone: ---
Consider the example:
int doubleToString_0(double a) {
if ( __builtin_isnan( a ) )
return 1;
else if ( a == 0. )
return 2;
return 3;
}
A suboptimal assembly with two `ucomisd` is generated for the above sample:
doubleToString_0(double):
ucomisd xmm0, xmm0
jp .L4
ucomisd xmm0, QWORD PTR .LC0[rip]
jnp .L8
.L5:
mov eax, 3
ret
.L8:
jne .L5
mov eax, 2
ret
.L4:
mov eax, 1
ret
.LC0:
.long 0
.long 0
More optimal solution would be to do only the second `ucomisd` and check flags
for a NaN:
doubleToString_0(double):
pxor xmm1, xmm1
ucomisd xmm0, xmm1
jp .L4
je .L8
.L5:
mov eax, 3
ret
.L8:
mov eax, 2
ret
.L4:
mov eax, 1
ret
More information about the Gcc-bugs
mailing list