Skip to content

Commit fddc321

Browse files
committed
rustc_mir: run the lower_intrinsics pass on MIR shims.
1 parent c82cf47 commit fddc321

7 files changed

+139
-2
lines changed

compiler/rustc_mir_transform/src/shim.rs

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

1818
use crate::util::expand_aggregate;
1919
use crate::{
20-
abort_unwinding_calls, add_call_guards, add_moves_for_packed_drops, remove_noop_landing_pads,
21-
run_passes, simplify,
20+
abort_unwinding_calls, add_call_guards, add_moves_for_packed_drops, lower_intrinsics,
21+
remove_noop_landing_pads, run_passes, simplify,
2222
};
2323
use rustc_middle::mir::patch::MirPatch;
2424
use rustc_mir_dataflow::elaborate_drops::{self, DropElaborator, DropFlagMode, DropStyle};
@@ -82,6 +82,7 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> Body<'
8282
&[&[
8383
&add_moves_for_packed_drops::AddMovesForPackedDrops,
8484
&remove_noop_landing_pads::RemoveNoopLandingPads,
85+
&lower_intrinsics::LowerIntrinsics,
8586
&simplify::SimplifyCfg::new("make_shim"),
8687
&add_call_guards::CriticalCallEdges,
8788
&abort_unwinding_calls::AbortUnwindingCalls,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
}
24+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
}
24+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
}
24+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
}
23+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
}
24+

src/test/mir-opt/lower_intrinsics.rs

+17
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,20 @@ pub fn discriminant<T>(t: T) {
7676
core::intrinsics::discriminant_value(&());
7777
core::intrinsics::discriminant_value(&E::B);
7878
}
79+
80+
// Check that the MIR shims used for reifying intrinsics to `fn` pointers,
81+
// also go through the lowering pass.
82+
pub fn reify_intrinsics() -> impl Copy {
83+
(
84+
// EMIT_MIR core.intrinsics-#1-wrapping_add.LowerIntrinsics.diff
85+
core::intrinsics::wrapping_add::<u32> as unsafe fn(_, _) -> _,
86+
// EMIT_MIR core.intrinsics-#1-size_of.LowerIntrinsics.diff
87+
core::intrinsics::size_of::<u8> as unsafe fn() -> _,
88+
// EMIT_MIR core.intrinsics-#1-unreachable.LowerIntrinsics.diff
89+
core::intrinsics::unreachable as unsafe fn() -> !,
90+
// EMIT_MIR core.intrinsics-#1-forget.LowerIntrinsics.diff
91+
core::intrinsics::forget::<E> as unsafe fn(_),
92+
// EMIT_MIR core.intrinsics-#1-discriminant_value.LowerIntrinsics.diff
93+
core::intrinsics::discriminant_value::<E> as unsafe fn(_) -> _,
94+
)
95+
}

0 commit comments

Comments
 (0)