Commit graph

6920 commits

Author SHA1 Message Date
Jan Van Bruggen
29303c4ba4 Add some missing exposures to docs 2022-01-23 12:38:39 -05:00
Jan Van Bruggen
7b22b42a8f Fix args order in some docs
These changes reflect the builtins as they're currently implemented, but I wish that instead they worked as (previously) described. Should this PR be abandoned in favor of an actual argument swap?
2022-01-23 12:37:36 -05:00
ayazhafiz
095204ec7a Fix can tests 2022-01-23 12:35:31 -05:00
ayazhafiz
0eede1cd86 Generate unique symbols for shadowing identifiers
This code has a shadowing error:

```
b = False
f = \b -> b
f b
```

but prior to this commit, the compiler would hit an internal error
during monomorphization and not even get to report the error. The reason
was that when we entered the closure `\b -> b`, we would try to
introduce the identifier `b` to the scope, see that it shadows an
existing identifier, and not insert the identifier. But this meant that
when checking the body of `\b -> b`, we would think that we captured the
value `b` in the outer scope, but that's incorrect!

The present patch fixes the issue by generating new symbols for
shadowing identifiers, so deeper scopes pick up the correct reference.
This also means in the future we may be able to compile and execute code
with shadows, even though it will still be an error.

Closes #2343
2022-01-23 12:35:31 -05:00
Folkert
6545968c34 import UserApp's provided types into the Package-Config module 2022-01-23 18:33:50 +01:00
ayazhafiz
3692b38447 Disable wasm tests for now 2022-01-23 12:33:22 -05:00
ayazhafiz
b2f2fcd6a8 Collect tags from extension variables during monomorphization
Fixes #2365
2022-01-23 12:33:22 -05:00
Richard Feldman
4fadc775e8 Add parse tests snapshot 2022-01-23 12:20:35 -05:00
Richard Feldman
1ab621dd54 Support optional spaces in app header types 2022-01-23 12:02:34 -05:00
Richard Feldman
01942fd98e Parse app header provided types 2022-01-23 11:52:59 -05:00
Richard Feldman
c1c0ffb25f Use UppercaseIdent over PlatformRigids 2022-01-23 11:13:23 -05:00
Richard Feldman
620e3f2913 parse tests for provided/required types in module headers 2022-01-23 10:11:17 -05:00
Folkert
8698ea3c72 update mono tests 2022-01-23 15:46:53 +01:00
Folkert
fbf3ba77e9 fix debug impl 2022-01-23 15:44:42 +01:00
Richard Feldman
b42cc3d625
Merge pull request #2392 from rtfeldman/tag-join-points
Improve code gen of tags in join points
2022-01-22 22:42:22 -05:00
Richard Feldman
638c56442c
Delete commented-out line 2022-01-22 22:41:41 -05:00
Richard Feldman
0e8d20418a
Merge pull request #2387 from rtfeldman/add_builtins_Num.minmaxIU816
Add `Num.(min/max)(I/U)(8/16)` builtins
2022-01-22 22:40:35 -05:00
Folkert
38b03282fd working version of joinpoints with phi nodes 2022-01-23 00:46:32 +01:00
Folkert
7baec2b201 make tag allocas at the function entry point block 2022-01-23 00:21:18 +01:00
ayazhafiz
48a3e871e8 Report self-recursive aliases at their declaration site, not in usages
Closes #2380
2022-01-22 14:26:32 -05:00
Jan Van Bruggen
14ef9be3d2 Sort Num.(min/max)* builtin symbol defs 2022-01-22 00:19:17 -07:00
Jan Van Bruggen
9a8a4c6ed7 Add Num.(min/max)(I/U)(8/16) builtins 2022-01-22 00:19:17 -07:00
Jan Van Bruggen
38f0a3717f Extract repeated min/max logic 2022-01-22 00:00:29 -07:00
Folkert
2c139100ca fix big error 2022-01-21 23:30:04 +01:00
Eric Newbury
7919cd9fee add test 2022-01-21 17:08:43 -05:00
Eric Newbury
a96d5e6abf Merge branch 'trunk' into enewbury/list-sort-desc 2022-01-21 17:06:52 -05:00
Eric Newbury
7e7104d9ba WIP 2022-01-21 16:46:47 -05:00
Eric Newbury
05c01a81f5 adding List.sortAsc builtin 2022-01-21 15:34:24 -05:00
Folkert de Vries
c0ea664141
Merge pull request #2375 from rtfeldman/expression-monomorphization-inlined
Monomorphize polymorphic non-function values
2022-01-21 20:10:42 +01:00
Brian Carroll
992105930b
Merge pull request #2363 from rtfeldman/wasm-refactor-lowlevels
Wasm: refactor low-level ops
2022-01-21 07:16:45 +00:00
Richard Feldman
83f12b6e53
Merge pull request #2361 from rtfeldman/cleanup_builtins_Num.minmaxI128
Remove leftover TODOs from #2354
2022-01-20 18:21:29 -05:00
Richard Feldman
eacbb956cf
Merge pull request #2360 from rtfeldman/builtins-using-builtins
using builtins from builtins
2022-01-20 18:20:50 -05:00
ayazhafiz
b281ea8c2c Make var_contains_content a loop 2022-01-20 18:09:04 -05:00
ayazhafiz
53be0e2674 Reduce visibility of partial exprs 2022-01-20 17:56:43 -05:00
ayazhafiz
25db1189af Monomorphize expressions in refcount test 2022-01-20 10:23:13 -05:00
Brian Hicks
f2ae02213a remove deprecated symbols and reorder remainder 2022-01-20 08:29:30 -06:00
Folkert de Vries
82c7e8c37e
Merge pull request #2372 from rtfeldman/effect-forever
Add `Effect.forever`
2022-01-20 09:16:32 +01:00
ayazhafiz
e7e2fa063f Specialize polymorphic values in record updates 2022-01-20 01:23:31 -05:00
ayazhafiz
8fd139ba67 Handle unspecialized symbols captured in closures 2022-01-20 00:34:11 -05:00
Richard Feldman
6d8277ad8d
Merge pull request #2367 from rtfeldman/remove_Num.minmaxInt
Remove `Num.(min/max)Int`
2022-01-20 00:19:44 -05:00
ayazhafiz
649695f6e3 Fix wasm refcount tests 2022-01-19 23:21:29 -05:00
ayazhafiz
ae104c3791 Elide unnecessary lifetimes 2022-01-19 23:16:48 -05:00
ayazhafiz
a5de224626 Specialize polymorphic non-function expressions
This commit fixes a long-standing bug wherein bindings to polymorphic,
non-function expressions would be lowered at binding site, rather than
being specialized at the call site.

