https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88542
Bug ID: 88542
Summary: Optimize symmetric range check
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
[code]
#include <math.h>
bool test1(double d, double max)
{
return (d < max) && (d > -max);
}
bool test2(double d, double max)
{
return fabs(d) < max;
}
[/code]
When code checks if some number d is in (or outside of) symmetric range like
(-max, max), code from test1() can be replaced with one from test2(). This of
course assumes that expression does not produce any side effects. This can be
done nicely for floating point numbers stored in IEEE format, what leads to
faster code:
[asm]
test1(double, double):
vcomisd xmm1, xmm0
jbe .L6
vxorpd xmm1, xmm1, XMMWORD PTR .LC0[rip]
vcomisd xmm0, xmm1
seta al
ret
.L6:
xor eax, eax
ret
test2(double, double):
vandpd xmm0, xmm0, XMMWORD PTR .LC1[rip]
vcomisd xmm1, xmm0
seta al
ret
[/asm]
For integer types stored in two's complement format similar change gives slower
code. However on platforms which uses different integer format with dedicated
sign bit this optimizations may be beneficial.