Por que o Rust não otimiza o código se duas referências mutáveis (mutable references) não podem ser alias?
Olá a todos! Comecei a estudar Rust e me deparei com um ponto interessante. Eu sei que a principal regra de segurança em Rust é que não podemos ter duas referências mutáveis (`&mut T`) para os mesmos dados simultaneamente. O compilador verifica isso rigorosamente em tempo de compilação através do sistema de empréstimo (borrow checker).
No entanto, notei algo estranho. Quando escrevo uma função simples que soma dois números, passando-os como referências mutáveis, o compilador gera um código não tão otimizado.
Aqui está o exemplo:
```rust
pub fn add(x: &mut u32, y: &mut u32) -> u32 {
*x + *y
}
```
Eu esperava que o compilador (LLVM) entendesse: como `x` e `y` são `&mut`, eles garantidamente não apontam para a mesma área de memória (noalias). Portanto, seria possível apenas carregar os valores desses endereços e somá-los. Mas quando olho para a saída do assembly (por exemplo, no godbolt.org), vejo que o compilador gera código com instruções explícitas de carregamento e desreferenciamento, em vez de simplesmente somar registradores.
Por que isso acontece?