diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2023-09-23 15:08:41 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2023-10-25 06:46:47 +0000 |
| commit | afd631cc0c3049d1e862fefa6fc0b778f660bad8 (patch) | |
| tree | 59cb5d74b4dfd48ad4fa163e6918872dd374baff | |
| parent | d28405972ff8e83ac5e1be53c72eb44a43f983a8 (diff) | |
| download | rust-afd631cc0c3049d1e862fefa6fc0b778f660bad8.tar.gz rust-afd631cc0c3049d1e862fefa6fc0b778f660bad8.zip | |
Do not visit rvalues twice.
| -rw-r--r-- | compiler/rustc_mir_transform/src/gvn.rs | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/compiler/rustc_mir_transform/src/gvn.rs b/compiler/rustc_mir_transform/src/gvn.rs index e7f36e5881a..2add66ee81b 100644 --- a/compiler/rustc_mir_transform/src/gvn.rs +++ b/compiler/rustc_mir_transform/src/gvn.rs @@ -484,20 +484,23 @@ impl<'tcx> MutVisitor<'tcx> for VnState<'_, 'tcx> { } fn visit_statement(&mut self, stmt: &mut Statement<'tcx>, location: Location) { - self.super_statement(stmt, location); if let StatementKind::Assign(box (_, ref mut rvalue)) = stmt.kind // Do not try to simplify a constant, it's already in canonical shape. && !matches!(rvalue, Rvalue::Use(Operand::Constant(_))) - && let Some(value) = self.simplify_rvalue(rvalue, location) { - if let Some(const_) = self.try_as_constant(value) { - *rvalue = Rvalue::Use(Operand::Constant(Box::new(const_))); - } else if let Some(local) = self.try_as_local(value, location) - && *rvalue != Rvalue::Use(Operand::Move(local.into())) + if let Some(value) = self.simplify_rvalue(rvalue, location) { - *rvalue = Rvalue::Use(Operand::Copy(local.into())); - self.reused_locals.insert(local); + if let Some(const_) = self.try_as_constant(value) { + *rvalue = Rvalue::Use(Operand::Constant(Box::new(const_))); + } else if let Some(local) = self.try_as_local(value, location) + && *rvalue != Rvalue::Use(Operand::Move(local.into())) + { + *rvalue = Rvalue::Use(Operand::Copy(local.into())); + self.reused_locals.insert(local); + } } + } else { + self.super_statement(stmt, location); } } } |
