如何解决GCC优化遗漏错误90271?

时间:2019-04-29 20:00:46

标签: c gcc compiler-optimization

2019年5月(或以后)发布的GCC版本无法优化这段代码:

owner
可以看到

here(GodBolt):clang不会对GCC和MSVC正确地优化此代码。这是GCC bug 90271,它将在某个时候被修复。但是-它不会针对今天发布的GCC版本而修复,我今天想编写这段代码...

那么:有没有一种解决方法可以使GCC为此功能生成与clang相同的代码,或者至少-具有相当性能的代码,将数据保存在寄存器中,而不求助于指针和堆栈?

注意:

  • 我将其标记为C,因为代码段位于C中。我假设一种解决方法(如果存在)也可以在C中实现。
  • 我对同时优化非内联函数和内联版本很感兴趣。
  • 此问题与this one有关,但仅涉及GCC和此处代码段中的特定方法;并且使用C而不是C ++。

1 个答案:

答案 0 :(得分:7)

这使非内联版本更长一些,但是内联版本针对所有三个编译器进行了优化:

int replace_bytes(int v1 ,char v2, size_t k)
{
    return (v1 & ~(0xFF << k * 8)) | ((unsigned char)v2 << k * 8);
}

如果v2是带符号类型,则必须在转换前将unsigned char强制转换为char。在这种情况下,如果没有大小写,v2将被符号扩展为整数,这将导致结果中不需要的位被设置为1。