Skip to content

Commit 80ba4bc

Browse files
committed
WIP
1 parent 365011a commit 80ba4bc

File tree

3 files changed

+189
-226
lines changed

3 files changed

+189
-226
lines changed

compiler/lib/generate.ml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -882,18 +882,22 @@ let build_graph ctx pc =
882882
let block = Addr.Map.find pc blocks in
883883
let succs =
884884
match block.branch with
885-
| Pushtrap ((pc1, _), _, (pc_exn, _), _) ->
886-
Addr.Set.add pc_exn (Hashtbl.find poptrap pc1) |> Addr.Set.elements
885+
| Pushtrap ((_pc1, _), _, (pc_exn, _), _) ->
886+
Addr.Set.add pc_exn (Hashtbl.find poptrap pc) |> Addr.Set.elements
887887
| _ -> Hashtbl.find succs pc
888888
in
889889
List.fold_left succs ~init:acc ~f:(fun acc pc' -> find pc_loops pc' acc)
890890
in
891891
find (Addr.Set.singleton pc_loop) pc_loop Addr.Set.empty
892892
in
893+
let get_ancestor pc =
894+
Hashtbl.fold (fun k l acc -> if List.mem pc ~set:l then k :: acc else acc) succs []
895+
in
893896
Addr.Set.iter
894897
(fun pc_loop ->
895898
let set = compute_exit_loop pc_loop in
896-
add_cf_frontier pc_loop set)
899+
let preds = get_ancestor pc_loop in
900+
List.iter preds ~f:(fun pc_loop_anc -> add_cf_frontier pc_loop_anc set))
897901
!loops
898902
in
899903
let () =

compiler/tests-compiler/gh1007.ml

