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