@@ -291,33 +291,41 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
291291 }
292292
293293 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+ } ;
296297 // 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) ;
302298 let val = Operand :: Copy ( place) ;
303299
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 ( )
306306 } ;
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+ ) ;
319319 } ;
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+ }
321329 }
322330
323331 TestKind :: Len { len, op } => {
0 commit comments