-ffast-math in Ports and wrong generated code

From: Andrey Simonenko <simon_at_comsys.ntu-kpi.kiev.ua>
Date: Tue, 3 Apr 2012 14:21:11 +0300
Hello,

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?
Received on Tue Apr 03 2012 - 09:21:15 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:25 UTC