@@ -242,13 +242,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
242
242
if let OperandValueKind :: Immediate ( to_scalar) = cast_kind
243
243
&& from_scalar. size ( self . cx ) == to_scalar. size ( self . cx )
244
244
{
245
- let from_backend_ty = bx. backend_type ( operand. layout ) ;
246
245
let to_backend_ty = bx. backend_type ( cast) ;
247
246
Some ( OperandValue :: Immediate ( self . transmute_immediate (
248
247
bx,
249
248
imm,
250
249
from_scalar,
251
- from_backend_ty,
252
250
to_scalar,
253
251
to_backend_ty,
254
252
) ) )
@@ -264,13 +262,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
264
262
&& in_a. size ( self . cx ) == out_a. size ( self . cx )
265
263
&& in_b. size ( self . cx ) == out_b. size ( self . cx )
266
264
{
267
- let in_a_ibty = bx. scalar_pair_element_backend_type ( operand. layout , 0 , false ) ;
268
- let in_b_ibty = bx. scalar_pair_element_backend_type ( operand. layout , 1 , false ) ;
269
265
let out_a_ibty = bx. scalar_pair_element_backend_type ( cast, 0 , false ) ;
270
266
let out_b_ibty = bx. scalar_pair_element_backend_type ( cast, 1 , false ) ;
271
267
Some ( OperandValue :: Pair (
272
- self . transmute_immediate ( bx, imm_a, in_a, in_a_ibty , out_a, out_a_ibty) ,
273
- self . transmute_immediate ( bx, imm_b, in_b, in_b_ibty , out_b, out_b_ibty) ,
268
+ self . transmute_immediate ( bx, imm_a, in_a, out_a, out_a_ibty) ,
269
+ self . transmute_immediate ( bx, imm_b, in_b, out_b, out_b_ibty) ,
274
270
) )
275
271
} else {
276
272
None
@@ -294,12 +290,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
294
290
) -> Option < Bx :: Value > {
295
291
use abi:: Primitive :: * ;
296
292
297
- // When scalars are passed by value, there's no metadata recording their
298
- // valid ranges. For example, `char`s are passed as just `i32`, with no
299
- // way for LLVM to know that they're 0x10FFFF at most. Thus we assume
300
- // the range of the input value too, not just the output range.
301
- self . assume_scalar_range ( bx, imm, from_scalar, from_backend_ty) ;
302
-
303
293
imm = match ( from_scalar. primitive ( ) , to_scalar. primitive ( ) ) {
304
294
( Int ( _, is_signed) , Int ( ..) ) => bx. intcast ( imm, to_backend_ty, is_signed) ,
305
295
( Float ( _) , Float ( _) ) => {
@@ -341,21 +331,15 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
341
331
bx : & mut Bx ,
342
332
mut imm : Bx :: Value ,
343
333
from_scalar : abi:: Scalar ,
344
- from_backend_ty : Bx :: Type ,
345
334
to_scalar : abi:: Scalar ,
346
335
to_backend_ty : Bx :: Type ,
347
336
) -> Bx :: Value {
337
+ use abi:: Primitive :: * ;
338
+
348
339
assert_eq ! ( from_scalar. size( self . cx) , to_scalar. size( self . cx) ) ;
349
340
350
- use abi:: Primitive :: * ;
351
341
imm = bx. from_immediate ( imm) ;
352
342
353
- // When scalars are passed by value, there's no metadata recording their
354
- // valid ranges. For example, `char`s are passed as just `i32`, with no
355
- // way for LLVM to know that they're 0x10FFFF at most. Thus we assume
356
- // the range of the input value too, not just the output range.
357
- self . assume_scalar_range ( bx, imm, from_scalar, from_backend_ty) ;
358
-
359
343
imm = match ( from_scalar. primitive ( ) , to_scalar. primitive ( ) ) {
360
344
( Int ( ..) | Float ( _) , Int ( ..) | Float ( _) ) => bx. bitcast ( imm, to_backend_ty) ,
361
345
( Pointer ( ..) , Pointer ( ..) ) => bx. pointercast ( imm, to_backend_ty) ,
@@ -370,55 +354,10 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
370
354
bx. bitcast ( int_imm, to_backend_ty)
371
355
}
372
356
} ;
373
- self . assume_scalar_range ( bx, imm, to_scalar, to_backend_ty) ;
374
357
imm = bx. to_immediate_scalar ( imm, to_scalar) ;
375
358
imm
376
359
}
377
360
378
- fn assume_scalar_range (
379
- & self ,
380
- bx : & mut Bx ,
381
- imm : Bx :: Value ,
382
- scalar : abi:: Scalar ,
383
- backend_ty : Bx :: Type ,
384
- ) {
385
- if matches ! ( self . cx. sess( ) . opts. optimize, OptLevel :: No | OptLevel :: Less )
386
- // For now, the critical niches are all over `Int`eger values.
387
- // Should floating-point values or pointers ever get more complex
388
- // niches, then this code will probably want to handle them too.
389
- || !matches ! ( scalar. primitive( ) , abi:: Primitive :: Int ( ..) )
390
- || scalar. is_always_valid ( self . cx )
391
- {
392
- return ;
393
- }
394
-
395
- let abi:: WrappingRange { start, end } = scalar. valid_range ( self . cx ) ;
396
-
397
- if start <= end {
398
- if start > 0 {
399
- let low = bx. const_uint_big ( backend_ty, start) ;
400
- let cmp = bx. icmp ( IntPredicate :: IntUGE , imm, low) ;
401
- bx. assume ( cmp) ;
402
- }
403
-
404
- let type_max = scalar. size ( self . cx ) . unsigned_int_max ( ) ;
405
- if end < type_max {
406
- let high = bx. const_uint_big ( backend_ty, end) ;
407
- let cmp = bx. icmp ( IntPredicate :: IntULE , imm, high) ;
408
- bx. assume ( cmp) ;
409
- }
410
- } else {
411
- let low = bx. const_uint_big ( backend_ty, start) ;
412
- let cmp_low = bx. icmp ( IntPredicate :: IntUGE , imm, low) ;
413
-
414
- let high = bx. const_uint_big ( backend_ty, end) ;
415
- let cmp_high = bx. icmp ( IntPredicate :: IntULE , imm, high) ;
416
-
417
- let or = bx. or ( cmp_low, cmp_high) ;
418
- bx. assume ( or) ;
419
- }
420
- }
421
-
422
361
pub fn codegen_rvalue_unsized (
423
362
& mut self ,
424
363
bx : & mut Bx ,
0 commit comments