Avatar ·

Por qué Rust no optimiza el código asumiendo que no hay aliasing entre dos referencias mutables?

¡Hola a todos! Estoy aprendiendo Rust y tratando de entender cómo el compilador utiliza las garantías de seguridad para optimizar el código. Se sabe que en Rust las referencias mutables (`&mut T`) son únicas: en cualquier momento solo puede existir una referencia mutable a los datos. Esta regla está garantizada por el compilador durante la verificación de préstamos. Aparentemente, esto debería darle a LLVM pistas poderosas para la optimización, similares a `restrict` en C/C++. Sin embargo, he notado que en algunos benchmarks simples Rust genera código que no utiliza esta suposición. Aquí hay un ejemplo simple: ```rust pub fn add_assign(x: &mut u32, y: &mut u32) { *x += *y; *x += *y; } ``` Esperaba que el compilador optimizara esto a `*x += *y * 2`, ya que `x` y `y` no pueden apuntar a la misma memoria. Pero en el ensamblador generado (por ejemplo, en Compiler Explorer) veo dos lecturas y dos sumas. ¿Por qué Rust no utiliza la garantía de ausencia de aliasing para esta optimización? ¿No es esto una de...