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