@@ -318,33 +318,41 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
318
318
}
319
319
320
320
TestKind :: Range ( ref range) => {
321
- let lower_bound_success = self . cfg . start_new_block ( ) ;
322
-
321
+ let [ success, fail] = * target_blocks else {
322
+ bug ! ( "`TestKind::Range` should have two target blocks" ) ;
323
+ } ;
323
324
// Test `val` by computing `lo <= val && val <= hi`, using primitive comparisons.
324
- // FIXME: skip useless comparison when the range is half-open.
325
- let lo = range. lo . to_const ( range. ty , self . tcx ) ;
326
- let hi = range. hi . to_const ( range. ty , self . tcx ) ;
327
- let lo = self . literal_operand ( test. span , lo) ;
328
- let hi = self . literal_operand ( test. span , hi) ;
329
325
let val = Operand :: Copy ( place) ;
330
326
331
- let [ success, fail] = * target_blocks else {
332
- bug ! ( "`TestKind::Range` should have two target blocks" ) ;
327
+ let intermediate_block = if !range. lo . is_finite ( ) {
328
+ block
329
+ } else if !range. hi . is_finite ( ) {
330
+ success
331
+ } else {
332
+ self . cfg . start_new_block ( )
333
333
} ;
334
- self . compare (
335
- block ,
336
- lower_bound_success ,
337
- fail ,
338
- source_info ,
339
- BinOp :: Le ,
340
- lo ,
341
- val . clone ( ) ,
342
- ) ;
343
- let op = match range . end {
344
- RangeEnd :: Included => BinOp :: Le ,
345
- RangeEnd :: Excluded => BinOp :: Lt ,
334
+
335
+ if let Some ( lo ) = range . lo . as_finite ( ) {
336
+ let lo = self . literal_operand ( test . span , lo ) ;
337
+ self . compare (
338
+ block ,
339
+ intermediate_block ,
340
+ fail ,
341
+ source_info ,
342
+ BinOp :: Le ,
343
+ lo ,
344
+ val . clone ( ) ,
345
+ ) ;
346
346
} ;
347
- self . compare ( lower_bound_success, success, fail, source_info, op, val, hi) ;
347
+
348
+ if let Some ( hi) = range. hi . as_finite ( ) {
349
+ let hi = self . literal_operand ( test. span , hi) ;
350
+ let op = match range. end {
351
+ RangeEnd :: Included => BinOp :: Le ,
352
+ RangeEnd :: Excluded => BinOp :: Lt ,
353
+ } ;
354
+ self . compare ( intermediate_block, success, fail, source_info, op, val, hi) ;
355
+ }
348
356
}
349
357
350
358
TestKind :: Len { len, op } => {
0 commit comments