X86 LLVM/clang是否具有控制代码填充的标志?

X86 LLVM/clang是否具有控制代码填充的标志?,x86,clang,llvm,X86,Clang,Llvm,我正在使用LLVM框架(v3.3)、clang前端和X86目标。 我注意到,我总是在这里和那里抛出一些nop来进行良好的度量,显然是为了将部分代码与16B对齐(至少是循环,也可能是其他块) 例如,此处0x401495处的nopw: 401489: 48 89 44 24 10 mov %rax,0x10(%rsp) 40148e: b9 e8 03 00 00 mov $0x3e8,%ecx 401493:

我正在使用LLVM框架(v3.3)、clang前端和X86目标。 我注意到,我总是在这里和那里抛出一些nop来进行良好的度量,显然是为了将部分代码与16B对齐(至少是循环,也可能是其他块)

例如,此处0x401495处的nopw:

  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
401489:4889442410mov%rax,0x10(%rsp)
40148e:b9 e8 03 00 mov$0x3e8,%ecx
401493:jmp 4014a4的eb 0f
401495:66 66 2e 0f 1f 84 00数据32 nopw%cs:0x0(%rax,%rax,1)
40149c:00
4014a0:48 8b 40 08 mov 0x8(%rax),%rax
4014a4:ff c9十二月%ecx
4014a6:75 f8 jne 4014a0
4014a8:8b 30 mov(%rax),%esi
我认为这有助于分支预测器或I-cache更好地执行,但我现在不需要这种优化,我需要保持代码的某些部分简单且可呈现

有没有办法通过编译器标志禁用此代码填充?类似于gcc的-fno align循环(或类似的对齐标志)

我在LLVM代码中搜索并浏览了与填充、对齐、nops等相关的内容。没有相关内容弹出。
我看到的唯一替代方法是使用-Os编译(它确实删除了此填充),但这会过于激进地更改代码的其余部分-我不想优化空间,而是为了可读性。

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

  • 这提到了与您的示例类似的内容:在循环中插入NOP,通过将“两个分支从同一个16B块中移出,如果它们都指向同一个目标”,来提高性能。它已经实施

  • 对于x86中实际生成的NOP指令,您可以在中找到它。此代码自创建以来已被多次修改;在某一点上,他们是一些


我希望这有点帮助

我发现
nop
指令是反汇编输出中分支目标的有用标记,因为循环通常只有编译/反汇编后无法保存的局部标签(与函数入口点不同)。