Skip to content

Specialize primitives even when eta-expanding#89

Closed
let-def wants to merge 4 commits intoocaml:trunkfrom
let-def:specialized-primitive
Closed

Specialize primitives even when eta-expanding#89
let-def wants to merge 4 commits intoocaml:trunkfrom
let-def:specialized-primitive

Conversation

@let-def
Copy link
Contributor

@let-def let-def commented Aug 5, 2014

As pointed out in PR 6494, primitives are not always specialized even though type information are available.

This request changes code generation to always specialize when enough is known about types.

@let-def let-def changed the title Specialize primitives even in when exa-expanding Specialize primitives even when eta-expanding Aug 5, 2014
@bobot
Copy link
Contributor

bobot commented Aug 6, 2014

Could you add an example in the testsuite that was not specialized before?

@let-def
Copy link
Contributor Author

let-def commented Aug 6, 2014

Sure, but I couldn't find any test related to specialization (I just tried some grep expressions, I might have missed the actual tests).

@gasche
Copy link
Member

gasche commented Aug 8, 2014

If I understand correctly, the change can be described as follows. In the current codebase, there are two different compilation schemes for primitives:

  • If they are applied to arguments (e.g. a = b), we use the argument types to perform type-based specialization; this is the function transl_prim. This function may also specialize operations on arguments that are not of type int but are known to be integers (constructors of sum types and polymorphic variants).
  • If they are not applied (e.g. (=) ), look at their arity to perform an eta-expansion fun a b -> a=b, but do not perform type specialization; this is the function transl_primitive, preceded by the following comment "(* Eta-expand a primitive without knowing the types of its arguments *)"

You remark that the type information provided by the context may allow specialization even in the second case, eg. (=) : int -> _ -> _ could be compiled just as fun (a:int) b -> a=b. The patch adds an optional parameter to the transl_primitive function to provide typing information when it is available, and changes the compilation of transl_primitive to specialize comparison operations in this case.

