Por que o Rust não otimiza o código assumindo a ausência de aliasing de duas referências mutáveis?
Olá a todos! Estou estudando Rust e tentando entender como o compilador usa as garantias de segurança para otimizar o código. Sabe-se que em Rust, referências mutáveis (`&mut T`) são únicas: a qualquer momento, pode existir apenas uma referência mutável para os dados. Essa regra é garantida pelo compilador durante a verificação de empréstimos. Aparentemente, isso deveria dar ao LLVM dicas poderosas para otimização, análogas ao `restrict` em C/C++. No entanto, notei que em alguns benchmarks simples, o Rust gera código que não usa essa suposição.
Aqui está um exemplo simples:
```rust
pub fn add_assign(x: &mut u32, y: &mut u32) {
*x += *y;
*x += *y;
}
```
Eu esperava que o compilador otimizasse isso para `*x += *y * 2`, já que `x` e `y` não podem apontar para a mesma memória. Mas no assembly gerado (por exemplo, no Compiler Explorer), vejo duas leituras e duas adições. Por que o Rust não usa a garantia de ausência de aliasing para essa otimização? Não é essa uma das...