This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/51938] missed optimization: 2 comparisons
- From: "marc.glisse at normalesup dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 23 Jan 2012 12:51:42 +0000
- Subject: [Bug rtl-optimization/51938] missed optimization: 2 comparisons
- Auto-submitted: auto-generated
- References: <bug-51938-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51938
--- Comment #2 from Marc Glisse <marc.glisse at normalesup dot org> 2012-01-23 12:51:42 UTC ---
(In reply to comment #1)
> I suspect also worthwhile for integral types. Note that for real types
> you need -ffinite-math-only - I bet the clang result is wrong for NaNs.
I hadn't thought about it (this code could indeed use -ffinite-math-only), but
it appears I am lucky, the code really is equivalent to if(x<0) f(); as
claimed. Indeed, for a NaN, x>0 and x<0 are false, so sign returns ZERO which
is not NEG. Comparing sign(x) to ZERO would indeed be different than x==0. On
the other hand, ucomisd sets ZF to 1 for QNaN. clang's code appears to be right
on all variations I tried.
> Btw, what's the optimal assembly you expect?
clang generates:
pxor %xmm1, %xmm1
ucomisd %xmm0, %xmm1
ja .LBB1_2
ret
.LBB1_2:
xorb %al, %al
jmp f # TAILCALL
No idea if that's optimal (it also depends on which branch is most likely), but
one pair of ucomisd+ja is certainly better than 2.