Add cfold benchmark - can't go over 5 (though Koka uses 20) because wasm runs out of stack. Not entirely sure how to handle that - I imagine we're emitting far to much on the stack frame, but also I would hope wasmtime would optimize it, and I additionally can't find a way to raise wasmtime's limit from the cli... It is worth noting that Koka notes that cfold is a benchmark that can exhaust the stack

This commit is contained in:
Nathan Braswell
2022-05-17 23:34:46 -04:00
parent e6a1ad5bf3
commit 7fef7eba85
6 changed files with 250 additions and 2 deletions

View File

@@ -1,4 +1,4 @@
set(sources rbtree.kk nqueens.kk nqueens-int.kk)
set(sources rbtree.kk nqueens.kk nqueens-int.kk cfold.kk)
set(koka koka)

70
koka_bench/koka/cfold.kk Normal file
View File

@@ -0,0 +1,70 @@
// Adapted from https://github.com/leanprover/lean4/blob/IFL19/tests/bench/const_fold.hs
import std/os/env
type expr
Var( : int )
Val( : int )
Add( l : expr, r : expr )
Mul( l : expr, r : expr )
fun mk_expr( n : int, v : int ) : div expr
if n==0
then (if v==0 then Var(1) else Val(v))
else Add( mk_expr(n - 1, v+1), mk_expr(n - 1, max(v - 1,0)) )
fun append_add( e0 : expr, e3 : expr ) : expr
match e0
Add(e1,e2) -> Add(e1, append_add(e2,e3))
_ -> Add(e0,e3)
fun append_mul( e0 : expr, e3 : expr ) : expr
match e0
Mul(e1,e2) -> Mul(e1, append_mul(e2,e3))
_ -> Mul(e0,e3)
fun reassoc( e : expr ) : expr
match e
Add(e1,e2) -> append_add(reassoc(e1), reassoc(e2))
Mul(e1,e2) -> append_mul(reassoc(e1), reassoc(e2))
_ -> e
fun cfold( e : expr ) : expr
match e
Add(e1,e2) ->
val e1' = cfold(e1)
val e2' = cfold(e2)
match e1'
Val(a) -> match e2'
Val(b) -> Val(a+b)
Add(f,Val(b)) -> Add(Val(a+b),f)
Add(Val(b),f) -> Add(Val(a+b),f)
_ -> Add(e1',e2')
_ -> Add(e1',e2')
Mul(e1,e2) ->
val e1' = cfold(e1)
val e2' = cfold(e2)
match e1'
Val(a) -> match e2'
Val(b) -> Val(a*b)
Mul(f,Val(b)) -> Mul(Val(a*b),f)
Mul(Val(b),f) -> Mul(Val(a*b),f)
_ -> Mul(e1',e2')
_ -> Mul(e1',e2')
_ -> e
fun eval(e : expr) : int
match e
Var -> 0
Val(v) -> v
Add(l,r) -> eval(l) + eval(r)
Mul(l,r) -> eval(l) * eval(r)
pub fun main()
val n = get-args().head("").parse-int.default(20)
val e = mk_expr(n,1)
val v1 = eval(e)
val v2 = e.reassoc.cfold.eval
println( v1.show )
println( v2.show )