为什么编译器重新计算另一个寄存器中已经可用的值?

问题描述

我正在研究Rust编译器生成的机器代码。这是一个简单的函数,用于计算切片中所有元素的总和。 (在Rust中,切片实际上是一个数组,其长度通常仅在运行时才知道。它位于内存的连续区域中,并由指向第一个元素和元素数量的指针来描述。)

fn sum_imperative(slice: &[i64]) -> i64 {
    let mut sum = 0;
    for n in slice {
        sum += n;
    }
    sum
}

在禁用SSE并启用优化的情况下,rustc 1.46.0 produces code的开始如下:

example::sum_imperative:
        test    rsi,rsi
        je      .LBB0_1
        lea     rax,[8*rsi - 8]
        mov     rdx,rax
        shr     rdx,3
        add     rdx,1

在此,切片中的元素N的数量rsi中。如果我的理解是正确的,则代码首先计算8N-8并将其存储在rax中。然后,它使用该结果来计算(8N-8)/ 8 + 1并将其存储在rdx中。假设没有溢出,则rdx的结果应始终等于rsi中仍然可用的N的原始值。

为什么编译器重新计算N的值而不是使用rsi中已经可用的值?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)