@@ -2112,6 +2112,7 @@ fn move_val(cx: @block_ctxt, action: copy_action, dst: ValueRef,
2112
2112
ty_to_str ( tcx, t) ) ;
2113
2113
}
2114
2114
2115
+ // FIXME[DPS] rename to store_temp_expr
2115
2116
fn move_val_if_temp ( cx : @block_ctxt , action : copy_action , dst : ValueRef ,
2116
2117
src : lval_result , t : ty:: t ) -> @block_ctxt {
2117
2118
// Lvals in memory are not temporaries. Copy them.
@@ -2213,7 +2214,7 @@ fn trans_unary(bcx: @block_ctxt, op: ast::unop, e: @ast::expr,
2213
2214
let llety = T_ptr ( type_of ( ccx, e_sp, e_ty) ) ;
2214
2215
body = PointerCast ( bcx, body, llety) ;
2215
2216
}
2216
- bcx = trans_expr_save_in ( bcx, e, body, INIT ) ;
2217
+ bcx = trans_expr_save_in ( bcx, e, body) ;
2217
2218
revoke_clean ( bcx, box) ;
2218
2219
ret store_in_dest ( bcx, box, dest) ;
2219
2220
}
@@ -2255,8 +2256,7 @@ fn trans_expr_fn(bcx: @block_ctxt, f: ast::_fn, sp: span,
2255
2256
trans_closure ( sub_cx, sp, f, llfn, none, [ ] , id, { |_fcx|} ) ;
2256
2257
}
2257
2258
} ;
2258
- let { bcx, val: addr } = get_dest_addr ( bcx, dest) ;
2259
- fill_fn_pair ( bcx, addr, llfn, env) ;
2259
+ fill_fn_pair ( bcx, get_dest_addr ( dest) , llfn, env) ;
2260
2260
ret bcx;
2261
2261
}
2262
2262
@@ -2357,19 +2357,18 @@ fn trans_assign_op(bcx: @block_ctxt, op: ast::binop, dst: @ast::expr,
2357
2357
}
2358
2358
_ { }
2359
2359
}
2360
- let rhs_res = trans_expr ( lhs_res. bcx , src) ;
2360
+ let { bcx , val : rhs_val } = trans_expr ( lhs_res. bcx , src) ;
2361
2361
if ty:: type_is_sequence ( tcx, t) {
2362
2362
alt op {
2363
2363
ast : : add. {
2364
- ret tvec:: trans_append ( rhs_res. bcx , t, lhs_res. val ,
2365
- rhs_res. val ) ;
2364
+ ret tvec:: trans_append ( bcx, t, lhs_res. val , rhs_val) ;
2366
2365
}
2367
2366
_ { }
2368
2367
}
2369
2368
}
2370
- let lhs_val = load_if_immediate ( rhs_res . bcx , lhs_res . val , t ) ;
2371
- ret trans_eager_binop ( rhs_res . bcx , op, lhs_val , t, rhs_res . val , t,
2372
- overwrite ( lhs_res. val , t ) ) ;
2369
+
2370
+ ret trans_eager_binop( bcx, op, Load ( bcx , lhs_res . val ) , t, rhs_val , t,
2371
+ save_in ( lhs_res. val ) ) ;
2373
2372
}
2374
2373
2375
2374
fn autoderef ( cx : @block_ctxt , v : ValueRef , t : ty:: t ) -> result_t {
@@ -2485,7 +2484,6 @@ tag dest {
2485
2484
by_val( @mutable ValueRef ) ;
2486
2485
by_ref ( @mutable ValueRef ) ;
2487
2486
save_in ( ValueRef ) ;
2488
- overwrite ( ValueRef , ty:: t) ;
2489
2487
ignore;
2490
2488
}
2491
2489
@@ -2538,19 +2536,12 @@ fn store_in_dest(bcx: @block_ctxt, val: ValueRef, dest: dest) -> @block_ctxt {
2538
2536
ignore. { }
2539
2537
by_val ( cell) { * cell = val; }
2540
2538
save_in ( addr) { Store ( bcx, val, addr) ; }
2541
- overwrite ( addr, tp) {
2542
- bcx = drop_ty ( bcx, addr, tp) ;
2543
- Store ( bcx, val, addr) ;
2544
- }
2545
2539
}
2546
2540
ret bcx;
2547
2541
}
2548
2542
2549
- fn get_dest_addr ( bcx : @block_ctxt , dest : dest ) -> result {
2550
- alt dest {
2551
- save_in( a) { rslt ( bcx, a) }
2552
- overwrite ( a, t) { rslt ( drop_ty ( bcx, a, t) , a) }
2553
- }
2543
+ fn get_dest_addr ( dest : dest ) -> ValueRef {
2544
+ alt dest { save_in( a) { a } }
2554
2545
}
2555
2546
2556
2547
// Wrapper through which legacy non-DPS code can use DPS functions
@@ -2733,7 +2724,7 @@ fn build_environment(bcx: @block_ctxt, lltydescs: [ValueRef],
2733
2724
bcx = bound. bcx ;
2734
2725
alt bv {
2735
2726
env_expr( e) {
2736
- bcx = trans_expr_save_in ( bcx, e, bound. val , INIT ) ;
2727
+ bcx = trans_expr_save_in ( bcx, e, bound. val ) ;
2737
2728
add_clean_temp_mem ( bcx, bound. val , bound_tys[ i] ) ;
2738
2729
temp_cleanups += [ bound. val ] ;
2739
2730
}
@@ -3698,8 +3689,7 @@ fn trans_bind_1(cx: @block_ctxt, outgoing_fty: ty::t,
3698
3689
let lv = lval_maybe_callee_to_lval ( f_res, pair_ty) ;
3699
3690
bcx = lv. bcx ;
3700
3691
// FIXME[DPS] factor this out
3701
- let { bcx, val: addr } = get_dest_addr ( bcx, dest) ;
3702
- ret memmove_ty( bcx, addr, lv. val , pair_ty) ;
3692
+ ret memmove_ty( bcx, get_dest_addr ( dest) , lv. val , pair_ty) ;
3703
3693
}
3704
3694
let closure = alt f_res. env {
3705
3695
null_env. { none }
@@ -3736,8 +3726,7 @@ fn trans_bind_1(cx: @block_ctxt, outgoing_fty: ty::t,
3736
3726
closure. ptrty , ty_param_count, target_res) ;
3737
3727
3738
3728
// Fill the function pair
3739
- let { bcx, val: addr } = get_dest_addr ( bcx, dest) ;
3740
- fill_fn_pair ( bcx, addr, llthunk. val , closure. ptr ) ;
3729
+ fill_fn_pair ( bcx, get_dest_addr ( dest) , llthunk. val , closure. ptr ) ;
3741
3730
ret bcx;
3742
3731
}
3743
3732
@@ -3845,7 +3834,7 @@ fn trans_args(cx: @block_ctxt, outer_cx: @block_ctxt, llenv: ValueRef,
3845
3834
} else { alloca ( cx, llretty) }
3846
3835
}
3847
3836
save_in ( dst) { dst }
3848
- overwrite ( _ , _ ) | by_val ( _) { alloca ( cx, llretty) }
3837
+ by_val ( _) { alloca ( cx, llretty) }
3849
3838
by_ref ( _) { dest_ref = true ; alloca ( cx, T_ptr ( llretty) ) }
3850
3839
} ;
3851
3840
// FIXME[DSP] does this always hold?
@@ -3970,10 +3959,6 @@ fn trans_call(in_cx: @block_ctxt, f: @ast::expr,
3970
3959
}
3971
3960
}
3972
3961
save_in ( _) { } // Already saved by callee
3973
- overwrite ( a, t) {
3974
- bcx = drop_ty ( bcx, a, t) ;
3975
- bcx = memmove_ty ( bcx, a, llretslot, ret_ty) ;
3976
- }
3977
3962
by_ref ( cell) | by_val ( cell) {
3978
3963
* cell = Load ( bcx, llretslot) ;
3979
3964
}
@@ -4167,55 +4152,38 @@ fn trans_landing_pad(bcx: @block_ctxt,
4167
4152
fn trans_tup ( bcx : @block_ctxt , elts : [ @ast:: expr ] , id : ast:: node_id ,
4168
4153
dest : dest ) -> @block_ctxt {
4169
4154
let t = node_id_type ( bcx. fcx . lcx . ccx , id) ;
4170
- let ( addr, overwrite ) = alt dest {
4155
+ let addr = alt dest {
4171
4156
ignore. {
4172
4157
for ex in elts { bcx = trans_expr_dps ( bcx, ex, ignore) ; }
4173
4158
ret bcx;
4174
4159
}
4175
- save_in ( pos) { ( pos, none) }
4176
- overwrite ( pos, _) {
4177
- let scratch = alloca ( bcx, llvm:: LLVMGetElementType ( val_ty ( pos) ) ) ;
4178
- ( scratch, some ( pos) )
4179
- }
4160
+ save_in ( pos) { pos }
4180
4161
} ;
4181
4162
let temp_cleanups = [ ] , i = 0 ;
4182
4163
for e in elts {
4183
4164
let dst = GEP_tup_like_1 ( bcx, t, addr, [ 0 , i] ) ;
4184
4165
let e_ty = ty:: expr_ty ( bcx_tcx ( bcx) , e) ;
4185
- bcx = trans_expr_save_in ( dst. bcx , e, dst. val , INIT ) ;
4166
+ bcx = trans_expr_save_in ( dst. bcx , e, dst. val ) ;
4186
4167
add_clean_temp_mem ( bcx, dst. val , e_ty) ;
4187
4168
temp_cleanups += [ dst. val ] ;
4188
4169
i += 1 ;
4189
4170
}
4190
4171
for cleanup in temp_cleanups { revoke_clean ( bcx, cleanup) ; }
4191
- alt overwrite {
4192
- some( pos) {
4193
- bcx = drop_ty ( bcx, pos, t) ;
4194
- bcx = memmove_ty ( bcx, pos, addr, t) ;
4195
- }
4196
- none. { }
4197
- }
4198
4172
ret bcx;
4199
4173
}
4200
4174
4201
4175
fn trans_rec ( bcx : @block_ctxt , fields : [ ast:: field ] ,
4202
4176
base : option:: t < @ast:: expr > , id : ast:: node_id ,
4203
4177
dest : dest ) -> @block_ctxt {
4204
4178
let t = node_id_type ( bcx_ccx ( bcx) , id) ;
4205
- let ( addr, overwrite ) = alt dest {
4179
+ let addr = alt dest {
4206
4180
ignore. {
4207
4181
for fld in fields {
4208
4182
bcx = trans_expr_dps ( bcx, fld. node . expr , ignore) ;
4209
4183
}
4210
4184
ret bcx;
4211
4185
}
4212
- save_in ( pos) { ( pos, none) }
4213
- // The expressions that populate the fields might still use the old
4214
- // record, so we build the new on in a scratch area
4215
- overwrite ( pos, _) {
4216
- let scratch = alloca ( bcx, llvm:: LLVMGetElementType ( val_ty ( pos) ) ) ;
4217
- ( scratch, some ( pos) )
4218
- }
4186
+ save_in ( pos) { pos }
4219
4187
} ;
4220
4188
4221
4189
let base_val = alt base {
@@ -4234,7 +4202,7 @@ fn trans_rec(bcx: @block_ctxt, fields: [ast::field],
4234
4202
bcx = dst. bcx ;
4235
4203
alt vec:: find ( { |f| str:: eq ( f. node . ident , tf. ident ) } , fields) {
4236
4204
some ( f) {
4237
- bcx = trans_expr_save_in ( bcx, f. node . expr , dst. val , INIT ) ;
4205
+ bcx = trans_expr_save_in ( bcx, f. node . expr , dst. val ) ;
4238
4206
}
4239
4207
none. {
4240
4208
let base = GEP_tup_like_1 ( bcx, t, base_val, [ 0 , i] ) ;
@@ -4249,13 +4217,6 @@ fn trans_rec(bcx: @block_ctxt, fields: [ast::field],
4249
4217
// Now revoke the cleanups as we pass responsibility for the data
4250
4218
// structure on to the caller
4251
4219
for cleanup in temp_cleanups { revoke_clean ( bcx, cleanup) ; }
4252
- alt overwrite {
4253
- some( pos) {
4254
- bcx = drop_ty ( bcx, pos, t) ;
4255
- bcx = memmove_ty ( bcx, pos, addr, t) ;
4256
- }
4257
- none. { }
4258
- }
4259
4220
ret bcx;
4260
4221
}
4261
4222
@@ -4274,19 +4235,37 @@ fn trans_expr(cx: @block_ctxt, e: @ast::expr) -> result {
4274
4235
}
4275
4236
}
4276
4237
4277
- fn trans_expr_save_in ( bcx : @block_ctxt , e : @ast:: expr , dest : ValueRef ,
4278
- kind : copy_action ) -> @block_ctxt {
4238
+ fn trans_expr_save_in ( bcx : @block_ctxt , e : @ast:: expr , dest : ValueRef )
4239
+ -> @block_ctxt {
4279
4240
let tcx = bcx_tcx ( bcx) , t = ty:: expr_ty ( tcx, e) ;
4280
4241
let dst = if ty:: type_is_bot ( tcx, t) || ty:: type_is_nil ( tcx, t) {
4281
4242
ignore
4282
- } else if kind == INIT {
4283
- save_in ( dest)
4284
- } else {
4285
- overwrite ( dest, t)
4286
- } ;
4243
+ } else { save_in ( dest) } ;
4287
4244
ret trans_expr_dps ( bcx, e, dst) ;
4288
4245
}
4289
4246
4247
+ fn trans_temp_expr ( bcx : @block_ctxt , e : @ast:: expr ) -> lval_result {
4248
+ if expr_is_lval ( bcx_tcx ( bcx) , e) {
4249
+ ret trans_lval ( bcx, e) ;
4250
+ } else {
4251
+ let tcx = bcx_tcx ( bcx) ;
4252
+ let ty = ty:: expr_ty ( tcx, e) ;
4253
+ if ty:: type_is_nil ( tcx, ty) || ty:: type_is_bot ( tcx, ty) {
4254
+ bcx = trans_expr_dps ( bcx, e, ignore) ;
4255
+ ret { bcx : bcx, val : C_nil ( ) , is_mem : false } ;
4256
+ } else if type_is_immediate ( bcx_ccx ( bcx) , ty) {
4257
+ let cell = empty_dest_cell ( ) ;
4258
+ bcx = trans_expr_dps ( bcx, e, by_val ( cell) ) ;
4259
+ ret { bcx : bcx, val : * cell, is_mem : false } ;
4260
+ } else {
4261
+ let { bcx, val: scratch } = alloc_ty ( bcx, ty) ;
4262
+ bcx = trans_expr_dps ( bcx, e, save_in ( scratch) ) ;
4263
+ ret { bcx : bcx, val : scratch, is_mem : false } ;
4264
+ }
4265
+ }
4266
+ }
4267
+
4268
+ // FIXME[DPS] supersede by trans_temp_expr, get rid of by_ref dests
4290
4269
fn trans_expr_by_ref ( bcx : @block_ctxt , e : @ast:: expr ) -> result {
4291
4270
let cell = empty_dest_cell ( ) ;
4292
4271
bcx = trans_expr_dps ( bcx, e, by_ref ( cell) ) ;
@@ -4430,22 +4409,20 @@ fn trans_expr_dps(bcx: @block_ctxt, e: @ast::expr, dest: dest)
4430
4409
}
4431
4410
ast:: expr_assign ( dst, src) {
4432
4411
assert dest == ignore;
4433
- let { bcx, val: lhs_addr , is_mem} = trans_lval ( bcx, dst) ;
4412
+ let src_r = trans_temp_expr ( bcx, src) ;
4413
+ let { bcx, val: addr , is_mem } = trans_lval ( src_r. bcx , dst) ;
4434
4414
assert is_mem;
4435
- ret trans_expr_save_in ( bcx, src, lhs_addr, DROP_EXISTING ) ;
4415
+ ret move_val_if_temp ( bcx, DROP_EXISTING , addr, src_r,
4416
+ ty:: expr_ty ( bcx_tcx ( bcx) , src) ) ;
4436
4417
}
4437
4418
ast:: expr_move ( dst, src) {
4419
+ // FIXME: calculate copy init-ness in typestate.
4438
4420
assert dest == ignore;
4439
- let { bcx, val: addr , is_mem } = trans_lval ( bcx, dst) ;
4421
+ let src_r = trans_temp_expr ( bcx, src) ;
4422
+ let { bcx, val: addr , is_mem } = trans_lval ( src_r. bcx , dst) ;
4440
4423
assert is_mem;
4441
- // FIXME: calculate copy init-ness in typestate.
4442
- if expr_is_lval ( tcx, src) {
4443
- ret trans_expr_save_in ( bcx, src, addr, DROP_EXISTING ) ;
4444
- } else {
4445
- let srclv = trans_lval ( bcx, src) ;
4446
- let t = ty:: expr_ty ( tcx, src) ;
4447
- ret move_val( srclv. bcx , DROP_EXISTING , addr, srclv, t) ;
4448
- }
4424
+ ret move_val( bcx, DROP_EXISTING , addr, src_r,
4425
+ ty:: expr_ty ( bcx_tcx ( bcx) , src) ) ;
4449
4426
}
4450
4427
ast:: expr_swap ( dst, src) {
4451
4428
assert dest == ignore;
@@ -4492,9 +4469,6 @@ fn lval_to_dps(bcx: @block_ctxt, e: @ast::expr, dest: dest) -> @block_ctxt {
4492
4469
* cell = val;
4493
4470
}
4494
4471
save_in ( loc) { bcx = move_val_if_temp ( bcx, INIT , loc, lv, ty) ; }
4495
- overwrite ( loc, _) {
4496
- bcx = move_val_if_temp ( bcx, DROP_EXISTING , loc, lv, ty) ;
4497
- }
4498
4472
ignore. { }
4499
4473
}
4500
4474
ret bcx;
@@ -4746,7 +4720,7 @@ fn trans_ret(bcx: @block_ctxt, e: option::t<@ast::expr>) -> @block_ctxt {
4746
4720
Store ( cx, val, bcx. fcx . llretptr ) ;
4747
4721
bcx = cx;
4748
4722
} else {
4749
- bcx = trans_expr_save_in ( bcx, x, bcx. fcx . llretptr , INIT ) ;
4723
+ bcx = trans_expr_save_in ( bcx, x, bcx. fcx . llretptr ) ;
4750
4724
}
4751
4725
}
4752
4726
_ { }
@@ -4784,7 +4758,7 @@ fn init_local(bcx: @block_ctxt, local: @ast::local) -> @block_ctxt {
4784
4758
some ( init) {
4785
4759
if init. op == ast:: init_assign ||
4786
4760
!expr_is_lval ( bcx_tcx ( bcx) , init. expr ) {
4787
- bcx = trans_expr_save_in ( bcx, init. expr , llptr, INIT ) ;
4761
+ bcx = trans_expr_save_in ( bcx, init. expr , llptr) ;
4788
4762
} else { // This is a move from an lval, must perform an actual move
4789
4763
let sub = trans_lval ( bcx, init. expr ) ;
4790
4764
bcx = move_val ( sub. bcx , INIT , llptr, sub, ty) ;
0 commit comments