@@ -244,13 +244,24 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> {
244244 } ;
245245
246246 // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
247+ // Bools in union fields needs to be truncated.
248+ let to_immediate_or_cast = |bx : & mut Bx , val, ty| {
249+ if ty == bx. cx ( ) . type_i1 ( ) {
250+ bx. trunc ( val, ty)
251+ } else {
252+ bx. bitcast ( val, ty)
253+ }
254+ } ;
255+
247256 match val {
248257 OperandValue :: Immediate ( ref mut llval) => {
249- * llval = bx . bitcast ( * llval, bx. cx ( ) . immediate_backend_type ( field) ) ;
258+ * llval = to_immediate_or_cast ( bx , * llval, bx. cx ( ) . immediate_backend_type ( field) ) ;
250259 }
251260 OperandValue :: Pair ( ref mut a, ref mut b) => {
252- * a = bx. bitcast ( * a, bx. cx ( ) . scalar_pair_element_backend_type ( field, 0 , true ) ) ;
253- * b = bx. bitcast ( * b, bx. cx ( ) . scalar_pair_element_backend_type ( field, 1 , true ) ) ;
261+ * a = to_immediate_or_cast ( bx, * a, bx. cx ( )
262+ . scalar_pair_element_backend_type ( field, 0 , true ) ) ;
263+ * b = to_immediate_or_cast ( bx, * b, bx. cx ( )
264+ . scalar_pair_element_backend_type ( field, 1 , true ) ) ;
254265 }
255266 OperandValue :: Ref ( ..) => bug ! ( )
256267 }
0 commit comments