Try this:
gcc -ffast-math -c first.c
gcc -c second.c
gcc -o dyn_fast_math first.o second.o
Putting uniquely-named functions in first.c and second.c. This should do the trick. There is rarely any "global" impact of a compiler optimization. If one does exist, linking will likely fail due to the conflict.
I tried a small sample without problem.
Here's an example.
first.c
extern double second();
double first ()
{
double dbl;
dbl = 1.0;
dbl /= 10.0;
return dbl;
}
int main ()
{
printf("first = %f\n", first());
printf("second = %f\n", second());
return 0;
}
second.c
double second ()
{
double ddbl;
ddbl = 1.0;
ddbl /= 10.0;
return ddbl;
}
compilation
gcc -S first.c
gcc -c first.s
gcc -ffast-math -S second.c
gcc -ffast-math -c second.s
gcc -o prog first.o second.o
Check the difference between first.s and second.s and you'll find this:
movapd %xmm1, %xmm2
divsd %xmm0, %xmm2
movapd %xmm2, %xmm0
changes to this:
mulsd %xmm1, %xmm0
Both functions are called, and both return the expected result.