@@ -318,33 +318,41 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
318318 }
319319
320320 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+ } ;
323324 // 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) ;
329325 let val = Operand :: Copy ( place) ;
330326
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 ( )
333333 } ;
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+ ) ;
346346 } ;
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+ }
348356 }
349357
350358 TestKind :: Len { len, op } => {
0 commit comments