Closed okuraofvegetable closed 4 years ago
ArrayとTupleのglobalなものをsupport(グローバル認定の仕方はレイトレ専用感あり) 大まかな流れ
Arrayは大丈夫だが、Tupleのほうをsupportしたら-inline 30以上で壊れるようになった...
let v =
let a = Array.create 3 1 in
let b = Array.create 2 1.0 in
(a,b)
in
let rec print_int_sub x =
if x = 0 then ()
else (
let y = x / 10 in
let rem = x - y * 10 in
print_int_sub y;
print_char (48+rem)
)
in
let rec print_int x =
if x = 0 then (print_char 48)
else (
if x > 0 then print_int_sub x
else (
print_char 45;
print_int_sub (-x)
)
)
in
let rec g x =
let (c,d) = v in
c.(x)
in
print_int (g 1)
で壊れることがわかった。これならデバッグできそう、LetTupleまわりのvirtual.mlが悪いと思われる
virtualで同じグローバル変数を複数回loadする可能性があるのが悪いことがわかった!!
Let
Ti3.50
Li 3
Let
Ti4.51
Li 1
Let
a.46
CallDir min_caml_create_array
int args
Ti3.50
Ti4.51
float args
Let
Ti5.48
Li 2
Let
Td6.49
Fli l.54
Let
b.47
CallDir min_caml_create_float_array
int args
Ti5.48
float args
Td6.49
Let
t.55
Li 3000
Let
Tu57
Stw b.47 t.55 C 4
Let
Tu56
Stw a.46 t.55 C 0
Let
v.20
Mr t.55
Let
Ti7.28
Li 1
Let
v.20
Li 3000
Let
d.30.53
Lwz v.20 C 4
Let
c.29.52
Lwz v.20 C 0
Let
o.58
Slw Ti7.28 C 2
Let
Ti8.27
Lwz c.29.52 V o.58
Ans
CallDir print_int.23
int args
Ti8.27
float args
何度もloadしてしまうとregAllocのassertに引っかかる。 逆に一度もloadしていないのに登場するとemitでnot savedと表示される。 現状inline化の閾値によってはどちらのエラーも見られるのでvirtual.mlを全体的に見直してrefactoringするのが望ましそう。
global変数をロードしたかどうかをリストの参照で管理する実装にしたけどレイトレはうまく行かなかった。LetはTree状になっているのでg の引数としてglobal_envを渡してやる必要がありそうなことがわかった。(ほんまか?)
普通にenvにloadしたやつ管理して丁寧に管理すればできた!