From e400595190a221f67e19c0eea8163ef8b10e6458 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Tue, 11 May 2021 15:44:56 -0400 Subject: [PATCH] Store VariantIdx to distinguish enum variants This saves ~24% of the instructions on the match-stress-enum benchmark. --- .../src/thir/pattern/deconstruct_pat.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs b/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs index 8c740a7ec15..db0f487645f 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs @@ -52,7 +52,6 @@ use super::{FieldPat, Pat, PatKind, PatRange}; use rustc_data_structures::captures::Captures; use rustc_index::vec::Idx; -use rustc_hir::def_id::DefId; use rustc_hir::{HirId, RangeEnd}; use rustc_middle::mir::interpret::ConstValue; use rustc_middle::mir::Field; @@ -590,7 +589,7 @@ pub(super) enum Constructor<'tcx> { /// and fixed-length arrays. Single, /// Enum variants. - Variant(DefId), + Variant(VariantIdx), /// Ranges of integer literal values (`2`, `2..=5` or `2..5`). IntRange(IntRange), /// Ranges of floating-point literal values (`2.0..=5.2`). @@ -634,7 +633,7 @@ impl<'tcx> Constructor<'tcx> { fn variant_index_for_adt(&self, adt: &'tcx ty::AdtDef) -> VariantIdx { match *self { - Variant(id) => adt.variant_index_with_id(id), + Variant(idx) => idx, Single => { assert!(!adt.is_enum()); VariantIdx::new(0) @@ -649,9 +648,7 @@ impl<'tcx> Constructor<'tcx> { PatKind::AscribeUserType { .. } => bug!(), // Handled by `expand_pattern` PatKind::Binding { .. } | PatKind::Wild => Wildcard, PatKind::Leaf { .. } | PatKind::Deref { .. } => Single, - &PatKind::Variant { adt_def, variant_index, .. } => { - Variant(adt_def.variants[variant_index].def_id) - } + &PatKind::Variant { variant_index, .. } => Variant(variant_index), PatKind::Constant { value } => { if let Some(int_range) = IntRange::from_const(cx.tcx, cx.param_env, value) { IntRange(int_range) @@ -928,15 +925,15 @@ impl<'tcx> SplitWildcard<'tcx> { // If `exhaustive_patterns` is enabled, we exclude variants known to be // uninhabited. def.variants - .iter() - .filter(|v| { + .iter_enumerated() + .filter(|(_, v)| { !v.uninhabited_from(cx.tcx, substs, def.adt_kind(), cx.param_env) .contains(cx.tcx, cx.module) }) - .map(|v| Variant(v.def_id)) + .map(|(idx, _)| Variant(idx)) .collect() } else { - def.variants.iter().map(|v| Variant(v.def_id)).collect() + def.variants.indices().map(|idx| Variant(idx)).collect() } } ty::Char => {