Date: Tue, 3 Apr 2012 06:43:00 -0700 From: Steve Kargl <sgk@troutmask.apl.washington.edu> To: Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua> Cc: freebsd-current@freebsd.org Subject: Re: -ffast-math in Ports and wrong generated code Message-ID: <20120403134300.GA98102@troutmask.apl.washington.edu> In-Reply-To: <20120403112111.GA39616@pm513-1.comsys.ntu-kpi.kiev.ua> References: <20120403112111.GA39616@pm513-1.comsys.ntu-kpi.kiev.ua>
index | next in thread | previous in thread | raw e-mail
On Tue, Apr 03, 2012 at 02:21:11PM +0300, Andrey Simonenko wrote:
>
> I use one port from the Ports Collection, that works with FP. Having
> reinstalled it (its version was not changed) I noticed that it started
> to work incorrectly. After debugging and disassembling its code I found
> out that the -ffast-math option used for building was the result of
> wrongly generated code (I did not specify this option in /etc/make.conf).
>
> At least finite() function call was eliminated from the result Assembler
> code when -ffast-math option is used, tested on 9.0-STABLE and 10.0-CURRENT.
>
> Example test source code and generated code under 9.0-STABLE on amd64
> by gcc from the base system:
>
> -----------------------------
> #include <math.h>
> #include <stdio.h>
>
> void
> check_finite(double x)
> {
> printf("%d\n", finite(x));
> }
> -----------------------------
>
> % gcc -Wall -O2 -S finite.c
> -----------------------------
> check_finite:
> .LFB3:
> subq $8, %rsp
> .LCFI0:
> call finite <-- call to finite()
> movl $.LC0, %edi
> movl %eax, %esi
> addq $8, %rsp
> xorl %eax, %eax
> jmp printf
> .LFE3:
> .size check_finite, .-check_finite
> -----------------------------
>
> % gcc -Wall -O2 -ffast-math -S finite.c
> -----------------------------
> check_finite:
> .LFB3:
> xorl %esi, %esi <-- fake result from finite()
> movl $.LC0, %edi
> xorl %eax, %eax
> jmp printf
> .LFE3:
> .size check_finite, .-check_finite
> -----------------------------
>
> Can somebody comment this?
Read the man page for gcc. With --fast-math,
gcc assumes that the result of any FP operation
is finite. So, the function call to finite()
is eliminated as it is always true.
--
Steve
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120403134300.GA98102>
