@@ -1312,7 +1312,7 @@ fn make_take_glue(cx: &@block_ctxt, v: ValueRef, t: ty::t) {
1312
1312
bcx = incr_refcnt_of_boxed ( cx, bld:: Load ( cx, v) ) . bcx ;
1313
1313
} else if ty:: type_is_structural ( bcx_tcx ( cx) , t) {
1314
1314
bcx = duplicate_heap_parts_if_necessary ( cx, v, t) . bcx ;
1315
- bcx = iter_structural_ty ( bcx, v, t, bind take_ty ( _ , _ , _ ) ) . bcx ;
1315
+ bcx = iter_structural_ty ( bcx, v, t, take_ty) . bcx ;
1316
1316
} else { bcx = cx; }
1317
1317
1318
1318
build_return ( bcx) ;
@@ -1349,8 +1349,7 @@ fn make_free_glue(cx: &@block_ctxt, v0: ValueRef, t: ty::t) {
1349
1349
let body =
1350
1350
bld:: GEP ( cx, v, [ C_int ( 0 ) , C_int ( abi:: box_rc_field_body) ] ) ;
1351
1351
let body_ty = body_mt. ty ;
1352
- let body_val = load_if_immediate ( cx, body, body_ty) ;
1353
- let rs = drop_ty ( cx, body_val, body_ty) ;
1352
+ let rs = drop_ty ( cx, body, body_ty) ;
1354
1353
if !bcx_ccx ( cx) . sess . get_opts ( ) . do_gc {
1355
1354
trans_non_gc_free ( rs. bcx , v)
1356
1355
} else { rslt ( cx, C_nil ( ) ) }
@@ -1469,7 +1468,7 @@ fn make_drop_glue(cx: &@block_ctxt, v0: ValueRef, t: ty::t) {
1469
1468
_ {
1470
1469
if ty:: type_has_pointers ( ccx. tcx , t) &&
1471
1470
ty:: type_is_structural ( ccx. tcx , t) {
1472
- iter_structural_ty ( cx, v0, t, bind drop_ty ( _ , _ , _ ) )
1471
+ iter_structural_ty ( cx, v0, t, drop_ty)
1473
1472
} else { rslt( cx, C_nil ( ) ) }
1474
1473
}
1475
1474
} ;
@@ -1518,7 +1517,7 @@ fn trans_res_drop(cx: @block_ctxt, rs: ValueRef, did: &ast::def_id,
1518
1517
let val_cast = bld:: BitCast ( cx, val. val , val_llty) ;
1519
1518
bld:: FastCall ( cx, dtor_addr, args + [ val_cast] ) ;
1520
1519
1521
- cx = drop_slot ( cx, val. val , inner_t_s) . bcx ;
1520
+ cx = drop_ty ( cx, val. val , inner_t_s) . bcx ;
1522
1521
bld:: Store ( cx, C_int ( 0 ) , drop_flag. val ) ;
1523
1522
bld:: Br ( cx, next_cx. llbb ) ;
1524
1523
ret rslt( next_cx, C_nil ( ) ) ;
@@ -1549,7 +1548,7 @@ fn decr_refcnt_maybe_free(cx: &@block_ctxt, box_ptr_alias: ValueRef,
1549
1548
let zero_test = bld:: ICmp ( rc_adj_cx, lib:: llvm:: LLVMIntEQ , C_int ( 0 ) , rc) ;
1550
1549
bld:: CondBr ( rc_adj_cx, zero_test, free_cx. llbb , next_cx. llbb ) ;
1551
1550
let free_res =
1552
- free_ty ( free_cx, load_if_immediate ( free_cx , full_alias, t ) , t) ;
1551
+ free_ty ( free_cx, full_alias, t) ;
1553
1552
bld:: Br ( free_res. bcx , next_cx. llbb ) ;
1554
1553
let t_else = T_nil ( ) ;
1555
1554
let v_else = C_nil ( ) ;
@@ -1728,7 +1727,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1728
1727
let next_cx = new_sub_block_ctxt ( cx, "next" ) ;
1729
1728
let null_test = bld:: IsNull ( cx, box_ptr) ;
1730
1729
bld:: CondBr ( cx, null_test, next_cx. llbb , inner_cx. llbb ) ;
1731
- let r = f ( inner_cx, box_ptr , tbox) ;
1730
+ let r = f ( inner_cx, box_cell , tbox) ;
1732
1731
bld:: Br ( r. bcx , next_cx. llbb ) ;
1733
1732
ret rslt( next_cx, C_nil ( ) ) ;
1734
1733
}
@@ -1772,9 +1771,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1772
1771
bld:: CondBr ( loop_header_cx, not_yet_at_end, loop_body_cx. llbb ,
1773
1772
next_cx. llbb ) ;
1774
1773
1775
- rs =
1776
- f ( loop_body_cx,
1777
- load_if_immediate ( loop_body_cx, dest_elem, unit_ty) , unit_ty) ;
1774
+ rs = f ( loop_body_cx, dest_elem, unit_ty) ;
1778
1775
1779
1776
loop_body_cx = rs. bcx ;
1780
1777
@@ -1805,8 +1802,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1805
1802
let llfldp_a = rslt. val ;
1806
1803
cx = rslt. bcx ;
1807
1804
let ty_subst = ty:: substitute_type_params ( ccx. tcx , tps, a. ty ) ;
1808
- let llfld_a = load_if_immediate ( cx, llfldp_a, ty_subst) ;
1809
- rslt = f ( cx, llfld_a, ty_subst) ;
1805
+ rslt = f ( cx, llfldp_a, ty_subst) ;
1810
1806
cx = rslt. bcx ;
1811
1807
j += 1 ;
1812
1808
}
@@ -1822,9 +1818,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1822
1818
for fld: ty:: field in fields {
1823
1819
r = GEP_tup_like ( r. bcx , t, av, [ 0 , i] ) ;
1824
1820
let llfld_a = r. val ;
1825
- r =
1826
- f ( r. bcx , load_if_immediate ( r. bcx , llfld_a, fld. mt . ty ) ,
1827
- fld. mt . ty ) ;
1821
+ r = f ( r. bcx , llfld_a, fld. mt . ty ) ;
1828
1822
i += 1 ;
1829
1823
}
1830
1824
}
@@ -1833,7 +1827,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1833
1827
for arg in args {
1834
1828
r = GEP_tup_like ( r. bcx , t, av, [ 0 , i] ) ;
1835
1829
let llfld_a = r. val ;
1836
- r = f ( r. bcx , load_if_immediate ( r . bcx , llfld_a, arg ) , arg) ;
1830
+ r = f ( r. bcx , llfld_a, arg) ;
1837
1831
i += 1 ;
1838
1832
}
1839
1833
}
@@ -1844,7 +1838,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1844
1838
let tup_t = ty:: mk_tup ( tcx, [ ty:: mk_int ( tcx) , inner_t_s] ) ;
1845
1839
r = GEP_tup_like ( r. bcx , tup_t, av, [ 0 , 1 ] ) ;
1846
1840
let llfld_a = r. val ;
1847
- r = f ( r. bcx , load_if_immediate ( r . bcx , llfld_a, inner1 ) , inner1) ;
1841
+ r = f ( r. bcx , llfld_a, inner1) ;
1848
1842
}
1849
1843
ty:: ty_tag ( tid, tps) {
1850
1844
let variants = ty:: tag_variants ( bcx_tcx ( cx) , tid) ;
@@ -1864,7 +1858,7 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, t: ty::t,
1864
1858
// NB: we must hit the discriminant first so that structural
1865
1859
// comparison know not to proceed when the discriminants differ.
1866
1860
let bcx = cx;
1867
- bcx = f ( bcx, lldiscrim_a , ty:: mk_int ( bcx_tcx ( cx) ) ) . bcx ;
1861
+ bcx = f ( bcx, lldiscrim_a_ptr , ty:: mk_int ( bcx_tcx ( cx) ) ) . bcx ;
1868
1862
let unr_cx = new_sub_block_ctxt ( bcx, "tag-iter-unr" ) ;
1869
1863
bld:: Unreachable ( unr_cx) ;
1870
1864
let llswitch = bld:: Switch ( bcx, lldiscrim_a, unr_cx. llbb , n_variants) ;
@@ -2141,7 +2135,7 @@ fn call_tydesc_glue_full(cx: &@block_ctxt, v: ValueRef, tydesc: ValueRef,
2141
2135
}
2142
2136
}
2143
2137
2144
- let llrawptr = bld:: BitCast ( cx, v, T_ptr ( T_i8 ( ) ) ) ;
2138
+ let llrawptr = bld:: PointerCast ( cx, v, T_ptr ( T_i8 ( ) ) ) ;
2145
2139
let lltydescs =
2146
2140
bld:: GEP ( cx, tydesc,
2147
2141
[ C_int ( 0 ) , C_int ( abi:: tydesc_field_first_param) ] ) ;
@@ -2165,8 +2159,7 @@ fn call_tydesc_glue(cx: &@block_ctxt, v: ValueRef, t: ty::t, field: int) ->
2165
2159
result {
2166
2160
let ti: option:: t < @tydesc_info > = none :: < @tydesc_info > ;
2167
2161
let td = get_tydesc ( cx, t, false , tps_normal, ti) . result ;
2168
- call_tydesc_glue_full ( td. bcx , spill_if_immediate ( td. bcx , v, t) , td. val ,
2169
- field, ti) ;
2162
+ call_tydesc_glue_full ( td. bcx , v, td. val , field, ti) ;
2170
2163
ret rslt( td. bcx , C_nil ( ) ) ;
2171
2164
}
2172
2165
@@ -2266,11 +2259,6 @@ fn take_ty(cx: &@block_ctxt, v: ValueRef, t: ty::t) -> result {
2266
2259
ret rslt( cx, C_nil ( ) ) ;
2267
2260
}
2268
2261
2269
- fn drop_slot ( cx : & @block_ctxt , slot : ValueRef , t : ty:: t ) -> result {
2270
- let llptr = load_if_immediate ( cx, slot, t) ;
2271
- ret drop_ty( cx, llptr, t) ;
2272
- }
2273
-
2274
2262
fn drop_ty ( cx : & @block_ctxt , v : ValueRef , t : ty:: t ) -> result {
2275
2263
if ty:: type_needs_drop ( bcx_tcx ( cx) , t) {
2276
2264
ret call_tydesc_glue ( cx, v, t, abi:: tydesc_field_drop_glue) ;
@@ -2392,10 +2380,10 @@ fn copy_val_no_check(cx: &@block_ctxt, action: copy_action, dst: ValueRef,
2392
2380
ret cx;
2393
2381
} else if ty:: type_is_boxed ( ccx. tcx , t) {
2394
2382
let bcx = if action == DROP_EXISTING {
2395
- drop_ty ( cx, bld :: Load ( cx , dst) , t) . bcx
2383
+ drop_ty ( cx, dst, t) . bcx
2396
2384
} else { cx } ;
2397
- bcx = take_ty ( bcx, src, t) . bcx ;
2398
2385
bld:: Store ( bcx, src, dst) ;
2386
+ bcx = take_ty ( bcx, dst, t) . bcx ;
2399
2387
ret bcx;
2400
2388
} else if type_is_structural_or_param ( ccx. tcx , t) {
2401
2389
let bcx = if action == DROP_EXISTING {
@@ -2433,7 +2421,7 @@ fn move_val(cx: @block_ctxt, action: copy_action, dst: ValueRef,
2433
2421
ty:: type_is_boxed ( tcx, t) {
2434
2422
if src. is_mem { src_val = bld:: Load ( cx, src_val) ; }
2435
2423
if action == DROP_EXISTING {
2436
- cx = drop_ty ( cx, bld :: Load ( cx , dst) , t) . bcx ;
2424
+ cx = drop_ty ( cx, dst, t) . bcx ;
2437
2425
}
2438
2426
bld:: Store ( cx, src_val, dst) ;
2439
2427
if src. is_mem { ret zero_alloca ( cx, src. res . val , t) . bcx ; }
@@ -3963,9 +3951,12 @@ fn trans_arg_expr(cx: &@block_ctxt, arg: &ty::arg, lldestty0: TypeRef,
3963
3951
add_clean_temp ( bcx, val, e_ty) ;
3964
3952
} else {
3965
3953
if lv. is_mem {
3954
+ bcx = take_ty ( bcx, val, e_ty) . bcx ;
3966
3955
val = load_if_immediate ( bcx, val, e_ty) ;
3956
+ } else if is_ext_vec_plus {
3957
+ let spilled = do_spill ( bcx, val) ;
3958
+ bcx = take_ty ( bcx, spilled, e_ty) . bcx ;
3967
3959
}
3968
- bcx = take_ty ( bcx, val, e_ty) . bcx ;
3969
3960
add_clean_temp ( bcx, val, e_ty) ;
3970
3961
}
3971
3962
} else if type_is_immediate ( ccx, e_ty) && !lv. is_mem {
@@ -4481,11 +4472,6 @@ fn with_out_method(work: fn(&out_method) -> result, cx: @block_ctxt,
4481
4472
if ty:: type_is_nil ( ccx. tcx , tp) { ret work ( return ) ; }
4482
4473
let res_alloca = alloc_ty ( cx, tp) ;
4483
4474
cx = zero_alloca ( res_alloca. bcx , res_alloca. val , tp) . bcx ;
4484
- fn drop_hoisted_ty ( cx : & @block_ctxt , target : ValueRef , t : ty:: t ) ->
4485
- result {
4486
- let reg_val = load_if_immediate ( cx, target, t) ;
4487
- ret drop_ty( cx, reg_val, t) ;
4488
- }
4489
4475
let done = work ( save_in ( res_alloca. val ) ) ;
4490
4476
let loaded = load_if_immediate ( done. bcx , res_alloca. val , tp) ;
4491
4477
add_clean_temp ( cx, loaded, tp) ;
@@ -5274,7 +5260,7 @@ fn copy_args_to_allocas(fcx: @fn_ctxt, scope: @block_ctxt,
5274
5260
// Args that are locally assigned to need to do a local
5275
5261
// take/drop
5276
5262
if fcx. lcx . ccx . mut_map . contains_key ( aarg. id ) {
5277
- bcx = take_ty ( bcx, aval , arg_ty) . bcx ;
5263
+ bcx = take_ty ( bcx, addr , arg_ty) . bcx ;
5278
5264
add_clean ( scope, addr, arg_ty) ;
5279
5265
}
5280
5266
}
0 commit comments