@@ -343,18 +343,45 @@ impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
343
343
) -> ( FlatSet < ScalarTy < ' tcx > > , FlatSet < bool > ) {
344
344
let left = self . eval_operand ( left, state) ;
345
345
let right = self . eval_operand ( right, state) ;
346
+
346
347
match ( left, right) {
348
+ ( FlatSet :: Bottom , _) | ( _, FlatSet :: Bottom ) => ( FlatSet :: Bottom , FlatSet :: Bottom ) ,
349
+ // Both sides are known, do the actual computation.
347
350
( FlatSet :: Elem ( left) , FlatSet :: Elem ( right) ) => {
348
351
match self . ecx . overflowing_binary_op ( op, & left, & right) {
349
352
Ok ( ( val, overflow, ty) ) => ( self . wrap_scalar ( val, ty) , FlatSet :: Elem ( overflow) ) ,
350
353
_ => ( FlatSet :: Top , FlatSet :: Top ) ,
351
354
}
352
355
}
353
- ( FlatSet :: Bottom , _) | ( _, FlatSet :: Bottom ) => ( FlatSet :: Bottom , FlatSet :: Bottom ) ,
354
- ( _, _) => {
355
- // Could attempt some algebraic simplifications here.
356
- ( FlatSet :: Top , FlatSet :: Top )
356
+ // Exactly one side is known, attempt some algebraic simplifications.
357
+ ( FlatSet :: Elem ( const_arg) , _) | ( _, FlatSet :: Elem ( const_arg) ) => {
358
+ let layout = const_arg. layout ;
359
+ if !matches ! ( layout. abi, rustc_target:: abi:: Abi :: Scalar ( ..) ) {
360
+ return ( FlatSet :: Top , FlatSet :: Top ) ;
361
+ }
362
+
363
+ let arg_scalar = const_arg. to_scalar ( ) ;
364
+ let Ok ( arg_value) = arg_scalar. to_bits ( layout. size ) else {
365
+ return ( FlatSet :: Top , FlatSet :: Top ) ;
366
+ } ;
367
+
368
+ match op {
369
+ BinOp :: BitAnd if arg_value == 0 => {
370
+ ( self . wrap_scalar ( arg_scalar, layout. ty ) , FlatSet :: Bottom )
371
+ }
372
+ BinOp :: BitOr
373
+ if arg_value == layout. size . truncate ( u128:: MAX )
374
+ || ( layout. ty . is_bool ( ) && arg_value == 1 ) =>
375
+ {
376
+ ( self . wrap_scalar ( arg_scalar, layout. ty ) , FlatSet :: Bottom )
377
+ }
378
+ BinOp :: Mul if layout. ty . is_integral ( ) && arg_value == 0 => {
379
+ ( self . wrap_scalar ( arg_scalar, layout. ty ) , FlatSet :: Elem ( false ) )
380
+ }
381
+ _ => ( FlatSet :: Top , FlatSet :: Top ) ,
382
+ }
357
383
}
384
+ ( FlatSet :: Top , FlatSet :: Top ) => ( FlatSet :: Top , FlatSet :: Top ) ,
358
385
}
359
386
}
360
387
0 commit comments