@@ -57,7 +57,6 @@ import capture::{cap_move, cap_drop, cap_copy, cap_ref};
57
57
58
58
export check_crate;
59
59
export last_use_map;
60
- export spill_map;
61
60
62
61
// Maps from an expr id to a list of variable ids for which this expr
63
62
// is the last use. Typically, the expr is a path and the node id is
@@ -66,13 +65,6 @@ export spill_map;
66
65
// list of closed over variables that can be moved into the closure.
67
66
type last_use_map = hashmap < node_id , @dvec < node_id > > ;
68
67
69
- // A set of variable ids which must be spilled (stored on the stack).
70
- // We add in any variables or arguments where:
71
- // (1) the variables are moved;
72
- // (2) the address of the variable/argument is taken;
73
- // or (3) we find a last use (as they may be moved).
74
- type spill_map = hashmap < node_id , ( ) > ;
75
-
76
68
enum variable = uint;
77
69
enum live_node = uint;
78
70
@@ -85,7 +77,7 @@ enum live_node_kind {
85
77
86
78
fn check_crate ( tcx : ty:: ctxt ,
87
79
method_map : typeck:: method_map ,
88
- crate : @crate ) -> ( last_use_map , spill_map ) {
80
+ crate : @crate ) -> last_use_map {
89
81
let visitor = visit:: mk_vt ( @{
90
82
visit_fn: visit_fn,
91
83
visit_local: visit_local,
@@ -94,12 +86,11 @@ fn check_crate(tcx: ty::ctxt,
94
86
} ) ;
95
87
96
88
let last_use_map = int_hash ( ) ;
97
- let spill_map = int_hash ( ) ;
98
89
let initial_maps = @ir_maps ( tcx, method_map,
99
- last_use_map, spill_map ) ;
90
+ last_use_map) ;
100
91
visit:: visit_crate ( * crate , initial_maps, visitor) ;
101
92
tcx. sess . abort_if_errors ( ) ;
102
- ret ( last_use_map, spill_map ) ;
93
+ ret last_use_map;
103
94
}
104
95
105
96
impl of to_str:: to_str for live_node {
@@ -162,7 +153,6 @@ class ir_maps {
162
153
let tcx: ty:: ctxt;
163
154
let method_map: typeck:: method_map ;
164
155
let last_use_map: last_use_map ;
165
- let spill_map: spill_map ;
166
156
167
157
let mut num_live_nodes: uint ;
168
158
let mut num_vars: uint ;
@@ -174,11 +164,10 @@ class ir_maps {
174
164
let mut lnks: [ live_node_kind ] ;
175
165
176
166
new ( tcx: ty:: ctxt, method_map: typeck:: method_map,
177
- last_use_map: last_use_map, spill_map : spill_map ) {
167
+ last_use_map: last_use_map) {
178
168
self . tcx = tcx;
179
169
self . method_map = method_map;
180
170
self . last_use_map = last_use_map;
181
- self . spill_map = spill_map;
182
171
183
172
self . num_live_nodes = 0 u;
184
173
self . num_vars = 0 u;
@@ -264,17 +253,6 @@ class ir_maps {
264
253
self . lnks [ * ln]
265
254
}
266
255
267
- fn add_spill ( var : variable ) {
268
- let vk = self . var_kinds [ * var] ;
269
- alt vk {
270
- vk_local( id, _) | vk_arg ( id, _, by_val) {
271
- #debug[ "adding spill for %?" , vk] ;
272
- self . spill_map . insert ( id, ( ) ) ;
273
- }
274
- vk_arg ( * ) | vk_field ( _) | vk_self | vk_implicit_ret { }
275
- }
276
- }
277
-
278
256
fn add_last_use ( expr_id : node_id , var : variable ) {
279
257
let vk = self . var_kinds [ * var] ;
280
258
#debug[ "Node %d is a last use of variable %?" , expr_id, vk] ;
@@ -308,7 +286,7 @@ fn visit_fn(fk: visit::fn_kind, decl: fn_decl, body: blk,
308
286
309
287
// swap in a new set of IR maps for this function body:
310
288
let fn_maps = @ir_maps ( self . tcx , self . method_map ,
311
- self . last_use_map , self . spill_map ) ;
289
+ self . last_use_map ) ;
312
290
313
291
#debug[ "creating fn_maps: %x" , ptr:: addr_of ( * fn_maps) as uint ] ;
314
292
@@ -1407,11 +1385,7 @@ fn check_expr(expr: @expr, &&self: @liveness, vt: vt<@liveness>) {
1407
1385
vt. visit_expr( f, self , vt) ;
1408
1386
vec:: iter2( args, targs) { |arg_expr, arg_ty|
1409
1387
alt ty:: resolved_mode( self . tcx, arg_ty. mode) {
1410
- by_val | by_copy {
1411
- vt. visit_expr( arg_expr, self, vt) ;
1412
- }
1413
- by_ref | by_mutbl_ref {
1414
- self. spill_expr( arg_expr) ;
1388
+ by_val | by_copy | by_ref | by_mutbl_ref {
1415
1389
vt. visit_expr( arg_expr, self, vt) ;
1416
1390
}
1417
1391
by_move {
@@ -1421,10 +1395,6 @@ fn check_expr(expr: @expr, &&self: @liveness, vt: vt<@liveness>) {
1421
1395
}
1422
1396
}
1423
1397
1424
- expr_addr_of( _, arg_expr) {
1425
- self . spill_expr( arg_expr) ;
1426
- }
1427
-
1428
1398
// no correctness conditions related to liveness
1429
1399
expr_if_check( * ) | expr_if( * ) | expr_alt( * ) |
1430
1400
expr_while( * ) | expr_loop( * ) |
@@ -1434,7 +1404,7 @@ fn check_expr(expr: @expr, &&self: @liveness, vt: vt<@liveness>) {
1434
1404
expr_assert( * ) | expr_check( * ) | expr_copy( * ) |
1435
1405
expr_loop_body( * ) | expr_cast( * ) | expr_unary( * ) | expr_fail( * ) |
1436
1406
expr_ret( * ) | expr_break | expr_cont | expr_lit( _) |
1437
- expr_block( * ) | expr_swap( * ) | expr_mac( * ) {
1407
+ expr_block( * ) | expr_swap( * ) | expr_mac( * ) | expr_addr_of ( * ) {
1438
1408
visit:: visit_expr( expr, self , vt) ;
1439
1409
}
1440
1410
}
@@ -1501,10 +1471,7 @@ impl check_methods for @liveness {
1501
1471
ln. to_str( ) , var. to_str( ) ] ;
1502
1472
1503
1473
alt ( * self ) . live_on_exit( ln, var) {
1504
- none {
1505
- // update spill map to include this variable, as it is moved:
1506
- ( * self . ir) . add_spill( var) ;
1507
- }
1474
+ none { }
1508
1475
some( lnk) {
1509
1476
self . report_illegal_move( span, lnk, var) ;
1510
1477
}
@@ -1516,20 +1483,10 @@ impl check_methods for @liveness {
1516
1483
some( _) { }
1517
1484
none {
1518
1485
( * self . ir) . add_last_use( expr. id, var) ;
1519
-
1520
- // update spill map to include this variable, as it may be moved:
1521
- ( * self . ir) . add_spill( var) ;
1522
1486
}
1523
1487
}
1524
1488
}
1525
1489
1526
- fn spill_expr( expr: @expr) {
1527
- alt ( * self ) . variable_from_path( expr) {
1528
- some( var) { ( * self . ir) . add_spill( var) }
1529
- none { }
1530
- }
1531
- }
1532
-
1533
1490
fn check_move_from_expr( expr: @expr, vt: vt < @liveness > ) {
1534
1491
#debug[ "check_move_from_expr(node %d: %s)" ,
1535
1492
expr. id, expr_to_str( expr) ] ;
@@ -1775,4 +1732,4 @@ impl check_methods for @liveness {
1775
1732
}
1776
1733
}
1777
1734
}
1778
- }
1735
+ }
0 commit comments