Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 8 pull requests #107327

Closed
wants to merge 23 commits into from
Closed
Changes from 4 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
2b99b9f
Preserve split DWARF files when building archives.
khuey Jan 15, 2023
1a6ab6c
Empty regions don't exist anymore, remove them from fluent
oli-obk Jan 17, 2023
64e5f91
Handle diagnostics customization on the fluent side
oli-obk Jan 17, 2023
6fe4cf7
Migrate mir_build's borrow conflicts
mejrs Jan 17, 2023
afd5307
Move `ty::tls` to seperate file
Noratrieb Dec 31, 2022
0d11b77
Some ty::tls cleanups
Noratrieb Dec 31, 2022
db305d0
Use strict provenance APIs in ty::tls
Noratrieb Dec 31, 2022
f74ca88
Use a type-alias-impl-trait in `ObligationForest`
Noratrieb Jan 21, 2023
d7f6564
Encode AdtDef in the def-id loop.
cjgillot Jul 3, 2022
6ecf30d
Inline encode_enum_variant_info.
cjgillot Jul 3, 2022
4d11206
Tweak comments.
cjgillot Jan 22, 2023
114eb2d
Replace ZST operands and debuginfo by constants.
cjgillot Jan 23, 2023
2a3b0e3
Rename method.
cjgillot Jan 25, 2023
49f4399
Generalize operation.
cjgillot Jan 25, 2023
d7f59e9
Custom mir: Add support for some remaining, easy to support constructs
JakobDegen Jan 26, 2023
e328198
Rollup merge of #106904 - khuey:preserve_debuginfo_for_rlibs, r=david…
matthiaskrgr Jan 26, 2023
dee71b6
Rollup merge of #106971 - oli-obk:tait_error, r=davidtwco
matthiaskrgr Jan 26, 2023
b3cdfc5
Rollup merge of #106978 - mejrs:mir_build3, r=davidtwco
matthiaskrgr Jan 26, 2023
6ec4b73
Rollup merge of #107150 - Nilstrieb:thread-local-cleanups, r=cjgillot
matthiaskrgr Jan 26, 2023
2f2356a
Rollup merge of #107168 - Nilstrieb:if-a-tait-falls-in-the-forest,can…
matthiaskrgr Jan 26, 2023
ca7a610
Rollup merge of #107189 - cjgillot:meta-adt, r=compiler-errors
matthiaskrgr Jan 26, 2023
71fa6ef
Rollup merge of #107270 - cjgillot:remove-zst, r=oli-obk
matthiaskrgr Jan 26, 2023
a3da8b6
Rollup merge of #107322 - JakobDegen:custom-mir, r=tmiasko
matthiaskrgr Jan 26, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 103 additions & 29 deletions compiler/rustc_mir_transform/src/remove_zsts.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
//! Removes assignments to ZST places.
//! Removes operations on ZST places, and convert ZST operands to constants.
use crate::MirPass;
use rustc_middle::mir::{Body, StatementKind};
use rustc_middle::mir::interpret::ConstValue;
use rustc_middle::mir::visit::*;
use rustc_middle::mir::*;
use rustc_middle::ty::{self, Ty, TyCtxt};

pub struct RemoveZsts;
@@ -16,38 +18,24 @@ impl<'tcx> MirPass<'tcx> for RemoveZsts {
if tcx.type_of(body.source.def_id()).is_generator() {
return;
}
let param_env = tcx.param_env(body.source.def_id());
let basic_blocks = body.basic_blocks.as_mut_preserves_cfg();
let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
let local_decls = &body.local_decls;
for block in basic_blocks {
for statement in block.statements.iter_mut() {
if let StatementKind::Assign(box (place, _)) | StatementKind::Deinit(box place) =
statement.kind
{
let place_ty = place.ty(local_decls, tcx).ty;
if !maybe_zst(place_ty) {
continue;
}
let Ok(layout) = tcx.layout_of(param_env.and(place_ty)) else {
continue;
};
if !layout.is_zst() {
continue;
}
if tcx.consider_optimizing(|| {
format!(
"RemoveZsts - Place: {:?} SourceInfo: {:?}",
place, statement.source_info
)
}) {
statement.make_nop();
}
}
}
let mut replacer = Replacer { tcx, param_env, local_decls };
for var_debug_info in &mut body.var_debug_info {
replacer.visit_var_debug_info(var_debug_info);
}
for (bb, data) in body.basic_blocks.as_mut_preserves_cfg().iter_enumerated_mut() {
replacer.visit_basic_block_data(bb, data);
}
}
}

struct Replacer<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>,
local_decls: &'a LocalDecls<'tcx>,
}

/// A cheap, approximate check to avoid unnecessary `layout_of` calls.
fn maybe_zst(ty: Ty<'_>) -> bool {
match ty.kind() {
@@ -63,3 +51,89 @@ fn maybe_zst(ty: Ty<'_>) -> bool {
_ => false,
}
}

impl<'tcx> Replacer<'_, 'tcx> {
fn known_to_be_zst(&self, ty: Ty<'tcx>) -> bool {
if !maybe_zst(ty) {
return false;
}
let Ok(layout) = self.tcx.layout_of(self.param_env.and(ty)) else {
return false;
};
layout.is_zst()
}

fn make_zst(&self, ty: Ty<'tcx>) -> Constant<'tcx> {
debug_assert!(self.known_to_be_zst(ty));
Constant {
span: rustc_span::DUMMY_SP,
user_ty: None,
literal: ConstantKind::Val(ConstValue::ZeroSized, ty),
}
}
}

impl<'tcx> MutVisitor<'tcx> for Replacer<'_, 'tcx> {
fn tcx(&self) -> TyCtxt<'tcx> {
self.tcx
}

fn visit_var_debug_info(&mut self, var_debug_info: &mut VarDebugInfo<'tcx>) {
match var_debug_info.value {
VarDebugInfoContents::Const(_) => {}
VarDebugInfoContents::Place(place) => {
let place_ty = place.ty(self.local_decls, self.tcx).ty;
if self.known_to_be_zst(place_ty) {
var_debug_info.value = VarDebugInfoContents::Const(self.make_zst(place_ty))
}
}
VarDebugInfoContents::Composite { ty, fragments: _ } => {
if self.known_to_be_zst(ty) {
var_debug_info.value = VarDebugInfoContents::Const(self.make_zst(ty))
}
}
}
}

fn visit_operand(&mut self, operand: &mut Operand<'tcx>, loc: Location) {
if let Operand::Constant(_) = operand {
return;
}
let op_ty = operand.ty(self.local_decls, self.tcx);
if self.known_to_be_zst(op_ty)
&& self.tcx.consider_optimizing(|| {
format!("RemoveZsts - Operand: {:?} Location: {:?}", operand, loc)
})
{
*operand = Operand::Constant(Box::new(self.make_zst(op_ty)))
}
}

fn visit_statement(&mut self, statement: &mut Statement<'tcx>, loc: Location) {
let place_for_ty = match statement.kind {
StatementKind::Assign(box (place, ref rvalue)) => {
rvalue.is_safe_to_remove().then_some(place)
}
StatementKind::Deinit(box place)
| StatementKind::SetDiscriminant { box place, variant_index: _ }
| StatementKind::AscribeUserType(box (place, _), _)
| StatementKind::Retag(_, box place)
| StatementKind::FakeRead(box (_, place)) => Some(place),
StatementKind::StorageLive(local) | StatementKind::StorageDead(local) => {
Some(local.into())
}
StatementKind::Coverage(_) | StatementKind::Intrinsic(_) | StatementKind::Nop => None,
};
if let Some(place_for_ty) = place_for_ty
&& let ty = place_for_ty.ty(self.local_decls, self.tcx).ty
&& self.known_to_be_zst(ty)
&& self.tcx.consider_optimizing(|| {
format!("RemoveZsts - Place: {:?} SourceInfo: {:?}", place_for_ty, statement.source_info)
})
{
statement.make_nop();
} else {
self.super_statement(statement, loc);
}
}
}
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@
}

