当我在this question中提出时,gcc正在移除(是的,使用 -O0 )一行代码 _mm_div_ss(s1, s2); ,大概是因为结果未保存 . 但是,这应该触发浮点异常并引发SIGFPE,如果删除调用则不会发生这种情况 .

Question :是否有一个标志或多个标志传递给gcc,以便代码按原样编译?我正在考虑像 fno-remove-unused 这样的东西,但是我支持使用gcc属性/ pragma代替吗?

我尝试过的事情:

$ gcc --help=optimizers | grep -i remove

没有结果 .

$ gcc --help=optimizers | grep -i unused

没有结果 .

并明确禁用所有死代码/消除标志 - 请注意,没有关于未使用代码的警告:

$ gcc -O0 -msse2 -Wall -Wextra -pedantic -Winline \

-fno-dce -fno-dse -fno-tree-dce \

-fno-tree-dse -fno-tree-fre -fno-compare-elim -fno-gcse \

-fno-gcse-after-reload -fno-gcse-las -fno-rerun-cse-after-loop \

-fno-tree-builtin-call-dce -fno-tree-cselim a.c

a.c: In function ‘main’:

a.c:25:5: warning: ISO C90 forbids mixed declarations and code [-Wpedantic]

__m128 s1, s2;

^

$

来源计划

#include

#include

#include

#include

static void sigaction_sfpe(int signal, siginfo_t *si, void *arg)

{

printf("%d,%d,%d\n", signal, si!=NULL?1:0, arg!=NULL?1:0);

printf("inside SIGFPE handler\nexit now.\n");

exit(1);

}

int main()

{

struct sigaction sa;

memset(&sa, 0, sizeof(sa));

sigemptyset(&sa.sa_mask);

sa.sa_sigaction = sigaction_sfpe;

sa.sa_flags = SA_SIGINFO;

sigaction(SIGFPE, &sa, NULL);

_mm_setcsr(0x00001D80);

__m128 s1, s2;

s1 = _mm_set_ps(1.0, 1.0, 1.0, 1.0);

s2 = _mm_set_ps(0.0, 0.0, 0.0, 0.0);

_mm_div_ss(s1, s2);

printf("done (no error).\n");

return 0;

}

编译上面的程序给出了

$ ./a.out

done (no error).

换线

_mm_div_ss(s1, s2);

s2 = _mm_div_ss(s1, s2); // add "s2 = "

产生预期的结果:

$ ./a.out

inside SIGFPE handler

编辑更多细节 .

这似乎与 _mm_div_ss definition上的 __always_inline__ 属性有关 .

$ cat t.c

int

div(int b)

{

return 1/b;

}

int main()

{

div(0);

return 0;

}

$ gcc -O0 -Wall -Wextra -pedantic -Winline t.c -o t.out

$

(没有警告或错误)

$ ./t.out

Floating point exception

$

vs下面(功能属性除外)

$ cat t.c

__inline int __attribute__((__always_inline__))

div(int b)

{

return 1/b;

}

int main()

{

div(0);

return 0;

}

$ gcc -O0 -Wall -Wextra -pedantic -Winline t.c -o t.out

$

(没有警告或错误)

$ ./t.out

$

添加函数属性 __warn_unused_result__ 至少会给出一条有用的消息:

$ gcc -O0 -Wall -Wextra -pedantic -Winline t.c -o t.out

t.c: In function ‘main’:

t.c:9:5: warning: ignoring return value of ‘div’, declared with attribute warn_unused_result [-Wunused-result]

div(0);

^

编辑:

关于gcc mailing list的一些讨论 . 最终,我认为一切都按预期工作 .

