首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ARM GCC在优化过程中移除所需代码

ARM GCC在优化过程中移除所需代码
EN

Stack Overflow用户
提问于 2021-11-21 11:37:48
回答 1查看 90关注 0票数 1

我有下面的代码,它完成了从16bpp图像到1bpp图像的非常基本的转换,代码按照预期运行,直到我启用了编译器优化,在这一点上我只得到了一个黑色图像。

代码语言:javascript
代码运行次数:0
运行
复制
#define RSCALE 5014709
#define GSCALE 9848225
#define BSCALE 1912602

uint16_t _convertBufferTo1bit(uint8_t* buffer, uint16_t size)
{
    uint8_t* dst_ptr = buffer;
    uint8_t* end_ptr = buffer + size;
    uint16_t pos = 0;
    uint8_t r, g, b, i;
    uint32_t lum;

    while(buffer < end_ptr)
    {
        for(i = 8; i > 0; i--)
        {
            r = (*buffer & 0xF8);
            g = ((*buffer & 0x07) << 5);
            buffer += 1;
            g |= (*buffer & 0x03);
            b = ((*buffer & 0x1F) << 3);
            buffer += 1;

            lum = ((RSCALE * r) + (GSCALE * g) + (BSCALE * b));
            if(lum > 0x7FFFFFFF)
            {
                //White
                dst_ptr[pos] |= (1 << (i-1));
            }
            else
            {
                //black
                dst_ptr[pos] &= ~(1 << (i-1));
            }
        }
        pos++;
    }

    return pos;
}

在查看反编译的程序集时,我可以看到编译器已经删除了if(lum > 0x7FFFFFFF)语句和所有相关的计算。有人能告诉我为什么吗?

-O0 -std=c++17 -Wall -Wextra

https://godbolt.org/z/GhPezzh33

-O1 -std=c++17 -Wall -Wextra

https://godbolt.org/z/bn1M4319h

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 12:00:47

在此代码中:

代码语言:javascript
代码运行次数:0
运行
复制
lum = ((RSCALE * r) + (GSCALE * g) + (BSCALE * b));
if(lum > 0x7FFFFFFF)

RSCALEGSCALEBSCALE分别是501470998482251912602。假设在使用的C实现中int是32位,这些都是int常量。

rgb都是uint8_t类型,因此它们在乘法中被提升为int

((RSCALE * r) + (GSCALE * g) + (BSCALE * b))完全是使用int操作数生成int结果的计算。因此,编译器可以看到lum被分配了int结果的值,并且它有权假定结果在INT_MININT_MAX的范围内。此外,它可以看到所有操作数都是非负的,因此不可能产生负结果,从而将可能的范围缩小到0INT_MAX。这排除了将负值指定给uint32_t会导致包络到高值的可能性。因此,编译器可能会假设lum > 0x7FFFFFFF永远不是真的。

计算可能会溢出int,然后行为是未定义的,编译器仍然允许使用假设。

要更正此问题,请将每个乘法的至少一个操作数更改为unsigned

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70054164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档