I am not fond of the proposed patch for the following reasons:

  1. let (gencomp, intcomp, _, _, _, _, _, simplify_constant_constructor) = is really ugly (sure, the gencomp-only version already existed in the codebase)
  2. The comment on top of transl_primitive is now inconsistent with the implementation, as you may pass type information to it
  3. I think you made the type_info argument optional because it was the quickest fix, but it looks like all calls to this function could in fact provide some typing information (the other use is in translmod.ml which I'm not familiar with, but is clearly called in presence of type information). We should probably make it a non-optional argument.
  4. You specialize comparison operators using contextual type information, but do not perform the other type-directed specialization of primitives; there is no good reason not to fix Array.length : int array -> _ at the same time as we fix (=) : int -> _.

I think a better approach would be to redefine translate_primitive's interface to "officially" take type information into account, move all the optimizations that only depend on type information (including array strengthening) into this translate_primitive function, and turn transl_prim into a translate_applied_primitive function that performs the few optimizations that really depend on the argument's code (constructor detection mostly), and defer to transl_primitive in all the other cases.

@gasche
Copy link
Member

gasche commented Oct 20, 2014

@def-lkb any feedback on this? Do you think the idea merits further work, or the current state should be considered on its own?

@let-def
Copy link
Contributor Author

let-def commented Oct 20, 2014

I agree that the idea merits further work. I don't have much time now, I will try to progress in the upcoming weeks.

@let-def let-def force-pushed the specialized-primitive branch 2 times, most recently from 9446270 to e91a7fb Compare October 30, 2014 13:29
@let-def
Copy link
Contributor Author

let-def commented Oct 30, 2014

This new version goes a bit further on specialization.
Primitives expanded during module coercions are also specialized.
The same code is used for optimization of eta-expanded primitives and applied primitives.

Now, I will add some tests.

@let-def let-def force-pushed the specialized-primitive branch 2 times, most recently from e6cce2c to 93b7e27 Compare October 31, 2014 18:47
@let-def
Copy link
Contributor Author

let-def commented Oct 31, 2014

I didn't review the testsuite completely. I'll do that later (and bigarrays are not covered)

@gasche
Copy link
Member

gasche commented Oct 31, 2014

I like the current state of the pull request. One thing I consider changing is the fact that type information is only stored in the Tcoerce_primitive case (that is in module coercions) rather than in all occurences of primitives in the typedtree. The transl_primitive function takes three parameters (primitive description, type and environment) for what is morally a simple "typed primitive", but those parameters are reconstructed in different ways depending on whether we're calling from a primitive identifier, a primitive signature item, or a primitive module coercion.

To make that more uniform, one possibility would be to use a single "typed primitive" type (Typedtree.primitive?) in all places of the typedtree. I'll consider doing that as a separate patch -- it is refactoring, so slightly more invasive and can be left as (optional) additional commits.

@let-def
Copy link
Contributor Author

let-def commented Nov 1, 2014

A few more cases could be specialized, I am thinking of mutations with a statically known constant constructor or integer that don't need to trigger the write barrier.

This is not done at the moment, not sure why.

@gasche
Copy link
Member

gasche commented Nov 1, 2014

Even when you mutate an old reference to put an integer/constant in it, you need to check that the previous value of the reference is not an old block, and in this case to darken it if the current GC phase is marking.

The strength-reduction code you've worked on in this pull request does optimize the case where the type of the reference is known to only contain integers (that is int, char and variants with only constant constructors; Typeopt.maybe_pointer_type), by propagating this information in the Psetfield opcode. See how Psetfield is compiled in cmmgen.ml.

I like the well-defined current scope of the patchset. Do send other pull requests for crazier ideas!

@let-def let-def force-pushed the specialized-primitive branch from fc7bb2c to 6d368a5 Compare November 1, 2014 11:30
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When I experimented with your patch, I was surprised by the dlambda output syntax eg. array.get addr foo bar -- at first I suspected that you introduced a bug in the code generation that resulted in a free addr variable being wrongly emitted. I discovered that this was only a printing effect, but assumed it was done this way in the past already.

Could you use a less confusing printing scheme? There are three different better ways to do this already in the printing code:

  • bigarray code uses Bigarray.get[float32,fortran], that is brackets to specify kind and layout.
  • inline records use inlined(%i), that is parentheses to specify some extra stuff
  • sys.constant uses sys.constant_%s to decline the possible variants: direct concatenation to the name (send does the same without the underscore)

To be fair I should also note that duprecord uses your technique of adding the kind after a space. I don't like this because it looks like function application to me -- I think we should only use spaces for stuff the user will recognized as parameters passed to the function.

Pick whichever you like. I have a preference for parentheses or brackets, maybe brackets as parentheses already have a meaning in this scheme-like language. I'll consider sending a patch to harmonize all printing techniques, but this would affect printing behavior of existing stuff so it must be handled separately.

This will enable type-directed optimizations during translation of
module coercions.

WARNING: this breaks Typedtree representation, magic number will have to
be adjusted.
@let-def let-def force-pushed the specialized-primitive branch from 6d368a5 to 491d1cd Compare November 2, 2014 15:55
@let-def
Copy link
Contributor Author

let-def commented Nov 2, 2014

@gasche I fixed the printing code.
It should be noted that the lambda printing is not enough faithful. To provide a pipeline that can be stopped/resumed at lambda stage, a cleanup would be necessary.
I worked on a better printing/parsing scheme for some tests but nothing complete. If you really want that you should think a bit about the best representation (human & machine friendly).

@gasche
Copy link
Member

gasche commented Nov 2, 2014

I agree; the scope here is just to get something readable and unsurprising.

Thanks for the change. You should refresh the .result files of the testsuite in accordance to the printing change -- they fail in the current state.

@let-def let-def force-pushed the specialized-primitive branch from 491d1cd to 9350af2 Compare November 2, 2014 17:14
@let-def
Copy link
Contributor Author

let-def commented Nov 2, 2014

Done.

@gasche
Copy link
Member

gasche commented Nov 2, 2014

Here is a new description of the change, to help new reviewers.

In the current codebase, there are two different compilation schemes
for primitives:

  • If they are applied to arguments (e.g. a = b), we use the argument
    types to perform type-based specialization; this is the function
    transl_prim. This function may also specialize operations on
    arguments that are not of type int but are known to be integers
    (constructors of sum types and polymorphic variants).
  • If they are not applied (e.g. (=) ), look at their arity to
    perform an eta-expansion fun a b -> a=b, but do not perform type
    specialization; this is the function transl_primitive, preceded by
    the following comment "(* Eta-expand a primitive without knowing the
    types of its arguments *)"