java代码修改触发编译_gcc -O0仍然优化了“未使用”的代码 . 是否有一个编译标志来改变它?...相关推荐

  1. java反射 修改静态方法的值 setAccessible

    转载自 java反射 修改静态方法的值 setAccessible 这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目 static void change(String str){str=& ...

  2. 运行java提示未签名_java – JNLP:在签名代码中加载未签名的代码

    我们在克服Java webstart的混合代码错误时遇到了困难.总之,我们有我们的主要JNLP文件,我们已经签署了它直接加载的所有代码.我们已将all-permissions选项添加到主JNLP中.它 ...

  3. 遗传算法_粒子群算法优化支持向量机分类预测-附代码

    遗传算法/粒子群算法优化支持向量机分类预测-附代码 文章目录 遗传算法/粒子群算法优化支持向量机分类预测-附代码 1. 支持向量机简介与参数优化的原理 1.1 支持向量机SVM简介 1.2 优化参数的 ...

  4. TVM yolov3优化代码修改(编译运行OK)

    TVM yolov3优化代码修改(编译运行OK) yolov3_quantize_sample.py 附https://github.com/makihiro/tvm_yolov3_sample代码: ...

  5. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

  6. java中static代码块_static怎样在java中修改代码块?

    代码是我们每个学编程的小伙伴都接触的内容,在代码块的修改上有很多方法,那么在java中又需要使用哪种方式来对代码块进行变动呢?哦们最近在学关键字的版块,其中有一个static用来修饰代码块的效果非常不 ...

  7. 编译基于Chrome代码修改的Brave浏览器

    0x1.概述 最近由于工作需要,对Chrome浏览器的Android版本进行编译学习,在网上找了一下,发现有一个基于Chrome开源基础上做二次修改的版本,名叫Brave,GIT仓库代码,主打隐私安全 ...

  8. maven自动编译,解决你每次代码修改需要重新编译的繁琐

    maven结构的项目,我们在每次修改代码后都会需要手动编译,下面命令可以解决此问题,只要代码修改,会自动帮你编译. 进入项目目录执行:mvn -U eclipse:clean eclipse:ecli ...

  9. QQ音乐Android端120万行代码,编译耗时是怎样优化的,凭借这份《数据结构与算法》核心文档

    在本文的后续内容中,将介绍几个重点模块的实现. 5. 核心原理 代码编译 (1)获取改动文件并进行编译 首先需要考虑的问题是,如何识别出用户改动了哪些文件? 我们的做法是,在每次编译成功后,收集所有工 ...

最新文章

  1. 2022-2028年中国橡胶手套行业市场研究及前瞻分析报告
  2. 关于Activity class {package/class} does not exist
  3. 协同过滤:基于用户的协同过滤itemCF
  4. 1143 Lowest Common Ancestor (30 分)【难度: 中 / 知识点: 最低公共祖先 未完成】
  5. jenkins更改默认端口
  6. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
  7. docker-compose(入门,与docker的区别)
  8. WordPress网站迁移数据最佳解决方案
  9. mysql 并行复制原理_MySQL 5.7 并行复制实现原理与调优
  10. java 视频转码工具类_JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)...
  11. ubuntu安装redis_在Ubuntu上安装Redis
  12. C语言中强制转换问题
  13. docker privileged作用_docker容器性能监控cAdvisor+influxDB+grafana监控系统安装部署
  14. 如何获取Android应用签名?
  15. Crout分解法 | matlab
  16. mac datagrip如何建立本地链接
  17. 三个蛤蜊三块肉才能称得上“老板”
  18. firnbsp;提交的版本的iphone4amp;nbs…
  19. 在线词云加载慢,有水印?作为程序员,教你如何使用Java,Python和JS生成词云!
  20. 新神奇传说补丁_如何在神奇宝贝Go中捕捉传说中的神奇宝贝

热门文章

  1. Linux使用jstat命令查看jvm的GC情况
  2. [JS][jQuery]清空元素html()、innerHTML= 与 empty()的区别 、remove()区别
  3. oracle中保留2位小数的写法
  4. mysql Error 1045(28000)
  5. as3:sprite作为容器使用时,最好不要指定width,height
  6. (转)解读NTFS(一)
  7. java ee 值范围_JAVAEE之内置对象和属性范围
  8. Linux Mysql 安装方法
  9. Eclipse中Copy Qualified Name复制类全名解决办法
  10. c 语言bool 类型数据_C ++中的bool数据类型