【问题标题】:Does the compiler optimize math expressions?编译器是否优化数学表达式?
【发布时间】:2021-07-12 02:11:01
【问题描述】:

rustc 会优化这样的表达式吗?

  • 2*x -> x
  • x/2 -> x>>1
  • x % 8 -> x&7
  • 等等

【问题讨论】:

  • 是的,这是 LLVM 在没有 rustc 前端帮助的情况下例行执行的优化。
  • 他们甚至能够优化更复杂的情况,例如x*13x%13。请注意,需要为此启用优化。
  • 更复杂的示例:pub fn sum(i: u32) -> u32 { (0..i).sum() }(0 到给定数字之间的所有数字的总和)针对其封闭形式的解决方案进行了优化。虽然代码说“遍历所有数字并将它们相加”,但 LLVM 认为有一个等效的解决方案可以在恒定时间内运行并消除循环。

标签: math optimization rust expression compiler-optimization


【解决方案1】:

这些微不足道的优化在LLVM optimization passes的域中,实际上生成的程序集更好更正确。

2*x 编译为单指令 lea rax, [rdi + rdi],在所有现代 x86 处理器上都是单指令(相关 question

x/2 用于有符号数字被编译为最快和正确的方式,在-1 的情况下给出正确答案(相关question

mov     rax, rdi
shr     rax, 63
add     rax, rdi 
sar     rax 

但编译为无符号数的右移

mov     rax, rdi
shr     rax

x % 8 也是如此,它会编译成带符号数字的长汇编(用于否定情况)

mov     rax, rdi
lea     rcx, [rdi + 7]
test    rdi, rdi
cmovns  rcx, rdi
and     rcx, -8
sub     rax, rcx
ret

and 无符号数指令(相关question

 mov     rax, rdi
 and     eax, 7
 ret

Godbolt link

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多