Skip to content

Commit 6ba42f1

Browse files
committed
scope analysis: cleanup
1 parent dab0627 commit 6ba42f1

File tree

2 files changed

+36
-68
lines changed

2 files changed

+36
-68
lines changed

src/shady/analysis/scope.c

Lines changed: 35 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -40,32 +40,39 @@ typedef struct {
4040
struct Dict* join_point_values;
4141
} ScopeBuildContext;
4242

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);
4545
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;
4850
}
4951
assert(false);
5052
return NULL;
5153
}
5254

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));
6057
*new = (CFNode) {
61-
.node = abs,
6258
.succ_edges = new_list(CFEdge),
6359
.pred_edges = new_list(CFEdge),
6460
.rpo_index = SIZE_MAX,
6561
.idom = NULL,
6662
.dominates = NULL,
6763
.structurally_dominates = new_set(const Node*, (HashFn) hash_node, (CmpFn) compare_node),
6864
};
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;
6976
assert(abs && new->node);
7077
insert_dict(const Node*, CFNode*, ctx->nodes, abs, new);
7178
append_list(Node*, ctx->queue, new);
@@ -101,8 +108,9 @@ static void add_edge(ScopeBuildContext* ctx, const Node* src, const Node* dst, C
101108
assert(is_structural_edge(type) == (bool) is_case(dst));
102109
if (ctx->lt && !in_loop(ctx->lt, ctx->entry, dst))
103110
return;
104-
if (ctx->lt && dst == ctx->entry)
111+
if (ctx->lt && dst == ctx->entry) {
105112
return;
113+
}
106114

107115
CFNode* src_node = get_or_enqueue(ctx, src);
108116
CFNode* dst_node = get_or_enqueue(ctx, dst);
@@ -200,7 +208,9 @@ static void process_cf_node(ScopeBuildContext* ctx, CFNode* node) {
200208
case MergeBreak_TAG: {
201209
break; // TODO i guess
202210
}
203-
case TailCall_TAG:
211+
case TailCall_TAG: {
212+
213+
}
204214
case Return_TAG:
205215
case Unreachable_TAG: break;
206216
case NotATerminator: if (terminator->arena->config.check_types) { error("Grammar problem"); } break;
@@ -214,7 +224,7 @@ static void flip_scope(Scope* scope) {
214224
scope->entry = NULL;
215225

216226
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];
218228

219229
struct List* tmp = cur->succ_edges;
220230
cur->succ_edges = cur->pred_edges;
@@ -223,32 +233,23 @@ static void flip_scope(Scope* scope) {
223233
for (size_t j = 0; j < entries_count_list(cur->succ_edges); j++) {
224234
CFEdge* edge = &read_list(CFEdge, cur->succ_edges)[j];
225235

226-
CFNode* tmp = edge->dst;
236+
CFNode* tmp2 = edge->dst;
227237
edge->dst = edge->src;
228-
edge->src = tmp;
238+
edge->src = tmp2;
229239
}
230240

231241
for (size_t j = 0; j < entries_count_list(cur->pred_edges); j++) {
232242
CFEdge* edge = &read_list(CFEdge, cur->pred_edges)[j];
233243

234-
CFNode* tmp = edge->dst;
244+
CFNode* tmp2 = edge->dst;
235245
edge->dst = edge->src;
236-
edge->src = tmp;
246+
edge->src = tmp2;
237247
}
238248

239249
if (entries_count_list(cur->pred_edges) == 0) {
240250
if (scope->entry != NULL) {
241251
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);
252253
CFEdge prev_entry_edge = {
253254
.type = JumpEdge,
254255
.src = new_entry,
@@ -272,6 +273,7 @@ static void flip_scope(Scope* scope) {
272273
}
273274
}
274275

276+
assert(scope->entry);
275277
if (!scope->entry->node) {
276278
scope->size += 1;
277279
append_list(Node*, scope->contents, scope->entry);
@@ -396,7 +398,7 @@ static size_t post_order_visit(Scope* scope, CFNode* n, size_t i) {
396398

397399
void compute_rpo(Scope* scope) {
398400
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);
400402
assert(index == 0);
401403

402404
// debug_print("RPO: ");
@@ -422,9 +424,9 @@ void compute_domtree(Scope* scope) {
422424
continue;
423425
for (size_t j = 0; j < entries_count_list(n->pred_edges); j++) {
424426
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;
428430
goto outer_loop;
429431
}
430432
}
@@ -464,37 +466,3 @@ void compute_domtree(Scope* scope) {
464466
append_list(CFNode*, n->idom->dominates, n);
465467
}
466468
}
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-
}

src/shady/analysis/scope.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ Scope* new_scope_lt_impl(const Node* entry, LoopTree* lt, bool flipped);
9999
*/
100100
#define new_scope_flipped(node) new_scope_impl(node, NULL, true);
101101

102-
CFNode* scope_lookup(Scope*, const Node* block);
102+
CFNode* scope_lookup(Scope*, const Node* abs);
103103
void compute_rpo(Scope*);
104104
void compute_domtree(Scope*);
105105

0 commit comments

Comments
 (0)