Frédéric remarks that the type information provided by the context may
allow specialization even in the second case, eg. (=) : int -> _ -> _ could be compiled just as fun (a:int) b -> a=b. He thus adds a new
function specialize_primitive that does the type-directed
specialization of primitives, given the type of the primitive. This
function is called by both transl_primitive (optimization of
unapplied positives) and transl_primitive_application (which also
performs the extra specializations possible when the applied arguments
are zero-ary variants).

The compilation code will encounter a primitive in three different situations:

  • when compiling an application (Texp_apply), when the function is
    a primitive, transl_primitive_application is used
  • when compiling a bound variable (Texp_ident) whose "value kind" is
    primitive, transl_primitive is used
  • when compiling a module coercion from an implementation which is
    a primitive definition (external ...), coerced by an interface which
    is a value declaration (val ...), the code corresponding to the
    primitive must be inserted and transl_primitive is used

The two first cases have type information available in the
typedtree. In the latter case, type information was missing
(the Tcoerce_primitive constructor only had a Primitives.description
parameter, which carries no type information), and Frédéric has to
change the Typedtree to propagate type information when constructing
the coercion.

The patch optimizes strictly more situations than the previous
implementation, while making the translcore.ml code simpler and easier
to read. Three code patterns that were not optimized before and are now
optimized are the following:

  1. non-eta-expanded rebindings with a stricter type

    let equal : int -> int -> bool = (=)
    
  2. polymorphic comparison with type flowing from the context

    List.sort Pervasives.compare [1;2;3;4]
    
  3. stricter type given by a module constraint

    module Int : Map.OrderedType with type t = int = struct 
      type t = int
      external compare : 'a -> 'a -> int = "%compare"
    end
    

