为什么Clang的汇编输出有条件地跳转到无条件跳转?

时间:2017-01-18 18:28:33

标签: c macos clang code-generation compiler-optimization

在调试一个程序崩溃的错误指针被解除引用的问题时,我运行了lldb并对崩溃函数进行了反汇编。在仔细阅读反汇编代码的同时,我注意到这些奇怪的指令选择:

0x100002b06 <+86>:   cmpl   $0x0, %eax
0x100002b09 <+89>:   je     0x100002b14
0x100002b0f <+95>:   jmp    0x10000330e
0x100002b14 <+100>:  jmp    0x100002c1d

我希望代码看起来像这样:

0x100002b06 <+86>:   cmpl   $0x0, %eax
0x100002b09 <+89>:   je     0x100002c1d
0x100002b0f <+95>:   jmp    0x10000330e

我很好奇为什么Clang做出了这个选择。它是某种分支预测优化,因为这是一个非常不匹配的NULL指针检查吗?

编辑: This is the originating C code,特别是带有NULL指针检查的行。

traverse = travdone_head;
while (1) {
  if (traverse == NULL) nullptr("grokdir() traverse");
  /* Don't re-traverse directories we've already seen */
  if (inode == traverse->inode && device == traverse->device) {

1 个答案:

答案 0 :(得分:0)

-O0适用于

  

缩短编译时间并使调试产生预期效果   结果。这是默认值。

与相应的源代码进行比较可能会很有趣。