mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-01 07:41:12 +00:00
fix mono tests
This commit is contained in:
parent
490f50deb2
commit
859656f02d
2 changed files with 460 additions and 372 deletions
|
@ -1169,20 +1169,19 @@ fn test_to_equality<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Tests<'a> = std::vec::Vec<(
|
||||||
|
bumpalo::collections::Vec<'a, (Symbol, Layout<'a>, Expr<'a>)>,
|
||||||
|
Symbol,
|
||||||
|
Symbol,
|
||||||
|
Layout<'a>,
|
||||||
|
)>;
|
||||||
|
|
||||||
fn stores_and_condition<'a>(
|
fn stores_and_condition<'a>(
|
||||||
env: &mut Env<'a, '_>,
|
env: &mut Env<'a, '_>,
|
||||||
cond_symbol: Symbol,
|
cond_symbol: Symbol,
|
||||||
cond_layout: &Layout<'a>,
|
cond_layout: &Layout<'a>,
|
||||||
test_chain: Vec<(Path, Test<'a>)>,
|
test_chain: Vec<(Path, Test<'a>)>,
|
||||||
) -> (
|
) -> (Tests<'a>, Option<(Symbol, JoinPointId, Stmt<'a>)>) {
|
||||||
std::vec::Vec<(
|
|
||||||
bumpalo::collections::Vec<'a, (Symbol, Layout<'a>, Expr<'a>)>,
|
|
||||||
Symbol,
|
|
||||||
Symbol,
|
|
||||||
Layout<'a>,
|
|
||||||
)>,
|
|
||||||
Option<(Symbol, JoinPointId, Stmt<'a>)>,
|
|
||||||
) {
|
|
||||||
let mut tests = Vec::with_capacity(test_chain.len());
|
let mut tests = Vec::with_capacity(test_chain.len());
|
||||||
|
|
||||||
let mut guard = None;
|
let mut guard = None;
|
||||||
|
@ -1261,6 +1260,68 @@ fn compile_guard<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn compile_test<'a>(
|
||||||
|
env: &mut Env<'a, '_>,
|
||||||
|
ret_layout: Layout<'a>,
|
||||||
|
stores: bumpalo::collections::Vec<'a, (Symbol, Layout<'a>, Expr<'a>)>,
|
||||||
|
lhs: Symbol,
|
||||||
|
rhs: Symbol,
|
||||||
|
fail: &'a Stmt<'a>,
|
||||||
|
mut cond: Stmt<'a>,
|
||||||
|
) -> Stmt<'a> {
|
||||||
|
// `if test_symbol then cond else false_branch
|
||||||
|
let test_symbol = env.unique_symbol();
|
||||||
|
let arena = env.arena;
|
||||||
|
|
||||||
|
cond = Stmt::Cond {
|
||||||
|
cond_symbol: test_symbol,
|
||||||
|
cond_layout: Layout::Builtin(Builtin::Int1),
|
||||||
|
branching_symbol: test_symbol,
|
||||||
|
branching_layout: Layout::Builtin(Builtin::Int1),
|
||||||
|
pass: arena.alloc(cond),
|
||||||
|
fail,
|
||||||
|
ret_layout,
|
||||||
|
};
|
||||||
|
|
||||||
|
let test = Expr::RunLowLevel(LowLevel::Eq, arena.alloc([lhs, rhs]));
|
||||||
|
|
||||||
|
// write to the test symbol
|
||||||
|
cond = Stmt::Let(
|
||||||
|
test_symbol,
|
||||||
|
test,
|
||||||
|
Layout::Builtin(Builtin::Int1),
|
||||||
|
arena.alloc(cond),
|
||||||
|
);
|
||||||
|
|
||||||
|
// stores are in top-to-bottom order, so we have to add them in reverse
|
||||||
|
for (symbol, layout, expr) in stores.into_iter().rev() {
|
||||||
|
cond = Stmt::Let(symbol, expr, layout, arena.alloc(cond));
|
||||||
|
}
|
||||||
|
|
||||||
|
cond
|
||||||
|
}
|
||||||
|
|
||||||
|
fn compile_tests<'a>(
|
||||||
|
env: &mut Env<'a, '_>,
|
||||||
|
ret_layout: Layout<'a>,
|
||||||
|
tests: Tests<'a>,
|
||||||
|
opt_guard: Option<(Symbol, JoinPointId, Stmt<'a>)>,
|
||||||
|
fail: &'a Stmt<'a>,
|
||||||
|
mut cond: Stmt<'a>,
|
||||||
|
) -> Stmt<'a> {
|
||||||
|
let arena = env.arena;
|
||||||
|
|
||||||
|
// the guard is the final thing that we check, so needs to be layered on first!
|
||||||
|
if let Some((_, id, stmt)) = opt_guard {
|
||||||
|
cond = compile_guard(env, ret_layout.clone(), id, arena.alloc(stmt), fail, cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (new_stores, lhs, rhs, _layout) in tests.into_iter().rev() {
|
||||||
|
cond = compile_test(env, ret_layout.clone(), new_stores, lhs, rhs, fail, cond);
|
||||||
|
}
|
||||||
|
cond
|
||||||
|
}
|
||||||
|
|
||||||
// TODO procs and layout are currently unused, but potentially required
|
// TODO procs and layout are currently unused, but potentially required
|
||||||
// for defining optional fields?
|
// for defining optional fields?
|
||||||
// if not, do remove
|
// if not, do remove
|
||||||
|
@ -1278,6 +1339,8 @@ fn decide_to_branching<'a>(
|
||||||
use Choice::*;
|
use Choice::*;
|
||||||
use Decider::*;
|
use Decider::*;
|
||||||
|
|
||||||
|
let arena = env.arena;
|
||||||
|
|
||||||
match decider {
|
match decider {
|
||||||
Leaf(Jump(label)) => {
|
Leaf(Jump(label)) => {
|
||||||
// we currently inline the jumps: does fewer jumps but produces a larger artifact
|
// we currently inline the jumps: does fewer jumps but produces a larger artifact
|
||||||
|
@ -1293,7 +1356,7 @@ fn decide_to_branching<'a>(
|
||||||
success,
|
success,
|
||||||
failure,
|
failure,
|
||||||
} => {
|
} => {
|
||||||
// generate a switch based on the test chain
|
// generate a (nested) if-then-else
|
||||||
|
|
||||||
let pass_expr = decide_to_branching(
|
let pass_expr = decide_to_branching(
|
||||||
env,
|
env,
|
||||||
|
@ -1317,80 +1380,35 @@ fn decide_to_branching<'a>(
|
||||||
jumps,
|
jumps,
|
||||||
);
|
);
|
||||||
|
|
||||||
let fail = &*env.arena.alloc(fail_expr);
|
|
||||||
let pass = &*env.arena.alloc(pass_expr);
|
|
||||||
|
|
||||||
let branching_symbol = env.unique_symbol();
|
|
||||||
let branching_layout = Layout::Builtin(Builtin::Int1);
|
|
||||||
|
|
||||||
let mut cond = pass.clone();
|
|
||||||
|
|
||||||
let true_symbol = env.unique_symbol();
|
|
||||||
|
|
||||||
let (tests, guard) = stores_and_condition(env, cond_symbol, &cond_layout, test_chain);
|
let (tests, guard) = stores_and_condition(env, cond_symbol, &cond_layout, test_chain);
|
||||||
|
|
||||||
let mut current_symbol = branching_symbol;
|
let number_of_tests = tests.len() as i64 + guard.is_some() as i64;
|
||||||
|
|
||||||
// TODO There must be some way to remove this iterator/loop
|
debug_assert!(number_of_tests > 0);
|
||||||
let nr = (tests.len() as i64) - 1 + (guard.is_some() as i64);
|
|
||||||
|
|
||||||
let arena = env.arena;
|
let mut accum = pass_expr;
|
||||||
|
if number_of_tests == 1 {
|
||||||
|
// if there is just one test, compile to a simple if-then-else
|
||||||
|
let fail = &*env.arena.alloc(fail_expr);
|
||||||
|
|
||||||
let accum_symbols = std::iter::once(true_symbol)
|
accum = compile_tests(env, ret_layout, tests, guard, fail, accum);
|
||||||
.chain((0..nr).map(|_| env.unique_symbol()))
|
} else {
|
||||||
.rev()
|
// otherwise, we use a join point so the code for the `else` case
|
||||||
.collect::<Vec<_>>();
|
// is only generated once.
|
||||||
|
let fail_jp_id = JoinPointId(env.unique_symbol());
|
||||||
|
let fail = arena.alloc(Stmt::Jump(fail_jp_id, &[]));
|
||||||
|
|
||||||
let mut accum_it = accum_symbols.into_iter();
|
accum = compile_tests(env, ret_layout, tests, guard, fail, accum);
|
||||||
|
|
||||||
// the guard is the final thing that we check, so needs to be layered on first!
|
accum = Stmt::Join {
|
||||||
if let Some((_, id, stmt)) = guard {
|
id: fail_jp_id,
|
||||||
cond = compile_guard(env, ret_layout.clone(), id, arena.alloc(stmt), fail, cond);
|
parameters: &[],
|
||||||
}
|
continuation: env.arena.alloc(fail_expr),
|
||||||
|
remainder: arena.alloc(accum),
|
||||||
for ((new_stores, lhs, rhs, _layout), accum) in tests.into_iter().rev().zip(accum_it) {
|
|
||||||
// `if test_symbol then cond else false_branch
|
|
||||||
let test_symbol = env.unique_symbol();
|
|
||||||
|
|
||||||
cond = Stmt::Cond {
|
|
||||||
cond_symbol: test_symbol,
|
|
||||||
cond_layout: Layout::Builtin(Builtin::Int1),
|
|
||||||
branching_symbol: test_symbol,
|
|
||||||
branching_layout: Layout::Builtin(Builtin::Int1),
|
|
||||||
pass: env.arena.alloc(cond),
|
|
||||||
fail,
|
|
||||||
ret_layout: ret_layout.clone(),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let test = Expr::RunLowLevel(
|
|
||||||
LowLevel::Eq,
|
|
||||||
bumpalo::vec![in arena; lhs, rhs].into_bump_slice(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// write to the test symbol
|
|
||||||
cond = Stmt::Let(
|
|
||||||
test_symbol,
|
|
||||||
test,
|
|
||||||
Layout::Builtin(Builtin::Int1),
|
|
||||||
arena.alloc(cond),
|
|
||||||
);
|
|
||||||
|
|
||||||
// stores are in top-to-bottom order, so we have to add them in reverse
|
|
||||||
for (symbol, layout, expr) in new_stores.into_iter().rev() {
|
|
||||||
cond = Stmt::Let(symbol, expr, layout, arena.alloc(cond));
|
|
||||||
}
|
|
||||||
|
|
||||||
current_symbol = accum;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cond = Stmt::Let(
|
accum
|
||||||
true_symbol,
|
|
||||||
Expr::Literal(Literal::Bool(true)),
|
|
||||||
Layout::Builtin(Builtin::Int1),
|
|
||||||
arena.alloc(cond),
|
|
||||||
);
|
|
||||||
|
|
||||||
cond
|
|
||||||
}
|
}
|
||||||
FanOut {
|
FanOut {
|
||||||
path,
|
path,
|
||||||
|
|
|
@ -116,11 +116,17 @@ mod test_mono {
|
||||||
let the_same = result == expected;
|
let the_same = result == expected;
|
||||||
|
|
||||||
if !the_same {
|
if !the_same {
|
||||||
println!("{}", result);
|
|
||||||
|
|
||||||
let expected_lines = expected.split("\n").collect::<Vec<&str>>();
|
let expected_lines = expected.split("\n").collect::<Vec<&str>>();
|
||||||
let result_lines = result.split("\n").collect::<Vec<&str>>();
|
let result_lines = result.split("\n").collect::<Vec<&str>>();
|
||||||
|
|
||||||
|
for line in &result_lines {
|
||||||
|
if !line.is_empty() {
|
||||||
|
println!(" {}", line);
|
||||||
|
} else {
|
||||||
|
println!("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert_eq!(expected_lines, result_lines);
|
assert_eq!(expected_lines, result_lines);
|
||||||
assert_eq!(0, 1);
|
assert_eq!(0, 1);
|
||||||
}
|
}
|
||||||
|
@ -183,15 +189,13 @@ mod test_mono {
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.10 = 0i64;
|
let Test.8 = 0i64;
|
||||||
let Test.11 = 3i64;
|
let Test.9 = 3i64;
|
||||||
let Test.2 = Just Test.10 Test.11;
|
let Test.2 = Just Test.8 Test.9;
|
||||||
let Test.6 = true;
|
let Test.5 = 0i64;
|
||||||
let Test.7 = 0i64;
|
let Test.6 = Index 0 Test.2;
|
||||||
let Test.8 = Index 0 Test.2;
|
let Test.7 = lowlevel Eq Test.5 Test.6;
|
||||||
let Test.9 = lowlevel Eq Test.7 Test.8;
|
if Test.7 then
|
||||||
let Test.5 = lowlevel And Test.9 Test.6;
|
|
||||||
if Test.5 then
|
|
||||||
let Test.1 = Index 1 Test.2;
|
let Test.1 = Index 1 Test.2;
|
||||||
ret Test.1;
|
ret Test.1;
|
||||||
else
|
else
|
||||||
|
@ -309,35 +313,33 @@ mod test_mono {
|
||||||
"#,
|
"#,
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure Num.32 (#Attr.2, #Attr.3):
|
procedure Num.32 (#Attr.2, #Attr.3):
|
||||||
let Test.19 = 0i64;
|
let Test.17 = 0i64;
|
||||||
let Test.15 = lowlevel NotEq #Attr.3 Test.19;
|
let Test.13 = lowlevel NotEq #Attr.3 Test.17;
|
||||||
if Test.15 then
|
if Test.13 then
|
||||||
let Test.17 = 1i64;
|
let Test.15 = 1i64;
|
||||||
let Test.18 = lowlevel NumDivUnchecked #Attr.2 #Attr.3;
|
let Test.16 = lowlevel NumDivUnchecked #Attr.2 #Attr.3;
|
||||||
let Test.16 = Ok Test.17 Test.18;
|
let Test.14 = Ok Test.15 Test.16;
|
||||||
ret Test.16;
|
ret Test.14;
|
||||||
else
|
else
|
||||||
let Test.13 = 0i64;
|
let Test.11 = 0i64;
|
||||||
let Test.14 = Struct {};
|
let Test.12 = Struct {};
|
||||||
let Test.12 = Err Test.13 Test.14;
|
let Test.10 = Err Test.11 Test.12;
|
||||||
ret Test.12;
|
ret Test.10;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.10 = 1000i64;
|
let Test.8 = 1000i64;
|
||||||
let Test.11 = 10i64;
|
let Test.9 = 10i64;
|
||||||
let Test.2 = CallByName Num.32 Test.10 Test.11;
|
let Test.2 = CallByName Num.32 Test.8 Test.9;
|
||||||
let Test.6 = true;
|
let Test.5 = 1i64;
|
||||||
let Test.7 = 1i64;
|
let Test.6 = Index 0 Test.2;
|
||||||
let Test.8 = Index 0 Test.2;
|
let Test.7 = lowlevel Eq Test.5 Test.6;
|
||||||
let Test.9 = lowlevel Eq Test.7 Test.8;
|
if Test.7 then
|
||||||
let Test.5 = lowlevel And Test.9 Test.6;
|
let Test.1 = Index 1 Test.2;
|
||||||
if Test.5 then
|
ret Test.1;
|
||||||
let Test.1 = Index 1 Test.2;
|
else
|
||||||
ret Test.1;
|
let Test.4 = -1i64;
|
||||||
else
|
ret Test.4;
|
||||||
let Test.4 = -1i64;
|
|
||||||
ret Test.4;
|
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -386,15 +388,13 @@ mod test_mono {
|
||||||
ret Test.5;
|
ret Test.5;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.12 = 0i64;
|
let Test.10 = 0i64;
|
||||||
let Test.13 = 41i64;
|
let Test.11 = 41i64;
|
||||||
let Test.1 = Just Test.12 Test.13;
|
let Test.1 = Just Test.10 Test.11;
|
||||||
let Test.8 = true;
|
let Test.7 = 0i64;
|
||||||
let Test.9 = 0i64;
|
let Test.8 = Index 0 Test.1;
|
||||||
let Test.10 = Index 0 Test.1;
|
let Test.9 = lowlevel Eq Test.7 Test.8;
|
||||||
let Test.11 = lowlevel Eq Test.9 Test.10;
|
if Test.9 then
|
||||||
let Test.7 = lowlevel And Test.11 Test.8;
|
|
||||||
if Test.7 then
|
|
||||||
let Test.2 = Index 1 Test.1;
|
let Test.2 = Index 1 Test.1;
|
||||||
let Test.4 = 1i64;
|
let Test.4 = 1i64;
|
||||||
let Test.3 = CallByName Num.14 Test.2 Test.4;
|
let Test.3 = CallByName Num.14 Test.2 Test.4;
|
||||||
|
@ -442,20 +442,24 @@ mod test_mono {
|
||||||
r#"
|
r#"
|
||||||
procedure Test.1 (Test.2):
|
procedure Test.1 (Test.2):
|
||||||
let Test.5 = 2i64;
|
let Test.5 = 2i64;
|
||||||
let Test.11 = true;
|
joinpoint Test.11:
|
||||||
let Test.12 = 2i64;
|
let Test.9 = 0i64;
|
||||||
let Test.15 = lowlevel Eq Test.12 Test.5;
|
ret Test.9;
|
||||||
let Test.13 = lowlevel And Test.15 Test.11;
|
in
|
||||||
let Test.8 = false;
|
let Test.10 = 2i64;
|
||||||
jump Test.7 Test.8;
|
let Test.13 = lowlevel Eq Test.10 Test.5;
|
||||||
joinpoint Test.7 Test.14:
|
if Test.13 then
|
||||||
let Test.10 = lowlevel And Test.14 Test.13;
|
joinpoint Test.7 Test.12:
|
||||||
if Test.10 then
|
if Test.12 then
|
||||||
let Test.6 = 42i64;
|
let Test.6 = 42i64;
|
||||||
ret Test.6;
|
ret Test.6;
|
||||||
else
|
else
|
||||||
let Test.9 = 0i64;
|
jump Test.11;
|
||||||
ret Test.9;
|
in
|
||||||
|
let Test.8 = false;
|
||||||
|
jump Test.7 Test.8;
|
||||||
|
else
|
||||||
|
jump Test.11;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.4 = Struct {};
|
let Test.4 = Struct {};
|
||||||
|
@ -511,30 +515,33 @@ mod test_mono {
|
||||||
ret Test.6;
|
ret Test.6;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
|
let Test.17 = 0i64;
|
||||||
let Test.19 = 0i64;
|
let Test.19 = 0i64;
|
||||||
let Test.21 = 0i64;
|
let Test.20 = 41i64;
|
||||||
let Test.22 = 41i64;
|
let Test.18 = Just Test.19 Test.20;
|
||||||
let Test.20 = Just Test.21 Test.22;
|
let Test.2 = Just Test.17 Test.18;
|
||||||
let Test.2 = Just Test.19 Test.20;
|
joinpoint Test.14:
|
||||||
let Test.10 = true;
|
|
||||||
let Test.12 = 0i64;
|
|
||||||
let Test.11 = Index 1 Test.2;
|
|
||||||
let Test.13 = Index 0 Test.11;
|
|
||||||
let Test.18 = lowlevel Eq Test.12 Test.13;
|
|
||||||
let Test.16 = lowlevel And Test.18 Test.10;
|
|
||||||
let Test.14 = 0i64;
|
|
||||||
let Test.15 = Index 0 Test.2;
|
|
||||||
let Test.17 = lowlevel Eq Test.14 Test.15;
|
|
||||||
let Test.9 = lowlevel And Test.17 Test.16;
|
|
||||||
if Test.9 then
|
|
||||||
let Test.7 = Index 1 Test.2;
|
|
||||||
let Test.3 = Index 1 Test.7;
|
|
||||||
let Test.5 = 1i64;
|
|
||||||
let Test.4 = CallByName Num.14 Test.3 Test.5;
|
|
||||||
ret Test.4;
|
|
||||||
else
|
|
||||||
let Test.8 = 1i64;
|
let Test.8 = 1i64;
|
||||||
ret Test.8;
|
ret Test.8;
|
||||||
|
in
|
||||||
|
let Test.9 = Index 1 Test.2;
|
||||||
|
let Test.10 = 0i64;
|
||||||
|
let Test.11 = Index 0 Test.9;
|
||||||
|
let Test.16 = lowlevel Eq Test.10 Test.11;
|
||||||
|
if Test.16 then
|
||||||
|
let Test.12 = 0i64;
|
||||||
|
let Test.13 = Index 0 Test.2;
|
||||||
|
let Test.15 = lowlevel Eq Test.12 Test.13;
|
||||||
|
if Test.15 then
|
||||||
|
let Test.7 = Index 1 Test.2;
|
||||||
|
let Test.3 = Index 1 Test.7;
|
||||||
|
let Test.5 = 1i64;
|
||||||
|
let Test.4 = CallByName Num.14 Test.3 Test.5;
|
||||||
|
ret Test.4;
|
||||||
|
else
|
||||||
|
jump Test.14;
|
||||||
|
else
|
||||||
|
jump Test.14;
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -555,26 +562,29 @@ mod test_mono {
|
||||||
ret Test.6;
|
ret Test.6;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.16 = 2i64;
|
let Test.14 = 2i64;
|
||||||
let Test.17 = 3i64;
|
let Test.15 = 3i64;
|
||||||
let Test.3 = Struct {Test.16, Test.17};
|
let Test.3 = Struct {Test.14, Test.15};
|
||||||
let Test.8 = true;
|
joinpoint Test.11:
|
||||||
let Test.10 = 4i64;
|
|
||||||
let Test.9 = Index 0 Test.3;
|
|
||||||
let Test.15 = lowlevel Eq Test.10 Test.9;
|
|
||||||
let Test.13 = lowlevel And Test.15 Test.8;
|
|
||||||
let Test.12 = 3i64;
|
|
||||||
let Test.11 = Index 1 Test.3;
|
|
||||||
let Test.14 = lowlevel Eq Test.12 Test.11;
|
|
||||||
let Test.7 = lowlevel And Test.14 Test.13;
|
|
||||||
if Test.7 then
|
|
||||||
let Test.4 = 9i64;
|
|
||||||
ret Test.4;
|
|
||||||
else
|
|
||||||
let Test.1 = Index 0 Test.3;
|
let Test.1 = Index 0 Test.3;
|
||||||
let Test.2 = Index 1 Test.3;
|
let Test.2 = Index 1 Test.3;
|
||||||
let Test.5 = CallByName Num.14 Test.1 Test.2;
|
let Test.5 = CallByName Num.14 Test.1 Test.2;
|
||||||
ret Test.5;
|
ret Test.5;
|
||||||
|
in
|
||||||
|
let Test.7 = Index 0 Test.3;
|
||||||
|
let Test.8 = 4i64;
|
||||||
|
let Test.13 = lowlevel Eq Test.8 Test.7;
|
||||||
|
if Test.13 then
|
||||||
|
let Test.9 = Index 1 Test.3;
|
||||||
|
let Test.10 = 3i64;
|
||||||
|
let Test.12 = lowlevel Eq Test.10 Test.9;
|
||||||
|
if Test.12 then
|
||||||
|
let Test.4 = 9i64;
|
||||||
|
ret Test.4;
|
||||||
|
else
|
||||||
|
jump Test.11;
|
||||||
|
else
|
||||||
|
jump Test.11;
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -698,6 +708,9 @@ mod test_mono {
|
||||||
r#"
|
r#"
|
||||||
procedure Test.1 (Test.4):
|
procedure Test.1 (Test.4):
|
||||||
let Test.2 = 0u8;
|
let Test.2 = 0u8;
|
||||||
|
joinpoint Test.8 Test.3:
|
||||||
|
ret Test.3;
|
||||||
|
in
|
||||||
switch Test.2:
|
switch Test.2:
|
||||||
case 1:
|
case 1:
|
||||||
let Test.9 = 1i64;
|
let Test.9 = 1i64;
|
||||||
|
@ -711,8 +724,6 @@ mod test_mono {
|
||||||
let Test.11 = 3i64;
|
let Test.11 = 3i64;
|
||||||
jump Test.8 Test.11;
|
jump Test.8 Test.11;
|
||||||
|
|
||||||
joinpoint Test.8 Test.3:
|
|
||||||
ret Test.3;
|
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.6 = Struct {};
|
let Test.6 = Struct {};
|
||||||
|
@ -798,21 +809,20 @@ mod test_mono {
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure Test.1 (Test.4):
|
procedure Test.1 (Test.4):
|
||||||
let Test.22 = 1i64;
|
let Test.18 = 1i64;
|
||||||
let Test.23 = 2i64;
|
let Test.19 = 2i64;
|
||||||
let Test.2 = Ok Test.22 Test.23;
|
let Test.2 = Ok Test.18 Test.19;
|
||||||
let Test.18 = true;
|
joinpoint Test.8 Test.3:
|
||||||
let Test.19 = 1i64;
|
ret Test.3;
|
||||||
let Test.20 = Index 0 Test.2;
|
in
|
||||||
let Test.21 = lowlevel Eq Test.19 Test.20;
|
let Test.15 = 1i64;
|
||||||
let Test.17 = lowlevel And Test.21 Test.18;
|
let Test.16 = Index 0 Test.2;
|
||||||
|
let Test.17 = lowlevel Eq Test.15 Test.16;
|
||||||
if Test.17 then
|
if Test.17 then
|
||||||
let Test.13 = true;
|
let Test.12 = Index 1 Test.2;
|
||||||
let Test.15 = 3i64;
|
let Test.13 = 3i64;
|
||||||
let Test.14 = Index 1 Test.2;
|
let Test.14 = lowlevel Eq Test.13 Test.12;
|
||||||
let Test.16 = lowlevel Eq Test.15 Test.14;
|
if Test.14 then
|
||||||
let Test.12 = lowlevel And Test.16 Test.13;
|
|
||||||
if Test.12 then
|
|
||||||
let Test.9 = 1i64;
|
let Test.9 = 1i64;
|
||||||
jump Test.8 Test.9;
|
jump Test.8 Test.9;
|
||||||
else
|
else
|
||||||
|
@ -821,8 +831,6 @@ mod test_mono {
|
||||||
else
|
else
|
||||||
let Test.11 = 3i64;
|
let Test.11 = 3i64;
|
||||||
jump Test.8 Test.11;
|
jump Test.8 Test.11;
|
||||||
joinpoint Test.8 Test.3:
|
|
||||||
ret Test.3;
|
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.6 = Struct {};
|
let Test.6 = Struct {};
|
||||||
|
@ -901,18 +909,17 @@ mod test_mono {
|
||||||
|
|
||||||
procedure Test.1 (Test.3):
|
procedure Test.1 (Test.3):
|
||||||
let Test.6 = 10i64;
|
let Test.6 = 10i64;
|
||||||
let Test.14 = true;
|
joinpoint Test.8 Test.13:
|
||||||
let Test.10 = 5i64;
|
|
||||||
let Test.9 = CallByName Bool.5 Test.6 Test.10;
|
|
||||||
jump Test.8 Test.9;
|
|
||||||
joinpoint Test.8 Test.15:
|
|
||||||
let Test.13 = lowlevel And Test.15 Test.14;
|
|
||||||
if Test.13 then
|
if Test.13 then
|
||||||
let Test.7 = 0i64;
|
let Test.7 = 0i64;
|
||||||
ret Test.7;
|
ret Test.7;
|
||||||
else
|
else
|
||||||
let Test.12 = 42i64;
|
let Test.12 = 42i64;
|
||||||
ret Test.12;
|
ret Test.12;
|
||||||
|
in
|
||||||
|
let Test.10 = 5i64;
|
||||||
|
let Test.9 = CallByName Bool.5 Test.6 Test.10;
|
||||||
|
jump Test.8 Test.9;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.5 = Struct {};
|
let Test.5 = Struct {};
|
||||||
|
@ -977,11 +984,9 @@ mod test_mono {
|
||||||
r#"
|
r#"
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.2 = 0i64;
|
let Test.2 = 0i64;
|
||||||
let Test.6 = true;
|
let Test.5 = 1i64;
|
||||||
let Test.7 = 1i64;
|
let Test.6 = lowlevel Eq Test.5 Test.2;
|
||||||
let Test.8 = lowlevel Eq Test.7 Test.2;
|
if Test.6 then
|
||||||
let Test.5 = lowlevel And Test.8 Test.6;
|
|
||||||
if Test.5 then
|
|
||||||
let Test.3 = 12i64;
|
let Test.3 = 12i64;
|
||||||
ret Test.3;
|
ret Test.3;
|
||||||
else
|
else
|
||||||
|
@ -1195,6 +1200,71 @@ mod test_mono {
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
|
procedure List.3 (#Attr.2, #Attr.3):
|
||||||
|
let Test.38 = lowlevel ListLen #Attr.2;
|
||||||
|
let Test.34 = lowlevel NumLt #Attr.3 Test.38;
|
||||||
|
if Test.34 then
|
||||||
|
let Test.36 = 1i64;
|
||||||
|
let Test.37 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
|
let Test.35 = Ok Test.36 Test.37;
|
||||||
|
ret Test.35;
|
||||||
|
else
|
||||||
|
let Test.32 = 0i64;
|
||||||
|
let Test.33 = Struct {};
|
||||||
|
let Test.31 = Err Test.32 Test.33;
|
||||||
|
ret Test.31;
|
||||||
|
|
||||||
|
procedure List.4 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
|
let Test.14 = lowlevel ListLen #Attr.2;
|
||||||
|
let Test.12 = lowlevel NumLt #Attr.3 Test.14;
|
||||||
|
if Test.12 then
|
||||||
|
let Test.13 = lowlevel ListSet #Attr.2 #Attr.3 #Attr.4;
|
||||||
|
ret Test.13;
|
||||||
|
else
|
||||||
|
ret #Attr.2;
|
||||||
|
|
||||||
|
procedure Test.1 (Test.2):
|
||||||
|
let Test.39 = 0i64;
|
||||||
|
let Test.28 = CallByName List.3 Test.2 Test.39;
|
||||||
|
let Test.30 = 0i64;
|
||||||
|
let Test.29 = CallByName List.3 Test.2 Test.30;
|
||||||
|
let Test.7 = Struct {Test.28, Test.29};
|
||||||
|
joinpoint Test.25:
|
||||||
|
let Test.18 = Array [];
|
||||||
|
ret Test.18;
|
||||||
|
in
|
||||||
|
let Test.19 = Index 0 Test.7;
|
||||||
|
let Test.20 = 1i64;
|
||||||
|
let Test.21 = Index 0 Test.19;
|
||||||
|
let Test.27 = lowlevel Eq Test.20 Test.21;
|
||||||
|
if Test.27 then
|
||||||
|
let Test.22 = Index 1 Test.7;
|
||||||
|
let Test.23 = 1i64;
|
||||||
|
let Test.24 = Index 0 Test.22;
|
||||||
|
let Test.26 = lowlevel Eq Test.23 Test.24;
|
||||||
|
if Test.26 then
|
||||||
|
let Test.17 = Index 0 Test.7;
|
||||||
|
let Test.3 = Index 1 Test.17;
|
||||||
|
let Test.16 = Index 1 Test.7;
|
||||||
|
let Test.4 = Index 1 Test.16;
|
||||||
|
let Test.15 = 0i64;
|
||||||
|
let Test.9 = CallByName List.4 Test.2 Test.15 Test.4;
|
||||||
|
let Test.10 = 0i64;
|
||||||
|
let Test.8 = CallByName List.4 Test.9 Test.10 Test.3;
|
||||||
|
ret Test.8;
|
||||||
|
else
|
||||||
|
dec Test.2;
|
||||||
|
jump Test.25;
|
||||||
|
else
|
||||||
|
dec Test.2;
|
||||||
|
jump Test.25;
|
||||||
|
|
||||||
|
procedure Test.0 ():
|
||||||
|
let Test.40 = 1i64;
|
||||||
|
let Test.41 = 2i64;
|
||||||
|
let Test.6 = Array [Test.40, Test.41];
|
||||||
|
let Test.5 = CallByName Test.1 Test.6;
|
||||||
|
ret Test.5;
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -1212,7 +1282,7 @@ mod test_mono {
|
||||||
swap = \list ->
|
swap = \list ->
|
||||||
when Pair (List.get list 0) (List.get list 0) is
|
when Pair (List.get list 0) (List.get list 0) is
|
||||||
Pair (Ok atI) (Ok atJ) ->
|
Pair (Ok atI) (Ok atJ) ->
|
||||||
list
|
list
|
||||||
|> List.set 0 atJ
|
|> List.set 0 atJ
|
||||||
|> List.set 0 atI
|
|> List.set 0 atI
|
||||||
|
|
||||||
|
@ -1225,47 +1295,49 @@ mod test_mono {
|
||||||
),
|
),
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure List.3 (#Attr.2, #Attr.3):
|
procedure List.3 (#Attr.2, #Attr.3):
|
||||||
let Test.40 = lowlevel ListLen #Attr.2;
|
let Test.38 = lowlevel ListLen #Attr.2;
|
||||||
let Test.36 = lowlevel NumLt #Attr.3 Test.40;
|
let Test.34 = lowlevel NumLt #Attr.3 Test.38;
|
||||||
if Test.36 then
|
if Test.34 then
|
||||||
let Test.38 = 1i64;
|
let Test.36 = 1i64;
|
||||||
let Test.39 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let Test.37 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
let Test.37 = Ok Test.38 Test.39;
|
let Test.35 = Ok Test.36 Test.37;
|
||||||
ret Test.37;
|
ret Test.35;
|
||||||
else
|
else
|
||||||
let Test.34 = 0i64;
|
|
||||||
let Test.35 = Struct {};
|
|
||||||
let Test.33 = Err Test.34 Test.35;
|
|
||||||
ret Test.33;
|
|
||||||
|
|
||||||
procedure List.4 (#Attr.2, #Attr.3, #Attr.4):
|
|
||||||
let Test.14 = lowlevel ListLen #Attr.2;
|
|
||||||
let Test.12 = lowlevel NumLt #Attr.3 Test.14;
|
|
||||||
if Test.12 then
|
|
||||||
let Test.13 = lowlevel ListSet #Attr.2 #Attr.3 #Attr.4;
|
|
||||||
ret Test.13;
|
|
||||||
else
|
|
||||||
ret #Attr.2;
|
|
||||||
|
|
||||||
procedure Test.1 (Test.2):
|
|
||||||
let Test.41 = 0i64;
|
|
||||||
let Test.30 = CallByName List.3 Test.2 Test.41;
|
|
||||||
let Test.32 = 0i64;
|
let Test.32 = 0i64;
|
||||||
let Test.31 = CallByName List.3 Test.2 Test.32;
|
let Test.33 = Struct {};
|
||||||
let Test.7 = Struct {Test.30, Test.31};
|
let Test.31 = Err Test.32 Test.33;
|
||||||
let Test.20 = true;
|
ret Test.31;
|
||||||
let Test.22 = 1i64;
|
|
||||||
let Test.21 = Index 0 Test.7;
|
procedure List.4 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
let Test.23 = Index 0 Test.21;
|
let Test.14 = lowlevel ListLen #Attr.2;
|
||||||
let Test.29 = lowlevel Eq Test.22 Test.23;
|
let Test.12 = lowlevel NumLt #Attr.3 Test.14;
|
||||||
let Test.27 = lowlevel And Test.29 Test.20;
|
if Test.12 then
|
||||||
let Test.25 = 1i64;
|
let Test.13 = lowlevel ListSet #Attr.2 #Attr.3 #Attr.4;
|
||||||
let Test.24 = Index 1 Test.7;
|
ret Test.13;
|
||||||
let Test.26 = Index 0 Test.24;
|
else
|
||||||
let Test.28 = lowlevel Eq Test.25 Test.26;
|
ret #Attr.2;
|
||||||
let Test.19 = lowlevel And Test.28 Test.27;
|
|
||||||
if Test.19 then
|
procedure Test.1 (Test.2):
|
||||||
|
let Test.39 = 0i64;
|
||||||
|
let Test.28 = CallByName List.3 Test.2 Test.39;
|
||||||
|
let Test.30 = 0i64;
|
||||||
|
let Test.29 = CallByName List.3 Test.2 Test.30;
|
||||||
|
let Test.7 = Struct {Test.28, Test.29};
|
||||||
|
joinpoint Test.25:
|
||||||
|
let Test.18 = Array [];
|
||||||
|
ret Test.18;
|
||||||
|
in
|
||||||
|
let Test.19 = Index 0 Test.7;
|
||||||
|
let Test.20 = 1i64;
|
||||||
|
let Test.21 = Index 0 Test.19;
|
||||||
|
let Test.27 = lowlevel Eq Test.20 Test.21;
|
||||||
|
if Test.27 then
|
||||||
|
let Test.22 = Index 1 Test.7;
|
||||||
|
let Test.23 = 1i64;
|
||||||
|
let Test.24 = Index 0 Test.22;
|
||||||
|
let Test.26 = lowlevel Eq Test.23 Test.24;
|
||||||
|
if Test.26 then
|
||||||
let Test.17 = Index 0 Test.7;
|
let Test.17 = Index 0 Test.7;
|
||||||
let Test.3 = Index 1 Test.17;
|
let Test.3 = Index 1 Test.17;
|
||||||
let Test.16 = Index 1 Test.7;
|
let Test.16 = Index 1 Test.7;
|
||||||
|
@ -1277,15 +1349,17 @@ mod test_mono {
|
||||||
ret Test.8;
|
ret Test.8;
|
||||||
else
|
else
|
||||||
dec Test.2;
|
dec Test.2;
|
||||||
let Test.18 = Array [];
|
jump Test.25;
|
||||||
ret Test.18;
|
else
|
||||||
|
dec Test.2;
|
||||||
|
jump Test.25;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.42 = 1i64;
|
let Test.40 = 1i64;
|
||||||
let Test.43 = 2i64;
|
let Test.41 = 2i64;
|
||||||
let Test.6 = Array [Test.42, Test.43];
|
let Test.6 = Array [Test.40, Test.41];
|
||||||
let Test.5 = CallByName Test.1 Test.6;
|
let Test.5 = CallByName Test.1 Test.6;
|
||||||
ret Test.5;
|
ret Test.5;
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -1430,19 +1504,18 @@ mod test_mono {
|
||||||
ret Test.12;
|
ret Test.12;
|
||||||
|
|
||||||
procedure Test.1 (Test.2, Test.3):
|
procedure Test.1 (Test.2, Test.3):
|
||||||
jump Test.7 Test.2 Test.3;
|
|
||||||
joinpoint Test.7 Test.2 Test.3:
|
joinpoint Test.7 Test.2 Test.3:
|
||||||
let Test.16 = true;
|
let Test.15 = 0i64;
|
||||||
let Test.17 = 0i64;
|
let Test.16 = lowlevel Eq Test.15 Test.2;
|
||||||
let Test.18 = lowlevel Eq Test.17 Test.2;
|
if Test.16 then
|
||||||
let Test.15 = lowlevel And Test.18 Test.16;
|
|
||||||
if Test.15 then
|
|
||||||
ret Test.3;
|
ret Test.3;
|
||||||
else
|
else
|
||||||
let Test.13 = 1i64;
|
let Test.13 = 1i64;
|
||||||
let Test.10 = CallByName Num.15 Test.2 Test.13;
|
let Test.10 = CallByName Num.15 Test.2 Test.13;
|
||||||
let Test.11 = CallByName Num.16 Test.2 Test.3;
|
let Test.11 = CallByName Num.16 Test.2 Test.3;
|
||||||
jump Test.7 Test.10 Test.11;
|
jump Test.7 Test.10 Test.11;
|
||||||
|
in
|
||||||
|
jump Test.7 Test.2 Test.3;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.5 = 10i64;
|
let Test.5 = 10i64;
|
||||||
|
@ -1767,20 +1840,18 @@ mod test_mono {
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
|
let Test.8 = 0i64;
|
||||||
let Test.10 = 0i64;
|
let Test.10 = 0i64;
|
||||||
let Test.12 = 0i64;
|
let Test.12 = 0i64;
|
||||||
let Test.14 = 0i64;
|
let Test.14 = 1i64;
|
||||||
let Test.16 = 1i64;
|
let Test.13 = Z Test.14;
|
||||||
let Test.15 = Z Test.16;
|
|
||||||
let Test.13 = S Test.14 Test.15;
|
|
||||||
let Test.11 = S Test.12 Test.13;
|
let Test.11 = S Test.12 Test.13;
|
||||||
let Test.2 = S Test.10 Test.11;
|
let Test.9 = S Test.10 Test.11;
|
||||||
let Test.6 = true;
|
let Test.2 = S Test.8 Test.9;
|
||||||
let Test.7 = 1i64;
|
let Test.5 = 1i64;
|
||||||
let Test.8 = Index 0 Test.2;
|
let Test.6 = Index 0 Test.2;
|
||||||
let Test.9 = lowlevel Eq Test.7 Test.8;
|
let Test.7 = lowlevel Eq Test.5 Test.6;
|
||||||
let Test.5 = lowlevel And Test.9 Test.6;
|
if Test.7 then
|
||||||
if Test.5 then
|
|
||||||
let Test.3 = 0i64;
|
let Test.3 = 0i64;
|
||||||
ret Test.3;
|
ret Test.3;
|
||||||
else
|
else
|
||||||
|
@ -1810,29 +1881,25 @@ mod test_mono {
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
|
let Test.14 = 0i64;
|
||||||
|
let Test.16 = 0i64;
|
||||||
let Test.18 = 0i64;
|
let Test.18 = 0i64;
|
||||||
let Test.20 = 0i64;
|
let Test.20 = 1i64;
|
||||||
let Test.22 = 0i64;
|
let Test.19 = Z Test.20;
|
||||||
let Test.24 = 1i64;
|
let Test.17 = S Test.18 Test.19;
|
||||||
let Test.23 = Z Test.24;
|
let Test.15 = S Test.16 Test.17;
|
||||||
let Test.21 = S Test.22 Test.23;
|
let Test.2 = S Test.14 Test.15;
|
||||||
let Test.19 = S Test.20 Test.21;
|
let Test.11 = 0i64;
|
||||||
let Test.2 = S Test.18 Test.19;
|
let Test.12 = Index 0 Test.2;
|
||||||
let Test.14 = true;
|
let Test.13 = lowlevel Eq Test.11 Test.12;
|
||||||
let Test.15 = 0i64;
|
|
||||||
let Test.16 = Index 0 Test.2;
|
|
||||||
let Test.17 = lowlevel Eq Test.15 Test.16;
|
|
||||||
let Test.13 = lowlevel And Test.17 Test.14;
|
|
||||||
if Test.13 then
|
if Test.13 then
|
||||||
let Test.8 = true;
|
let Test.7 = Index 1 Test.2;
|
||||||
let Test.10 = 0i64;
|
inc Test.7;
|
||||||
let Test.9 = Index 1 Test.2;
|
let Test.8 = 0i64;
|
||||||
inc Test.9;
|
let Test.9 = Index 0 Test.7;
|
||||||
let Test.11 = Index 0 Test.9;
|
dec Test.7;
|
||||||
dec Test.9;
|
let Test.10 = lowlevel Eq Test.8 Test.9;
|
||||||
let Test.12 = lowlevel Eq Test.10 Test.11;
|
if Test.10 then
|
||||||
let Test.7 = lowlevel And Test.12 Test.8;
|
|
||||||
if Test.7 then
|
|
||||||
let Test.4 = Index 1 Test.2;
|
let Test.4 = Index 1 Test.2;
|
||||||
let Test.3 = 1i64;
|
let Test.3 = 1i64;
|
||||||
ret Test.3;
|
ret Test.3;
|
||||||
|
@ -1872,12 +1939,10 @@ mod test_mono {
|
||||||
ret Test.13;
|
ret Test.13;
|
||||||
|
|
||||||
procedure Test.1 (Test.6):
|
procedure Test.1 (Test.6):
|
||||||
let Test.19 = true;
|
let Test.18 = Index 0 Test.6;
|
||||||
let Test.21 = false;
|
let Test.19 = false;
|
||||||
let Test.20 = Index 0 Test.6;
|
let Test.20 = lowlevel Eq Test.19 Test.18;
|
||||||
let Test.22 = lowlevel Eq Test.21 Test.20;
|
if Test.20 then
|
||||||
let Test.18 = lowlevel And Test.22 Test.19;
|
|
||||||
if Test.18 then
|
|
||||||
let Test.8 = Index 1 Test.6;
|
let Test.8 = Index 1 Test.6;
|
||||||
ret Test.8;
|
ret Test.8;
|
||||||
else
|
else
|
||||||
|
@ -1885,11 +1950,9 @@ mod test_mono {
|
||||||
ret Test.10;
|
ret Test.10;
|
||||||
|
|
||||||
procedure Test.1 (Test.6):
|
procedure Test.1 (Test.6):
|
||||||
let Test.32 = true;
|
let Test.29 = Index 0 Test.6;
|
||||||
let Test.34 = false;
|
let Test.30 = false;
|
||||||
let Test.33 = Index 0 Test.6;
|
let Test.31 = lowlevel Eq Test.30 Test.29;
|
||||||
let Test.35 = lowlevel Eq Test.34 Test.33;
|
|
||||||
let Test.31 = lowlevel And Test.35 Test.32;
|
|
||||||
if Test.31 then
|
if Test.31 then
|
||||||
let Test.8 = 3i64;
|
let Test.8 = 3i64;
|
||||||
ret Test.8;
|
ret Test.8;
|
||||||
|
@ -1898,19 +1961,19 @@ mod test_mono {
|
||||||
ret Test.10;
|
ret Test.10;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.38 = true;
|
let Test.34 = true;
|
||||||
let Test.37 = Struct {Test.38};
|
let Test.33 = Struct {Test.34};
|
||||||
let Test.5 = CallByName Test.1 Test.37;
|
let Test.5 = CallByName Test.1 Test.33;
|
||||||
let Test.36 = false;
|
let Test.32 = false;
|
||||||
let Test.28 = Struct {Test.36};
|
let Test.26 = Struct {Test.32};
|
||||||
let Test.3 = CallByName Test.1 Test.28;
|
let Test.3 = CallByName Test.1 Test.26;
|
||||||
let Test.26 = true;
|
let Test.24 = true;
|
||||||
let Test.27 = 11i64;
|
let Test.25 = 11i64;
|
||||||
let Test.25 = Struct {Test.26, Test.27};
|
let Test.23 = Struct {Test.24, Test.25};
|
||||||
let Test.4 = CallByName Test.1 Test.25;
|
let Test.4 = CallByName Test.1 Test.23;
|
||||||
let Test.23 = false;
|
let Test.21 = false;
|
||||||
let Test.24 = 7i64;
|
let Test.22 = 7i64;
|
||||||
let Test.15 = Struct {Test.23, Test.24};
|
let Test.15 = Struct {Test.21, Test.22};
|
||||||
let Test.2 = CallByName Test.1 Test.15;
|
let Test.2 = CallByName Test.1 Test.15;
|
||||||
let Test.14 = CallByName Num.16 Test.2 Test.3;
|
let Test.14 = CallByName Num.16 Test.2 Test.3;
|
||||||
let Test.12 = CallByName Num.16 Test.14 Test.4;
|
let Test.12 = CallByName Num.16 Test.14 Test.4;
|
||||||
|
@ -1943,30 +2006,33 @@ mod test_mono {
|
||||||
ret Test.6;
|
ret Test.6;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
|
let Test.17 = 0i64;
|
||||||
let Test.19 = 0i64;
|
let Test.19 = 0i64;
|
||||||
let Test.21 = 0i64;
|
let Test.20 = 41i64;
|
||||||
let Test.22 = 41i64;
|
let Test.18 = Just Test.19 Test.20;
|
||||||
let Test.20 = Just Test.21 Test.22;
|
let Test.2 = Just Test.17 Test.18;
|
||||||
let Test.2 = Just Test.19 Test.20;
|
joinpoint Test.14:
|
||||||
let Test.10 = true;
|
|
||||||
let Test.12 = 0i64;
|
|
||||||
let Test.11 = Index 1 Test.2;
|
|
||||||
let Test.13 = Index 0 Test.11;
|
|
||||||
let Test.18 = lowlevel Eq Test.12 Test.13;
|
|
||||||
let Test.16 = lowlevel And Test.18 Test.10;
|
|
||||||
let Test.14 = 0i64;
|
|
||||||
let Test.15 = Index 0 Test.2;
|
|
||||||
let Test.17 = lowlevel Eq Test.14 Test.15;
|
|
||||||
let Test.9 = lowlevel And Test.17 Test.16;
|
|
||||||
if Test.9 then
|
|
||||||
let Test.7 = Index 1 Test.2;
|
|
||||||
let Test.3 = Index 1 Test.7;
|
|
||||||
let Test.5 = 1i64;
|
|
||||||
let Test.4 = CallByName Num.14 Test.3 Test.5;
|
|
||||||
ret Test.4;
|
|
||||||
else
|
|
||||||
let Test.8 = 1i64;
|
let Test.8 = 1i64;
|
||||||
ret Test.8;
|
ret Test.8;
|
||||||
|
in
|
||||||
|
let Test.9 = Index 1 Test.2;
|
||||||
|
let Test.10 = 0i64;
|
||||||
|
let Test.11 = Index 0 Test.9;
|
||||||
|
let Test.16 = lowlevel Eq Test.10 Test.11;
|
||||||
|
if Test.16 then
|
||||||
|
let Test.12 = 0i64;
|
||||||
|
let Test.13 = Index 0 Test.2;
|
||||||
|
let Test.15 = lowlevel Eq Test.12 Test.13;
|
||||||
|
if Test.15 then
|
||||||
|
let Test.7 = Index 1 Test.2;
|
||||||
|
let Test.3 = Index 1 Test.7;
|
||||||
|
let Test.5 = 1i64;
|
||||||
|
let Test.4 = CallByName Num.14 Test.3 Test.5;
|
||||||
|
ret Test.4;
|
||||||
|
else
|
||||||
|
jump Test.14;
|
||||||
|
else
|
||||||
|
jump Test.14;
|
||||||
"#
|
"#
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -2055,18 +2121,18 @@ mod test_mono {
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
procedure List.3 (#Attr.2, #Attr.3):
|
procedure List.3 (#Attr.2, #Attr.3):
|
||||||
let Test.42 = lowlevel ListLen #Attr.2;
|
let Test.40 = lowlevel ListLen #Attr.2;
|
||||||
let Test.38 = lowlevel NumLt #Attr.3 Test.42;
|
let Test.36 = lowlevel NumLt #Attr.3 Test.40;
|
||||||
if Test.38 then
|
if Test.36 then
|
||||||
let Test.40 = 1i64;
|
let Test.38 = 1i64;
|
||||||
let Test.41 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
let Test.39 = lowlevel ListGetUnsafe #Attr.2 #Attr.3;
|
||||||
let Test.39 = Ok Test.40 Test.41;
|
let Test.37 = Ok Test.38 Test.39;
|
||||||
ret Test.39;
|
ret Test.37;
|
||||||
else
|
else
|
||||||
let Test.36 = 0i64;
|
let Test.34 = 0i64;
|
||||||
let Test.37 = Struct {};
|
let Test.35 = Struct {};
|
||||||
let Test.35 = Err Test.36 Test.37;
|
let Test.33 = Err Test.34 Test.35;
|
||||||
ret Test.35;
|
ret Test.33;
|
||||||
|
|
||||||
procedure List.4 (#Attr.2, #Attr.3, #Attr.4):
|
procedure List.4 (#Attr.2, #Attr.3, #Attr.4):
|
||||||
let Test.18 = lowlevel ListLen #Attr.2;
|
let Test.18 = lowlevel ListLen #Attr.2;
|
||||||
|
@ -2078,38 +2144,42 @@ mod test_mono {
|
||||||
ret #Attr.2;
|
ret #Attr.2;
|
||||||
|
|
||||||
procedure Test.1 (Test.2, Test.3, Test.4):
|
procedure Test.1 (Test.2, Test.3, Test.4):
|
||||||
let Test.33 = CallByName List.3 Test.4 Test.2;
|
let Test.31 = CallByName List.3 Test.4 Test.2;
|
||||||
let Test.34 = CallByName List.3 Test.4 Test.3;
|
let Test.32 = CallByName List.3 Test.4 Test.3;
|
||||||
let Test.12 = Struct {Test.33, Test.34};
|
let Test.12 = Struct {Test.31, Test.32};
|
||||||
let Test.23 = true;
|
joinpoint Test.28:
|
||||||
let Test.25 = 1i64;
|
|
||||||
let Test.24 = Index 0 Test.12;
|
|
||||||
let Test.26 = Index 0 Test.24;
|
|
||||||
let Test.32 = lowlevel Eq Test.25 Test.26;
|
|
||||||
let Test.30 = lowlevel And Test.32 Test.23;
|
|
||||||
let Test.28 = 1i64;
|
|
||||||
let Test.27 = Index 1 Test.12;
|
|
||||||
let Test.29 = Index 0 Test.27;
|
|
||||||
let Test.31 = lowlevel Eq Test.28 Test.29;
|
|
||||||
let Test.22 = lowlevel And Test.31 Test.30;
|
|
||||||
if Test.22 then
|
|
||||||
let Test.20 = Index 0 Test.12;
|
|
||||||
let Test.5 = Index 1 Test.20;
|
|
||||||
let Test.19 = Index 1 Test.12;
|
|
||||||
let Test.6 = Index 1 Test.19;
|
|
||||||
let Test.14 = CallByName List.4 Test.4 Test.2 Test.6;
|
|
||||||
let Test.13 = CallByName List.4 Test.14 Test.3 Test.5;
|
|
||||||
ret Test.13;
|
|
||||||
else
|
|
||||||
dec Test.4;
|
|
||||||
let Test.21 = Array [];
|
let Test.21 = Array [];
|
||||||
ret Test.21;
|
ret Test.21;
|
||||||
|
in
|
||||||
|
let Test.22 = Index 0 Test.12;
|
||||||
|
let Test.23 = 1i64;
|
||||||
|
let Test.24 = Index 0 Test.22;
|
||||||
|
let Test.30 = lowlevel Eq Test.23 Test.24;
|
||||||
|
if Test.30 then
|
||||||
|
let Test.25 = Index 1 Test.12;
|
||||||
|
let Test.26 = 1i64;
|
||||||
|
let Test.27 = Index 0 Test.25;
|
||||||
|
let Test.29 = lowlevel Eq Test.26 Test.27;
|
||||||
|
if Test.29 then
|
||||||
|
let Test.20 = Index 0 Test.12;
|
||||||
|
let Test.5 = Index 1 Test.20;
|
||||||
|
let Test.19 = Index 1 Test.12;
|
||||||
|
let Test.6 = Index 1 Test.19;
|
||||||
|
let Test.14 = CallByName List.4 Test.4 Test.2 Test.6;
|
||||||
|
let Test.13 = CallByName List.4 Test.14 Test.3 Test.5;
|
||||||
|
ret Test.13;
|
||||||
|
else
|
||||||
|
dec Test.4;
|
||||||
|
jump Test.28;
|
||||||
|
else
|
||||||
|
dec Test.4;
|
||||||
|
jump Test.28;
|
||||||
|
|
||||||
procedure Test.0 ():
|
procedure Test.0 ():
|
||||||
let Test.9 = 0i64;
|
let Test.9 = 0i64;
|
||||||
let Test.10 = 0i64;
|
let Test.10 = 0i64;
|
||||||
let Test.43 = 1i64;
|
let Test.41 = 1i64;
|
||||||
let Test.11 = Array [Test.43];
|
let Test.11 = Array [Test.41];
|
||||||
let Test.8 = CallByName Test.1 Test.9 Test.10 Test.11;
|
let Test.8 = CallByName Test.1 Test.9 Test.10 Test.11;
|
||||||
ret Test.8;
|
ret Test.8;
|
||||||
"#
|
"#
|
||||||
|
@ -2193,7 +2263,7 @@ mod test_mono {
|
||||||
f = \{} -> x
|
f = \{} -> x
|
||||||
f
|
f
|
||||||
|
|
||||||
main =
|
main =
|
||||||
f = foo {}
|
f = foo {}
|
||||||
f {}
|
f {}
|
||||||
"#
|
"#
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue