Skip to content

Commit 85abfd0

Browse files
eddybGrigorenkoPV
authored andcommitted
rustc_mir: run the lower_intrinsics pass on MIR shims.
1 parent 00db2ae commit 85abfd0

7 files changed

+133
-1
lines changed

compiler/rustc_mir_transform/src/shim.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use std::iter;
1717

1818
use crate::{
1919
abort_unwinding_calls, add_call_guards, add_moves_for_packed_drops, deref_separator,
20-
mentioned_items, pass_manager as pm, remove_noop_landing_pads, simplify,
20+
lower_intrinsics, mentioned_items, pass_manager as pm, remove_noop_landing_pads, simplify,
2121
};
2222
use rustc_middle::mir::patch::MirPatch;
2323
use rustc_mir_dataflow::elaborate_drops::{self, DropElaborator, DropFlagMode, DropStyle};
@@ -153,6 +153,7 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceKind<'tcx>) -> Body<
153153
&add_moves_for_packed_drops::AddMovesForPackedDrops,
154154
&deref_separator::Derefer,
155155
&remove_noop_landing_pads::RemoveNoopLandingPads,
156+
&lower_intrinsics::LowerIntrinsics,
156157
&simplify::SimplifyCfg::MakeShim,
157158
&abort_unwinding_calls::AbortUnwindingCalls,
158159
&add_call_guards::CriticalCallEdges,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `discriminant_value` before LowerIntrinsics
2+
+ // MIR for `discriminant_value` after LowerIntrinsics
3+
4+
fn discriminant_value(_1: &T) -> <T as DiscriminantKind>::Discriminant {
5+
let mut _0: <T as std::marker::DiscriminantKind>::Discriminant; // return place in scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
6+
7+
bb0: {
8+
- _0 = discriminant_value::<T>(move _1) -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
9+
- // mir::Constant
10+
- // + span: $SRC_DIR/core/src/intrinsics.rs:LL:COL
11+
- // + literal: Const { ty: for<'r> extern "rust-intrinsic" fn(&'r T) -> <T as std::marker::DiscriminantKind>::Discriminant {std::intrinsics::discriminant_value::<T>}, val: Value(Scalar(<ZST>)) }
12+
+ _0 = discriminant((*_1)); // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
13+
+ goto -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
14+
}
15+
16+
bb1: {
17+
return; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
18+
}
19+
20+
bb2 (cleanup): {
21+
resume; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `std::intrinsics::forget` before LowerIntrinsics
2+
+ // MIR for `std::intrinsics::forget` after LowerIntrinsics
3+
4+
fn std::intrinsics::forget(_1: T) -> () {
5+
let mut _0: (); // return place in scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
6+
7+
bb0: {
8+
- _0 = std::intrinsics::forget::<T>(move _1) -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
9+
- // mir::Constant
10+
- // + span: $SRC_DIR/core/src/intrinsics.rs:LL:COL
11+
- // + literal: Const { ty: extern "rust-intrinsic" fn(T) {std::intrinsics::forget::<T>}, val: Value(Scalar(<ZST>)) }
12+
+ _0 = const (); // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
13+
+ goto -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
14+
}
15+
16+
bb1: {
17+
return; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
18+
}
19+
20+
bb2 (cleanup): {
21+
resume; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `std::intrinsics::size_of` before LowerIntrinsics
2+
+ // MIR for `std::intrinsics::size_of` after LowerIntrinsics
3+
4+
fn std::intrinsics::size_of() -> usize {
5+
let mut _0: usize; // return place in scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
6+
7+
bb0: {
8+
- _0 = std::intrinsics::size_of::<T>() -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
9+
- // mir::Constant
10+
- // + span: $SRC_DIR/core/src/intrinsics.rs:LL:COL
11+
- // + literal: Const { ty: extern "rust-intrinsic" fn() -> usize {std::intrinsics::size_of::<T>}, val: Value(Scalar(<ZST>)) }
12+
+ _0 = SizeOf(T); // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
13+
+ goto -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
14+
}
15+
16+
bb1: {
17+
return; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
18+
}
19+
20+
bb2 (cleanup): {
21+
resume; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
- // MIR for `std::intrinsics::unreachable` before LowerIntrinsics
2+
+ // MIR for `std::intrinsics::unreachable` after LowerIntrinsics
3+
4+
fn std::intrinsics::unreachable() -> ! {
5+
let mut _0: !; // return place in scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
6+
7+
bb0: {
8+
- _0 = std::intrinsics::unreachable() -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
9+
- // mir::Constant
10+
- // + span: $SRC_DIR/core/src/intrinsics.rs:LL:COL
11+
- // + literal: Const { ty: unsafe extern "rust-intrinsic" fn() -> ! {std::intrinsics::unreachable}, val: Value(Scalar(<ZST>)) }
12+
+ unreachable; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
13+
}
14+
15+
bb1: {
16+
return; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
17+
}
18+
19+
bb2 (cleanup): {
20+
resume; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `wrapping_add` before LowerIntrinsics
2+
+ // MIR for `wrapping_add` after LowerIntrinsics
3+
4+
fn wrapping_add(_1: T, _2: T) -> T {
5+
let mut _0: T; // return place in scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
6+
7+
bb0: {
8+
- _0 = wrapping_add::<T>(move _1, move _2) -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
9+
- // mir::Constant
10+
- // + span: $SRC_DIR/core/src/intrinsics.rs:LL:COL
11+
- // + literal: Const { ty: extern "rust-intrinsic" fn(T, T) -> T {std::intrinsics::wrapping_add::<T>}, val: Value(Scalar(<ZST>)) }
12+
+ _0 = Add(move _1, move _2); // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
13+
+ goto -> bb1; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
14+
}
15+
16+
bb1: {
17+
return; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
18+
}
19+
20+
bb2 (cleanup): {
21+
resume; // scope 0 at $SRC_DIR/core/src/intrinsics.rs:LL:COL
22+
}
23+
}

tests/mir-opt/lower_intrinsics.rs

+17
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,20 @@ pub fn get_metadata(a: *const i32, b: *const [u8], c: *const dyn std::fmt::Debug
267267
let _usize = ptr_metadata(b);
268268
let _vtable = ptr_metadata(c);
269269
}
270+
271+
// Check that the MIR shims used for reifying intrinsics to `fn` pointers,
272+
// also go through the lowering pass.
273+
pub fn reify_intrinsics() -> impl Copy {
274+
(
275+
// EMIT_MIR core.intrinsics-#1-wrapping_add.LowerIntrinsics.diff
276+
core::intrinsics::wrapping_add::<u32> as unsafe fn(_, _) -> _,
277+
// EMIT_MIR core.intrinsics-#1-size_of.LowerIntrinsics.diff
278+
core::intrinsics::size_of::<u8> as unsafe fn() -> _,
279+
// EMIT_MIR core.intrinsics-#1-unreachable.LowerIntrinsics.diff
280+
core::intrinsics::unreachable as unsafe fn() -> !,
281+
// EMIT_MIR core.intrinsics-#1-forget.LowerIntrinsics.diff
282+
core::intrinsics::forget::<E> as unsafe fn(_),
283+
// EMIT_MIR core.intrinsics-#1-discriminant_value.LowerIntrinsics.diff
284+
core::intrinsics::discriminant_value::<E> as unsafe fn(_) -> _,
285+
)
286+
}

0 commit comments

Comments
 (0)