Auto merge of #126784 - scottmcm:smaller-terminator, r=compiler-errors · rust-lang/rust@d8d5732 (original) (raw)
1
1
`//! Lowers intrinsic calls
`
2
2
``
``
3
`+
use crate::take_array;
`
3
4
`use rustc_middle::mir::*;
`
4
5
`use rustc_middle::ty::{self, TyCtxt};
`
5
6
`use rustc_middle::{bug, span_bug};
`
`@@ -50,42 +51,34 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
50
51
`}
`
51
52
` sym::copy_nonoverlapping => {
`
52
53
`let target = target.unwrap();
`
53
``
`-
let mut args = args.drain(..);
`
``
54
`+
let Ok([src, dst, count]) = take_array(args) else {
`
``
55
`+
bug!("Wrong arguments for copy_non_overlapping intrinsic");
`
``
56
`+
};
`
54
57
` block.statements.push(Statement {
`
55
58
`source_info: terminator.source_info,
`
56
59
`kind: StatementKind::Intrinsic(Box::new(
`
57
60
`NonDivergingIntrinsic::CopyNonOverlapping(
`
58
61
` rustc_middle::mir::CopyNonOverlapping {
`
59
``
`-
src: args.next().unwrap().node,
`
60
``
`-
dst: args.next().unwrap().node,
`
61
``
`-
count: args.next().unwrap().node,
`
``
62
`+
src: src.node,
`
``
63
`+
dst: dst.node,
`
``
64
`+
count: count.node,
`
62
65
`},
`
63
66
`),
`
64
67
`)),
`
65
68
`});
`
66
``
`-
assert_eq!(
`
67
``
`-
args.next(),
`
68
``
`-
None,
`
69
``
`-
"Extra argument for copy_non_overlapping intrinsic"
`
70
``
`-
);
`
71
``
`-
drop(args);
`
72
69
` terminator.kind = TerminatorKind::Goto { target };
`
73
70
`}
`
74
71
` sym::assume => {
`
75
72
`let target = target.unwrap();
`
76
``
`-
let mut args = args.drain(..);
`
``
73
`+
let Ok([arg]) = take_array(args) else {
`
``
74
`+
bug!("Wrong arguments for assume intrinsic");
`
``
75
`+
};
`
77
76
` block.statements.push(Statement {
`
78
77
`source_info: terminator.source_info,
`
79
78
`kind: StatementKind::Intrinsic(Box::new(
`
80
``
`-
NonDivergingIntrinsic::Assume(args.next().unwrap().node),
`
``
79
`+
NonDivergingIntrinsic::Assume(arg.node),
`
81
80
`)),
`
82
81
`});
`
83
``
`-
assert_eq!(
`
84
``
`-
args.next(),
`
85
``
`-
None,
`
86
``
`-
"Extra argument for copy_non_overlapping intrinsic"
`
87
``
`-
);
`
88
``
`-
drop(args);
`
89
82
` terminator.kind = TerminatorKind::Goto { target };
`
90
83
`}
`
91
84
` sym::wrapping_add
`
`@@ -100,13 +93,9 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
100
93
` | sym::unchecked_shl
`
101
94
` | sym::unchecked_shr => {
`
102
95
`let target = target.unwrap();
`
103
``
`-
let lhs;
`
104
``
`-
let rhs;
`
105
``
`-
{
`
106
``
`-
let mut args = args.drain(..);
`
107
``
`-
lhs = args.next().unwrap();
`
108
``
`-
rhs = args.next().unwrap();
`
109
``
`-
}
`
``
96
`+
let Ok([lhs, rhs]) = take_array(args) else {
`
``
97
`+
bug!("Wrong arguments for {} intrinsic", intrinsic.name);
`
``
98
`+
};
`
110
99
`let bin_op = match intrinsic.name {
`
111
100
` sym::wrapping_add => BinOp::Add,
`
112
101
` sym::wrapping_sub => BinOp::Sub,
`
`@@ -132,13 +121,9 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
132
121
`}
`
133
122
` sym::add_with_overflow | sym::sub_with_overflow | sym::mul_with_overflow => {
`
134
123
`if let Some(target) = *target {
`
135
``
`-
let lhs;
`
136
``
`-
let rhs;
`
137
``
`-
{
`
138
``
`-
let mut args = args.drain(..);
`
139
``
`-
lhs = args.next().unwrap();
`
140
``
`-
rhs = args.next().unwrap();
`
141
``
`-
}
`
``
124
`+
let Ok([lhs, rhs]) = take_array(args) else {
`
``
125
`+
bug!("Wrong arguments for {} intrinsic", intrinsic.name);
`
``
126
`+
};
`
142
127
`let bin_op = match intrinsic.name {
`
143
128
` sym::add_with_overflow => BinOp::AddWithOverflow,
`
144
129
` sym::sub_with_overflow => BinOp::SubWithOverflow,
`
`@@ -174,7 +159,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
174
159
`}
`
175
160
`}
`
176
161
` sym::read_via_copy => {
`
177
``
`-
let [arg] = args.as_slice() else {
`
``
162
`+
let Ok([arg]) = take_array(args) else {
`
178
163
`span_bug!(terminator.source_info.span, "Wrong number of arguments");
`
179
164
`};
`
180
165
`let derefed_place = if let Some(place) = arg.node.place()
`
`@@ -207,7 +192,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
207
192
`}
`
208
193
` sym::write_via_move => {
`
209
194
`let target = target.unwrap();
`
210
``
`-
let Ok([ptr, val]) = <[_; 2]>::try_from(std::mem::take(args)) else {
`
``
195
`+
let Ok([ptr, val]) = take_array(args) else {
`
211
196
`span_bug!(
`
212
197
` terminator.source_info.span,
`
213
198
`"Wrong number of arguments for write_via_move intrinsic",
`
`@@ -247,7 +232,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
247
232
`}
`
248
233
` sym::offset => {
`
249
234
`let target = target.unwrap();
`
250
``
`-
let Ok([ptr, delta]) = <[_; 2]>::try_from(std::mem::take(args)) else {
`
``
235
`+
let Ok([ptr, delta]) = take_array(args) else {
`
251
236
`span_bug!(
`
252
237
` terminator.source_info.span,
`
253
238
`"Wrong number of arguments for offset intrinsic",
`
`@@ -264,7 +249,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
264
249
`}
`
265
250
` sym::transmute | sym::transmute_unchecked => {
`
266
251
`let dst_ty = destination.ty(local_decls, tcx).ty;
`
267
``
`-
let Ok([arg]) = <[_; 1]>::try_from(std::mem::take(args)) else {
`
``
252
`+
let Ok([arg]) = take_array(args) else {
`
268
253
`span_bug!(
`
269
254
` terminator.source_info.span,
`
270
255
`"Wrong number of arguments for transmute intrinsic",
`
`@@ -289,7 +274,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
289
274
`}
`
290
275
`}
`
291
276
` sym::aggregate_raw_ptr => {
`
292
``
`-
let Ok([data, meta]) = <[_; 2]>::try_from(std::mem::take(args)) else {
`
``
277
`+
let Ok([data, meta]) = take_array(args) else {
`
293
278
`span_bug!(
`
294
279
` terminator.source_info.span,
`
295
280
`"Wrong number of arguments for aggregate_raw_ptr intrinsic",
`
`@@ -317,7 +302,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
`
317
302
` terminator.kind = TerminatorKind::Goto { target };
`
318
303
`}
`
319
304
` sym::ptr_metadata => {
`
320
``
`-
let Ok([ptr]) = <[_; 1]>::try_from(std::mem::take(args)) else {
`
``
305
`+
let Ok([ptr]) = take_array(args) else {
`
321
306
`span_bug!(
`
322
307
` terminator.source_info.span,
`
323
308
`"Wrong number of arguments for ptr_metadata intrinsic",
`