@@ -95,7 +95,8 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
9595            | "bitreverse"  => { 
9696                let  ty = substs. type_at ( 0 ) ; 
9797                let  layout_of = self . layout_of ( ty) ?; 
98-                 let  bits = self . read_scalar ( args[ 0 ] ) ?. to_bits ( layout_of. size ) ?; 
98+                 let  val = self . read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?; 
99+                 let  bits = self . force_bits ( val,  layout_of. size ) ?; 
99100                let  kind = match  layout_of. abi  { 
100101                    ty:: layout:: Abi :: Scalar ( ref  scalar)  => scalar. value , 
101102                    _ => throw_unsup ! ( TypeNotPrimitive ( ty) ) , 
@@ -149,7 +150,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
149150                        // term since the sign of the second term can be inferred from this and 
150151                        // the fact that the operation has overflowed (if either is 0 no 
151152                        // overflow can occur) 
152-                         let  first_term:  u128  = l. to_scalar ( ) ?. to_bits ( l. layout . size ) ?; 
153+                         let  first_term:  u128  = self . force_bits ( l. to_scalar ( ) ?,   l. layout . size ) ?; 
153154                        let  first_term_positive = first_term &  ( 1  << ( num_bits-1 ) )  == 0 ; 
154155                        if  first_term_positive { 
155156                            // Negative overflow not possible since the positive first term 
@@ -187,7 +188,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
187188                let  ( val,  overflowed,  _ty)  = self . overflowing_binary_op ( bin_op,  l,  r) ?; 
188189                if  overflowed { 
189190                    let  layout = self . layout_of ( substs. type_at ( 0 ) ) ?; 
190-                     let  r_val = r. to_scalar ( ) ?. to_bits ( layout. size ) ?; 
191+                     let  r_val = self . force_bits ( r. to_scalar ( ) ?,   layout. size ) ?; 
191192                    throw_ub_format ! ( "Overflowing shift by {} in `{}`" ,  r_val,  intrinsic_name) ; 
192193                } 
193194                self . write_scalar ( val,  dest) ?; 
@@ -196,8 +197,10 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
196197                // rotate_left: (X << (S % BW)) | (X >> ((BW - S) % BW)) 
197198                // rotate_right: (X << ((BW - S) % BW)) | (X >> (S % BW)) 
198199                let  layout = self . layout_of ( substs. type_at ( 0 ) ) ?; 
199-                 let  val_bits = self . read_scalar ( args[ 0 ] ) ?. to_bits ( layout. size ) ?; 
200-                 let  raw_shift_bits = self . read_scalar ( args[ 1 ] ) ?. to_bits ( layout. size ) ?; 
200+                 let  val = self . read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?; 
201+                 let  val_bits = self . force_bits ( val,  layout. size ) ?; 
202+                 let  raw_shift = self . read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?; 
203+                 let  raw_shift_bits = self . force_bits ( raw_shift,  layout. size ) ?; 
201204                let  width_bits = layout. size . bits ( )  as  u128 ; 
202205                let  shift_bits = raw_shift_bits % width_bits; 
203206                let  inv_shift_bits = ( width_bits - shift_bits)  % width_bits; 
0 commit comments