Lines changed: 133 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -157,145 +157,142 @@ let () = M.myfun M.x
157157
function myfun(x)
158158
{var x$0=x;
159159
for(;;)
160-
{if(x$0)
161-
{var
162-
next=x$0[1],
163-
rev_sort=
164-
function(n,l)
165-
{if(2 === n)
166-
{if(l)
167-
{var _e_=l[2];
168-
if(_e_)
169-
{var
170-
tl=_e_[2],
171-
x2=_e_[1],
172-
x1=l[1],
173-
s=0 < caml_int_compare(x1,x2)?[0,x1,[0,x2,0]]:[0,x2,[0,x1,0]];
174-
return [0,s,tl]}}}
175-
else
176-
if(3 === n && l)
177-
{var _g_=l[2];
178-
if(_g_)
179-
{var _h_=_g_[2];
180-
if(_h_)
181-
{var
182-
tl$1=_h_[2],
183-
x3=_h_[1],
184-
x2$0=_g_[1],
185-
x1$0=l[1],
186-
s$0=
187-
0 < caml_int_compare(x1$0,x2$0)
188-
?0 < caml_int_compare(x2$0,x3)
189-
?[0,x1$0,[0,x2$0,[0,x3,0]]]
190-
:0 < caml_int_compare(x1$0,x3)
191-
?[0,x1$0,[0,x3,[0,x2$0,0]]]
192-
:[0,x3,[0,x1$0,[0,x2$0,0]]]
160+
{if(! x$0)return 0;
161+
var
162+
next=x$0[1],
163+
rev_sort=
164+
function(n,l)
165+
{if(2 === n)
166+
{if(l)
167+
{var _e_=l[2];
168+
if(_e_)
169+
{var
170+
tl=_e_[2],
171+
x2=_e_[1],
172+
x1=l[1],
173+
s=0 < caml_int_compare(x1,x2)?[0,x1,[0,x2,0]]:[0,x2,[0,x1,0]];
174+
return [0,s,tl]}}}
175+
else
176+
if(3 === n && l)
177+
{var _g_=l[2];
178+
if(_g_)
179+
{var _h_=_g_[2];
180+
if(_h_)
181+
{var
182+
tl$1=_h_[2],
183+
x3=_h_[1],
184+
x2$0=_g_[1],
185+
x1$0=l[1],
186+
s$0=
187+
0 < caml_int_compare(x1$0,x2$0)
188+
?0 < caml_int_compare(x2$0,x3)
189+
?[0,x1$0,[0,x2$0,[0,x3,0]]]
193190
:0 < caml_int_compare(x1$0,x3)
194-
?[0,x2$0,[0,x1$0,[0,x3,0]]]
195-
:0 < caml_int_compare(x2$0,x3)
196-
?[0,x2$0,[0,x3,[0,x1$0,0]]]
197-
:[0,x3,[0,x2$0,[0,x1$0,0]]];
198-
return [0,s$0,tl$1]}}}
199-
var
200-
n1=n >> 1,
201-
n2=n - n1 | 0,
202-
match=sort(n1,l),
203-
l2$0=match[2],
204-
s1=match[1],
205-
match$0=sort(n2,l2$0),
206-
tl$0=match$0[2],
207-
s2=match$0[1],
208-
switch$0=0,
209-
l1=s1,
210-
l2=s2,
211-
accu=0;
212-
for(;;)
213-
{if(l1)
214-
{if(l2)
215-
{var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
216-
if(0 < caml_int_compare(h1,h2))
217-
{var accu$0=[0,h2,accu],l2=t2,accu=accu$0;continue}
218-
var accu$1=[0,h1,accu],l1=t1,accu=accu$1;
219-
continue}}
220-
else
221-
switch$0 = 1;
222-
break}
223-
var _f_=switch$0?rev_append(l2,accu):rev_append(l1,accu);
224-
return [0,_f_,tl$0]},
225-
sort=
226-
function(n,l)
227-
{if(2 === n)
228-
{if(l)
229-
{var _a_=l[2];
230-
if(_a_)
231-
{var
232-
tl=_a_[2],
233-
x2=_a_[1],
234-
x1=l[1],
235-
s=0 < caml_int_compare(x1,x2)?[0,x2,[0,x1,0]]:[0,x1,[0,x2,0]];
236-
return [0,s,tl]}}}
191+
?[0,x1$0,[0,x3,[0,x2$0,0]]]
192+
:[0,x3,[0,x1$0,[0,x2$0,0]]]
193+
:0 < caml_int_compare(x1$0,x3)
194+
?[0,x2$0,[0,x1$0,[0,x3,0]]]
195+
:0 < caml_int_compare(x2$0,x3)
196+
?[0,x2$0,[0,x3,[0,x1$0,0]]]
197+
:[0,x3,[0,x2$0,[0,x1$0,0]]];
198+
return [0,s$0,tl$1]}}}
199+
var
200+
n1=n >> 1,
201+
n2=n - n1 | 0,
202+
match=sort(n1,l),
203+
l2$0=match[2],
204+
s1=match[1],
205+
match$0=sort(n2,l2$0),
206+
tl$0=match$0[2],
207+
s2=match$0[1],
208+
switch$0=0,
209+
l1=s1,
210+
l2=s2,
211+
accu=0;
212+
for(;;)
213+
{if(l1)
214+
{if(l2)
215+
{var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
216+
if(0 < caml_int_compare(h1,h2))
217+
{var accu$0=[0,h2,accu],l2=t2,accu=accu$0;continue}
218+
var accu$1=[0,h1,accu],l1=t1,accu=accu$1;
219+
continue}}
237220
else
238-
if(3 === n && l)
239-
{var _c_=l[2];
240-
if(_c_)
241-
{var _d_=_c_[2];
242-
if(_d_)
243-
{var
244-
tl$1=_d_[2],
245-
x3=_d_[1],
246-
x2$0=_c_[1],
247-
x1$0=l[1],
248-
s$0=
249-
0 < caml_int_compare(x1$0,x2$0)
221+
switch$0 = 1;
222+
break}
223+
var _f_=switch$0?rev_append(l2,accu):rev_append(l1,accu);
224+
return [0,_f_,tl$0]},
225+
sort=
226+
function(n,l)
227+
{if(2 === n)
228+
{if(l)
229+
{var _a_=l[2];
230+
if(_a_)
231+
{var
232+
tl=_a_[2],
233+
x2=_a_[1],
234+
x1=l[1],
235+
s=0 < caml_int_compare(x1,x2)?[0,x2,[0,x1,0]]:[0,x1,[0,x2,0]];
236+
return [0,s,tl]}}}
237+
else
238+
if(3 === n && l)
239+
{var _c_=l[2];
240+
if(_c_)
241+
{var _d_=_c_[2];
242+
if(_d_)
243+
{var
244+
tl$1=_d_[2],
245+
x3=_d_[1],
246+
x2$0=_c_[1],
247+
x1$0=l[1],
248+
s$0=
249+
0 < caml_int_compare(x1$0,x2$0)
250+
?0 < caml_int_compare(x1$0,x3)
251+
?0 < caml_int_compare(x2$0,x3)
252+
?[0,x3,[0,x2$0,[0,x1$0,0]]]
253+
:[0,x2$0,[0,x3,[0,x1$0,0]]]
254+
:[0,x2$0,[0,x1$0,[0,x3,0]]]
255+
:0 < caml_int_compare(x2$0,x3)
250256
?0 < caml_int_compare(x1$0,x3)
251-
?0 < caml_int_compare(x2$0,x3)
252-
?[0,x3,[0,x2$0,[0,x1$0,0]]]
253-
:[0,x2$0,[0,x3,[0,x1$0,0]]]
254-
:[0,x2$0,[0,x1$0,[0,x3,0]]]
255-
:0 < caml_int_compare(x2$0,x3)
256-
?0 < caml_int_compare(x1$0,x3)
257-
?[0,x3,[0,x1$0,[0,x2$0,0]]]
258-
:[0,x1$0,[0,x3,[0,x2$0,0]]]
259-
:[0,x1$0,[0,x2$0,[0,x3,0]]];
260-
return [0,s$0,tl$1]}}}
261-
var
262-
n1=n >> 1,
263-
n2=n - n1 | 0,
264-
match=rev_sort(n1,l),
265-
l2$0=match[2],
266-
s1=match[1],
267-
match$0=rev_sort(n2,l2$0),
268-
tl$0=match$0[2],
269-
s2=match$0[1],
270-
switch$0=0,
271-
l1=s1,
272-
l2=s2,
273-
accu=0;
274-
for(;;)
275-
{if(l1)
276-
{if(l2)
277-
{var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
278-
if(0 < caml_int_compare(h1,h2))
279-
{var accu$0=[0,h1,accu],l1=t1,accu=accu$0;continue}
280-
var accu$1=[0,h2,accu],l2=t2,accu=accu$1;
281-
continue}}
282-
else
283-
switch$0 = 1;
284-
break}
285-
var _b_=switch$0?rev_append(l2,accu):rev_append(l1,accu);
286-
return [0,_b_,tl$0]},
287-
len=0,
288-
param=l;
289-
for(;;)
290-
{if(param)
291-
{var param$0=param[2],len$0=len + 1 | 0,len=len$0,param=param$0;
292-
continue}
293-
break}
294-
if(2 <= len)sort(len,l);
295-
var x$0=next;
296-
continue}
297-
break}
298-
return 0}
257+
?[0,x3,[0,x1$0,[0,x2$0,0]]]
258+
:[0,x1$0,[0,x3,[0,x2$0,0]]]
259+
:[0,x1$0,[0,x2$0,[0,x3,0]]];
260+
return [0,s$0,tl$1]}}}
261+
var
262+
n1=n >> 1,
263+
n2=n - n1 | 0,
264+
match=rev_sort(n1,l),
265+
l2$0=match[2],
266+
s1=match[1],
267+
match$0=rev_sort(n2,l2$0),
268+
tl$0=match$0[2],
269+
s2=match$0[1],
270+
switch$0=0,
271+
l1=s1,
272+
l2=s2,
273+
accu=0;
274+
for(;;)
275+
{if(l1)
276+
{if(l2)
277+
{var t2=l2[2],h2=l2[1],t1=l1[2],h1=l1[1];
278+
if(0 < caml_int_compare(h1,h2))
279+
{var accu$0=[0,h1,accu],l1=t1,accu=accu$0;continue}
280+
var accu$1=[0,h2,accu],l2=t2,accu=accu$1;
281+
continue}}
282+
else
283+
switch$0 = 1;
284+
break}
285+
var _b_=switch$0?rev_append(l2,accu):rev_append(l1,accu);
286+
return [0,_b_,tl$0]},
287+
len=0,
288+
param=l;
289+
for(;;)
290+
{if(param)
291+
{var param$0=param[2],len$0=len + 1 | 0,len=len$0,param=param$0;
292+
continue}
293+
break}
294+
if(2 <= len)sort(len,l);
295+
var x$0=next}}
299296
//end |}]
300297

301298
let%expect_test _ =

0 commit comments

Comments
 (0)