Skip to content

Commit 08d4c44

Browse files
committed
l2s: process basic blocks more reliably even with phis
1 parent cf90520 commit 08d4c44

File tree

1 file changed

+53
-5
lines changed

1 file changed

+53
-5
lines changed

src/frontends/llvm/l2s.c

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,23 @@ static const Node* write_bb_tail(Parser* p, Node* fn_or_bb, BodyBuilder* b, LLVM
5656
assert(false);
5757
}
5858

59+
typedef struct {
60+
LLVMBasicBlockRef bb;
61+
LLVMValueRef instr;
62+
Node* nbb;
63+
} TodoBB;
64+
5965
const Node* convert_basic_block(Parser* p, Node* fn, LLVMBasicBlockRef bb) {
6066
const Node** found = find_value_dict(LLVMValueRef, const Node*, p->map, bb);
6167
if (found) return *found;
68+
assert(false);
69+
}
70+
71+
static TodoBB prepare_bb(Parser* p, Node* fn, LLVMBasicBlockRef bb) {
6272
IrArena* a = get_module_arena(p->dst);
73+
debug_print("l2s: converting BB %s %d\n", LLVMGetBasicBlockName(bb), bb);
74+
if (get_log_level() <= DEBUG)
75+
LLVMDumpValue(bb);
6376

6477
struct List* phis = new_list(LLVMValueRef);
6578
Nodes params = empty(a);
@@ -85,9 +98,14 @@ const Node* convert_basic_block(Parser* p, Node* fn, LLVMBasicBlockRef bb) {
8598
Node* nbb = basic_block(a, fn, params, name);
8699
insert_dict(LLVMValueRef, const Node*, p->map, bb, nbb);
87100
insert_dict(const Node*, struct List*, p->phis, nbb, phis);
88-
BodyBuilder* b = begin_body(a);
89-
nbb->payload.basic_block.body = write_bb_tail(p, nbb, b, bb, instr);
90-
return nbb;
101+
TodoBB todo = {
102+
.bb = bb,
103+
.instr = instr,
104+
.nbb = nbb,
105+
};
106+
//append_list(TodoBB, p->todo_bbs, todo);
107+
//return nbb;
108+
return todo;
91109
}
92110
}
93111

@@ -107,12 +125,14 @@ const Node* convert_function(Parser* p, LLVMValueRef fn) {
107125
debug_print("Converting function: %s\n", LLVMGetValueName(fn));
108126

109127
Nodes params = empty(a);
110-
for (LLVMValueRef oparam = LLVMGetFirstParam(fn); oparam && oparam <= LLVMGetLastParam(fn); oparam = LLVMGetNextParam(oparam)) {
128+
for (LLVMValueRef oparam = LLVMGetFirstParam(fn); oparam; oparam = LLVMGetNextParam(oparam)) {
111129
LLVMTypeRef ot = LLVMTypeOf(oparam);
112130
const Type* t = convert_type(p, ot);
113131
const Node* param = var(a, t, LLVMGetValueName(oparam));
114132
insert_dict(LLVMValueRef, const Node*, p->map, oparam, param);
115133
params = append_nodes(a, params, param);
134+
if (oparam == LLVMGetLastParam(fn))
135+
break;
116136
}
117137
const Type* fn_type = convert_type(p, LLVMGlobalGetValueType(fn));
118138
assert(fn_type->tag == FnType_TAG);
@@ -131,11 +151,39 @@ const Node* convert_function(Parser* p, LLVMValueRef fn) {
131151
const Node* r = fn_addr_helper(a, f);
132152
insert_dict(LLVMValueRef, const Node*, p->map, fn, r);
133153

134-
if (LLVMCountBasicBlocks(fn) > 0) {
154+
/*if (LLVMCountBasicBlocks(fn) > 0) {
135155
LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock(fn);
136156
BodyBuilder* b = begin_body(a);
137157
insert_dict(LLVMValueRef, const Node*, p->map, first_bb, f);
138158
f->payload.fun.body = write_bb_tail(p, f, b, first_bb, LLVMGetFirstInstruction(first_bb));
159+
}*/
160+
161+
if (LLVMCountBasicBlocks(fn) > 0) {
162+
struct List* todo_bbs = new_list(TodoBB);
163+
164+
for (LLVMBasicBlockRef bb = LLVMGetEntryBasicBlock(fn); bb; bb = LLVMGetNextBasicBlock(bb)) {
165+
if (bb == LLVMGetEntryBasicBlock(fn)) {
166+
LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock(fn);
167+
insert_dict(LLVMValueRef, const Node*, p->map, first_bb, f);
168+
} else {
169+
TodoBB todo = prepare_bb(p, f, bb);
170+
append_list(TodoBB, todo_bbs, todo);
171+
}
172+
if (bb == LLVMGetLastBasicBlock(fn))
173+
break;
174+
}
175+
176+
LLVMBasicBlockRef first_bb = LLVMGetEntryBasicBlock(fn);
177+
BodyBuilder* entry_bb = begin_body(a);
178+
f->payload.fun.body = write_bb_tail(p, f, entry_bb, first_bb, LLVMGetFirstInstruction(first_bb));
179+
180+
for (size_t i = 0; i < entries_count_list(todo_bbs); i++) {
181+
TodoBB todo = read_list(TodoBB, todo_bbs)[i];
182+
BodyBuilder* bb = begin_body(a);
183+
todo.nbb->payload.basic_block.body = write_bb_tail(p, todo.nbb, bb, todo.bb, todo.instr);
184+
}
185+
186+
destroy_list(todo_bbs);
139187
}
140188

141189
return r;

0 commit comments

Comments
 (0)