@@ -203,30 +203,14 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
203
203
let alloc_align = alloc. inner ( ) . align ;
204
204
assert ! ( alloc_align >= layout. align. abi) ;
205
205
206
- // Returns `None` when the value is partially undefined or any byte of it has provenance.
207
- // Otherwise returns the value or (if the entire value is undef) returns an undef.
208
206
let read_scalar = |start, size, s : abi:: Scalar , ty| {
209
- let range = alloc_range ( start, size) ;
210
207
match alloc. 0 . read_scalar (
211
208
bx,
212
- range ,
209
+ alloc_range ( start , size ) ,
213
210
/*read_provenance*/ matches ! ( s. primitive( ) , abi:: Primitive :: Pointer ( _) ) ,
214
211
) {
215
- Ok ( val) => Some ( bx. scalar_to_backend ( val, s, ty) ) ,
216
- Err ( _) => {
217
- // We may have failed due to partial provenance or unexpected provenance,
218
- // continue down the normal code path if so.
219
- if alloc. 0 . provenance ( ) . range_empty ( range, & bx. tcx ( ) )
220
- // Since `read_scalar` failed, but there were no relocations involved, the
221
- // bytes must be partially or fully uninitialized. Thus we can now unwrap the
222
- // information about the range of uninit bytes and check if it's the full range.
223
- && alloc. 0 . init_mask ( ) . is_range_initialized ( range) . unwrap_err ( ) == range
224
- {
225
- Some ( bx. const_undef ( ty) )
226
- } else {
227
- None
228
- }
229
- }
212
+ Ok ( val) => bx. scalar_to_backend ( val, s, ty) ,
213
+ Err ( _) => bx. const_poison ( ty) ,
230
214
}
231
215
} ;
232
216
@@ -237,14 +221,16 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
237
221
// check that walks over the type of `mplace` to make sure it is truly correct to treat this
238
222
// like a `Scalar` (or `ScalarPair`).
239
223
match layout. backend_repr {
240
- BackendRepr :: Scalar ( s) => {
224
+ BackendRepr :: Scalar ( s @ abi :: Scalar :: Initialized { .. } ) => {
241
225
let size = s. size ( bx) ;
242
226
assert_eq ! ( size, layout. size, "abi::Scalar size does not match layout size" ) ;
243
- if let Some ( val) = read_scalar ( offset, size, s, bx. immediate_backend_type ( layout) ) {
244
- return OperandRef { val : OperandValue :: Immediate ( val) , layout } ;
245
- }
227
+ let val = read_scalar ( offset, size, s, bx. immediate_backend_type ( layout) ) ;
228
+ OperandRef { val : OperandValue :: Immediate ( val) , layout }
246
229
}
247
- BackendRepr :: ScalarPair ( a, b) => {
230
+ BackendRepr :: ScalarPair (
231
+ a @ abi:: Scalar :: Initialized { .. } ,
232
+ b @ abi:: Scalar :: Initialized { .. } ,
233
+ ) => {
248
234
let ( a_size, b_size) = ( a. size ( bx) , b. size ( bx) ) ;
249
235
let b_offset = ( offset + a_size) . align_to ( b. align ( bx) . abi ) ;
250
236
assert ! ( b_offset. bytes( ) > 0 ) ;
@@ -260,21 +246,20 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
260
246
b,
261
247
bx. scalar_pair_element_backend_type ( layout, 1 , true ) ,
262
248
) ;
263
- if let ( Some ( a_val) , Some ( b_val) ) = ( a_val, b_val) {
264
- return OperandRef { val : OperandValue :: Pair ( a_val, b_val) , layout } ;
265
- }
249
+ OperandRef { val : OperandValue :: Pair ( a_val, b_val) , layout }
250
+ }
251
+ _ if layout. is_zst ( ) => OperandRef :: zero_sized ( layout) ,
252
+ _ => {
253
+ // Neither a scalar nor scalar pair. Load from a place
254
+ // FIXME: should we cache `const_data_from_alloc` to avoid repeating this for the
255
+ // same `ConstAllocation`?
256
+ let init = bx. const_data_from_alloc ( alloc) ;
257
+ let base_addr = bx. static_addr_of ( init, alloc_align, None ) ;
258
+
259
+ let llval = bx. const_ptr_byte_offset ( base_addr, offset) ;
260
+ bx. load_operand ( PlaceRef :: new_sized ( llval, layout) )
266
261
}
267
- _ if layout. is_zst ( ) => return OperandRef :: zero_sized ( layout) ,
268
- _ => { }
269
262
}
270
- // Neither a scalar nor scalar pair. Load from a place
271
- // FIXME: should we cache `const_data_from_alloc` to avoid repeating this for the
272
- // same `ConstAllocation`?
273
- let init = bx. const_data_from_alloc ( alloc) ;
274
- let base_addr = bx. static_addr_of ( init, alloc_align, None ) ;
275
-
276
- let llval = bx. const_ptr_byte_offset ( base_addr, offset) ;
277
- bx. load_operand ( PlaceRef :: new_sized ( llval, layout) )
278
263
}
279
264
280
265
/// Asserts that this operand refers to a scalar and returns
0 commit comments