【问题标题】:GCC optimizes sinl and cosl to sincoslGCC 将水槽和煤优化为 sincol
【发布时间】:2015-08-11 05:58:33
【问题描述】:

我看到使用 GCC 编译时的行为暗示 GCC 足够聪明,可以优化同一“范围”中的调用(我在这里松散地使用该术语,因为范围比 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(本机客户端 r14192,Git 提交 7faaabb9f10e6dcae5f2b799da43e236e65cda95) 版权所有 (C) 2010 Free Software Foundation, Inc.

但是我不希望这是特定于版本的。可能是通用的 GCC 行为(我猜可能是特定于拱门/目标的)。

【问题讨论】:

  • 你能提供一个MCVE吗?你可能也对这个bug report感兴趣。
  • 哈,谢谢。我刚刚也发现了。我不能使用 -ansi 因为该项目在这些设置下没有机会。 MCVE 可能会很棘手,因为我使用的是非标准工具链。我可以尝试使用现成的版本进行回购,但没有承诺我这样做的速度:(。
  • 我只是在尝试各种“变通办法”。我发现将 2 * M_PI 添加到一个参数是可行的:)。不过我不确定我对此是否特别满意!
  • 您尝试过使用-fno-builtin-sincos 标志吗?仿生库有一个workaround,您可能也会感兴趣。
  • 是的,那个标志没有帮助。我阅读 GCC 错误报告的方式暗示它不会。仿生解决方法很有趣。我想知道类似的事情,但不确定如何防止递归。会试一试的。我设法在单个呼叫站点使用操作员来完成某些工作〜但这需要在所有呼叫站点完成。仿生是一个通用的解决方案,所以希望它会起作用。

标签: gcc optimization libc trigonometry


【解决方案1】:

有关答案的一些背景信息,请参阅我原来的帖子的 cmets。似乎最好的“修复”是使用仿生类型的解决方法:

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

【讨论】:

    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多