LLVM / clang是否有标志来控制代码填充?

时间:2014-12-30 21:18:52

标签: x86 clang llvm

我正在使用LLVM框架(v3.3),clang前端,X86目标。 我注意到我总是在这里和那里得到一点点NOP,这显然是为了将部分代码对齐到16B(至少是循环,也是其他块)。

例如 - 这里的nopw为0x401495:

  401489:       48 89 44 24 10          mov    %rax,0x10(%rsp)
  40148e:       b9 e8 03 00 00          mov    $0x3e8,%ecx
  401493:       eb 0f                   jmp    4014a4 <main+0x34>
  401495:       66 66 2e 0f 1f 84 00    data32 nopw %cs:0x0(%rax,%rax,1)
  40149c:       00 00 00 00
  4014a0:       48 8b 40 08             mov    0x8(%rax),%rax
  4014a4:       ff c9                   dec    %ecx
  4014a6:       75 f8                   jne    4014a0 <main+0x30>
  4014a8:       8b 30                   mov    (%rax),%esi

我认为这有助于分支预测器或I-cache表现更好,但我现在不需要这种优化,我需要保持代码的某些部分简单明了。< / p>

有没有办法通过编译器标志禁用此代码填充?像gcc&#39; s -fno-align-loops(或类似的对齐标志)

我已经搜索了manual并通过LLVM代码浏览了与填充,对齐,nops等相关的任何内容。没有任何相关内容弹出。 我看到的唯一选择是使用-Os(它确实删除了这个填充)进行编译,但这会极大地改变代码的其余部分 - 我不想为空间进行优化,而是为了便于阅读。

1 个答案:

答案 0 :(得分:1)

没有答案的老问题,所以只有几个与LLVM NOP填充相关的指针:

  • 这个LLVM's RFC提到了类似于你的例子:在循环中插入NOP以通过将“2个分支移出相同的16B块(如果它们都转到同一目标”)来提高性能。它已经实施here

  • 在x86中生成实际的NOP指令,您可以在X86AsmBackend::writeNopData中找到它。该代码自创建以来已多次修改;在某些时候他们有些alternate NOP instructions

我希望这有点帮助!