mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 19:58:18 +00:00
Decision tree compilation of list patterns
This commit is contained in:
parent
da1d937277
commit
ae71c7efe2
7 changed files with 479 additions and 38 deletions
67
crates/compiler/test_mono/generated/match_list.txt
Normal file
67
crates/compiler/test_mono/generated/match_list.txt
Normal file
|
@ -0,0 +1,67 @@
|
|||
procedure Test.0 ():
|
||||
let Test.42 : Int1 = false;
|
||||
let Test.43 : Int1 = true;
|
||||
let Test.1 : List Int1 = Array [Test.42, Test.43];
|
||||
joinpoint Test.16:
|
||||
let Test.8 : Str = "E";
|
||||
ret Test.8;
|
||||
in
|
||||
joinpoint Test.10:
|
||||
let Test.5 : Str = "B";
|
||||
ret Test.5;
|
||||
in
|
||||
let Test.39 : U64 = lowlevel ListLen Test.1;
|
||||
let Test.40 : U64 = 0i64;
|
||||
let Test.41 : Int1 = lowlevel Eq Test.39 Test.40;
|
||||
if Test.41 then
|
||||
dec Test.1;
|
||||
let Test.4 : Str = "A";
|
||||
ret Test.4;
|
||||
else
|
||||
let Test.36 : U64 = lowlevel ListLen Test.1;
|
||||
let Test.37 : U64 = 1i64;
|
||||
let Test.38 : Int1 = lowlevel Eq Test.36 Test.37;
|
||||
if Test.38 then
|
||||
let Test.17 : U64 = 0i64;
|
||||
let Test.18 : Int1 = lowlevel ListGetUnsafe Test.1 Test.17;
|
||||
let Test.19 : Int1 = false;
|
||||
let Test.20 : Int1 = lowlevel Eq Test.19 Test.1;
|
||||
dec Test.1;
|
||||
if Test.20 then
|
||||
jump Test.10;
|
||||
else
|
||||
jump Test.16;
|
||||
else
|
||||
let Test.33 : U64 = lowlevel ListLen Test.1;
|
||||
let Test.34 : U64 = 2i64;
|
||||
let Test.35 : Int1 = lowlevel NumGte Test.33 Test.34;
|
||||
if Test.35 then
|
||||
let Test.25 : U64 = 0i64;
|
||||
let Test.26 : Int1 = lowlevel ListGetUnsafe Test.1 Test.25;
|
||||
let Test.27 : Int1 = false;
|
||||
let Test.28 : Int1 = lowlevel Eq Test.27 Test.1;
|
||||
if Test.28 then
|
||||
let Test.21 : U64 = 1i64;
|
||||
let Test.22 : Int1 = lowlevel ListGetUnsafe Test.1 Test.21;
|
||||
let Test.23 : Int1 = false;
|
||||
let Test.24 : Int1 = lowlevel Eq Test.23 Test.1;
|
||||
dec Test.1;
|
||||
if Test.24 then
|
||||
let Test.6 : Str = "C";
|
||||
ret Test.6;
|
||||
else
|
||||
let Test.7 : Str = "D";
|
||||
ret Test.7;
|
||||
else
|
||||
dec Test.1;
|
||||
jump Test.16;
|
||||
else
|
||||
let Test.29 : U64 = 0i64;
|
||||
let Test.30 : Int1 = lowlevel ListGetUnsafe Test.1 Test.29;
|
||||
let Test.31 : Int1 = false;
|
||||
let Test.32 : Int1 = lowlevel Eq Test.31 Test.1;
|
||||
dec Test.1;
|
||||
if Test.32 then
|
||||
jump Test.10;
|
||||
else
|
||||
jump Test.16;
|
|
@ -2000,3 +2000,19 @@ fn unreachable_branch_is_eliminated_but_produces_lambda_specializations() {
|
|||
"#
|
||||
)
|
||||
}
|
||||
|
||||
#[mono_test]
|
||||
fn match_list() {
|
||||
indoc!(
|
||||
r#"
|
||||
l = [A, B]
|
||||
|
||||
when l is
|
||||
[] -> "A"
|
||||
[A] -> "B"
|
||||
[A, A, ..] -> "C"
|
||||
[A, B, ..] -> "D"
|
||||
[B, ..] -> "E"
|
||||
"#
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue