Skip to content

Commit 74547ef

Browse files
committed
Compiler: exit loop early (experiment)
1 parent 54e46ff commit 74547ef

File tree

5 files changed

+2417
-2928
lines changed

5 files changed

+2417
-2928
lines changed

compiler/lib/structure.ml

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,24 @@ let build_graph blocks pc =
174174
(* Create an artificial frontier when for-loops are not longer necessary *)
175175
List.iter !loops ~f:(fun pc ->
176176
let pc_loop = pc in
177-
let set = compute_exit_loop pc_loop in
178-
let preds =
179-
Hashtbl.find preds pc_loop
180-
|> Addr.Set.filter (fun pred -> is_forward' block_order pred pc_loop)
177+
let l =
178+
compute_exit_loop pc_loop
179+
|> Addr.Set.elements
180+
|> List.sort ~cmp:(fun a b ->
181+
compare (Hashtbl.find block_order b) (Hashtbl.find block_order a))
181182
in
182-
Addr.Set.iter
183-
(fun pc_loop_anc ->
184-
Addr.Set.iter (fun exit_pc -> add_edge pc_loop_anc exit_pc) set)
185-
preds)
183+
match l with
184+
| [] -> ()
185+
| pc :: _ ->
186+
let set = Addr.Set.singleton pc in
187+
let preds =
188+
Hashtbl.find preds pc_loop
189+
|> Addr.Set.filter (fun pred -> is_forward' block_order pred pc_loop)
190+
in
191+
Addr.Set.iter
192+
(fun pc_loop_anc ->
193+
Addr.Set.iter (fun exit_pc -> add_edge pc_loop_anc exit_pc) set)
194+
preds)
186195
in
187196
{ succs; preds; reverse_post_order = !l; block_order }
188197

compiler/tests-compiler/gh1007.ml

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -219,20 +219,15 @@ let () = M.myfun M.x
219219
s2 = match$1[1];
220220
a:
221221
{
222-
b:
223-
{
224-
var l1 = s1, l2 = s2, accu = 0;
225-
for(;;){
226-
if(! l1) break;
227-
if(! l2) break b;
228-
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
229-
if(0 < caml_int_compare(h1, h2))
230-
var accu$0 = [0, h2, accu], l2 = t2, accu = accu$0;
231-
else
232-
var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1;
233-
}
234-
var _c_ = rev_append(l2, accu);
235-
break a;
222+
var l1 = s1, l2 = s2, accu = 0;
223+
for(;;){
224+
if(! l1){var _c_ = rev_append(l2, accu); break a;}
225+
if(! l2) break;
226+
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
227+
if(0 < caml_int_compare(h1, h2))
228+
var accu$0 = [0, h2, accu], l2 = t2, accu = accu$0;
229+
else
230+
var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1;
236231
}
237232
var _c_ = rev_append(l1, accu);
238233
}
@@ -297,20 +292,15 @@ let () = M.myfun M.x
297292
s2 = match$1[1];
298293
a:
299294
{
300-
b:
301-
{
302-
var l1 = s1, l2 = s2, accu = 0;
303-
for(;;){
304-
if(! l1) break;
305-
if(! l2) break b;
306-
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
307-
if(0 < caml_int_compare(h1, h2))
308-
var accu$0 = [0, h1, accu], l1 = t1, accu = accu$0;
309-
else
310-
var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1;
311-
}
312-
var _a_ = rev_append(l2, accu);
313-
break a;
295+
var l1 = s1, l2 = s2, accu = 0;
296+
for(;;){
297+
if(! l1){var _a_ = rev_append(l2, accu); break a;}
298+
if(! l2) break;
299+
var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1];
300+
if(0 < caml_int_compare(h1, h2))
301+
var accu$0 = [0, h1, accu], l1 = t1, accu = accu$0;
302+
else
303+
var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1;
314304
}
315305
var _a_ = rev_append(l1, accu);
316306
}

compiler/tests-compiler/inlining.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ let%expect_test "inline recursive function" =
2626
|} in
2727
print_fun_decl program (Some "f");
2828
print_fun_decl program (Some "g");
29-
[%expect
30-
{|
29+
[%expect{|
3130
function f(param){for(;;) ;}
3231
//end
3332
function g(param){return f(0);}

0 commit comments

Comments
 (0)