bb1: {
StorageLive(_2); // scope 0 at $SRC_DIR/std/src/panic.rs:LL:COL
_2 = begin_panic::<&str>(const "explicit panic"); // scope 0 at $SRC_DIR/std/src/panic.rs:LL:COL
// mir::Constant
// + span: $SRC_DIR/std/src/panic.rs:LL:COL
14 changes: 4 additions & 10 deletions tests/mir-opt/const_prop/invalid_constant.main.ConstProp.diff
Original file line number Diff line number Diff line change
@@ -12,12 +12,10 @@
let _3: [E; 1]; // in scope 1 at $DIR/invalid_constant.rs:+13:9: +13:21
scope 3 {
debug _invalid_tag => _3; // in scope 3 at $DIR/invalid_constant.rs:+13:9: +13:21
let _6: [Empty; 1]; // in scope 3 at $DIR/invalid_constant.rs:+20:9: +20:31
scope 5 {
debug _enum_without_variants => _6; // in scope 5 at $DIR/invalid_constant.rs:+20:9: +20:31
let _7: main::Str<"���">; // in scope 5 at $DIR/invalid_constant.rs:+24:9: +24:22
debug _enum_without_variants => const [ZeroSized: Empty]; // in scope 5 at $DIR/invalid_constant.rs:+20:9: +20:31
scope 7 {
debug _non_utf8_str => _7; // in scope 7 at $DIR/invalid_constant.rs:+24:9: +24:22
debug _non_utf8_str => const Str::<"���">; // in scope 7 at $DIR/invalid_constant.rs:+24:9: +24:22
}
}
scope 6 {
@@ -46,18 +44,14 @@
- _3 = [move _4]; // scope 1 at $DIR/invalid_constant.rs:+13:24: +13:60
+ _4 = const Scalar(0x00000004): E; // scope 4 at $DIR/invalid_constant.rs:+13:34: +13:57
+ // mir::Constant
+ // + span: $DIR/invalid_constant.rs:28:34: 28:57
+ // + span: $DIR/invalid_constant.rs:29:34: 29:57
+ // + literal: Const { ty: E, val: Value(Scalar(0x00000004)) }
+ _3 = [const Scalar(0x00000004): E]; // scope 1 at $DIR/invalid_constant.rs:+13:24: +13:60
+ // mir::Constant
+ // + span: $DIR/invalid_constant.rs:28:24: 28:60
+ // + span: $DIR/invalid_constant.rs:29:24: 29:60
+ // + literal: Const { ty: E, val: Value(Scalar(0x00000004)) }
StorageDead(_4); // scope 1 at $DIR/invalid_constant.rs:+13:59: +13:60
StorageDead(_5); // scope 1 at $DIR/invalid_constant.rs:+13:60: +13:61
StorageLive(_6); // scope 3 at $DIR/invalid_constant.rs:+20:9: +20:31
StorageLive(_7); // scope 5 at $DIR/invalid_constant.rs:+24:9: +24:22
StorageDead(_7); // scope 5 at $DIR/invalid_constant.rs:+27:1: +27:2
StorageDead(_6); // scope 3 at $DIR/invalid_constant.rs:+27:1: +27:2
StorageDead(_3); // scope 1 at $DIR/invalid_constant.rs:+27:1: +27:2
StorageDead(_1); // scope 0 at $DIR/invalid_constant.rs:+27:1: +27:2
return; // scope 0 at $DIR/invalid_constant.rs:+27:2: +27:2
79 changes: 79 additions & 0 deletions tests/mir-opt/const_prop/invalid_constant.main.RemoveZsts.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
- // MIR for `main` before RemoveZsts
+ // MIR for `main` after RemoveZsts

fn main() -> () {
let mut _0: (); // return place in scope 0 at $DIR/invalid_constant.rs:+0:11: +0:11
let _1: char; // in scope 0 at $DIR/invalid_constant.rs:+6:9: +6:22
let mut _2: main::InvalidChar; // in scope 0 at $DIR/invalid_constant.rs:+6:34: +6:63
let mut _4: E; // in scope 0 at $DIR/invalid_constant.rs:+13:25: +13:59
let mut _5: main::InvalidTag; // in scope 0 at $DIR/invalid_constant.rs:+13:34: +13:55
let mut _7: Empty; // in scope 0 at $DIR/invalid_constant.rs:+20:35: +20:73
let mut _8: main::NoVariants; // in scope 0 at $DIR/invalid_constant.rs:+20:44: +20:65
scope 1 {
debug _invalid_char => _1; // in scope 1 at $DIR/invalid_constant.rs:+6:9: +6:22
let _3: [E; 1]; // in scope 1 at $DIR/invalid_constant.rs:+13:9: +13:21
scope 3 {
debug _invalid_tag => _3; // in scope 3 at $DIR/invalid_constant.rs:+13:9: +13:21
let _6: [Empty; 1]; // in scope 3 at $DIR/invalid_constant.rs:+20:9: +20:31
scope 5 {
- debug _enum_without_variants => _6; // in scope 5 at $DIR/invalid_constant.rs:+20:9: +20:31
+ debug _enum_without_variants => const [ZeroSized: Empty]; // in scope 5 at $DIR/invalid_constant.rs:+20:9: +20:31
let _9: main::Str<"���">; // in scope 5 at $DIR/invalid_constant.rs:+24:9: +24:22
scope 7 {
- debug _non_utf8_str => _9; // in scope 7 at $DIR/invalid_constant.rs:+24:9: +24:22
+ debug _non_utf8_str => const Str::<"���">; // in scope 7 at $DIR/invalid_constant.rs:+24:9: +24:22
}
}
scope 6 {
}
}
scope 4 {
}
}
scope 2 {
}

bb0: {
StorageLive(_1); // scope 0 at $DIR/invalid_constant.rs:+6:9: +6:22
StorageLive(_2); // scope 2 at $DIR/invalid_constant.rs:+6:34: +6:63
Deinit(_2); // scope 2 at $DIR/invalid_constant.rs:+6:34: +6:63
(_2.0: u32) = const 1114113_u32; // scope 2 at $DIR/invalid_constant.rs:+6:34: +6:63
_1 = (_2.1: char); // scope 2 at $DIR/invalid_constant.rs:+6:34: +6:67
StorageDead(_2); // scope 0 at $DIR/invalid_constant.rs:+6:69: +6:70
StorageLive(_3); // scope 1 at $DIR/invalid_constant.rs:+13:9: +13:21
StorageLive(_4); // scope 1 at $DIR/invalid_constant.rs:+13:25: +13:59
StorageLive(_5); // scope 4 at $DIR/invalid_constant.rs:+13:34: +13:55
Deinit(_5); // scope 4 at $DIR/invalid_constant.rs:+13:34: +13:55
(_5.0: u32) = const 4_u32; // scope 4 at $DIR/invalid_constant.rs:+13:34: +13:55
_4 = (_5.1: E); // scope 4 at $DIR/invalid_constant.rs:+13:34: +13:57
_3 = [move _4]; // scope 1 at $DIR/invalid_constant.rs:+13:24: +13:60
StorageDead(_4); // scope 1 at $DIR/invalid_constant.rs:+13:59: +13:60
StorageDead(_5); // scope 1 at $DIR/invalid_constant.rs:+13:60: +13:61
- StorageLive(_6); // scope 3 at $DIR/invalid_constant.rs:+20:9: +20:31
- StorageLive(_7); // scope 3 at $DIR/invalid_constant.rs:+20:35: +20:73
+ nop; // scope 3 at $DIR/invalid_constant.rs:+20:9: +20:31
+ nop; // scope 3 at $DIR/invalid_constant.rs:+20:35: +20:73
StorageLive(_8); // scope 6 at $DIR/invalid_constant.rs:+20:44: +20:65
Deinit(_8); // scope 6 at $DIR/invalid_constant.rs:+20:44: +20:65
(_8.0: u32) = const 0_u32; // scope 6 at $DIR/invalid_constant.rs:+20:44: +20:65
- _7 = (_8.1: Empty); // scope 6 at $DIR/invalid_constant.rs:+20:44: +20:71
- _6 = [move _7]; // scope 3 at $DIR/invalid_constant.rs:+20:34: +20:74
- StorageDead(_7); // scope 3 at $DIR/invalid_constant.rs:+20:73: +20:74
+ nop; // scope 6 at $DIR/invalid_constant.rs:+20:44: +20:71
+ nop; // scope 3 at $DIR/invalid_constant.rs:+20:34: +20:74
+ nop; // scope 3 at $DIR/invalid_constant.rs:+20:73: +20:74
StorageDead(_8); // scope 3 at $DIR/invalid_constant.rs:+20:74: +20:75
- StorageLive(_9); // scope 5 at $DIR/invalid_constant.rs:+24:9: +24:22
- _0 = const (); // scope 0 at $DIR/invalid_constant.rs:+0:11: +27:2
- StorageDead(_9); // scope 5 at $DIR/invalid_constant.rs:+27:1: +27:2
- StorageDead(_6); // scope 3 at $DIR/invalid_constant.rs:+27:1: +27:2
+ nop; // scope 5 at $DIR/invalid_constant.rs:+24:9: +24:22
+ nop; // scope 0 at $DIR/invalid_constant.rs:+0:11: +27:2
+ nop; // scope 5 at $DIR/invalid_constant.rs:+27:1: +27:2
+ nop; // scope 3 at $DIR/invalid_constant.rs:+27:1: +27:2
StorageDead(_3); // scope 1 at $DIR/invalid_constant.rs:+27:1: +27:2
StorageDead(_1); // scope 0 at $DIR/invalid_constant.rs:+27:1: +27:2
return; // scope 0 at $DIR/invalid_constant.rs:+27:2: +27:2
}
}

1 change: 1 addition & 0 deletions tests/mir-opt/const_prop/invalid_constant.rs
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ enum E { A, B, C }
#[derive(Copy, Clone)]
enum Empty {}

// EMIT_MIR invalid_constant.main.RemoveZsts.diff
// EMIT_MIR invalid_constant.main.ConstProp.diff
fn main() {
// An invalid char.
2 changes: 0 additions & 2 deletions tests/mir-opt/const_prop/issue_66971.main.ConstProp.diff
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@
let mut _2: ((), u8, u8); // in scope 0 at $DIR/issue_66971.rs:+1:12: +1:22

bb0: {
StorageLive(_1); // scope 0 at $DIR/issue_66971.rs:+1:5: +1:23
StorageLive(_2); // scope 0 at $DIR/issue_66971.rs:+1:12: +1:22
Deinit(_2); // scope 0 at $DIR/issue_66971.rs:+1:12: +1:22
(_2.1: u8) = const 0_u8; // scope 0 at $DIR/issue_66971.rs:+1:12: +1:22
@@ -20,7 +19,6 @@

bb1: {
StorageDead(_2); // scope 0 at $DIR/issue_66971.rs:+1:22: +1:23
StorageDead(_1); // scope 0 at $DIR/issue_66971.rs:+1:23: +1:24
return; // scope 0 at $DIR/issue_66971.rs:+2:2: +2:2
}
}
2 changes: 0 additions & 2 deletions tests/mir-opt/const_prop/issue_67019.main.ConstProp.diff
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@
let mut _3: (u8, u8); // in scope 0 at $DIR/issue_67019.rs:+1:11: +1:17

bb0: {
StorageLive(_1); // scope 0 at $DIR/issue_67019.rs:+1:5: +1:20
StorageLive(_2); // scope 0 at $DIR/issue_67019.rs:+1:10: +1:19
StorageLive(_3); // scope 0 at $DIR/issue_67019.rs:+1:11: +1:17
Deinit(_3); // scope 0 at $DIR/issue_67019.rs:+1:11: +1:17
@@ -26,7 +25,6 @@

bb1: {
StorageDead(_2); // scope 0 at $DIR/issue_67019.rs:+1:19: +1:20
StorageDead(_1); // scope 0 at $DIR/issue_67019.rs:+1:20: +1:21
return; // scope 0 at $DIR/issue_67019.rs:+2:2: +2:2
}
}
Original file line number Diff line number Diff line change
@@ -13,7 +13,6 @@
bb0: {
StorageLive(_1); // scope 0 at $DIR/scalar_literal_propagation.rs:+1:9: +1:10
_1 = const 1_u32; // scope 0 at $DIR/scalar_literal_propagation.rs:+1:13: +1:14
StorageLive(_2); // scope 1 at $DIR/scalar_literal_propagation.rs:+2:5: +2:15
StorageLive(_3); // scope 1 at $DIR/scalar_literal_propagation.rs:+2:13: +2:14
- _3 = _1; // scope 1 at $DIR/scalar_literal_propagation.rs:+2:13: +2:14
- _2 = consume(move _3) -> bb1; // scope 1 at $DIR/scalar_literal_propagation.rs:+2:5: +2:15
@@ -26,7 +25,6 @@

bb1: {
StorageDead(_3); // scope 1 at $DIR/scalar_literal_propagation.rs:+2:14: +2:15
StorageDead(_2); // scope 1 at $DIR/scalar_literal_propagation.rs:+2:15: +2:16
StorageDead(_1); // scope 0 at $DIR/scalar_literal_propagation.rs:+3:1: +3:2
return; // scope 0 at $DIR/scalar_literal_propagation.rs:+3:2: +3:2
}
Original file line number Diff line number Diff line change
@@ -15,7 +15,6 @@
Deinit(_1); // scope 0 at $DIR/tuple_literal_propagation.rs:+1:13: +1:19
(_1.0: u32) = const 1_u32; // scope 0 at $DIR/tuple_literal_propagation.rs:+1:13: +1:19
(_1.1: u32) = const 2_u32; // scope 0 at $DIR/tuple_literal_propagation.rs:+1:13: +1:19
StorageLive(_2); // scope 1 at $DIR/tuple_literal_propagation.rs:+3:5: +3:15
StorageLive(_3); // scope 1 at $DIR/tuple_literal_propagation.rs:+3:13: +3:14
- _3 = _1; // scope 1 at $DIR/tuple_literal_propagation.rs:+3:13: +3:14
+ _3 = const (1_u32, 2_u32); // scope 1 at $DIR/tuple_literal_propagation.rs:+3:13: +3:14
@@ -27,7 +26,6 @@

bb1: {
StorageDead(_3); // scope 1 at $DIR/tuple_literal_propagation.rs:+3:14: +3:15
StorageDead(_2); // scope 1 at $DIR/tuple_literal_propagation.rs:+3:15: +3:16
StorageDead(_1); // scope 0 at $DIR/tuple_literal_propagation.rs:+4:1: +4:2
return; // scope 0 at $DIR/tuple_literal_propagation.rs:+4:2: +4:2
}
16 changes: 8 additions & 8 deletions tests/mir-opt/inline/asm_unwind.main.Inline.diff
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
+ scope 1 (inlined foo) { // at $DIR/asm_unwind.rs:21:5: 21:10
+ let _2: D; // in scope 1 at $DIR/asm_unwind.rs:15:9: 15:11
+ scope 2 {
+ debug _d => _2; // in scope 2 at $DIR/asm_unwind.rs:15:9: 15:11
+ debug _d => const D; // in scope 2 at $DIR/asm_unwind.rs:15:9: 15:11
+ scope 3 {
+ }
+ }
@@ -19,21 +19,21 @@
- // mir::Constant
- // + span: $DIR/asm_unwind.rs:21:5: 21:8
- // + literal: Const { ty: fn() {foo}, val: Value(<ZST>) }
+ StorageLive(_2); // scope 1 at $DIR/asm_unwind.rs:15:9: 15:11
+ asm!("", options(MAY_UNWIND)) -> [return: bb1, unwind: bb3]; // scope 3 at $DIR/asm_unwind.rs:16:14: 16:54
+ StorageLive(_2); // scope 0 at $DIR/asm_unwind.rs:+1:5: +1:10
+ asm!("", options(MAY_UNWIND)) -> [return: bb2, unwind: bb3]; // scope 3 at $DIR/asm_unwind.rs:16:14: 16:54
}

bb1: {
+ drop(_2) -> bb2; // scope 1 at $DIR/asm_unwind.rs:17:1: 17:2
+ }
+
+ bb2: {
+ StorageDead(_2); // scope 1 at $DIR/asm_unwind.rs:17:1: 17:2
+ StorageDead(_2); // scope 0 at $DIR/asm_unwind.rs:+1:5: +1:10
StorageDead(_1); // scope 0 at $DIR/asm_unwind.rs:+1:10: +1:11
_0 = const (); // scope 0 at $DIR/asm_unwind.rs:+0:15: +2:2
return; // scope 0 at $DIR/asm_unwind.rs:+2:2: +2:2
+ }
+
+ bb2: {
+ drop(_2) -> bb1; // scope 1 at $DIR/asm_unwind.rs:17:1: 17:2
+ }
+
+ bb3 (cleanup): {
+ drop(_2) -> bb4; // scope 1 at $DIR/asm_unwind.rs:17:1: 17:2
+ }
9 changes: 5 additions & 4 deletions tests/mir-opt/inline/cycle.g.Inline.diff
Original file line number Diff line number Diff line change
@@ -5,11 +5,11 @@
let mut _0: (); // return place in scope 0 at $DIR/cycle.rs:+0:8: +0:8
let _1: (); // in scope 0 at $DIR/cycle.rs:+1:5: +1:12
+ let mut _2: fn() {main}; // in scope 0 at $DIR/cycle.rs:+1:5: +1:12
+ let mut _5: (); // in scope 0 at $DIR/cycle.rs:6:5: 6:8
+ scope 1 (inlined f::<fn() {main}>) { // at $DIR/cycle.rs:12:5: 12:12
+ debug g => _2; // in scope 1 at $DIR/cycle.rs:5:6: 5:7
+ let _3: (); // in scope 1 at $DIR/cycle.rs:6:5: 6:8
+ let mut _4: &fn() {main}; // in scope 1 at $DIR/cycle.rs:6:5: 6:6
+ let mut _5: (); // in scope 1 at $DIR/cycle.rs:6:5: 6:8
+ scope 2 (inlined <fn() {main} as Fn<()>>::call - shim(fn() {main})) { // at $DIR/cycle.rs:6:5: 6:8
+ }
+ }
@@ -25,14 +25,16 @@
- // mir::Constant
// + span: $DIR/cycle.rs:12:7: 12:11
// + literal: Const { ty: fn() {main}, val: Value(<ZST>) }
+ StorageLive(_3); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ StorageLive(_3); // scope 0 at $DIR/cycle.rs:+1:5: +1:12
+ StorageLive(_4); // scope 1 at $DIR/cycle.rs:6:5: 6:6
+ _4 = &_2; // scope 1 at $DIR/cycle.rs:6:5: 6:6
+ StorageLive(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ _5 = const (); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ _3 = move (*_4)() -> [return: bb4, unwind: bb2]; // scope 2 at $SRC_DIR/core/src/ops/function.rs:LL:COL
}

bb1: {
+ StorageDead(_3); // scope 0 at $DIR/cycle.rs:+1:5: +1:12
+ StorageDead(_2); // scope 0 at $DIR/cycle.rs:+1:5: +1:12
StorageDead(_1); // scope 0 at $DIR/cycle.rs:+1:12: +1:13
_0 = const (); // scope 0 at $DIR/cycle.rs:+0:8: +2:2
@@ -48,9 +50,8 @@
+ }
+
+ bb4: {
+ StorageDead(_5); // scope 1 at $DIR/cycle.rs:6:7: 6:8
+ StorageDead(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ StorageDead(_4); // scope 1 at $DIR/cycle.rs:6:7: 6:8
+ StorageDead(_3); // scope 1 at $DIR/cycle.rs:6:8: 6:9
+ drop(_2) -> bb1; // scope 1 at $DIR/cycle.rs:7:1: 7:2
}
}
9 changes: 5 additions & 4 deletions tests/mir-opt/inline/cycle.main.Inline.diff
Original file line number Diff line number Diff line change
@@ -5,11 +5,11 @@
let mut _0: (); // return place in scope 0 at $DIR/cycle.rs:+0:11: +0:11
let _1: (); // in scope 0 at $DIR/cycle.rs:+1:5: +1:9
+ let mut _2: fn() {g}; // in scope 0 at $DIR/cycle.rs:+1:5: +1:9
+ let mut _5: (); // in scope 0 at $DIR/cycle.rs:6:5: 6:8
+ scope 1 (inlined f::<fn() {g}>) { // at $DIR/cycle.rs:17:5: 17:9
+ debug g => _2; // in scope 1 at $DIR/cycle.rs:5:6: 5:7
+ let _3: (); // in scope 1 at $DIR/cycle.rs:6:5: 6:8
+ let mut _4: &fn() {g}; // in scope 1 at $DIR/cycle.rs:6:5: 6:6
+ let mut _5: (); // in scope 1 at $DIR/cycle.rs:6:5: 6:8
+ scope 2 (inlined <fn() {g} as Fn<()>>::call - shim(fn() {g})) { // at $DIR/cycle.rs:6:5: 6:8
+ }
+ }
@@ -25,14 +25,16 @@
- // mir::Constant
// + span: $DIR/cycle.rs:17:7: 17:8
// + literal: Const { ty: fn() {g}, val: Value(<ZST>) }
+ StorageLive(_3); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ StorageLive(_3); // scope 0 at $DIR/cycle.rs:+1:5: +1:9
+ StorageLive(_4); // scope 1 at $DIR/cycle.rs:6:5: 6:6
+ _4 = &_2; // scope 1 at $DIR/cycle.rs:6:5: 6:6
+ StorageLive(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ _5 = const (); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ _3 = move (*_4)() -> [return: bb4, unwind: bb2]; // scope 2 at $SRC_DIR/core/src/ops/function.rs:LL:COL
}

bb1: {
+ StorageDead(_3); // scope 0 at $DIR/cycle.rs:+1:5: +1:9
+ StorageDead(_2); // scope 0 at $DIR/cycle.rs:+1:5: +1:9
StorageDead(_1); // scope 0 at $DIR/cycle.rs:+1:9: +1:10
_0 = const (); // scope 0 at $DIR/cycle.rs:+0:11: +2:2
@@ -48,9 +50,8 @@
+ }
+
+ bb4: {
+ StorageDead(_5); // scope 1 at $DIR/cycle.rs:6:7: 6:8
+ StorageDead(_5); // scope 1 at $DIR/cycle.rs:6:5: 6:8
+ StorageDead(_4); // scope 1 at $DIR/cycle.rs:6:7: 6:8
+ StorageDead(_3); // scope 1 at $DIR/cycle.rs:6:8: 6:9
+ drop(_2) -> bb1; // scope 1 at $DIR/cycle.rs:7:1: 7:2
}
}
56 changes: 28 additions & 28 deletions tests/mir-opt/inline/exponential_runtime.main.Inline.diff
Original file line number Diff line number Diff line change
@@ -18,9 +18,13 @@
bb0: {
StorageLive(_1); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
- _1 = <() as G>::call() -> bb1; // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
+ StorageLive(_2); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ StorageLive(_5); // scope 2 at $DIR/exponential_runtime.rs:61:9: 61:25
+ _5 = <() as E>::call() -> bb3; // scope 2 at $DIR/exponential_runtime.rs:61:9: 61:25
+ StorageLive(_2); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
+ StorageLive(_3); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
+ StorageLive(_4); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
+ StorageLive(_5); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ StorageLive(_6); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ StorageLive(_7); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ _5 = <() as E>::call() -> bb4; // scope 2 at $DIR/exponential_runtime.rs:61:9: 61:25
// mir::Constant
- // + span: $DIR/exponential_runtime.rs:86:5: 86:20
- // + literal: Const { ty: fn() {<() as G>::call}, val: Value(<ZST>) }
@@ -29,47 +33,43 @@
}

bb1: {
+ StorageDead(_3); // scope 1 at $DIR/exponential_runtime.rs:74:25: 74:26
+ StorageLive(_4); // scope 1 at $DIR/exponential_runtime.rs:75:9: 75:25
+ _4 = <() as F>::call() -> bb2; // scope 1 at $DIR/exponential_runtime.rs:75:9: 75:25
+ // mir::Constant
+ // + span: $DIR/exponential_runtime.rs:75:9: 75:23
+ // + literal: Const { ty: fn() {<() as F>::call}, val: Value(<ZST>) }
+ }
+
+ bb2: {
+ StorageDead(_4); // scope 1 at $DIR/exponential_runtime.rs:75:25: 75:26
+ StorageDead(_4); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
+ StorageDead(_3); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
+ StorageDead(_2); // scope 0 at $DIR/exponential_runtime.rs:+1:5: +1:22
StorageDead(_1); // scope 0 at $DIR/exponential_runtime.rs:+1:22: +1:23
_0 = const (); // scope 0 at $DIR/exponential_runtime.rs:+0:11: +2:2
return; // scope 0 at $DIR/exponential_runtime.rs:+2:2: +2:2
+ }
+
+ bb2: {
+ StorageDead(_7); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ StorageDead(_6); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ StorageDead(_5); // scope 1 at $DIR/exponential_runtime.rs:73:9: 73:25
+ _3 = <() as F>::call() -> bb3; // scope 1 at $DIR/exponential_runtime.rs:74:9: 74:25
+ // mir::Constant
+ // + span: $DIR/exponential_runtime.rs:74:9: 74:23
+ // + literal: Const { ty: fn() {<() as F>::call}, val: Value(<ZST>) }
+ }
+
+ bb3: {
+ StorageDead(_5); // scope 2 at $DIR/exponential_runtime.rs:61:25: 61:26
+ StorageLive(_6); // scope 2 at $DIR/exponential_runtime.rs:62:9: 62:25
+ _6 = <() as E>::call() -> bb4; // scope 2 at $DIR/exponential_runtime.rs:62:9: 62:25
+ _4 = <() as F>::call() -> bb1; // scope 1 at $DIR/exponential_runtime.rs:75:9: 75:25
+ // mir::Constant
+ // + span: $DIR/exponential_runtime.rs:62:9: 62:23
+ // + literal: Const { ty: fn() {<() as E>::call}, val: Value(<ZST>) }
+ // + span: $DIR/exponential_runtime.rs:75:9: 75:23
+ // + literal: Const { ty: fn() {<() as F>::call}, val: Value(<ZST>) }
+ }
+
+ bb4: {
+ StorageDead(_6); // scope 2 at $DIR/exponential_runtime.rs:62:25: 62:26
+ StorageLive(_7); // scope 2 at $DIR/exponential_runtime.rs:63:9: 63:25
+ _7 = <() as E>::call() -> bb5; // scope 2 at $DIR/exponential_runtime.rs:63:9: 63:25
+ _6 = <() as E>::call() -> bb5; // scope 2 at $DIR/exponential_runtime.rs:62:9: 62:25
+ // mir::Constant
+ // + span: $DIR/exponential_runtime.rs:63:9: 63:23
+ // + span: $DIR/exponential_runtime.rs:62:9: 62:23
+ // + literal: Const { ty: fn() {<() as E>::call}, val: Value(<ZST>) }
+ }
+
+ bb5: {
+ StorageDead(_7); // scope 2 at $DIR/exponential_runtime.rs:63:25: 63:26
+ StorageDead(_2); // scope 1 at $DIR/exponential_runtime.rs:73:25: 73:26
+ StorageLive(_3); // scope 1 at $DIR/exponential_runtime.rs:74:9: 74:25
+ _3 = <() as F>::call() -> bb1; // scope 1 at $DIR/exponential_runtime.rs:74:9: 74:25
+ _7 = <() as E>::call() -> bb2; // scope 2 at $DIR/exponential_runtime.rs:63:9: 63:25
+ // mir::Constant
+ // + span: $DIR/exponential_runtime.rs:74:9: 74:23
+ // + literal: Const { ty: fn() {<() as F>::call}, val: Value(<ZST>) }
+ // + span: $DIR/exponential_runtime.rs:63:9: 63:23
+ // + literal: Const { ty: fn() {<() as E>::call}, val: Value(<ZST>) }
}
}

9 changes: 5 additions & 4 deletions tests/mir-opt/inline/inline_cycle.two.Inline.diff
Original file line number Diff line number Diff line change
@@ -5,10 +5,10 @@
let mut _0: (); // return place in scope 0 at $DIR/inline_cycle.rs:+0:10: +0:10
let _1: (); // in scope 0 at $DIR/inline_cycle.rs:+1:5: +1:12
+ let mut _2: fn() {f}; // in scope 0 at $DIR/inline_cycle.rs:+1:5: +1:12
+ let mut _4: (); // in scope 0 at $DIR/inline_cycle.rs:54:5: 54:8
+ scope 1 (inlined call::<fn() {f}>) { // at $DIR/inline_cycle.rs:49:5: 49:12
+ debug f => _2; // in scope 1 at $DIR/inline_cycle.rs:53:22: 53:23
+ let _3: (); // in scope 1 at $DIR/inline_cycle.rs:54:5: 54:8
+ let mut _4: (); // in scope 1 at $DIR/inline_cycle.rs:54:5: 54:8
+ scope 2 (inlined <fn() {f} as FnOnce<()>>::call_once - shim(fn() {f})) { // at $DIR/inline_cycle.rs:54:5: 54:8
+ }
+ }
@@ -24,14 +24,15 @@
- // mir::Constant
// + span: $DIR/inline_cycle.rs:49:10: 49:11
// + literal: Const { ty: fn() {f}, val: Value(<ZST>) }
+ StorageLive(_3); // scope 1 at $DIR/inline_cycle.rs:54:5: 54:8
+ StorageLive(_3); // scope 0 at $DIR/inline_cycle.rs:+1:5: +1:12
+ StorageLive(_4); // scope 1 at $DIR/inline_cycle.rs:54:5: 54:8
+ _4 = const (); // scope 1 at $DIR/inline_cycle.rs:54:5: 54:8
+ _3 = move _2() -> bb1; // scope 2 at $SRC_DIR/core/src/ops/function.rs:LL:COL
}

bb1: {
+ StorageDead(_4); // scope 1 at $DIR/inline_cycle.rs:54:7: 54:8
+ StorageDead(_3); // scope 1 at $DIR/inline_cycle.rs:54:8: 54:9
+ StorageDead(_4); // scope 1 at $DIR/inline_cycle.rs:54:5: 54:8
+ StorageDead(_3); // scope 0 at $DIR/inline_cycle.rs:+1:5: +1:12
+ StorageDead(_2); // scope 0 at $DIR/inline_cycle.rs:+1:5: +1:12
StorageDead(_1); // scope 0 at $DIR/inline_cycle.rs:+1:12: +1:13
_0 = const (); // scope 0 at $DIR/inline_cycle.rs:+0:10: +2:2
2 changes: 1 addition & 1 deletion tests/mir-opt/inline/inline_diverging.g.Inline.diff
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@
bb2: {
StorageLive(_6); // scope 0 at $DIR/inline_diverging.rs:+4:9: +4:16
- _6 = panic(); // scope 0 at $DIR/inline_diverging.rs:+4:9: +4:16
+ StorageLive(_7); // scope 1 at $SRC_DIR/std/src/panic.rs:LL:COL
+ StorageLive(_7); // scope 0 at $DIR/inline_diverging.rs:+4:9: +4:16
+ _7 = begin_panic::<&str>(const "explicit panic"); // scope 1 at $SRC_DIR/std/src/panic.rs:LL:COL
// mir::Constant
- // + span: $DIR/inline_diverging.rs:16:9: 16:14
38 changes: 18 additions & 20 deletions tests/mir-opt/inline/inline_diverging.h.Inline.diff
Original file line number Diff line number Diff line change
@@ -5,19 +5,18 @@
let mut _0: (); // return place in scope 0 at $DIR/inline_diverging.rs:+0:12: +0:12
let _1: (!, !); // in scope 0 at $DIR/inline_diverging.rs:+1:5: +1:22
+ let mut _2: fn() -> ! {sleep}; // in scope 0 at $DIR/inline_diverging.rs:+1:5: +1:22
+ let mut _8: (); // in scope 0 at $DIR/inline_diverging.rs:27:13: 27:16
+ scope 1 (inlined call_twice::<!, fn() -> ! {sleep}>) { // at $DIR/inline_diverging.rs:22:5: 22:22
+ debug f => _2; // in scope 1 at $DIR/inline_diverging.rs:26:36: 26:37
+ let _3: !; // in scope 1 at $DIR/inline_diverging.rs:27:9: 27:10
+ let mut _4: &fn() -> ! {sleep}; // in scope 1 at $DIR/inline_diverging.rs:27:13: 27:14
+ let mut _5: (); // in scope 1 at $DIR/inline_diverging.rs:27:13: 27:16
+ let mut _6: &fn() -> ! {sleep}; // in scope 1 at $DIR/inline_diverging.rs:28:13: 28:14
+ let mut _7: (); // in scope 1 at $DIR/inline_diverging.rs:28:13: 28:16
+ let mut _8: !; // in scope 1 at $DIR/inline_diverging.rs:29:6: 29:7
+ let mut _9: !; // in scope 1 at $DIR/inline_diverging.rs:29:9: 29:10
+ let mut _5: &fn() -> ! {sleep}; // in scope 1 at $DIR/inline_diverging.rs:28:13: 28:14
+ let mut _6: !; // in scope 1 at $DIR/inline_diverging.rs:29:6: 29:7
+ let mut _7: !; // in scope 1 at $DIR/inline_diverging.rs:29:9: 29:10
+ scope 2 {
+ debug a => _3; // in scope 2 at $DIR/inline_diverging.rs:27:9: 27:10
+ scope 3 {
+ debug b => _9; // in scope 3 at $DIR/inline_diverging.rs:28:9: 28:10
+ debug b => _7; // in scope 3 at $DIR/inline_diverging.rs:28:9: 28:10
+ }
+ }
+ scope 4 (inlined <fn() -> ! {sleep} as Fn<()>>::call - shim(fn() -> ! {sleep})) { // at $DIR/inline_diverging.rs:27:13: 27:16
@@ -35,23 +34,23 @@
- // mir::Constant
// + span: $DIR/inline_diverging.rs:22:16: 22:21
// + literal: Const { ty: fn() -> ! {sleep}, val: Value(<ZST>) }
+ StorageLive(_9); // scope 0 at $DIR/inline_diverging.rs:+1:5: +1:22
+ StorageLive(_7); // scope 0 at $DIR/inline_diverging.rs:+1:5: +1:22
+ StorageLive(_3); // scope 1 at $DIR/inline_diverging.rs:27:9: 27:10
+ StorageLive(_4); // scope 1 at $DIR/inline_diverging.rs:27:13: 27:14
+ _4 = &_2; // scope 1 at $DIR/inline_diverging.rs:27:13: 27:14
+ StorageLive(_5); // scope 1 at $DIR/inline_diverging.rs:27:13: 27:16
+ StorageLive(_8); // scope 1 at $DIR/inline_diverging.rs:27:13: 27:16
+ _8 = const (); // scope 1 at $DIR/inline_diverging.rs:27:13: 27:16
+ _3 = move (*_4)() -> [return: bb6, unwind: bb4]; // scope 4 at $SRC_DIR/core/src/ops/function.rs:LL:COL
+ }
+
+ bb1: {
+ StorageDead(_7); // scope 2 at $DIR/inline_diverging.rs:28:15: 28:16
+ StorageDead(_6); // scope 2 at $DIR/inline_diverging.rs:28:15: 28:16
+ StorageLive(_8); // scope 3 at $DIR/inline_diverging.rs:29:6: 29:7
+ _8 = move _3; // scope 3 at $DIR/inline_diverging.rs:29:6: 29:7
+ StorageDead(_5); // scope 2 at $DIR/inline_diverging.rs:28:15: 28:16
+ StorageLive(_6); // scope 3 at $DIR/inline_diverging.rs:29:6: 29:7
+ _6 = move _3; // scope 3 at $DIR/inline_diverging.rs:29:6: 29:7
+ Deinit(_1); // scope 3 at $DIR/inline_diverging.rs:29:5: 29:11
+ (_1.0: !) = move _8; // scope 3 at $DIR/inline_diverging.rs:29:5: 29:11
+ (_1.1: !) = move _9; // scope 3 at $DIR/inline_diverging.rs:29:5: 29:11
+ StorageDead(_8); // scope 3 at $DIR/inline_diverging.rs:29:10: 29:11
+ (_1.0: !) = move _6; // scope 3 at $DIR/inline_diverging.rs:29:5: 29:11
+ (_1.1: !) = move _7; // scope 3 at $DIR/inline_diverging.rs:29:5: 29:11
+ StorageDead(_6); // scope 3 at $DIR/inline_diverging.rs:29:10: 29:11
+ StorageDead(_3); // scope 1 at $DIR/inline_diverging.rs:30:1: 30:2
+ drop(_2) -> bb2; // scope 1 at $DIR/inline_diverging.rs:30:1: 30:2
+ }
@@ -73,12 +72,11 @@
+ }
+
+ bb6: {
+ StorageDead(_5); // scope 1 at $DIR/inline_diverging.rs:27:15: 27:16
+ StorageDead(_8); // scope 1 at $DIR/inline_diverging.rs:27:13: 27:16
+ StorageDead(_4); // scope 1 at $DIR/inline_diverging.rs:27:15: 27:16
+ StorageLive(_6); // scope 2 at $DIR/inline_diverging.rs:28:13: 28:14
+ _6 = &_2; // scope 2 at $DIR/inline_diverging.rs:28:13: 28:14
+ StorageLive(_7); // scope 2 at $DIR/inline_diverging.rs:28:13: 28:16
+ _9 = <fn() -> ! {sleep} as Fn<()>>::call(move _6, move _7) -> [return: bb1, unwind: bb3]; // scope 2 at $DIR/inline_diverging.rs:28:13: 28:16
+ StorageLive(_5); // scope 2 at $DIR/inline_diverging.rs:28:13: 28:14
+ _5 = &_2; // scope 2 at $DIR/inline_diverging.rs:28:13: 28:14
+ _7 = <fn() -> ! {sleep} as Fn<()>>::call(move _5, const ()) -> [return: bb1, unwind: bb3]; // scope 2 at $DIR/inline_diverging.rs:28:13: 28:16
+ // mir::Constant
+ // + span: $DIR/inline_diverging.rs:28:13: 28:14
+ // + literal: Const { ty: for<'a> extern "rust-call" fn(&'a fn() -> ! {sleep}, ()) -> <fn() -> ! {sleep} as FnOnce<()>>::Output {<fn() -> ! {sleep} as Fn<()>>::call}, val: Value(<ZST>) }
32 changes: 16 additions & 16 deletions tests/mir-opt/inline/inline_options.main.Inline.after.mir
Original file line number Diff line number Diff line change
@@ -21,35 +21,35 @@ fn main() -> () {
bb1: {
StorageDead(_1); // scope 0 at $DIR/inline_options.rs:+1:18: +1:19
StorageLive(_2); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
StorageLive(_3); // scope 1 at $DIR/inline_options.rs:16:23: 16:26
_3 = g() -> bb2; // scope 1 at $DIR/inline_options.rs:16:23: 16:26
StorageLive(_3); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
StorageLive(_4); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
StorageLive(_5); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
_3 = g() -> bb3; // scope 1 at $DIR/inline_options.rs:16:23: 16:26
// mir::Constant
// + span: $DIR/inline_options.rs:16:23: 16:24
// + literal: Const { ty: fn() {g}, val: Value(<ZST>) }
}

bb2: {
StorageDead(_3); // scope 1 at $DIR/inline_options.rs:16:26: 16:27
StorageLive(_4); // scope 1 at $DIR/inline_options.rs:16:28: 16:31
_4 = g() -> bb3; // scope 1 at $DIR/inline_options.rs:16:28: 16:31
// mir::Constant
// + span: $DIR/inline_options.rs:16:28: 16:29
// + literal: Const { ty: fn() {g}, val: Value(<ZST>) }
StorageDead(_5); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
StorageDead(_4); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
StorageDead(_3); // scope 0 at $DIR/inline_options.rs:+2:5: +2:21
StorageDead(_2); // scope 0 at $DIR/inline_options.rs:+2:21: +2:22
_0 = const (); // scope 0 at $DIR/inline_options.rs:+0:11: +3:2
return; // scope 0 at $DIR/inline_options.rs:+3:2: +3:2
}

bb3: {
StorageDead(_4); // scope 1 at $DIR/inline_options.rs:16:31: 16:32
StorageLive(_5); // scope 1 at $DIR/inline_options.rs:16:33: 16:36
_5 = g() -> bb4; // scope 1 at $DIR/inline_options.rs:16:33: 16:36
_4 = g() -> bb4; // scope 1 at $DIR/inline_options.rs:16:28: 16:31
// mir::Constant
// + span: $DIR/inline_options.rs:16:33: 16:34
// + span: $DIR/inline_options.rs:16:28: 16:29
// + literal: Const { ty: fn() {g}, val: Value(<ZST>) }
}

bb4: {
StorageDead(_5); // scope 1 at $DIR/inline_options.rs:16:36: 16:37
StorageDead(_2); // scope 0 at $DIR/inline_options.rs:+2:21: +2:22
_0 = const (); // scope 0 at $DIR/inline_options.rs:+0:11: +3:2
return; // scope 0 at $DIR/inline_options.rs:+3:2: +3:2
_5 = g() -> bb2; // scope 1 at $DIR/inline_options.rs:16:33: 16:36
// mir::Constant
// + span: $DIR/inline_options.rs:16:33: 16:34
// + literal: Const { ty: fn() {g}, val: Value(<ZST>) }
}
}
Original file line number Diff line number Diff line change
@@ -10,10 +10,9 @@ fn main() -> () {
scope 1 {
debug f => _1; // in scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:9: +1:10
scope 2 (inlined main::{closure#0}) { // at $DIR/issue_76997_inline_scopes_parenting.rs:6:5: 6:10
debug x => _5; // in scope 2 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:14: +1:15
let _6: (); // in scope 2 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:23: +1:24
debug x => const (); // in scope 2 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:14: +1:15
scope 3 {
debug y => _6; // in scope 3 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:23: +1:24
debug y => const (); // in scope 3 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:23: +1:24
}
}
}
@@ -30,8 +29,6 @@ fn main() -> () {
(_3.0: ()) = move _4; // scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+2:5: +2:10
StorageLive(_5); // scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+2:5: +2:10
_5 = move (_3.0: ()); // scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+2:5: +2:10
StorageLive(_6); // scope 2 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:23: +1:24
StorageDead(_6); // scope 2 at $DIR/issue_76997_inline_scopes_parenting.rs:+1:32: +1:33
StorageDead(_5); // scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+2:5: +2:10
StorageDead(_4); // scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+2:9: +2:10
StorageDead(_3); // scope 1 at $DIR/issue_76997_inline_scopes_parenting.rs:+2:9: +2:10
Original file line number Diff line number Diff line change
@@ -56,7 +56,6 @@
}

bb1: {
StorageLive(_15); // scope 1 at $SRC_DIR/core/src/panic.rs:LL:COL
_15 = core::panicking::panic(const "internal error: entered unreachable code"); // scope 1 at $SRC_DIR/core/src/panic.rs:LL:COL
// mir::Constant
// + span: $SRC_DIR/core/src/panic.rs:LL:COL
Original file line number Diff line number Diff line change
@@ -70,7 +70,6 @@ fn num_to_digit(_1: char) -> u32 {
}

bb6: {
StorageLive(_8); // scope 3 at $SRC_DIR/core/src/option.rs:LL:COL
_8 = core::panicking::panic(const "called `Option::unwrap()` on a `None` value"); // scope 3 at $SRC_DIR/core/src/option.rs:LL:COL
// mir::Constant
// + span: $SRC_DIR/core/src/option.rs:LL:COL
2 changes: 0 additions & 2 deletions tests/mir-opt/lower_intrinsics_e2e.f_u64.PreCodegen.after.mir
Original file line number Diff line number Diff line change
@@ -12,15 +12,13 @@ fn f_u64() -> () {

bb0: {
StorageLive(_1); // scope 0 at $DIR/lower_intrinsics_e2e.rs:+1:5: +1:21
StorageLive(_2); // scope 1 at $DIR/lower_intrinsics_e2e.rs:23:9: 23:21
_2 = f_non_zst::<u64>(const 0_u64) -> bb1; // scope 1 at $DIR/lower_intrinsics_e2e.rs:23:9: 23:21
// mir::Constant
// + span: $DIR/lower_intrinsics_e2e.rs:23:9: 23:18
// + literal: Const { ty: fn(u64) {f_non_zst::<u64>}, val: Value(<ZST>) }
}

bb1: {
StorageDead(_2); // scope 1 at $DIR/lower_intrinsics_e2e.rs:23:21: 23:22
StorageDead(_1); // scope 0 at $DIR/lower_intrinsics_e2e.rs:+1:5: +1:21
return; // scope 0 at $DIR/lower_intrinsics_e2e.rs:+2:2: +2:2
}
11 changes: 3 additions & 8 deletions tests/mir-opt/lower_intrinsics_e2e.f_unit.PreCodegen.after.mir
Original file line number Diff line number Diff line change
@@ -2,26 +2,21 @@

fn f_unit() -> () {
let mut _0: (); // return place in scope 0 at $DIR/lower_intrinsics_e2e.rs:+0:17: +0:17
let mut _1: (); // in scope 0 at $DIR/lower_intrinsics_e2e.rs:+1:16: +1:18
scope 1 (inlined f_dispatch::<()>) { // at $DIR/lower_intrinsics_e2e.rs:9:5: 9:19
debug t => _1; // in scope 1 at $DIR/lower_intrinsics_e2e.rs:19:22: 19:23
let _2: (); // in scope 1 at $DIR/lower_intrinsics_e2e.rs:21:9: 21:17
debug t => const (); // in scope 1 at $DIR/lower_intrinsics_e2e.rs:19:22: 19:23
let _1: (); // in scope 1 at $DIR/lower_intrinsics_e2e.rs:21:9: 21:17
scope 2 (inlined std::mem::size_of::<()>) { // at $DIR/lower_intrinsics_e2e.rs:20:8: 20:32
}
}

bb0: {
StorageLive(_1); // scope 0 at $DIR/lower_intrinsics_e2e.rs:+1:16: +1:18
StorageLive(_2); // scope 1 at $DIR/lower_intrinsics_e2e.rs:21:9: 21:17
_2 = f_zst::<()>(move _1) -> bb1; // scope 1 at $DIR/lower_intrinsics_e2e.rs:21:9: 21:17
_1 = f_zst::<()>(const ()) -> bb1; // scope 1 at $DIR/lower_intrinsics_e2e.rs:21:9: 21:17
// mir::Constant
// + span: $DIR/lower_intrinsics_e2e.rs:21:9: 21:14
// + literal: Const { ty: fn(()) {f_zst::<()>}, val: Value(<ZST>) }
}

bb1: {
StorageDead(_2); // scope 1 at $DIR/lower_intrinsics_e2e.rs:21:17: 21:18
StorageDead(_1); // scope 0 at $DIR/lower_intrinsics_e2e.rs:+1:18: +1:19
return; // scope 0 at $DIR/lower_intrinsics_e2e.rs:+2:2: +2:2
}
}
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@
}

bb0: {
StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
_3 = move _1; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
drop(_3) -> [return: bb2, unwind: bb1]; // scope 1 at $SRC_DIR/core/src/mem/mod.rs:LL:COL
@@ -23,7 +23,7 @@

bb2: {
StorageDead(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:11: +1:12
StorageDead(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+0:32: +2:2
return; // scope 0 at $DIR/remove_unneeded_drops.rs:+2:2: +2:2
}
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@
}

bb0: {
StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
_3 = move _1; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
drop(_3) -> [return: bb2, unwind: bb1]; // scope 1 at $SRC_DIR/core/src/mem/mod.rs:LL:COL
@@ -23,7 +23,7 @@

bb2: {
StorageDead(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:11: +1:12
StorageDead(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+0:27: +2:2
return; // scope 0 at $DIR/remove_unneeded_drops.rs:+2:2: +2:2
}
Original file line number Diff line number Diff line change
@@ -11,15 +11,15 @@
}

bb0: {
StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
- nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
_3 = _1; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
- drop(_3) -> bb1; // scope 1 at $SRC_DIR/core/src/mem/mod.rs:LL:COL
- }
-
- bb1: {
StorageDead(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:11: +1:12
StorageDead(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
- nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
- nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+0:17: +2:2
return; // scope 0 at $DIR/remove_unneeded_drops.rs:+2:2: +2:2
}
Original file line number Diff line number Diff line change
@@ -11,15 +11,15 @@
}

bb0: {
StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
- nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:5: +1:12
StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
_3 = _1; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:10: +1:11
- drop(_3) -> bb1; // scope 1 at $SRC_DIR/core/src/mem/mod.rs:LL:COL
- }
-
- bb1: {
StorageDead(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:11: +1:12
StorageDead(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
- nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+1:12: +1:13
- nop; // scope 0 at $DIR/remove_unneeded_drops.rs:+0:36: +2:2
return; // scope 0 at $DIR/remove_unneeded_drops.rs:+2:2: +2:2
}
6 changes: 4 additions & 2 deletions tests/mir-opt/remove_zsts.get_union.RemoveZsts.diff
Original file line number Diff line number Diff line change
@@ -6,13 +6,15 @@
let mut _1: (); // in scope 0 at $DIR/remove_zsts.rs:+1:14: +1:16

bb0: {
StorageLive(_1); // scope 0 at $DIR/remove_zsts.rs:+1:14: +1:16
- StorageLive(_1); // scope 0 at $DIR/remove_zsts.rs:+1:14: +1:16
- Deinit(_1); // scope 0 at $DIR/remove_zsts.rs:+1:14: +1:16
+ nop; // scope 0 at $DIR/remove_zsts.rs:+1:14: +1:16
+ nop; // scope 0 at $DIR/remove_zsts.rs:+1:14: +1:16
Deinit(_0); // scope 0 at $DIR/remove_zsts.rs:+1:5: +1:18
- (_0.0: ()) = move _1; // scope 0 at $DIR/remove_zsts.rs:+1:5: +1:18
- StorageDead(_1); // scope 0 at $DIR/remove_zsts.rs:+1:17: +1:18
+ nop; // scope 0 at $DIR/remove_zsts.rs:+1:5: +1:18
StorageDead(_1); // scope 0 at $DIR/remove_zsts.rs:+1:17: +1:18
+ nop; // scope 0 at $DIR/remove_zsts.rs:+1:17: +1:18
return; // scope 0 at $DIR/remove_zsts.rs:+2:2: +2:2
}
}
35 changes: 14 additions & 21 deletions tests/mir-opt/simple_option_map_e2e.ezmap.PreCodegen.after.mir
Original file line number Diff line number Diff line change
@@ -3,50 +3,43 @@
fn ezmap(_1: Option<i32>) -> Option<i32> {
debug x => _1; // in scope 0 at $DIR/simple_option_map_e2e.rs:+0:14: +0:15
let mut _0: std::option::Option<i32>; // return place in scope 0 at $DIR/simple_option_map_e2e.rs:+0:33: +0:44
let mut _2: [closure@$DIR/simple_option_map_e2e.rs:14:12: 14:15]; // in scope 0 at $DIR/simple_option_map_e2e.rs:+1:12: +1:21
scope 1 (inlined map::<i32, i32, [closure@$DIR/simple_option_map_e2e.rs:14:12: 14:15]>) { // at $DIR/simple_option_map_e2e.rs:14:5: 14:22
debug slf => _1; // in scope 1 at $DIR/simple_option_map_e2e.rs:2:17: 2:20
debug f => _2; // in scope 1 at $DIR/simple_option_map_e2e.rs:2:33: 2:34
let mut _3: isize; // in scope 1 at $DIR/simple_option_map_e2e.rs:7:9: 7:16
debug f => const ZeroSized: [closure@$DIR/simple_option_map_e2e.rs:14:12: 14:15]; // in scope 1 at $DIR/simple_option_map_e2e.rs:2:33: 2:34
let mut _2: isize; // in scope 1 at $DIR/simple_option_map_e2e.rs:7:9: 7:16
let mut _3: i32; // in scope 1 at $DIR/simple_option_map_e2e.rs:7:25: 7:29
let mut _4: i32; // in scope 1 at $DIR/simple_option_map_e2e.rs:7:25: 7:29
let mut _5: i32; // in scope 1 at $DIR/simple_option_map_e2e.rs:7:25: 7:29
scope 2 {
debug x => _5; // in scope 2 at $DIR/simple_option_map_e2e.rs:7:14: 7:15
debug x => _4; // in scope 2 at $DIR/simple_option_map_e2e.rs:7:14: 7:15
scope 3 (inlined ezmap::{closure#0}) { // at $DIR/simple_option_map_e2e.rs:7:25: 7:29
debug n => _5; // in scope 3 at $DIR/simple_option_map_e2e.rs:+1:13: +1:14
debug n => _4; // in scope 3 at $DIR/simple_option_map_e2e.rs:+1:13: +1:14
}
}
}

bb0: {
StorageLive(_2); // scope 0 at $DIR/simple_option_map_e2e.rs:+1:12: +1:21
_3 = discriminant(_1); // scope 1 at $DIR/simple_option_map_e2e.rs:6:11: 6:14
switchInt(move _3) -> [0: bb1, 1: bb3, otherwise: bb2]; // scope 1 at $DIR/simple_option_map_e2e.rs:6:5: 6:14
_2 = discriminant(_1); // scope 1 at $DIR/simple_option_map_e2e.rs:6:11: 6:14
switchInt(move _2) -> [0: bb1, 1: bb3, otherwise: bb2]; // scope 1 at $DIR/simple_option_map_e2e.rs:6:5: 6:14
}

bb1: {
Deinit(_0); // scope 1 at $DIR/simple_option_map_e2e.rs:8:17: 8:21
discriminant(_0) = 0; // scope 1 at $DIR/simple_option_map_e2e.rs:8:17: 8:21
goto -> bb4; // scope 1 at $DIR/simple_option_map_e2e.rs:8:17: 8:21
return; // scope 1 at $DIR/simple_option_map_e2e.rs:8:17: 8:21
}

bb2: {
unreachable; // scope 1 at $DIR/simple_option_map_e2e.rs:6:11: 6:14
}

bb3: {
_5 = move ((_1 as Some).0: i32); // scope 1 at $DIR/simple_option_map_e2e.rs:7:14: 7:15
StorageLive(_4); // scope 2 at $DIR/simple_option_map_e2e.rs:7:25: 7:29
_4 = Add(move _5, const 1_i32); // scope 3 at $DIR/simple_option_map_e2e.rs:+1:16: +1:21
_4 = move ((_1 as Some).0: i32); // scope 1 at $DIR/simple_option_map_e2e.rs:7:14: 7:15
StorageLive(_3); // scope 2 at $DIR/simple_option_map_e2e.rs:7:25: 7:29
_3 = Add(move _4, const 1_i32); // scope 3 at $DIR/simple_option_map_e2e.rs:+1:16: +1:21
Deinit(_0); // scope 2 at $DIR/simple_option_map_e2e.rs:7:20: 7:30
((_0 as Some).0: i32) = move _4; // scope 2 at $DIR/simple_option_map_e2e.rs:7:20: 7:30
((_0 as Some).0: i32) = move _3; // scope 2 at $DIR/simple_option_map_e2e.rs:7:20: 7:30
discriminant(_0) = 1; // scope 2 at $DIR/simple_option_map_e2e.rs:7:20: 7:30
StorageDead(_4); // scope 2 at $DIR/simple_option_map_e2e.rs:7:29: 7:30
goto -> bb4; // scope 1 at $DIR/simple_option_map_e2e.rs:10:1: 10:2
}

bb4: {
StorageDead(_2); // scope 0 at $DIR/simple_option_map_e2e.rs:+1:21: +1:22
return; // scope 0 at $DIR/simple_option_map_e2e.rs:+2:2: +2:2
StorageDead(_3); // scope 2 at $DIR/simple_option_map_e2e.rs:7:29: 7:30
return; // scope 1 at $DIR/simple_option_map_e2e.rs:10:1: 10:2
}
}
Original file line number Diff line number Diff line change
@@ -14,15 +14,13 @@
}

bb1: {
StorageLive(_2); // scope 0 at $DIR/simplify_if.rs:+2:9: +2:15
_2 = noop() -> bb2; // scope 0 at $DIR/simplify_if.rs:+2:9: +2:15
// mir::Constant
// + span: $DIR/simplify_if.rs:7:9: 7:13
// + literal: Const { ty: fn() {noop}, val: Value(<ZST>) }
}

bb2: {
StorageDead(_2); // scope 0 at $DIR/simplify_if.rs:+2:15: +2:16
goto -> bb4; // scope 0 at $DIR/simplify_if.rs:+1:5: +3:6
}