@@ -4001,12 +4001,20 @@ mod ivec {
4001
4001
copy_cx. build. Phi ( T_ptr ( llunitty) ,
4002
4002
~[ dest_ptr_stack, dest_ptr_heap] ,
4003
4003
~[ stack_cx. llbb, heap_cx. llbb] ) ;
4004
- auto lhs_len_unscaled = copy_cx. build. UDiv ( lhs_len, unit_sz) ;
4005
- auto lhs_end_ptr =
4006
- copy_cx. build. InBoundsGEP ( lhs_data, ~[ lhs_len_unscaled] ) ;
4007
- auto rhs_len_unscaled = copy_cx. build. UDiv ( rhs_len, unit_sz) ;
4008
- auto rhs_end_ptr =
4009
- copy_cx. build. InBoundsGEP ( rhs_data, ~[ rhs_len_unscaled] ) ;
4004
+
4005
+ auto lhs_end_ptr; auto rhs_end_ptr;
4006
+ if ( ty:: type_has_dynamic_size( cx. fcx. lcx. ccx. tcx, unit_ty) ) {
4007
+ lhs_end_ptr = copy_cx. build. InBoundsGEP ( lhs_data, ~[ lhs_len] ) ;
4008
+ rhs_end_ptr = copy_cx. build. InBoundsGEP ( rhs_data, ~[ rhs_len] ) ;
4009
+ } else {
4010
+ auto lhs_len_unscaled = copy_cx. build. UDiv ( lhs_len, unit_sz) ;
4011
+ lhs_end_ptr = copy_cx. build. InBoundsGEP ( lhs_data,
4012
+ ~[ lhs_len_unscaled] ) ;
4013
+ auto rhs_len_unscaled = copy_cx. build. UDiv ( rhs_len, unit_sz) ;
4014
+ rhs_end_ptr = copy_cx. build. InBoundsGEP ( rhs_data,
4015
+ ~[ rhs_len_unscaled] ) ;
4016
+ }
4017
+
4010
4018
auto dest_ptr_ptr = alloca( copy_cx, T_ptr ( llunitty) ) ;
4011
4019
copy_cx. build. Store ( first_dest_ptr, dest_ptr_ptr) ;
4012
4020
auto lhs_ptr_ptr = alloca( copy_cx, T_ptr ( llunitty) ) ;
@@ -4027,18 +4035,22 @@ mod ivec {
4027
4035
rhs_copy_cx. llbb) ;
4028
4036
auto dest_ptr_lhs_copy = lhs_do_copy_cx. build. Load ( dest_ptr_ptr) ;
4029
4037
auto lhs_val = load_if_immediate( lhs_do_copy_cx, lhs_ptr, unit_ty) ;
4030
- rs =
4031
- copy_val( lhs_do_copy_cx, INIT , dest_ptr_lhs_copy, lhs_val,
4032
- unit_ty) ;
4038
+ rs = copy_val( lhs_do_copy_cx, INIT , dest_ptr_lhs_copy, lhs_val,
4039
+ unit_ty) ;
4033
4040
lhs_do_copy_cx = rs. bcx;
4034
- {
4035
- auto d = lhs_do_copy_cx. build. InBoundsGEP ( dest_ptr_lhs_copy,
4036
- ~[ C_int ( 1 ) ] ) ;
4037
- auto lhs = lhs_do_copy_cx. build. InBoundsGEP ( lhs_ptr,
4038
- ~[ C_int ( 1 ) ] ) ;
4039
- lhs_do_copy_cx. build. Store ( d, dest_ptr_ptr) ;
4040
- lhs_do_copy_cx. build. Store ( lhs, lhs_ptr_ptr) ;
4041
+
4042
+ // Increment both pointers.
4043
+ if ( ty:: type_has_dynamic_size( cx. fcx. lcx. ccx. tcx, unit_ty) ) {
4044
+ // We have to increment by the dynamically-computed size.
4045
+ incr_ptr( lhs_do_copy_cx, dest_ptr_lhs_copy, unit_sz,
4046
+ dest_ptr_ptr) ;
4047
+ incr_ptr( lhs_do_copy_cx, lhs_ptr, unit_sz, lhs_ptr_ptr) ;
4048
+ } else {
4049
+ incr_ptr( lhs_do_copy_cx, dest_ptr_lhs_copy, C_int ( 1 ) ,
4050
+ dest_ptr_ptr) ;
4051
+ incr_ptr( lhs_do_copy_cx, lhs_ptr, C_int ( 1 ) , lhs_ptr_ptr) ;
4041
4052
}
4053
+
4042
4054
lhs_do_copy_cx. build. Br ( lhs_copy_cx. llbb) ;
4043
4055
// Copy in elements from the RHS.
4044
4056
@@ -4055,14 +4067,19 @@ mod ivec {
4055
4067
copy_val( rhs_do_copy_cx, INIT , dest_ptr_rhs_copy, rhs_val,
4056
4068
unit_ty) ;
4057
4069
rhs_do_copy_cx = rs. bcx;
4058
- {
4059
- auto d = rhs_do_copy_cx. build. InBoundsGEP ( dest_ptr_rhs_copy,
4060
- ~[ C_int ( 1 ) ] ) ;
4061
- auto rhs = rhs_do_copy_cx. build. InBoundsGEP ( rhs_ptr,
4062
- ~[ C_int ( 1 ) ] ) ;
4063
- rhs_do_copy_cx. build. Store ( d, dest_ptr_ptr) ;
4064
- rhs_do_copy_cx. build. Store ( rhs, rhs_ptr_ptr) ;
4070
+
4071
+ // Increment both pointers.
4072
+ if ( ty:: type_has_dynamic_size( cx. fcx. lcx. ccx. tcx, unit_ty) ) {
4073
+ // We have to increment by the dynamically-computed size.
4074
+ incr_ptr( rhs_do_copy_cx, dest_ptr_rhs_copy, unit_sz,
4075
+ dest_ptr_ptr) ;
4076
+ incr_ptr( rhs_do_copy_cx, rhs_ptr, unit_sz, rhs_ptr_ptr) ;
4077
+ } else {
4078
+ incr_ptr( rhs_do_copy_cx, dest_ptr_rhs_copy, C_int ( 1 ) ,
4079
+ dest_ptr_ptr) ;
4080
+ incr_ptr( rhs_do_copy_cx, rhs_ptr, C_int ( 1 ) , rhs_ptr_ptr) ;
4065
4081
}
4082
+
4066
4083
rhs_do_copy_cx. build. Br ( rhs_copy_cx. llbb) ;
4067
4084
// Finally done!
4068
4085
0 commit comments