Skip to content

Commit 2f9f182

Browse files
eddybGrigorenkoPV
authored andcommitted
rustc_mir: run the lower_intrinsics pass on MIR shims.
1 parent 6123252 commit 2f9f182

7 files changed

+129
-1
lines changed

compiler/rustc_mir_transform/src/shim.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ use tracing::{debug, instrument};
2121

2222
use crate::{
2323
abort_unwinding_calls, add_call_guards, add_moves_for_packed_drops, deref_separator,
24-
instsimplify, mentioned_items, pass_manager as pm, remove_noop_landing_pads, simplify,
24+
instsimplify, lower_intrinsics, mentioned_items, pass_manager as pm, remove_noop_landing_pads,
25+
simplify,
2526
};
2627

2728
mod async_destructor_ctor;
@@ -153,6 +154,7 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceKind<'tcx>) -> Body<
153154
&add_moves_for_packed_drops::AddMovesForPackedDrops,
154155
&deref_separator::Derefer,
155156
&remove_noop_landing_pads::RemoveNoopLandingPads,
157+
&lower_intrinsics::LowerIntrinsics,
156158
&simplify::SimplifyCfg::MakeShim,
157159
&instsimplify::InstSimplify::BeforeInline,
158160
&abort_unwinding_calls::AbortUnwindingCalls,
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

+12
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,15 @@ 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+
core::intrinsics::wrapping_add::<u32> as unsafe fn(_, _) -> _,
276+
core::intrinsics::size_of::<u8> as unsafe fn() -> _,
277+
core::intrinsics::unreachable as unsafe fn() -> !,
278+
core::intrinsics::forget::<E> as unsafe fn(_),
279+
core::intrinsics::discriminant_value::<E> as unsafe fn(_) -> _,
280+
)
281+
}

0 commit comments

Comments
 (0)