@@ -1597,7 +1597,6 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
15971597 unimplemented ! ( ) ;
15981598 }
15991599
1600-
16011600 pub fn vector_select ( & mut self , cond : RValue < ' gcc > , then_val : RValue < ' gcc > , else_val : RValue < ' gcc > ) -> RValue < ' gcc > {
16021601 // cond is a vector of integers, not of bools.
16031602 let cond_type = cond. get_type ( ) ;
@@ -1607,10 +1606,12 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
16071606 let zeros = vec ! [ self . context. new_rvalue_zero( element_type) ; num_units] ;
16081607 let zeros = self . context . new_rvalue_from_vector ( None , cond_type, & zeros) ;
16091608
1609+ let result_type = then_val. get_type ( ) ;
1610+
16101611 let masks = self . context . new_comparison ( None , ComparisonOp :: NotEquals , cond, zeros) ;
16111612 // NOTE: masks is a vector of integers, but the values can be vectors of floats, so use bitcast to make
16121613 // the & operation work.
1613- let masks = self . bitcast_if_needed ( masks , then_val . get_type ( ) ) ;
1614+ let then_val = self . bitcast_if_needed ( then_val , masks . get_type ( ) ) ;
16141615 let then_vals = masks & then_val;
16151616
16161617 let minus_ones = vec ! [ self . context. new_rvalue_from_int( element_type, -1 ) ; num_units] ;
@@ -1623,7 +1624,8 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
16231624 let else_val = self . context . new_bitcast ( None , else_val, then_val. get_type ( ) ) ;
16241625 let else_vals = inverted_masks & else_val;
16251626
1626- then_vals | else_vals
1627+ let res = then_vals | else_vals;
1628+ self . bitcast_if_needed ( res, result_type)
16271629 }
16281630}
16291631
0 commit comments