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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 04:00:47

在此代码中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析
The GNU Compiler Collection,通常简称GCC,是一套由GNU开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持C语言编译,还支持C++, Ada, Objective C等许多语言。另外GCC对硬件平台的支持,可以所无所不在,它不仅支持X86处理器架构, 还支持ARM, Motorola 68000, Motorola 8800, Atmel AVR, MIPS等处理器架构。
全栈程序员站长
2022/07/18
6.8K0
GCC 优化级别
1. gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
KINGYT
2019/10/22
8.1K0
第009课 gcc和arm-linux-gcc和Makefile
hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello
韦东山
2020/09/30
4.9K0
第009课 gcc和arm-linux-gcc和Makefile
【图片+代码】:GCC 链接过程中的【重定位】过程分析
最近因为项目上的需要,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux中一些编译、链接相关的内容。
IOT物联网小镇
2022/04/06
8140
【图片+代码】:GCC 链接过程中的【重定位】过程分析
arm-gcc各版本区别
从本质来讲他们都是编译器,而gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。可执行程序其实就是一堆的0101二进制机器码。这些机器码代表什么含义只有机器本身能理解。所以你用gcc编译出来的可执行程序只有在linux系统下面可以运行。
云深无际
2020/08/12
3.4K0
arm-gcc各版本区别
Ubuntu18.04安装arm-linux-gcc交叉编译工具(附arm-linux-gcc 5.4.0包)
下载(百度云)链接:https://pan.baidu.com/s/1AeqzkboWkJDJjU9HxtXhrA 提取码:uzup
全栈程序员站长
2022/06/28
4.3K0
Ubuntu18.04安装arm-linux-gcc交叉编译工具(附arm-linux-gcc 5.4.0包)
GCC编译优化选项
查看GCC各选项打开的优化项:gcc -Q --help=optimizers。分为如下:
叫你不戴帽子
2019/01/03
8K0
arm-linux-gcc 4.3.2编译uboot 1.1.6
在第三期项目的视频中,官方提供了一整套新的工具链,bootloader, 内核和文件系统(arm-linux-gcc_4.3.2, uboot-2012.04.01, linux-3.4.2)其中uboot-2012.04.01来源于毕业班,其下载烧写功能远不如uboot-1.1.6,因此我更偏向于使用老版的Uboot。但是第三期的工具链却无法直接编译uboot-1.1.6, 现在将解决这一问题。
韦东山
2022/09/08
2.8K0
qt交叉编译环境搭建_arm linux gcc
AArch64 是随 ARMv8 ISA 一起引入的 64 位架构,用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。,而不能执行 A32 或 T32 指令。但是,与 AArch32 中不同,在64位状态下,指令可以访问 64 位和 32 位寄存器。
全栈程序员站长
2022/11/07
6.6K0
qt交叉编译环境搭建_arm linux gcc
Linux系统中使用GCC CPU参数优化代码编译
在编译程序时,借助参数传递的方法,使用与系统CPU相匹配的gcc参数,编译出的程序就是为系统CPU而进行特定优化过的,因而执行速度和效率都会是最好。
一见
2018/08/07
2.4K0
arm 开发板更新 gcc/gcc++ | Debain 更新 gcc,无需编译直接更新 gcc
网上的方法,大多是copy的,要下载gcc源码包,然后编译。我想说,你就算用 8G 内存的电脑,解压、配置、编译,没几个小时搞不来。
痴者工良
2021/04/26
7990
ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
  在讲解各编译器之前,必须先了解一下以下这些文件。这些文件在编译器目录下或者编译生成目标平台的可执行程序时经常见到。此外,还需要注意区分 Windows 平台 和 Linux 平台的文件。
全栈程序员站长
2022/06/28
15.5K0
ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
STM32高级开发——gcc-arm-none-eabi
素材来源:https://blog.csdn.net/zhengyangliu123/article/details/54783443
李肖遥
2022/12/22
1.4K0
STM32高级开发——gcc-arm-none-eabi
遍历ArrayList的过程中移除元素的方式
原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。
全栈程序员站长
2022/09/15
6180
GCC生成的汇编代码
GCC产生的汇编代码有点难读,它包含一些我们不关心的信息。所有以 "." 开头的行都是指导汇编器和链接器的命令,称为“汇编器命令”。
Java架构师必看
2021/03/22
2.2K0
GCC生成的汇编代码
在arm上编译php
其实在arm上编译php和在x86没有太大区别,主要是很多依赖都需要重新编译,这里拿openssl和curl举例。
老高的技术博客
2022/12/29
1K0
在centos中更新gcc到6.4.0
本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/update-gcc-in-centos/
羽翰尘
2019/11/21
1.1K0
Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9
本文介绍了如何将OpenCV库移植到ARM平台上,包括编译工具链、依赖库、配置方法以及运行时注意事项。
剑影啸清寒
2018/01/02
9.5K1
Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9
点击加载更多

相似问题

GCC ARM乘法优化

223

GCC优化:使用ARM条件指令?

27

停止ARM GCC优化函数调用

217

gcc代码的ARM源代码

15

GCC优化移除功能序言与启示

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文