Skip to content

Commit

Permalink
Rollup merge of rust-lang#47467 - arielb1:cleanup-shims, r=eddyb
Browse files Browse the repository at this point in the history
remove noop landing pads in cleanup shims

No-op landing pads are already removed in the normal optimization pipeline - so also removing them on the shim pipeline should slightly improve codegen performance, as these cleanup blocks are known to hurt LLVM.

This un-regresses and is therefore a fix for rust-lang#47442. However, the reporter of that issue should try using `-C panic=abort` instead of carefully avoiding panics.

r? @eddyb
  • Loading branch information
kennytm authored Jan 17, 2018
2 parents 4b636d0 + dc44d41 commit be916ce
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 7 deletions.
3 changes: 2 additions & 1 deletion src/librustc_mir/shim.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use std::fmt;
use std::iter;

use transform::{add_moves_for_packed_drops, add_call_guards};
use transform::{no_landing_pads, simplify};
use transform::{remove_noop_landing_pads, no_landing_pads, simplify};
use util::elaborate_drops::{self, DropElaborator, DropStyle, DropFlagMode};
use util::patch::MirPatch;

Expand Down Expand Up @@ -118,6 +118,7 @@ fn make_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
add_moves_for_packed_drops::add_moves_for_packed_drops(
tcx, &mut result, instance.def_id());
no_landing_pads::no_landing_pads(tcx, &mut result);
remove_noop_landing_pads::remove_noop_landing_pads(tcx, &mut result);
simplify::simplify_cfg(&mut result);
add_call_guards::CriticalCallEdges.add_call_guards(&mut result);
debug!("make_shim({:?}) = {:?}", instance, result);
Expand Down
19 changes: 13 additions & 6 deletions src/librustc_mir/transform/remove_noop_landing_pads.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,24 @@ use util::patch::MirPatch;
/// code for these.
pub struct RemoveNoopLandingPads;

pub fn remove_noop_landing_pads<'a, 'tcx>(
tcx: TyCtxt<'a, 'tcx, 'tcx>,
mir: &mut Mir<'tcx>)
{
if tcx.sess.no_landing_pads() {
return
}
debug!("remove_noop_landing_pads({:?})", mir);

RemoveNoopLandingPads.remove_nop_landing_pads(mir)
}

impl MirPass for RemoveNoopLandingPads {
fn run_pass<'a, 'tcx>(&self,
tcx: TyCtxt<'a, 'tcx, 'tcx>,
_src: MirSource,
mir: &mut Mir<'tcx>) {
if tcx.sess.no_landing_pads() {
return
}

debug!("remove_noop_landing_pads({:?})", mir);
self.remove_nop_landing_pads(mir);
remove_noop_landing_pads(tcx, mir);
}
}

Expand Down
32 changes: 32 additions & 0 deletions src/test/codegen/issue-47442.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// check that we don't emit unneeded `resume` cleanup blocks for every
// destructor.

// CHECK-NOT: Unwind

#![feature(test)]
#![crate_type="rlib"]

extern crate test;

struct Foo {}

impl Drop for Foo {
fn drop(&mut self) {
test::black_box(());
}
}

#[no_mangle]
pub fn foo() {
let _foo = Foo {};
}

0 comments on commit be916ce

Please sign in to comment.