@@ -135,15 +135,14 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
135135        assert_eq ! ( alloc_align,  layout. align. abi) ; 
136136
137137        let  read_scalar = |start,  size,  s :  abi:: Scalar ,  ty| { 
138-             let  val = alloc
139-                 . 0 
140-                 . read_scalar ( 
141-                     bx, 
142-                     alloc_range ( start,  size) , 
143-                     /*read_provenance*/  matches ! ( s. primitive( ) ,  abi:: Pointer ( _) ) , 
144-                 ) 
145-                 . unwrap ( ) ; 
146-             bx. scalar_to_backend ( val,  s,  ty) 
138+             match  alloc. 0 . read_scalar ( 
139+                 bx, 
140+                 alloc_range ( start,  size) , 
141+                 /*read_provenance*/  matches ! ( s. primitive( ) ,  abi:: Pointer ( _) ) , 
142+             )  { 
143+                 Ok ( val)  => bx. scalar_to_backend ( val,  s,  ty) , 
144+                 Err ( _)  => bx. const_poison ( ty) , 
145+             } 
147146        } ; 
148147
149148        // It may seem like all types with `Scalar` or `ScalarPair` ABI are fair game at this point. 
@@ -156,18 +155,18 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
156155            Abi :: Scalar ( s @ abi:: Scalar :: Initialized  {  .. } )  => { 
157156                let  size = s. size ( bx) ; 
158157                assert_eq ! ( size,  layout. size,  "abi::Scalar size does not match layout size" ) ; 
159-                 let  val = read_scalar ( Size :: ZERO ,  size,  s,  bx. backend_type ( layout) ) ; 
158+                 let  val = read_scalar ( offset ,  size,  s,  bx. backend_type ( layout) ) ; 
160159                OperandRef  {  val :  OperandValue :: Immediate ( val) ,  layout } 
161160            } 
162161            Abi :: ScalarPair ( 
163162                a @ abi:: Scalar :: Initialized  {  .. } , 
164163                b @ abi:: Scalar :: Initialized  {  .. } , 
165164            )  => { 
166165                let  ( a_size,  b_size)  = ( a. size ( bx) ,  b. size ( bx) ) ; 
167-                 let  b_offset = a_size. align_to ( b. align ( bx) . abi ) ; 
166+                 let  b_offset = ( offset +  a_size) . align_to ( b. align ( bx) . abi ) ; 
168167                assert ! ( b_offset. bytes( )  > 0 ) ; 
169168                let  a_val = read_scalar ( 
170-                     Size :: ZERO , 
169+                     offset , 
171170                    a_size, 
172171                    a, 
173172                    bx. scalar_pair_element_backend_type ( layout,  0 ,  true ) , 
0 commit comments