@@ -244,13 +244,24 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> {
244
244
} ;
245
245
246
246
// 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
+
247
256
match val {
248
257
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) ) ;
250
259
}
251
260
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 ) ) ;
254
265
}
255
266
OperandValue :: Ref ( ..) => bug ! ( )
256
267
}
0 commit comments