cpuex2019-1 / compiler

Other
0 stars 0 forks source link

globals.mlで定義される配列を埋め込む #11

Closed okuraofvegetable closed 4 years ago

okuraofvegetable commented 4 years ago
okuraofvegetable commented 4 years ago

ArrayとTupleのglobalなものをsupport(グローバル認定の仕方はレイトレ専用感あり) 大まかな流れ

okuraofvegetable commented 4 years ago

Arrayは大丈夫だが、Tupleのほうをsupportしたら-inline 30以上で壊れるようになった...

okuraofvegetable commented 4 years ago
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が悪いと思われる

okuraofvegetable commented 4 years ago

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
okuraofvegetable commented 4 years ago

何度もloadしてしまうとregAllocのassertに引っかかる。 逆に一度もloadしていないのに登場するとemitでnot savedと表示される。 現状inline化の閾値によってはどちらのエラーも見られるのでvirtual.mlを全体的に見直してrefactoringするのが望ましそう。

okuraofvegetable commented 4 years ago

global変数をロードしたかどうかをリストの参照で管理する実装にしたけどレイトレはうまく行かなかった。LetはTree状になっているのでg の引数としてglobal_envを渡してやる必要がありそうなことがわかった。(ほんまか?)

okuraofvegetable commented 4 years ago

普通にenvにloadしたやつ管理して丁寧に管理すればできた!