Concretely, consider the program

```
main =
    n = 1

    idU8 : U8 -> U8
    idU8 = \m -> m

    idU8 n
```

Prior to this commit, we would lower `n = 1` as part of the IR, and the
`n` at the call site `idU8 n` would reference the lowered definition.
However, at the definition site, `1` has the polymorphic type `Num *` -
it is not until the the call site that we are able to refine the type
bound by `n`, but at that point it's too late. Since the default layout
for `Num *` is a signed 64-bit int, we would generate IR like

```
procedure main():
    let App.n : Builtin(Int(I64)) = 1i64;
    ...
    let App.5 : Builtin(Int(U8)) = CallByName Add.idU8 App.n;
    ret App.5;
```

But we know `idU8` expects a `u8`; giving it an `i64` is nonsense.
Indeed this would trigger LLVM miscompilations later on.

To remedy this, we now keep a sidecar table that maps symbols to the
polymorphic expression they reference, when they do so. We then
specialize references to symbols on the fly at usage sites, similar to
how we specialize function usages.

Looking at our example, the definition `n = 1` is now never lowered to
the IR directly. We only generate code for `1` at each place `n` is
referenced. As a larger example, you can imagine that

```
main =
    n = 1

    asU8 : U8 -> U8
    asU32 : U32 -> U8

    asU8 n + asU32 n
```

is lowered to the moral equivalent of

```
main =
    asU8 : U8 -> U8
    asU32 : U32 -> U8

    asU8 1 + asU32 1
```

Moreover, transient usages of polymorphic expressions are lowered
successfully with this approach. See for example the
`monomorphized_tag_with_polymorphic_arg_and_monomorphic_arg` test in
this commit, which checks that

```
main =
    mono : U8
    mono = 15
    poly = A
    wrap = Wrapped poly mono

    useWrap1 : [Wrapped [A] U8, Other] -> U8
    useWrap1 =
        \w -> when w is
            Wrapped A n -> n
            Other -> 0

    useWrap2 : [Wrapped [A, B] U8] -> U8
    useWrap2 =
        \w -> when w is
            Wrapped A n -> n
            Wrapped B _ -> 0

    useWrap1 wrap * useWrap2 wrap
```

has proper code generated for it, in the presence of the polymorphic
`wrap` which references the polymorphic `poly`.

https://github.com/rtfeldman/roc/pull/2347 had a different approach to
this - polymorphic expressions would be converted to (possibly capturing) thunks.
This has the benefit of reducing code size if there are many polymorphic
usages, but may make the generated code slower and makes integration
with the existing IR implementation harder. In practice I think the
average number of polymorphic usages of an expression will be very
small.

Closes https://github.com/rtfeldman/roc/issues/2336
Closes https://github.com/rtfeldman/roc/issues/2254
Closes https://github.com/rtfeldman/roc/issues/2344
2022-01-19 22:52:15 -05:00
ayazhafiz
3342090e7b Add var_contains_content conditional function to Subs
This function checks for the existence of a content of a certain shape
on a content, or any its deep children.
2022-01-19 22:51:15 -05:00
Folkert
202a8438ce change UserApp -> Test in mono tests 2022-01-19 23:22:19 +01:00
Folkert
72e883a20b make symbol debug formatting consistent 2022-01-19 23:21:18 +01:00
Folkert
ee4c2177c0 add annotation for Effect.loop 2022-01-19 23:13:34 +01:00
Folkert
5230c6f6f3 implement Effect.loop 2022-01-19 23:06:32 +01:00
Folkert
2adcbecf8a update mono tests 2022-01-19 21:01:18 +01:00
Folkert
fbab19a937 custom debug instance for LambdaSet
so that symbols are printed as their numbers; makes mono tests reliable
2022-01-19 20:57:36 +01:00