-
Notifications
You must be signed in to change notification settings - Fork 76
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve unboxing during cmm for Flambda #295
Conversation
7079df6
to
b543137
Compare
Do we need all that machinery ? Your example gets unboxed as expected with Closure, so I would expect that the solution would be to add value_kind annotations on Flambda lets. Do you have other examples that benefit from the extra annotations, in particular with Closure ? |
(Disclaimer: I'm familiar with the idea of this PR, but haven't read the code yet)
Trying to ensure that all I think it should be possible to produce some examples that don't unbox on closure without this PR. They aren't going to be common pieces of code though. Something like: module Foo : sig
type t
val create : unit -> t
val add : t -> t -> t
end = struct
type t = float
let create () = 0.0
let add = (+.)
end
type _ foo_or_float =
| Foo : Foo.t foo_or_float
| Float : float foo_or_float
let bar (type a) p (witness : a foo_or_float) (x : float) (y : float) : a =
let z : a =
match witness with
| Foo -> Foo.create ()
| Float ->
if p then x +. y
else y
in
match witness with
| Foo -> Foo.add z z
| Float -> z +. z I would expect |
I'm not completely convinced that it makes sense to spend time reviewing such a big patch when Flambda 2 already does the job correctly, but at least I understand why this patch is useful, thanks. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Most of this looks good, but I think the changes in cmmgen.ml are much more invasive than they need to be.
9cb7d4c
to
819b3d6
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is looking pretty good, just a few small things to address.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me.
33fbb42
to
03f5b03
Compare
1269762
to
0c8d2eb
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've looked over the latest changes, and also noticed an issue based on a discussion with @Gbury.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approving for the Flambda 2 parts.
The kinds in To_cmm_helpers
are dubious, but they're never used and as noted in To_cmm
, the Cmm terms generated here never return anything unless it's a function return anyway.
5a29f0e
to
ababce8
Compare
first version Remove unneeded changes from ocaml/ make fmt Fix tests Fix wrong kinds in lambda/ Move valuekind in the type switch for flambda Changed handling of [kind] inside backend More precise value_kind in translmod Add a value_kind on catch Fill a dummy value_kind in parsecmm Fix tests Code review ocamlformat Fix tests VVal -> Vval Fix tests Makes comprehension lists works Code review [Pseqor] and [Pseqand] are returning a Pintval
ababce8
to
7766f1f
Compare
64235a382a flambda-backend: Change Float.nan from sNaN to qNaN (ocaml-flambda#466) 14a8e27063 flambda-backend: Track GC work for all managed bigarray allocations (upstream 11022) (ocaml-flambda#569) c3cda96154 flambda-backend: Add two new methods to targetint for dwarf (ocaml-flambda#560) e6f1fed2f5 flambda-backend: Handle arithmetic overflow in select_addr (ocaml-flambda#570) dab7209a12 flambda-backend: Add Target_system to ocaml/utils (ocaml-flambda#542) 82d5044871 flambda-backend: Enhance numbers.ml with more primitive types (ocaml-flambda#544) 216be99334 flambda-backend: Fix flambda_o3 and flambda_oclassic attributes (ocaml-flambda#536) 4b56e07c1d flambda-backend: Test naked pointer root handling (ocaml-flambda#550) 40d69cef86 flambda-backend: Stop local function optimisation from moving code into function bodies; opaque_identity fixes for class compilation (ocaml-flambda#537) f08ae5851c flambda-backend: Implemented inlining history and use it inside inlining reports (ocaml-flambda#365) ac496bf52e flambda-backend: Disable the local keyword in typing (ocaml-flambda#540) 7d46712f7a flambda-backend: Bugfix for Typedtree generation of arrow types (ocaml-flambda#539) 61a7b47773 flambda-backend: Insert missing page table check in roots_nat.c (ocaml-flambda#541) 323bd36d98 flambda-backend: Compiler error when -disable-all-extensions and -extension are used (ocaml-flambda#534) d8956b09e4 flambda-backend: Persistent environment and reproducibility (ocaml-flambda#533) 4a0c89f117 flambda-backend: Revert "Revert bswap PRs (480 and 482)" (ocaml-flambda#506) 7803705828 flambda-backend: Cause a C warning when CAMLreturn is missing in C stubs. (ocaml-flambda#376) 6199db5b26 flambda-backend: Improve unboxing during cmm for Flambda (ocaml-flambda#295) 96b9e1ba6d flambda-backend: Print diagnostics at runtime for Invalid (ocaml-flambda#530) 42ab88e8a1 flambda-backend: Disable bytecode compilers in ocamltest (ocaml-flambda#504) 58c72d5476 flambda-backend: Backport ocaml/ocaml#10595 from upstream/trunk (ocaml-flambda#471) 10105394de flambda-backend: Use C++ name mangling convention (ocaml-flambda#483) 81881bbf88 flambda-backend: Local allocation test no longer relies on lifting (ocaml-flambda#525) f5c47190f6 flambda-backend: Fix an assertion in Closure that breaks probes (ocaml-flambda#505) c2cf2b2a14 flambda-backend: Add some missing command line arguments to ocamlnat (ocaml-flambda#499) git-subtree-dir: ocaml git-subtree-split: 64235a382a0424cced40eed328ddf1dfb9645f87
64235a382a flambda-backend: Change Float.nan from sNaN to qNaN (#466) 14a8e27063 flambda-backend: Track GC work for all managed bigarray allocations (upstream 11022) (#569) c3cda96154 flambda-backend: Add two new methods to targetint for dwarf (#560) e6f1fed2f5 flambda-backend: Handle arithmetic overflow in select_addr (#570) dab7209a12 flambda-backend: Add Target_system to ocaml/utils (#542) 82d5044871 flambda-backend: Enhance numbers.ml with more primitive types (#544) 216be99334 flambda-backend: Fix flambda_o3 and flambda_oclassic attributes (#536) 4b56e07c1d flambda-backend: Test naked pointer root handling (#550) 40d69cef86 flambda-backend: Stop local function optimisation from moving code into function bodies; opaque_identity fixes for class compilation (#537) f08ae5851c flambda-backend: Implemented inlining history and use it inside inlining reports (#365) ac496bf52e flambda-backend: Disable the local keyword in typing (#540) 7d46712f7a flambda-backend: Bugfix for Typedtree generation of arrow types (#539) 61a7b47773 flambda-backend: Insert missing page table check in roots_nat.c (#541) 323bd36d98 flambda-backend: Compiler error when -disable-all-extensions and -extension are used (#534) d8956b09e4 flambda-backend: Persistent environment and reproducibility (#533) 4a0c89f117 flambda-backend: Revert "Revert bswap PRs (480 and 482)" (#506) 7803705828 flambda-backend: Cause a C warning when CAMLreturn is missing in C stubs. (#376) 6199db5b26 flambda-backend: Improve unboxing during cmm for Flambda (#295) 96b9e1ba6d flambda-backend: Print diagnostics at runtime for Invalid (#530) 42ab88e8a1 flambda-backend: Disable bytecode compilers in ocamltest (#504) 58c72d5476 flambda-backend: Backport ocaml/ocaml#10595 from upstream/trunk (#471) 10105394de flambda-backend: Use C++ name mangling convention (#483) 81881bbf88 flambda-backend: Local allocation test no longer relies on lifting (#525) f5c47190f6 flambda-backend: Fix an assertion in Closure that breaks probes (#505) c2cf2b2a14 flambda-backend: Add some missing command line arguments to ocamlnat (#499) git-subtree-dir: ocaml git-subtree-split: 64235a382a0424cced40eed328ddf1dfb9645f87
5b98caf9d flambda-backend: Revert "Restructure LIBDIR" (ocaml-flambda#1093) 46f1b16d7 flambda-backend: Remove a stray character from dynlink Makefile (ocaml-flambda#1090) e5154424a flambda-backend: Restructure LIBDIR: Move Dynlink, Str and Unix to sub-directories (port PR#11198) (ocaml-flambda#895) 9307e7c50 flambda-backend: inline fast path of caml_applyN (ocaml-flambda#934) 3244386e6 flambda-backend: Bump magic numbers (ocaml-flambda#1077) 7c9e15d2c flambda-backend: Fix bug in arguments to `get_unit_info` (ocaml-flambda#1069) a2f4c9e07 flambda-backend: Closure rename static catch (ocaml-flambda#1070) 2ee705a5b flambda-backend: Backport ocaml-flambda#946 to ocaml/ subfolder (ocaml-flambda#1061) 569703fb6 flambda-backend: Merge ocaml-jst#97 (ocaml-flambda#1063) 7b1779a77 flambda-backend: Port value_kind changes to testsuite/tools to fix parsecmm.mly (ocaml-flambda#1060) 49505d183 flambda-backend: Bugfix for Ctype.nondep_type (ocaml-flambda#1059) 654c63cf7 flambda-backend: Backport ocaml-flambda#295 kind changes to ocaml/ subfolder (ocaml-flambda#1018) 50a9ce0bf flambda-backend: Fix extern_closure_up_to_env (ocaml-flambda#1053) bc2c78d2e flambda-backend: Remove obsolete pack-related code (ocaml-flambda#1051) 872ff3818 flambda-backend: Fix error-prone syntax resulting from reformatting (ocaml-flambda#1050) d03b346cf flambda-backend: Fix different .cmi files being produced by ocamlopt and ocamlc when using -pack (ocaml-flambda#1049) 90ee37b48 flambda-backend: Revert "Revert "Use Import_info.t in Cmt_format"" (ocaml-flambda#1045) ac12d9072 flambda-backend: Fix version number (ocaml-flambda#1043) 75e01541e flambda-backend: Revert "Use Import_info.t in Cmt_format" (ocaml-flambda#1042) ecab74c38 flambda-backend: Use Import_info.t in Cmt_format (ocaml-flambda#1037) 7661d4d47 flambda-backend: Bootstrap 1098a56c6 flambda-backend: Update .depend files a7292dae2 flambda-backend: Revert ocaml/toplevel/native/dune 758447903 flambda-backend: Remove alloc-check from ocaml/ git-subtree-dir: ocaml git-subtree-split: 5b98caf9dfd647d1b2b031a0d5cb5a45d52ac207
77434f02e flambda-backend: Bump magic numbers for 4.14.1-5 (ocaml-flambda#1190) 3a78e83c9 flambda-backend: Revert "Instance compilation units" (ocaml-flambda#1175) 9a683c928 flambda-backend: Move compute_layout to Lambda (ocaml-flambda#1167) 0ea58e9a3 flambda-backend: Revert "Add a proper top and bottom layout" (ocaml-flambda#1169) 1e5e23a1b flambda-backend: Add hint for common misplaced [@unboxed] attribute (ocaml-flambda#1164) 10f870ac9 flambda-backend: Add a proper top and bottom layout (ocaml-flambda#1158) d1be56335 flambda-backend: Don't warn about misplaced attributes in -i mode (ocaml-flambda#1163) feefcaac8 flambda-backend: Remove immutable arrays from stdlib.ml and stdlib.mli (ocaml-flambda#1154) ba101be42 flambda-backend: Shrink the ref_table if it grows large (ocaml-flambda#1156) 777fda7b9 flambda-backend: Preserve backtraces from failing `Lazy_backtrack` computations (ocaml-flambda#805) 56d014e05 flambda-backend: Remove remaining `layout_top` after ocaml-flambda#1084 (ocaml-flambda#1138) dc1c1ce89 flambda-backend: Layouts for parameters in lambda & remove most layout_top (ocaml-flambda#1084) 49fea7805 flambda-backend: Instance compilation units (ocaml-flambda#1113) 1127fd2f8 flambda-backend: Merge pull request ocaml-flambda#1143 from riaqn/merge-ocaml-jst f458733c8 flambda-backend: fix things after merge b43d38509 flambda-backend: File magic updates (ocaml-flambda#306) 9f604aaea flambda-backend: Merge ocaml-jst 1f5461386 flambda-backend: More assertions for local alloc and letrec (ocaml-flambda#1081) 0c95280ab flambda-backend: Remove most layout_top in closure (ocaml-flambda#1127) 8ad48b5b3 flambda-backend: Use only `.ocamlformat*` to enable or disable ocamlformat (ocaml-flambda#1135) 1aa2885a0 flambda-backend: Build all boot targets in `make hacking` (ocaml-flambda#1133) 6b6c25a85 flambda-backend: Hide `Compilation_unit.t`'s definition in a submodule (ocaml-flambda#1134) 529d66b6f flambda-backend: Compile refactor (ocaml-flambda#1096) df798c1c9 flambda-backend: Propagates layouts through Flambda1 (ocaml-flambda#1115) 9bce50be5 flambda-backend: Add `gc-timings` to collect timing information from the GC (ocaml-flambda#1089) d431d3b83 flambda-backend: Use the type of primitive declarations to make their layout (ocaml-flambda#1118) 8da887e0f flambda-backend: Changes to arity in clambda (ocaml-flambda#1106) db20e9724 flambda-backend: Fix simplify-exits (ocaml-flambda#1108) 6a63906ee flambda-backend: Add layout on Lregion (ocaml-flambda#1107) c562fb385 flambda-backend: caml_{curry,apply,send}* for unboxed types (ocaml-flambda#1104) 50ee311bc flambda-backend: Temporary fix for incorrect layout for result of custom and operators (ocaml-flambda#1119) c89512d64 flambda-backend: More error checking for natdynlink symbols (ocaml-flambda#1005) 27d68bf7e flambda-backend: Flambda1 region deletion and locals fixes (ocaml-flambda#1000) 0e3e0576e flambda-backend: Add identifiers for instantiated functor units (ocaml-flambda#1092) 4b75b460d flambda-backend: Fix build system under ocaml/runtime (ocaml-flambda#1085) 7c9fc3215 flambda-backend: Fix valid character range computation for compilation units (ocaml-flambda#1110) 40c754a7d flambda-backend: Add result layout in Lapply and Lsend (ocaml-flambda#1102) cedaea1e0 flambda-backend: Add layout type in Lambda (ocaml-flambda#1032) 47c0e23a2 flambda-backend: Configure: Add flag to use legacy library layout (ocaml-flambda#1098) eed588881 flambda-backend: Restructure LIBDIR: Move Dynlink, Str and Unix to sub-directories (port part of ocaml/PR11198) (ocaml-flambda#1094) 5b98caf9d flambda-backend: Revert "Restructure LIBDIR" (ocaml-flambda#1093) 46f1b16d7 flambda-backend: Remove a stray character from dynlink Makefile (ocaml-flambda#1090) e5154424a flambda-backend: Restructure LIBDIR: Move Dynlink, Str and Unix to sub-directories (port PR#11198) (ocaml-flambda#895) 9307e7c50 flambda-backend: inline fast path of caml_applyN (ocaml-flambda#934) 3244386e6 flambda-backend: Bump magic numbers (ocaml-flambda#1077) 7c9e15d2c flambda-backend: Fix bug in arguments to `get_unit_info` (ocaml-flambda#1069) a2f4c9e07 flambda-backend: Closure rename static catch (ocaml-flambda#1070) 2ee705a5b flambda-backend: Backport ocaml-flambda#946 to ocaml/ subfolder (ocaml-flambda#1061) 569703fb6 flambda-backend: Merge ocaml-jst#97 (ocaml-flambda#1063) 7b1779a77 flambda-backend: Port value_kind changes to testsuite/tools to fix parsecmm.mly (ocaml-flambda#1060) 49505d183 flambda-backend: Bugfix for Ctype.nondep_type (ocaml-flambda#1059) 654c63cf7 flambda-backend: Backport ocaml-flambda#295 kind changes to ocaml/ subfolder (ocaml-flambda#1018) 50a9ce0bf flambda-backend: Fix extern_closure_up_to_env (ocaml-flambda#1053) bc2c78d2e flambda-backend: Remove obsolete pack-related code (ocaml-flambda#1051) 872ff3818 flambda-backend: Fix error-prone syntax resulting from reformatting (ocaml-flambda#1050) d03b346cf flambda-backend: Fix different .cmi files being produced by ocamlopt and ocamlc when using -pack (ocaml-flambda#1049) 90ee37b48 flambda-backend: Revert "Revert "Use Import_info.t in Cmt_format"" (ocaml-flambda#1045) ac12d9072 flambda-backend: Fix version number (ocaml-flambda#1043) 75e01541e flambda-backend: Revert "Use Import_info.t in Cmt_format" (ocaml-flambda#1042) ecab74c38 flambda-backend: Use Import_info.t in Cmt_format (ocaml-flambda#1037) 7661d4d47 flambda-backend: Bootstrap 1098a56c6 flambda-backend: Update .depend files a7292dae2 flambda-backend: Revert ocaml/toplevel/native/dune 758447903 flambda-backend: Remove alloc-check from ocaml/ git-subtree-dir: ocaml git-subtree-split: 77434f02edabf1a8b17372747bf301a74879df0f
bcae5ff33 flambda-backend: Bump buffer size to avoid gcc warning (#1247) d6c170bac flambda-backend: Remove `-absname` to improve dune build errors (#1233) 1b2bcb487 flambda-backend: Put frametables in .text with relative offsets for return addresses. (#1227) 999d523b4 flambda-backend: Small optimisation for caml_modify (#1226) b16493b31 flambda-backend: Add timestamps to GC logs (#1229) 95f7e809e flambda-backend: Provide a no-naked-pointers runtime and use it for the compiler (#1224) ba775819d flambda-backend: Replace assertion with a match statement (#1225) cfb3cd242 flambda-backend: Memoise last substitution composition (#1209) 1c4db4405 flambda-backend: Port PR1202 and PR1205 to the ocaml/ subtree (#1211) 577410ee7 flambda-backend: Correctly stack debuginfo for inlined body in classic mode (#1152) 6733de6a5 flambda-backend: Fix dune install in otherlibs: missing cmt and typo. (#1194) 4c97d260e flambda-backend: Unboxed numbers (#1165) 1ad7252a0 flambda-backend: Revert "Revert "Add a proper top and bottom layout" (#1169)" (#1191) dea4b3e6b flambda-backend: Don't get the layout of arguments from patterns (#1179) 6d3e85b23 flambda-backend: Don't copy when resolving aliases in try_modtypes (#1184) 73e52b748 flambda-backend: Clarify the types used for static jump/catch (#1180) 273a40df2 flambda-backend: Reenable backtrace testsuite folder for flambda2 (#1161) 77434f02e flambda-backend: Bump magic numbers for 4.14.1-5 (#1190) 3a78e83c9 flambda-backend: Revert "Instance compilation units" (#1175) 9a683c928 flambda-backend: Move compute_layout to Lambda (#1167) 0ea58e9a3 flambda-backend: Revert "Add a proper top and bottom layout" (#1169) 1e5e23a1b flambda-backend: Add hint for common misplaced [@unboxed] attribute (#1164) 10f870ac9 flambda-backend: Add a proper top and bottom layout (#1158) d1be56335 flambda-backend: Don't warn about misplaced attributes in -i mode (#1163) feefcaac8 flambda-backend: Remove immutable arrays from stdlib.ml and stdlib.mli (#1154) ba101be42 flambda-backend: Shrink the ref_table if it grows large (#1156) 777fda7b9 flambda-backend: Preserve backtraces from failing `Lazy_backtrack` computations (#805) 56d014e05 flambda-backend: Remove remaining `layout_top` after #1084 (#1138) dc1c1ce89 flambda-backend: Layouts for parameters in lambda & remove most layout_top (#1084) 49fea7805 flambda-backend: Instance compilation units (#1113) 1127fd2f8 flambda-backend: Merge pull request #1143 from riaqn/merge-ocaml-jst f458733c8 flambda-backend: fix things after merge b43d38509 flambda-backend: File magic updates (#306) 9f604aaea flambda-backend: Merge ocaml-jst 1f5461386 flambda-backend: More assertions for local alloc and letrec (#1081) 0c95280ab flambda-backend: Remove most layout_top in closure (#1127) 8ad48b5b3 flambda-backend: Use only `.ocamlformat*` to enable or disable ocamlformat (#1135) 1aa2885a0 flambda-backend: Build all boot targets in `make hacking` (#1133) 6b6c25a85 flambda-backend: Hide `Compilation_unit.t`'s definition in a submodule (#1134) 529d66b6f flambda-backend: Compile refactor (#1096) df798c1c9 flambda-backend: Propagates layouts through Flambda1 (#1115) 9bce50be5 flambda-backend: Add `gc-timings` to collect timing information from the GC (#1089) d431d3b83 flambda-backend: Use the type of primitive declarations to make their layout (#1118) 8da887e0f flambda-backend: Changes to arity in clambda (#1106) db20e9724 flambda-backend: Fix simplify-exits (#1108) 6a63906ee flambda-backend: Add layout on Lregion (#1107) c562fb385 flambda-backend: caml_{curry,apply,send}* for unboxed types (#1104) 50ee311bc flambda-backend: Temporary fix for incorrect layout for result of custom and operators (#1119) c89512d64 flambda-backend: More error checking for natdynlink symbols (#1005) 27d68bf7e flambda-backend: Flambda1 region deletion and locals fixes (#1000) 0e3e0576e flambda-backend: Add identifiers for instantiated functor units (#1092) 4b75b460d flambda-backend: Fix build system under ocaml/runtime (#1085) 7c9fc3215 flambda-backend: Fix valid character range computation for compilation units (#1110) 40c754a7d flambda-backend: Add result layout in Lapply and Lsend (#1102) cedaea1e0 flambda-backend: Add layout type in Lambda (#1032) 47c0e23a2 flambda-backend: Configure: Add flag to use legacy library layout (#1098) eed588881 flambda-backend: Restructure LIBDIR: Move Dynlink, Str and Unix to sub-directories (port part of ocaml/PR11198) (#1094) 5b98caf9d flambda-backend: Revert "Restructure LIBDIR" (#1093) 46f1b16d7 flambda-backend: Remove a stray character from dynlink Makefile (#1090) e5154424a flambda-backend: Restructure LIBDIR: Move Dynlink, Str and Unix to sub-directories (port PR#11198) (#895) 9307e7c50 flambda-backend: inline fast path of caml_applyN (#934) 3244386e6 flambda-backend: Bump magic numbers (#1077) 7c9e15d2c flambda-backend: Fix bug in arguments to `get_unit_info` (#1069) a2f4c9e07 flambda-backend: Closure rename static catch (#1070) 2ee705a5b flambda-backend: Backport #946 to ocaml/ subfolder (#1061) 569703fb6 flambda-backend: Merge ocaml-jst#97 (#1063) 7b1779a77 flambda-backend: Port value_kind changes to testsuite/tools to fix parsecmm.mly (#1060) 49505d183 flambda-backend: Bugfix for Ctype.nondep_type (#1059) 654c63cf7 flambda-backend: Backport #295 kind changes to ocaml/ subfolder (#1018) 50a9ce0bf flambda-backend: Fix extern_closure_up_to_env (#1053) bc2c78d2e flambda-backend: Remove obsolete pack-related code (#1051) 872ff3818 flambda-backend: Fix error-prone syntax resulting from reformatting (#1050) d03b346cf flambda-backend: Fix different .cmi files being produced by ocamlopt and ocamlc when using -pack (#1049) 90ee37b48 flambda-backend: Revert "Revert "Use Import_info.t in Cmt_format"" (#1045) ac12d9072 flambda-backend: Fix version number (#1043) 75e01541e flambda-backend: Revert "Use Import_info.t in Cmt_format" (#1042) ecab74c38 flambda-backend: Use Import_info.t in Cmt_format (#1037) 7661d4d47 flambda-backend: Bootstrap 1098a56c6 flambda-backend: Update .depend files a7292dae2 flambda-backend: Revert ocaml/toplevel/native/dune 758447903 flambda-backend: Remove alloc-check from ocaml/ git-subtree-dir: ocaml git-subtree-split: bcae5ff335d548b92752f53817d5b08ab2b98ff9
Cmm was able to unbox some values thanks to the
value_kind
put onlet
. However, only putting thevalue_kind
onlet
is not enough and on some simple example the heuristic would fail.For example, the following example:
Was compiling into:
Instead of
This PR adds a
value_kind
on all join points that is then used to decide if a value should be unboxed on some let statements.