Skip to content

Commit

Permalink
Unconditionally run RevealAll pass and run it earlier
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Sep 11, 2023
1 parent 1779252 commit 97afa07
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 21 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_mir_transform/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ fn run_runtime_lowering_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
let passes: &[&dyn MirPass<'tcx>] = &[
// These next passes must be executed together
&add_call_guards::CriticalCallEdges,
&reveal_all::RevealAll, // has to be done before drop elaboration, since we need to drop opaque types, too.
&elaborate_drops::ElaborateDrops,
// This will remove extraneous landing pads which are no longer
// necessary as well as well as forcing any call in a non-unwinding
Expand Down Expand Up @@ -526,7 +527,6 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
body,
&[
&check_alignment::CheckAlignment,
&reveal_all::RevealAll, // has to be done before inlining, since inlined code is in RevealAll mode.
&lower_slice_len::LowerSliceLenCalls, // has to be done before inlining, otherwise actual call will be almost always inlined. Also simple, so can just do first
&unreachable_prop::UnreachablePropagation,
&uninhabited_enum_branching::UninhabitedEnumBranching,
Expand Down
4 changes: 0 additions & 4 deletions compiler/rustc_mir_transform/src/reveal_all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@ use rustc_middle::ty::{self, Ty, TyCtxt};
pub struct RevealAll;

impl<'tcx> MirPass<'tcx> for RevealAll {
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
sess.mir_opt_level() >= 3 || super::inline::Inline.is_enabled(sess)
}

fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
// Do not apply this transformation to generators.
if body.generator.is_some() {
Expand Down
26 changes: 21 additions & 5 deletions tests/mir-opt/inline/issue_78442.bar.RevealAll.panic-abort.diff
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,44 @@
StorageLive(_2);
StorageLive(_3);
StorageLive(_4);
_4 = hide_foo() -> [return: bb1, unwind unreachable];
_4 = hide_foo() -> [return: bb1, unwind: bb6];
}

bb1: {
_3 = &_4;
StorageLive(_5);
_5 = ();
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind unreachable];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind unreachable];
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
}

bb2: {
StorageDead(_5);
StorageDead(_3);
drop(_4) -> [return: bb3, unwind: bb6];
}

bb3: {
StorageDead(_4);
StorageDead(_2);
_0 = const ();
drop(_1) -> [return: bb3, unwind unreachable];
drop(_1) -> [return: bb4, unwind: bb7];
}

bb3: {
bb4: {
return;
}

bb5 (cleanup): {
drop(_4) -> [return: bb6, unwind terminate(cleanup)];
}

bb6 (cleanup): {
drop(_1) -> [return: bb7, unwind terminate(cleanup)];
}

bb7 (cleanup): {
resume;
}
}

24 changes: 16 additions & 8 deletions tests/mir-opt/inline/issue_78442.bar.RevealAll.panic-unwind.diff
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,43 @@
StorageLive(_2);
StorageLive(_3);
StorageLive(_4);
_4 = hide_foo() -> [return: bb1, unwind: bb4];
_4 = hide_foo() -> [return: bb1, unwind: bb6];
}

bb1: {
_3 = &_4;
StorageLive(_5);
_5 = ();
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb4];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb4];
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
}

bb2: {
StorageDead(_5);
StorageDead(_3);
drop(_4) -> [return: bb3, unwind: bb6];
}

bb3: {
StorageDead(_4);
StorageDead(_2);
_0 = const ();
drop(_1) -> [return: bb3, unwind: bb5];
drop(_1) -> [return: bb4, unwind continue];
}

bb3: {
bb4: {
return;
}

bb4 (cleanup): {
drop(_1) -> [return: bb5, unwind terminate(cleanup)];
bb5 (cleanup): {
drop(_4) -> [return: bb6, unwind terminate(cleanup)];
}

bb5 (cleanup): {
bb6 (cleanup): {
drop(_1) -> [return: bb7, unwind terminate(cleanup)];
}

bb7 (cleanup): {
resume;
}
}
Expand Down
2 changes: 2 additions & 0 deletions tests/ui/polymorphization/generators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ where

#[rustc_polymorphize_error]
pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
//~^ ERROR item has unused generic parameters
|| {
//~^ ERROR item has unused generic parameters
yield 1;
Expand All @@ -57,6 +58,7 @@ pub fn used_type_in_return<R: Default>() -> impl Generator<(), Yield = u32, Retu

#[rustc_polymorphize_error]
pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
//~^ ERROR item has unused generic parameters
|| {
//~^ ERROR item has unused generic parameters
yield 1;
Expand Down
20 changes: 17 additions & 3 deletions tests/ui/polymorphization/generators.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,34 @@ LL | #![feature(generic_const_exprs, generators, generator_trait, rustc_attrs)]
= note: `#[warn(incomplete_features)]` on by default

error: item has unused generic parameters
--> $DIR/generators.rs:35:5
--> $DIR/generators.rs:36:5
|
LL | pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| - generic parameter `T` is unused
LL |
LL | || {
| ^^

error: item has unused generic parameters
--> $DIR/generators.rs:60:5
--> $DIR/generators.rs:34:8
|
LL | pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| ^^^^^^^^^^^ - generic parameter `T` is unused

error: item has unused generic parameters
--> $DIR/generators.rs:62:5
|
LL | pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| ------------ generic parameter `T` is unused
LL |
LL | || {
| ^^

error: aborting due to 2 previous errors; 1 warning emitted
error: item has unused generic parameters
--> $DIR/generators.rs:60:8
|
LL | pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| ^^^^^^^^^^^^ ------------ generic parameter `T` is unused

error: aborting due to 4 previous errors; 1 warning emitted

18 changes: 18 additions & 0 deletions tests/ui/type-alias-impl-trait/destructure_tait-ice-113594.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// build-pass

#![feature(type_alias_impl_trait)]

pub struct Foo {
/// This type must have nontrivial drop glue
field: String,
}

pub type Tait = impl Sized;

pub fn ice_cold(beverage: Tait) {
// Must destructure at least one field of `Foo`
let Foo { field } = beverage;
_ = field;
}

fn main() {}

0 comments on commit 97afa07

Please sign in to comment.