(3) also works when the implementation is a .ml file and the interface
a .mli file, but would not work anymore if we use let compare = compare: the issue that inlining is performed after type
specialization is well-known (see e.g. PR#5541) and orthogonal to
Frédéric's work.

The change comes in four simple patches, including a testsuite -- it
seems there was no explicit test of type-based specialization
before. I have fully reviewed it and think it should be included
upstream.

@bobot
Copy link
Contributor

bobot commented Nov 11, 2014

This PR have been discussed during the last developers' meeting, where I had the pleasure to be. To sum-up:

  • ok for integration
  • just find a way for the oracle of the testsuite to not depend on the id number (a printer that don't print them? Or which number them locally by their order of apparition?)

@gasche
Copy link
Member

gasche commented Nov 17, 2014

Merged in trunk, with a sed script to strip the id numbers away at testing time. I hope this is not going to break under OSX or what not.

PS: due to a SVN connectivity problem, I'm afraid the attribution (commit author name) information has been dropped from this patchset. Hopefully, I wrote a Changes entry (hint, hint) to properly record attribution.

@gasche gasche closed this Nov 17, 2014
@let-def let-def deleted the specialized-primitive branch May 6, 2015 21:18
chambart pushed a commit to chambart/ocaml-1 that referenced this pull request Aug 4, 2021
stedolan pushed a commit to stedolan/ocaml that referenced this pull request Oct 5, 2021
stedolan pushed a commit to stedolan/ocaml that referenced this pull request Dec 13, 2021
chambart pushed a commit to chambart/ocaml-1 that referenced this pull request Feb 1, 2022
23a7f73 flambda-backend: Fix some Debuginfo.t scopes in the frontend (ocaml#248)
33a04a6 flambda-backend: Attempt to shrink the heap before calling the assembler (ocaml#429)
8a36a16 flambda-backend: Fix to allow stage 2 builds in Flambda 2 -Oclassic mode (ocaml#442)
d828db6 flambda-backend: Rename -no-extensions flag to -disable-all-extensions (ocaml#425)
68c39d5 flambda-backend: Fix mistake with extension records (ocaml#423)
423f312 flambda-backend: Refactor -extension and -standard flags (ocaml#398)
585e023 flambda-backend: Improved simplification of array operations (ocaml#384)
faec6b1 flambda-backend: Typos (ocaml#407)
8914940 flambda-backend: Ensure allocations are initialised, even dead ones (ocaml#405)
6b58001 flambda-backend: Move compiler flag -dcfg out of ocaml/ subdirectory (ocaml#400)
4fd57cf flambda-backend: Use ghost loc for extension to avoid expressions with overlapping locations (ocaml#399)
8d993c5 flambda-backend: Let's fix instead of reverting flambda_backend_args (ocaml#396)
d29b133 flambda-backend: Revert "Move flambda-backend specific flags out of ocaml/ subdirectory (ocaml#382)" (ocaml#395)
d0cda93 flambda-backend: Revert ocaml#373 (ocaml#393)
1c6eee1 flambda-backend: Fix "make check_all_arches" in ocaml/ subdirectory (ocaml#388)
a7960dd flambda-backend: Move flambda-backend specific flags out of ocaml/ subdirectory (ocaml#382)
bf7b1a8 flambda-backend: List and Array Comprehensions (ocaml#147)
f2547de flambda-backend: Compile more stdlib files with -O3 (ocaml#380)
3620c58 flambda-backend: Four small inliner fixes (ocaml#379)
2d165d2 flambda-backend: Regenerate ocaml/configure
3838b56 flambda-backend: Bump Menhir to version 20210419 (ocaml#362)
43c14d6 flambda-backend: Re-enable -flambda2-join-points (ocaml#374)
5cd2520 flambda-backend: Disable inlining of recursive functions by default (ocaml#372)
e98b277 flambda-backend: Import ocaml#10736 (stack limit increases) (ocaml#373)
82c8086 flambda-backend: Use hooks for type tree and parse tree (ocaml#363)
33bbc93 flambda-backend: Fix parsecmm.mly in ocaml subdirectory (ocaml#357)
9650034 flambda-backend: Right-to-left evaluation of arguments of String.get and friends (ocaml#354)
f7d3775 flambda-backend: Revert "Magic numbers" (ocaml#360)
0bd2fa6 flambda-backend: Add [@inline ready] attribute and remove [@inline hint] (not [@inlined hint]) (ocaml#351)
cee74af flambda-backend: Ensure that functions are evaluated after their arguments (ocaml#353)
954be59 flambda-backend: Bootstrap
dd5c299 flambda-backend: Change prefix of all magic numbers to avoid clashes with upstream.
c2b1355 flambda-backend: Fix wrong shift generation in Cmm_helpers (ocaml#347)
739243b flambda-backend: Add flambda_oclassic attribute (ocaml#348)
dc9b7fd flambda-backend: Only speculate during inlining if argument types have useful information (ocaml#343)
aa190ec flambda-backend: Backport fix from PR#10719 (ocaml#342)
c53a574 flambda-backend: Reduce max inlining depths at -O2 and -O3 (ocaml#334)
a2493dc flambda-backend: Tweak error messages in Compenv.
1c7b580 flambda-backend: Change Name_abstraction to use a parameterized type (ocaml#326)
07e0918 flambda-backend: Save cfg to file (ocaml#257)
9427a8d flambda-backend: Make inlining parameters more aggressive (ocaml#332)
fe0610f flambda-backend: Do not cache young_limit in a processor register (upstream PR 9876) (ocaml#315)
56f28b8 flambda-backend: Fix an overflow bug in major GC work computation (ocaml#310)
8e43a49 flambda-backend: Cmm invariants (port upstream PR 1400) (ocaml#258)
e901f16 flambda-backend: Add attributes effects and coeffects (#18)
aaa1cdb flambda-backend: Expose Flambda 2 flags via OCAMLPARAM (ocaml#304)
62db54f flambda-backend: Fix freshening substitutions
57231d2 flambda-backend: Evaluate signature substitutions lazily (upstream PR 10599) (ocaml#280)
a1a07de flambda-backend: Keep Sys.opaque_identity in Cmm and Mach (port upstream PR 9412) (ocaml#238)
faaf149 flambda-backend: Rename Un_cps -> To_cmm (ocaml#261)
ecb0201 flambda-backend: Add "-dcfg" flag to ocamlopt (ocaml#254)
32ec58a flambda-backend: Bypass Simplify (ocaml#162)
bd4ce4a flambda-backend: Revert "Semaphore without probes: dummy notes (ocaml#142)" (ocaml#242)
c98530f flambda-backend: Semaphore without probes: dummy notes (ocaml#142)
c9b6a04 flambda-backend: Remove hack for .depend from runtime/dune  (ocaml#170)
6e5d4cf flambda-backend: Build and install Semaphore (ocaml#183)
924eb60 flambda-backend: Special constructor for %sys_argv primitive (ocaml#166)
2ac6334 flambda-backend: Build ocamldoc (ocaml#157)
c6f7267 flambda-backend: Add -mbranches-within-32B to major_gc.c compilation (where supported)
a99fdee flambda-backend: Merge pull request ocaml#10195 from stedolan/mark-prefetching
bd72dcb flambda-backend: Prefetching optimisations for sweeping (ocaml#9934)
27fed7e flambda-backend: Add missing index param for Obj.field (ocaml#145)
cd48b2f flambda-backend: Fix camlinternalOO at -O3 with Flambda 2 (ocaml#132)
9d85430 flambda-backend: Fix testsuite execution (ocaml#125)
ac964ca flambda-backend: Comment out `[@inlined]` annotation. (ocaml#136)
ad4afce flambda-backend: Fix magic numbers (test suite) (ocaml#135)
9b033c7 flambda-backend: Disable the comparison of bytecode programs (`ocamltest`) (ocaml#128)
e650abd flambda-backend: Import flambda2 changes (`Asmpackager`) (ocaml#127)
14dcc38 flambda-backend: Fix error with Record_unboxed (bug in block kind patch) (ocaml#119)
2d35761 flambda-backend: Resurrect [@inline never] annotations in camlinternalMod (ocaml#121)
f5985ad flambda-backend: Magic numbers for cmx and cmxa files (ocaml#118)
0e8b9f0 flambda-backend: Extend conditions to include flambda2 (ocaml#115)
99870c8 flambda-backend: Fix Translobj assertions for Flambda 2 (ocaml#112)
5106317 flambda-backend: Minor fix for "lazy" compilation in Matching with Flambda 2 (ocaml#110)
dba922b flambda-backend: Oclassic/O2/O3 etc (ocaml#104)
f88af3e flambda-backend: Wire in the remaining Flambda 2 flags (ocaml#103)
678d647 flambda-backend: Wire in the Flambda 2 inlining flags (ocaml#100)
1a8febb flambda-backend: Formatting of help text for some Flambda 2 options (ocaml#101)
9ae1c7a flambda-backend: First set of command-line flags for Flambda 2 (ocaml#98)
bc0bc5e flambda-backend: Add config variables flambda_backend, flambda2 and probes (ocaml#99)
efb8304 flambda-backend: Build our own ocamlobjinfo from tools/objinfo/ at the root (ocaml#95)
d2cfaca flambda-backend: Add mutability annotations to Pfield etc. (ocaml#88)
5532555 flambda-backend: Lambda block kinds (ocaml#86)
0c597ba flambda-backend: Revert VERSION, etc. back to 4.12.0 (mostly reverts 822d0a0 from upstream 4.12) (ocaml#93)
037c3d0 flambda-backend: Float blocks
7a9d190 flambda-backend: Allow --enable-middle-end=flambda2 etc (ocaml#89)
9057474 flambda-backend: Root scanning fixes for Flambda 2 (ocaml#87)
08e02a3 flambda-backend: Ensure that Lifthenelse has a boolean-valued condition (ocaml#63)
77214b7 flambda-backend: Obj changes for Flambda 2 (ocaml#71)
ecfdd72 flambda-backend: Cherry-pick 9432cfdadb043a191b414a2caece3e4f9bbc68b7 (ocaml#84)
d1a4396 flambda-backend: Add a `returns` field to `Cmm.Cextcall` (ocaml#74)
575dff5 flambda-backend: CMM traps (ocaml#72)
8a87272 flambda-backend: Remove Obj.set_tag and Obj.truncate (ocaml#73)
d9017ae flambda-backend: Merge pull request ocaml#80 from mshinwell/fb-backport-pr10205
3a4824e flambda-backend: Backport PR#10205 from upstream: Avoid overwriting closures while initialising recursive modules
f31890e flambda-backend: Install missing headers of ocaml/runtime/caml (ocaml#77)
83516f8 flambda-backend: Apply node created for probe should not be annotated as tailcall (ocaml#76)
bc430cb flambda-backend: Add Clflags.is_flambda2 (ocaml#62)
ed87247 flambda-backend: Preallocation of blocks in Translmod for value let rec w/ flambda2 (ocaml#59)
a4b04d5 flambda-backend: inline never on Gc.create_alarm (ocaml#56)
cef0bb6 flambda-backend: Config.flambda2 (ocaml#58)
ff0e4f7 flambda-backend: Pun labelled arguments with type constraint in function applications (ocaml#53)
d72c5fb flambda-backend: Remove Cmm.memory_chunk.Double_u (ocaml#42)
9d34d99 flambda-backend: Install missing artifacts
10146f2 flambda-backend: Add ocamlcfg (ocaml#34)
819d38a flambda-backend: Use OC_CFLAGS, OC_CPPFLAGS, and SHAREDLIB_CFLAGS for foreign libs (#30)
f98b564 flambda-backend: Pass -function-sections iff supported. (#29)
e0eef5e flambda-backend: Bootstrap (#11 part 2)
17374b4 flambda-backend: Add [@@Builtin] attribute to Primitives (#11 part 1)
85127ad flambda-backend: Add builtin, effects and coeffects fields to Cextcall (#12)
b670bcf flambda-backend: Replace tuple with record in Cextcall (#10)
db451b5 flambda-backend: Speedups in Asmlink (#8)
2fe489d flambda-backend: Cherry-pick upstream PR#10184 from upstream, dynlink invariant removal (rev 3dc3cd7 upstream)
d364bfa flambda-backend: Local patch against upstream: enable function sections in the Dune build
886b800 flambda-backend: Local patch against upstream: remove Raw_spacetime_lib (does not build with -m32)
1a7db7c flambda-backend: Local patch against upstream: make dune ignore ocamldoc/ directory
e411dd3 flambda-backend: Local patch against upstream: remove ocaml/testsuite/tests/tool-caml-tex/
1016d03 flambda-backend: Local patch against upstream: remove ocaml/dune-project and ocaml/ocaml-variants.opam
93785e3 flambda-backend: To upstream: export-dynamic for otherlibs/dynlink/ via the natdynlinkops files (still needs .gitignore + way of generating these files)
63db8c1 flambda-backend: To upstream: stop using -O3 in otherlibs/Makefile.otherlibs.common
eb2f1ed flambda-backend: To upstream: stop using -O3 for dynlink/
6682f8d flambda-backend: To upstream: use flambda_o3 attribute instead of -O3 in the Makefile for systhreads/
de197df flambda-backend: To upstream: renamed ocamltest_unix.xxx files for dune
bf3773d flambda-backend: To upstream: dune build fixes (depends on previous to-upstream patches)
6fbc80e flambda-backend: To upstream: refactor otherlibs/dynlink/, removing byte/ and native/
71a03ef flambda-backend: To upstream: fix to Ocaml_modifiers in ocamltest
686d6e3 flambda-backend: To upstream: fix dependency problem with Instruct
c311155 flambda-backend: To upstream: remove threadUnix
52e6e78 flambda-backend: To upstream: stabilise filenames used in backtraces: stdlib/, otherlibs/systhreads/, toplevel/toploop.ml
7d08e0e flambda-backend: To upstream: use flambda_o3 attribute in stdlib
403b82e flambda-backend: To upstream: flambda_o3 attribute support (includes bootstrap)
65032b1 flambda-backend: To upstream: use nolabels attribute instead of -nolabels for otherlibs/unix/
f533fad flambda-backend: To upstream: remove Compflags, add attributes, etc.
49fc1b5 flambda-backend: To upstream: Add attributes and bootstrap compiler
a4b9e0d flambda-backend: Already upstreamed: stdlib capitalisation patch
4c1c259 flambda-backend: ocaml#9748 from xclerc/share-ev_defname (cherry-pick 3e937fc)
00027c4 flambda-backend: permanent/default-to-best-fit (cherry-pick 64240fd)
2561dd9 flambda-backend: permanent/reraise-by-default (cherry-pick 50e9490)
c0aa4f4 flambda-backend: permanent/gc-tuning (cherry-pick e9d6d2f)

git-subtree-dir: ocaml
git-subtree-split: 23a7f73
sadiqj pushed a commit to sadiqj/ocaml that referenced this pull request Feb 21, 2023
stedolan pushed a commit to stedolan/ocaml that referenced this pull request Mar 21, 2023
a09392d Set Menhir version back to 20210419 again (ocaml#89)
cc63992 Merge pull request ocaml#88 from mshinwell/flambda-backend-changes-2022-12-27
3e49df3 HACKING.jst.adoc
1866676 Merge flambda-backend changes
e012992 Merge pull request ocaml#87 from mshinwell/merge-4.14.1
ac5c7c8 Merge tag '4.14.1' into main
3da21bc add a useful debug printer
83b7c72 Document the debug_printers script
98896e0 Remove a tiny code stutter I came across
99cb5d9 release 4.14.1
b49060f last commit before tagging 4.14.1
fae9aef Add documentation
708e5a9 Add tests
c609eee Bootstrap
7f922d0 Polymorphic parameters
51aeb04 Keep generalized structure from patterns when typing let
4b68bb3 Add test of princiaplity from polymorphic type constraints
82c7afe fix wong raise
aca252f x86: Force result of Icomp to be in a register (ocaml#11808)
985725b Add dynlink_compilerlibs.mli to .gitignore (ocaml#79)
2b1fa24 Regenerate parser (ocaml#80)
1bb6c79 Merge pull request ocaml#78 from mshinwell/flambda-backend-patches-2022-12-13
9029581 Update otherlibs/dynlink/Makefile
3e4f1b9 Revert toplevel/native/dune to ocaml-jst version
6061e4c Regenerate configure using autoconf 2.71
888d4b1 Back out patch which disables alloc-check in ocaml-jst
a6d5796 Fix dynlink build
3e46daf Update .depend files
a5c547e Bootstrap
a6a9031 Merge flambda-backend changes
0ac7fdd temp fix for linker error (ocaml#77)
1018602 Remove references to 32-bit Cygwin (ocaml#11797)
e2d0d9e Enable individual testing with Makefile.jst (ocaml#76)
f10cbf6 increment version number after tagging 4.14.1~rc1
11c5ab7 release 4.14.1~rc1
e4c3920 last commit before tagging 4.14.1~rc1
9e598ca Merge pull request ocaml#11793 from dra27/then-than
2a7e501 Use a more relaxed mode for unification in Ctype.subst (ocaml#11771) (ocaml#73)
7b35ef7 Statically initialize `caml_global_data` with a valid value (ocaml#11788)
cbd791a Allow immediates to cross modes (ocaml#58)
85a0817 Merge pull request ocaml#11534 from gasche/follow-synonyms-in-show-module-type
699f43c Changes
e54e9bc fix the 'stuttering' issue in #show
d9799d3 test comments
fec3b23 follow synonyms when #show-ing module types
06a1ad7 regression tests for ocaml#11533 (still failing)
549d757 Run "misplaced attributes" check when compiling mlis (ocaml#72)
b2b74bf Fix bug in `Mtype.strengthen_lazy` causing spurious typing errors (ocaml#11776)
a6c0e75 Ensure that Ctype.nongen always calls remove_mode_variables (ocaml#70)
6c50831 array elements are global (ocaml#67)
bc510ed Ensure that types from packed modules are always generalised (ocaml#11732)
4d47036 Fix ocaml#10768
8788ff6 Add/move some documentation
9891a36 Propagate location information to `local_` in expressions
988306d Add support for `global_` and `nonlocal_` constructor arguments (ocaml#50)
6729eb8 Missing CAMLparam in win32's Unix.stat (ocaml#11737)
e7dd740 Add debug_printers.ml (ocaml#63)
65f2896 more entries in gitignore (ocaml#62)
a9a84d0 Move `global_flag` to `Asttypes` (ocaml#60)
fac5896 Minor attribute fixes from flambda-backend
75f402e Note about make install and Makefile.jst (ocaml#56)
fb5b1e4 Remove the -force-tmc flag (ocaml#11661)
bd87a61 ocamlmklib: use `ar rcs` instead of `ar rc` (ocaml#11670)
83762af Merge pull request ocaml#11622 from Octachron/fix_recursive_types_in_constructor_mismatch
ca48730 Merge pull request ocaml#11609 from Octachron/pr11194_unbound_and_printing_context

git-subtree-dir: ocaml
git-subtree-split: a09392d
EmileTrotignon pushed a commit to EmileTrotignon/ocaml that referenced this pull request Jan 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants