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",

`