@@ -257,13 +257,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
257
257
if let OperandValueKind :: Immediate ( to_scalar) = cast_kind
258
258
&& from_scalar. size ( self . cx ) == to_scalar. size ( self . cx )
259
259
{
260
- let from_backend_ty = bx. backend_type ( operand. layout ) ;
261
260
let to_backend_ty = bx. backend_type ( cast) ;
262
261
Some ( OperandValue :: Immediate ( self . transmute_immediate (
263
262
bx,
264
263
imm,
265
264
from_scalar,
266
- from_backend_ty,
267
265
to_scalar,
268
266
to_backend_ty,
269
267
) ) )
@@ -279,13 +277,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
279
277
&& in_a. size ( self . cx ) == out_a. size ( self . cx )
280
278
&& in_b. size ( self . cx ) == out_b. size ( self . cx )
281
279
{
282
- let in_a_ibty = bx. scalar_pair_element_backend_type ( operand. layout , 0 , false ) ;
283
- let in_b_ibty = bx. scalar_pair_element_backend_type ( operand. layout , 1 , false ) ;
284
280
let out_a_ibty = bx. scalar_pair_element_backend_type ( cast, 0 , false ) ;
285
281
let out_b_ibty = bx. scalar_pair_element_backend_type ( cast, 1 , false ) ;
286
282
Some ( OperandValue :: Pair (
287
- self . transmute_immediate ( bx, imm_a, in_a, in_a_ibty , out_a, out_a_ibty) ,
288
- self . transmute_immediate ( bx, imm_b, in_b, in_b_ibty , out_b, out_b_ibty) ,
283
+ self . transmute_immediate ( bx, imm_a, in_a, out_a, out_a_ibty) ,
284
+ self . transmute_immediate ( bx, imm_b, in_b, out_b, out_b_ibty) ,
289
285
) )
290
286
} else {
291
287
None
@@ -309,12 +305,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
309
305
) -> Option < Bx :: Value > {
310
306
use abi:: Primitive :: * ;
311
307
312
- // When scalars are passed by value, there's no metadata recording their
313
- // valid ranges. For example, `char`s are passed as just `i32`, with no
314
- // way for LLVM to know that they're 0x10FFFF at most. Thus we assume
315
- // the range of the input value too, not just the output range.
316
- self . assume_scalar_range ( bx, imm, from_scalar, from_backend_ty) ;
317
-
318
308
imm = match ( from_scalar. primitive ( ) , to_scalar. primitive ( ) ) {
319
309
( Int ( _, is_signed) , Int ( ..) ) => bx. intcast ( imm, to_backend_ty, is_signed) ,
320
310
( Float ( _) , Float ( _) ) => {
@@ -356,7 +346,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
356
346
bx : & mut Bx ,
357
347
mut imm : Bx :: Value ,
358
348
from_scalar : abi:: Scalar ,
359
- from_backend_ty : Bx :: Type ,
360
349
to_scalar : abi:: Scalar ,
361
350
to_backend_ty : Bx :: Type ,
362
351
) -> Bx :: Value {
@@ -365,11 +354,13 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
365
354
use abi:: Primitive :: * ;
366
355
imm = bx. from_immediate ( imm) ;
367
356
368
- // When scalars are passed by value, there's no metadata recording their
369
- // valid ranges. For example, `char`s are passed as just `i32`, with no
370
- // way for LLVM to know that they're 0x10FFFF at most. Thus we assume
371
- // the range of the input value too, not just the output range.
372
- self . assume_scalar_range ( bx, imm, from_scalar, from_backend_ty) ;
357
+ // We used to `assume` the `from_scalar` here too, but that's no longer needed
358
+ // because if we have a scalar, we must already know its range. Either
359
+ // 1) It's a parameter with `range` parameter metadata,
360
+ // 2) It's something we `load`ed with `!range` metadata, or
361
+ // 3) It's something we transmuted and already `assume`d the range.
362
+ // And thus in all those cases another `assume` is just wasteful.
363
+ // (Case 1 didn't used to be covered, and thus the `assume` was needed.)
373
364
374
365
imm = match ( from_scalar. primitive ( ) , to_scalar. primitive ( ) ) {
375
366
( Int ( ..) | Float ( _) , Int ( ..) | Float ( _) ) => bx. bitcast ( imm, to_backend_ty) ,
@@ -389,18 +380,19 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
389
380
bx. bitcast ( int_imm, to_backend_ty)
390
381
}
391
382
} ;
392
- self . assume_scalar_range ( bx, imm, to_scalar, to_backend_ty) ;
383
+
384
+ // This `assume` remains important for cases like
385
+ // transmute::<u32, NonZeroU32>(x) == 0
386
+ // since it's never passed to something with parameter metadata (especially
387
+ // after MIR inlining) so the only way to tell the backend about the
388
+ // constraint that the `transmute` introduced is to `assume` it.
389
+ self . assume_scalar_range ( bx, imm, to_scalar) ;
390
+
393
391
imm = bx. to_immediate_scalar ( imm, to_scalar) ;
394
392
imm
395
393
}
396
394
397
- fn assume_scalar_range (
398
- & self ,
399
- bx : & mut Bx ,
400
- imm : Bx :: Value ,
401
- scalar : abi:: Scalar ,
402
- backend_ty : Bx :: Type ,
403
- ) {
395
+ fn assume_scalar_range ( & self , bx : & mut Bx , imm : Bx :: Value , scalar : abi:: Scalar ) {
404
396
if matches ! ( self . cx. sess( ) . opts. optimize, OptLevel :: No )
405
397
// For now, the critical niches are all over `Int`eger values.
406
398
// Should floating-point values or pointers ever get more complex
@@ -411,31 +403,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
411
403
return ;
412
404
}
413
405
414
- let abi:: WrappingRange { start, end } = scalar. valid_range ( self . cx ) ;
415
-
416
- if start <= end {
417
- if start > 0 {
418
- let low = bx. const_uint_big ( backend_ty, start) ;
419
- let cmp = bx. icmp ( IntPredicate :: IntUGE , imm, low) ;
420
- bx. assume ( cmp) ;
421
- }
422
-
423
- let type_max = scalar. size ( self . cx ) . unsigned_int_max ( ) ;
424
- if end < type_max {
425
- let high = bx. const_uint_big ( backend_ty, end) ;
426
- let cmp = bx. icmp ( IntPredicate :: IntULE , imm, high) ;
427
- bx. assume ( cmp) ;
428
- }
429
- } else {
430
- let low = bx. const_uint_big ( backend_ty, start) ;
431
- let cmp_low = bx. icmp ( IntPredicate :: IntUGE , imm, low) ;
432
-
433
- let high = bx. const_uint_big ( backend_ty, end) ;
434
- let cmp_high = bx. icmp ( IntPredicate :: IntULE , imm, high) ;
435
-
436
- let or = bx. or ( cmp_low, cmp_high) ;
437
- bx. assume ( or) ;
438
- }
406
+ let range = scalar. valid_range ( self . cx ) ;
407
+ bx. assume_integer_range ( imm, range) ;
439
408
}
440
409
441
410
pub ( crate ) fn codegen_rvalue_unsized (
0 commit comments