@@ -40,32 +40,39 @@ typedef struct {
40
40
struct Dict * join_point_values ;
41
41
} ScopeBuildContext ;
42
42
43
- CFNode * scope_lookup (Scope * scope , const Node * block ) {
44
- CFNode * * found = find_value_dict (const Node * , CFNode * , scope -> map , block );
43
+ CFNode * scope_lookup (Scope * scope , const Node * abs ) {
44
+ CFNode * * found = find_value_dict (const Node * , CFNode * , scope -> map , abs );
45
45
if (found ) {
46
- assert ((* found )-> node );
47
- return * found ;
46
+ CFNode * cfnode = * found ;
47
+ assert (cfnode -> node );
48
+ assert (cfnode -> node == abs );
49
+ return cfnode ;
48
50
}
49
51
assert (false);
50
52
return NULL ;
51
53
}
52
54
53
- static CFNode * get_or_enqueue (ScopeBuildContext * ctx , const Node * abs ) {
54
- assert (is_abstraction (abs ));
55
- assert (!is_function (abs ) || abs == ctx -> entry );
56
- CFNode * * found = find_value_dict (const Node * , CFNode * , ctx -> nodes , abs );
57
- if (found ) return * found ;
58
-
59
- CFNode * new = arena_alloc (ctx -> arena , sizeof (CFNode ));
55
+ static CFNode * new_cfnode (Arena * a ) {
56
+ CFNode * new = arena_alloc (a , sizeof (CFNode ));
60
57
* new = (CFNode ) {
61
- .node = abs ,
62
58
.succ_edges = new_list (CFEdge ),
63
59
.pred_edges = new_list (CFEdge ),
64
60
.rpo_index = SIZE_MAX ,
65
61
.idom = NULL ,
66
62
.dominates = NULL ,
67
63
.structurally_dominates = new_set (const Node * , (HashFn ) hash_node , (CmpFn ) compare_node ),
68
64
};
65
+ return new ;
66
+ }
67
+
68
+ static CFNode * get_or_enqueue (ScopeBuildContext * ctx , const Node * abs ) {
69
+ assert (is_abstraction (abs ));
70
+ assert (!is_function (abs ) || abs == ctx -> entry );
71
+ CFNode * * found = find_value_dict (const Node * , CFNode * , ctx -> nodes , abs );
72
+ if (found ) return * found ;
73
+
74
+ CFNode * new = new_cfnode (ctx -> arena );
75
+ new -> node = abs ;
69
76
assert (abs && new -> node );
70
77
insert_dict (const Node * , CFNode * , ctx -> nodes , abs , new );
71
78
append_list (Node * , ctx -> queue , new );
@@ -101,8 +108,9 @@ static void add_edge(ScopeBuildContext* ctx, const Node* src, const Node* dst, C
101
108
assert (is_structural_edge (type ) == (bool ) is_case (dst ));
102
109
if (ctx -> lt && !in_loop (ctx -> lt , ctx -> entry , dst ))
103
110
return ;
104
- if (ctx -> lt && dst == ctx -> entry )
111
+ if (ctx -> lt && dst == ctx -> entry ) {
105
112
return ;
113
+ }
106
114
107
115
CFNode * src_node = get_or_enqueue (ctx , src );
108
116
CFNode * dst_node = get_or_enqueue (ctx , dst );
@@ -200,7 +208,9 @@ static void process_cf_node(ScopeBuildContext* ctx, CFNode* node) {
200
208
case MergeBreak_TAG : {
201
209
break ; // TODO i guess
202
210
}
203
- case TailCall_TAG :
211
+ case TailCall_TAG : {
212
+
213
+ }
204
214
case Return_TAG :
205
215
case Unreachable_TAG : break ;
206
216
case NotATerminator : if (terminator -> arena -> config .check_types ) { error ("Grammar problem" ); } break ;
@@ -214,7 +224,7 @@ static void flip_scope(Scope* scope) {
214
224
scope -> entry = NULL ;
215
225
216
226
for (size_t i = 0 ; i < scope -> size ; i ++ ) {
217
- CFNode * cur = read_list (CFNode * , scope -> contents )[i ];
227
+ CFNode * cur = read_list (CFNode * , scope -> contents )[i ];
218
228
219
229
struct List * tmp = cur -> succ_edges ;
220
230
cur -> succ_edges = cur -> pred_edges ;
@@ -223,32 +233,23 @@ static void flip_scope(Scope* scope) {
223
233
for (size_t j = 0 ; j < entries_count_list (cur -> succ_edges ); j ++ ) {
224
234
CFEdge * edge = & read_list (CFEdge , cur -> succ_edges )[j ];
225
235
226
- CFNode * tmp = edge -> dst ;
236
+ CFNode * tmp2 = edge -> dst ;
227
237
edge -> dst = edge -> src ;
228
- edge -> src = tmp ;
238
+ edge -> src = tmp2 ;
229
239
}
230
240
231
241
for (size_t j = 0 ; j < entries_count_list (cur -> pred_edges ); j ++ ) {
232
242
CFEdge * edge = & read_list (CFEdge , cur -> pred_edges )[j ];
233
243
234
- CFNode * tmp = edge -> dst ;
244
+ CFNode * tmp2 = edge -> dst ;
235
245
edge -> dst = edge -> src ;
236
- edge -> src = tmp ;
246
+ edge -> src = tmp2 ;
237
247
}
238
248
239
249
if (entries_count_list (cur -> pred_edges ) == 0 ) {
240
250
if (scope -> entry != NULL ) {
241
251
if (scope -> entry -> node ) {
242
- CFNode * new_entry = arena_alloc (scope -> arena , sizeof (CFNode ));
243
- * new_entry = (CFNode ) {
244
- .node = NULL ,
245
- .succ_edges = new_list (CFEdge ),
246
- .pred_edges = new_list (CFEdge ),
247
- .rpo_index = SIZE_MAX ,
248
- .idom = NULL ,
249
- .dominates = NULL ,
250
- };
251
-
252
+ CFNode * new_entry = new_cfnode (scope -> arena );
252
253
CFEdge prev_entry_edge = {
253
254
.type = JumpEdge ,
254
255
.src = new_entry ,
@@ -272,6 +273,7 @@ static void flip_scope(Scope* scope) {
272
273
}
273
274
}
274
275
276
+ assert (scope -> entry );
275
277
if (!scope -> entry -> node ) {
276
278
scope -> size += 1 ;
277
279
append_list (Node * , scope -> contents , scope -> entry );
@@ -396,7 +398,7 @@ static size_t post_order_visit(Scope* scope, CFNode* n, size_t i) {
396
398
397
399
void compute_rpo (Scope * scope ) {
398
400
scope -> rpo = malloc (sizeof (const CFNode * ) * scope -> size );
399
- size_t index = post_order_visit (scope , scope -> entry , scope -> size );
401
+ size_t index = post_order_visit (scope , scope -> entry , scope -> size );
400
402
assert (index == 0 );
401
403
402
404
// debug_print("RPO: ");
@@ -422,9 +424,9 @@ void compute_domtree(Scope* scope) {
422
424
continue ;
423
425
for (size_t j = 0 ; j < entries_count_list (n -> pred_edges ); j ++ ) {
424
426
CFEdge e = read_list (CFEdge , n -> pred_edges )[j ];
425
- CFNode * p = e .src ;
426
- if (p -> rpo_index < n -> rpo_index ) {
427
- n -> idom = p ;
427
+ CFNode * pred = e .src ;
428
+ if (pred -> rpo_index < n -> rpo_index ) {
429
+ n -> idom = pred ;
428
430
goto outer_loop ;
429
431
}
430
432
}
@@ -464,37 +466,3 @@ void compute_domtree(Scope* scope) {
464
466
append_list (CFNode * , n -> idom -> dominates , n );
465
467
}
466
468
}
467
-
468
- /**
469
- * @param node: Start node.
470
- * @param target: List to extend. @ref List of @ref CFNode*
471
- */
472
- static void get_undominated_children (const CFNode * node , struct List * target ) {
473
- for (size_t i = 0 ; i < entries_count_list (node -> succ_edges ); i ++ ) {
474
- CFEdge edge = read_list (CFEdge , node -> succ_edges )[i ];
475
-
476
- bool contained = false;
477
- for (size_t j = 0 ; j < entries_count_list (node -> dominates ); j ++ ) {
478
- CFNode * dominated = read_list (CFNode * , node -> dominates )[j ];
479
- if (edge .dst == dominated ) {
480
- contained = true;
481
- break ;
482
- }
483
- }
484
- if (!contained )
485
- append_list (CFNode * , target , edge .dst );
486
- }
487
- }
488
-
489
- //TODO: this function can produce duplicates.
490
- struct List * scope_get_dom_frontier (Scope * scope , const CFNode * node ) {
491
- struct List * dom_frontier = new_list (CFNode * );
492
-
493
- get_undominated_children (node , dom_frontier );
494
- for (size_t i = 0 ; i < entries_count_list (node -> dominates ); i ++ ) {
495
- CFNode * dom = read_list (CFNode * , node -> dominates )[i ];
496
- get_undominated_children (dom , dom_frontier );
497
- }
498
-
499
- return dom_frontier ;
500
- }
0 commit comments