Avatar ·

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...