@@ -291,33 +291,41 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
291
291
}
292
292
293
293
TestKind :: Range ( ref range) => {
294
- let lower_bound_success = self . cfg . start_new_block ( ) ;
295
-
294
+ let [ success, fail] = * target_blocks else {
295
+ bug ! ( "`TestKind::Range` should have two target blocks" ) ;
296
+ } ;
296
297
// Test `val` by computing `lo <= val && val <= hi`, using primitive comparisons.
297
- // FIXME: skip useless comparison when the range is half-open.
298
- let lo = range. lo . to_const ( range. ty , self . tcx ) ;
299
- let hi = range. hi . to_const ( range. ty , self . tcx ) ;
300
- let lo = self . literal_operand ( test. span , lo) ;
301
- let hi = self . literal_operand ( test. span , hi) ;
302
298
let val = Operand :: Copy ( place) ;
303
299
304
- let [ success, fail] = * target_blocks else {
305
- bug ! ( "`TestKind::Range` should have two target blocks" ) ;
300
+ let intermediate_block = if !range. lo . is_finite ( ) {
301
+ block
302
+ } else if !range. hi . is_finite ( ) {
303
+ success
304
+ } else {
305
+ self . cfg . start_new_block ( )
306
306
} ;
307
- self . compare (
308
- block ,
309
- lower_bound_success ,
310
- fail ,
311
- source_info ,
312
- BinOp :: Le ,
313
- lo ,
314
- val . clone ( ) ,
315
- ) ;
316
- let op = match range . end {
317
- RangeEnd :: Included => BinOp :: Le ,
318
- RangeEnd :: Excluded => BinOp :: Lt ,
307
+
308
+ if let Some ( lo ) = range . lo . as_finite ( ) {
309
+ let lo = self . literal_operand ( test . span , lo ) ;
310
+ self . compare (
311
+ block ,
312
+ intermediate_block ,
313
+ fail ,
314
+ source_info ,
315
+ BinOp :: Le ,
316
+ lo ,
317
+ val . clone ( ) ,
318
+ ) ;
319
319
} ;
320
- self . compare ( lower_bound_success, success, fail, source_info, op, val, hi) ;
320
+
321
+ if let Some ( hi) = range. hi . as_finite ( ) {
322
+ let hi = self . literal_operand ( test. span , hi) ;
323
+ let op = match range. end {
324
+ RangeEnd :: Included => BinOp :: Le ,
325
+ RangeEnd :: Excluded => BinOp :: Lt ,
326
+ } ;
327
+ self . compare ( intermediate_block, success, fail, source_info, op, val, hi) ;
328
+ }
321
329
}
322
330
323
331
TestKind :: Len { len, op } => {
0 commit comments