diff options
| author | bors <bors@rust-lang.org> | 2023-04-26 15:52:33 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-04-26 15:52:33 +0000 |
| commit | 9c044d77a334609513f3b615e0763a40cc02424d (patch) | |
| tree | ae444821302a827fe1af2cc2a2da4396e099c6c3 /compiler/rustc_mir_transform/src | |
| parent | 8763965a2c7b68a33af5fc55999f9eff26749fd6 (diff) | |
| parent | 05a665f21a6f9763d136a9d2d7c0255de6d333fb (diff) | |
| download | rust-9c044d77a334609513f3b615e0763a40cc02424d.tar.gz rust-9c044d77a334609513f3b615e0763a40cc02424d.zip | |
Auto merge of #110822 - scottmcm:lower-offset-to-mir, r=compiler-errors
Lower `intrinsics::offset` to `mir::BinOp::Offset` They're [semantically the same](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.Rvalue.html#variant.BinaryOp), so this means the backends don't need to handle the intrinsic and means fewer MIR basic blocks in pointer arithmetic code.
Diffstat (limited to 'compiler/rustc_mir_transform/src')
| -rw-r--r-- | compiler/rustc_mir_transform/src/lower_intrinsics.rs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/compiler/rustc_mir_transform/src/lower_intrinsics.rs b/compiler/rustc_mir_transform/src/lower_intrinsics.rs index c7d3f6c9f04..62b727674c5 100644 --- a/compiler/rustc_mir_transform/src/lower_intrinsics.rs +++ b/compiler/rustc_mir_transform/src/lower_intrinsics.rs @@ -192,6 +192,23 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics { terminator.kind = TerminatorKind::Goto { target }; } } + sym::offset => { + let target = target.unwrap(); + let Ok([ptr, delta]) = <[_; 2]>::try_from(std::mem::take(args)) else { + span_bug!( + terminator.source_info.span, + "Wrong number of arguments for offset intrinsic", + ); + }; + block.statements.push(Statement { + source_info: terminator.source_info, + kind: StatementKind::Assign(Box::new(( + *destination, + Rvalue::BinaryOp(BinOp::Offset, Box::new((ptr, delta))), + ))), + }); + terminator.kind = TerminatorKind::Goto { target }; + } sym::option_payload_ptr => { if let (Some(target), Some(arg)) = (*target, args[0].place()) { let ty::RawPtr(ty::TypeAndMut { ty: dest_ty, .. }) = |
