GCC 将水槽和煤炭优化为 sincosl

GCC optimizes sinl and cosl to sincosl

我在使用 GCC 编译时看到的行为表明 GCC 足够智能,可以优化同一 "scope" 中的调用(我在这里宽松地使用该术语,因为范围比 C++ 严格指的范围更广范围)将 sin 和 cos 转换为对 sincos 的单个调用。

具体来说,对于 long double xsinl(x)cosl(x) 优化为 sincosl(x, x) 调用。

我很确定这就是正在发生的事情,因为我可以注释掉 sin 或 cos,然后分别调用 cos 或 sin。同样,如果我更改参数,那么,我将再次获得单独的 sin 和 cos 调用。

这对我来说是个问题,因为我链接的 C 库没有实现 sincosl。所以我真的想要单独的功能。

我的说法正确吗?有人可以指出我这种行为的文档吗?可以禁用吗?

仅供参考,我正在使用:

i686-nacl-gcc.exe --version x86_64-nacl-gcc (GCC) 4.4.3 20141209 (Native Client r14192, Git Commit 7faaabb9f10e6dcae5f2b799da43e236e65cda95) Copyright (C) 2010 Free Software Foundation, Inc.

但是我不认为这是特定于版本的。可能是通用的 GCC 行为(我猜可能 arch/target 具体)。

请参阅对我原来的 post 的评论,了解有关答案的一些背景知识。看似最好的 "fix" 是使用 Bionic 类型的解决方法:

https://github.com/android/platform_bionic/blob/master/libm/sincos.c