diff options
| author | bors <bors@rust-lang.org> | 2020-07-23 07:11:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-07-23 07:11:01 +0000 |
| commit | fcac11993ca055bbdc7683a2f6ed7b88a838fb0f (patch) | |
| tree | 3afcc7ae7281b8c2fa90f30355819595a8d42f10 /src/librustc_middle/ty | |
| parent | e8b55a4ad230ebec762fdfc4f241ba98a98560af (diff) | |
| parent | 1d6860082fb3f7e15a64f551e50863021ef122c1 (diff) | |
| download | rust-fcac11993ca055bbdc7683a2f6ed7b88a838fb0f.tar.gz rust-fcac11993ca055bbdc7683a2f6ed7b88a838fb0f.zip | |
Auto merge of #74611 - Mark-Simulacrum:revert-74069-bad-niche, r=eddyb
Revert "Compare tagged/niche-filling layout and pick the best one" Reverts rust-lang/rust#74069. It caused a performance regression, see https://github.com/rust-lang/rust/pull/74069#issuecomment-662166827. perf: https://perf.rust-lang.org/compare.html?start=d3df8512d2c2afc6d2e7d8b5b951dd7f2ad77b02&end=cfade73820883adf654fe34fd6b0b03a99458a51 r? @eddyb cc @nnethercote
Diffstat (limited to 'src/librustc_middle/ty')
| -rw-r--r-- | src/librustc_middle/ty/layout.rs | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/src/librustc_middle/ty/layout.rs b/src/librustc_middle/ty/layout.rs index dc775b15927..215f44819b5 100644 --- a/src/librustc_middle/ty/layout.rs +++ b/src/librustc_middle/ty/layout.rs @@ -876,8 +876,6 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { .iter_enumerated() .all(|(i, v)| v.discr == ty::VariantDiscr::Relative(i.as_u32())); - let mut niche_filling_layout = None; - // Niche-filling enum optimization. if !def.repr.inhibit_enum_layout_opt() && no_explicit_discriminants { let mut dataful_variant = None; @@ -974,7 +972,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let largest_niche = Niche::from_scalar(dl, offset, niche_scalar.clone()); - niche_filling_layout = Some(Layout { + return Ok(tcx.intern_layout(Layout { variants: Variants::Multiple { tag: niche_scalar, tag_encoding: TagEncoding::Niche { @@ -993,7 +991,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { largest_niche, size, align, - }); + })); } } } @@ -1216,7 +1214,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { let largest_niche = Niche::from_scalar(dl, Size::ZERO, tag.clone()); - let tagged_layout = Layout { + tcx.intern_layout(Layout { variants: Variants::Multiple { tag, tag_encoding: TagEncoding::Direct, @@ -1231,23 +1229,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { abi, align, size, - }; - - let best_layout = match (tagged_layout, niche_filling_layout) { - (tagged_layout, Some(niche_filling_layout)) => { - // Pick the smaller layout; otherwise, - // pick the layout with the larger niche; otherwise, - // pick tagged as it has simpler codegen. - cmp::min_by_key(tagged_layout, niche_filling_layout, |layout| { - let niche_size = - layout.largest_niche.as_ref().map_or(0, |n| n.available(dl)); - (layout.size, cmp::Reverse(niche_size)) - }) - } - (tagged_layout, None) => tagged_layout, - }; - - tcx.intern_layout(best_layout) + }) } // Types with no meaningful known layout. |
