Avatar ·

Pourquoi Rust n'optimise-t-il pas le code en supposant l'absence d'aliasing de deux références mutables ?

Bonjour à tous ! J'apprends Rust et j'essaie de comprendre comment le compilateur utilise les garanties de sécurité pour optimiser le code. On sait qu'en Rust, les références mutables (`&mut T`) sont uniques : à tout moment, il ne peut exister qu'une seule référence mutable sur une donnée. Cette règle est garantie par le compilateur lors de la vérification des emprunts. Il semblerait que cela devrait fournir à LLVM des indices puissants pour l'optimisation, similaires à `restrict` en C/C++. Cependant, j'ai remarqué que dans certains benchmarks simples, Rust génère du code qui n'utilise pas cette hypothèse. Voici un exemple simple : ```rust pub fn add_assign(x: &mut u32, y: &mut u32) { *x += *y; *x += *y; } ``` Je m'attendais à ce que le compilateur optimise cela en `*x += *y * 2`, car `x` et `y` ne peuvent pas pointer vers la même mémoire. Mais dans l'assembleur généré (par exemple, sur Compiler Explorer), je vois deux lectures et deux additions. Pourquoi Rust n'utilise-t-il pas la garantie d'absence d'aliasing pour une telle optimisation ? N'est-ce pas l'un des