Por qué Rust no optimiza el código si dos referencias mutables (mutable references) no pueden aliasing?
¡Hola a todos! Empecé a estudiar Rust y me encontré con un punto interesante. Sé que la regla principal de seguridad en Rust es que no podemos tener dos referencias mutables (`&mut T`) a los mismos datos al mismo tiempo. El compilador verifica esto estrictamente en tiempo de compilación a través del sistema de borrowing.
Sin embargo, noté algo extraño. Cuando escribo una función simple que suma dos números, pasándolos como referencias mutables, el compilador genera un código no tan óptimo.
Aquí un ejemplo:
```rust
pub fn add(x: &mut u32, y: &mut u32) -> u32 {
*x + *y
}
```
Esperaba que el compilador (LLVM) entendiera: como `x` y `y` son `&mut`, están garantizados a no apuntar a la misma área de memoria (noalias). Entonces, simplemente se podrían cargar los valores de esas direcciones y sumarlos. Pero cuando miro la salida en ensamblador (por ejemplo, en godbolt.org), veo que el compilador genera código con instrucciones explícitas de carga y desreferenciación, en lugar de simplemente sumar registros.
¿Por qué sucede esto?