gpt4 book ai didi

assembly - 为什么窥孔优化是针对汇编代码而不是 IR 代码进行的?

转载 作者:行者123 更新时间:2023-12-05 02:30:22 26 4
gpt4 key购买 nike

我不明白为什么需要窥孔优化?因为编译器足够聪明来优化代码?能否请您举一些需要进行窥视孔优化的示例?

最佳答案

窥视孔通常是针对特定目标的
它们可能仅在目标寄存器 (RTL) 方面有意义,而不是 IR。

例如x86 xor eax, eax而不是 mov eax,0 . (What is the best way to set a register to zero in x86 assembly: xor, mov or and?)。没有理由在 IR 中执行此操作,并且在最后一刻(最终代码生成)之前执行此操作会混淆其他优化值为零的事实。对除 x86 以外的任何机器执行此操作将是一种反优化(创建错误的依赖性)。 OTOH 你不想让它太晚,否则你可能无法在设置 FLAGS 的东西之前对其重新排序,例如

  xor  eax,eax
cmp ecx, edx
sete al ; boolean 0 or 1 zero-extended to 64-bit RAX

代替

  cmp   ecx, edx
sete al ; false dependency on old RAX
movzx eax, al ; no mov-elimination, extra critical path latency

  cmp   ecx, edx
mov eax, 0 ; less efficient instruction to leave FLAGS untouched
sete al ; later reads of RAX will have partial-register stalls on P6-family

或者作为另一个示例,x86 可以使用 LEA 乘以 3、5 或 9,以利用 2 位移位并添加 2 寄存器寻址模式。优化器知道这是一个有效的构建 block 可能很​​有用,并且旨在将事物重构为乘以 9,但实际上将乘以 10 转换为 (x * 5) * 2。对于 (x<<3) + (x<<1) 的目标,这不是您想要的方式效率更高 ( x*10 = x*8 + x*2 )。

关于assembly - 为什么窥孔优化是针对汇编代码而不是 IR 代码进行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71890645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com