|
Revision tags: dev, v36.0.9, v44.0.1, v43.0.2, v36.0.8, v24.0.8, v44.0.0, v43.0.1, v42.0.2, v36.0.7, v24.0.7 |
|
| #
2f7dbd61 |
| 31-Mar-2026 |
Chris Fallin <[email protected]> |
PCC: remove proof-carrying code (for now?). (#12800)
In late 2023, we built out an experimental feature called Proof-Carrying Code (PCC), where we attached "facts" to values in the CLIF IR and built
PCC: remove proof-carrying code (for now?). (#12800)
In late 2023, we built out an experimental feature called Proof-Carrying Code (PCC), where we attached "facts" to values in the CLIF IR and built verification of these facts after lowering to machine instructions. We also added "memory types" describing layout of memory and a "checked" flag on memory operations such that we could verify that any checked memory operation accessed valid memory (as defined by memory types attached to pointer values via facts). Wasmtime's Cranelift backend then put appropriate memory types and facts in its IR such that all accesses to memory (aspirationally) could be checked, taking the whole mid-end and lowering backend of Cranelift out of the trusted core that enforces SFI.
This basically worked, at the time, for static memories; but never for dynamic memories, and then work on the feature lost prioritization (aka I had to work on other things) and I wasn't able to complete it and put it in fuzzing/enable it as a production option.
Unfortunately since then it has bit-rotted significantly -- as we add new backend optimizations and instruction lowerings we haven't kept the PCC framework up to date.
Inspired by the discussion in #12497 I think it's time to delete it (hopefully just "for now"?) unless/until we can build it again. And when we do that, we should probably get it to the point of validating robust operation on all combinations of memory configurations before merging. (That implies a big experiment branch rather than a bunch of eager PRs in-tree, but so it goes.) I still believe it is possible to build this (and I have ideas on how to do it!) but not right now.
show more ...
|
|
Revision tags: v43.0.0, v42.0.1, v41.0.4, v42.0.0, v40.0.4, v36.0.6, v24.0.6, v41.0.3, v41.0.2, v41.0.1, v36.0.5, v40.0.3, v41.0.0, v36.0.4, v39.0.2, v40.0.2, v40.0.1, v40.0.0, v39.0.1, v39.0.0, v38.0.4, v37.0.3, v36.0.3, v24.0.5, v38.0.3, v38.0.2, v38.0.1, v37.0.2, v37.0.1, v37.0.0 |
|
| #
3a14fa39 |
| 03-Sep-2025 |
Paul Nodet <[email protected]> |
refactor(cranelift): merge DominatorTreePreorder into DominatorTree (#11596)
* refactor(cranelift): merge DominatorTreePreorder into DominatorTree
Integrate preorder functionality directly into Dom
refactor(cranelift): merge DominatorTreePreorder into DominatorTree (#11596)
* refactor(cranelift): merge DominatorTreePreorder into DominatorTree
Integrate preorder functionality directly into DominatorTree to eliminate duplicate computation and improve performance.
This eliminates the need for a separate DominatorTreePreorder data structure, reducing memory usage and providing O(1) block dominance checks by default. Block dominance checks throughout the compiler now benefit from constant-time performance instead of O(depth) tree traversal.
* refactor(cranelift): implement the new unified DominatorTree
Remove separate DominatorTreePreorder computation and use unified API:
- Context: Remove domtree_preorder field, simplify compute_domtree() - AliasAnalysis: Switch from DominatorTreePreorder to DominatorTree - Update dominance checks to use general dominates() method
All dominance checks in alias analysis now automatically benefit from O(1) block dominance performance when instructions are in different blocks.
* refactor(cranelift): update optimization passes for DominatorTree
* refactor(cranelift): update verifier and tests for new DominatorTree
SSA dominance validation in the verifier now benefits from O(1) block-to-block dominance checks, improving compilation performance during debug builds with verification enabled.
show more ...
|
|
Revision tags: v36.0.2, v36.0.1, v36.0.0, v35.0.0, v24.0.4, v33.0.2, v34.0.2 |
|
| #
968952ab |
| 10-Jul-2025 |
Nick Fitzgerald <[email protected]> |
Cranelift: introduce a function inliner (#11210)
* Cranelift: introduce a function inliner
This comit adds "inlining as a library" to Cranelift; it does _not_ provide a complete, off-the-shelf inli
Cranelift: introduce a function inliner (#11210)
* Cranelift: introduce a function inliner
This comit adds "inlining as a library" to Cranelift; it does _not_ provide a complete, off-the-shelf inlining solution. Cranelift's compilation context is per-function and does not encompass the full call graph. It does not know which functions are hot and which are cold, which have been marked the equivalent of `#[inline(always)]` versus `#[inline(never)]`, etc... Only the Cranelift user can understand these aspects of the full compilation pipeline, and these things can be very different between (say) Wasmtime and `cg_clif`. Therefore, this infrastructure does not attempt to define hueristics for when inlining a particular call is likely beneficial. This module only provides hooks for the Cranelift user to tell Cranelift whether a given call should be inlined or not, and the mechanics to inline a callee into a particular call site when the user directs Cranelift to do so.
This commit also creates a new kind of filetest that will always inline calls to functions that have already been defined in the file. This lets us exercise the inliner in filetests.
Fixes https://github.com/bytecodealliance/wasmtime/issues/4127
* Address review feedback
* Require callee bodies are pre-legalized
show more ...
|
|
Revision tags: v34.0.1, v33.0.1, v24.0.3, v32.0.1 |
|
| #
e33e0f21 |
| 24-Jun-2025 |
Karan Lokchandani <[email protected]> |
feat(cranelift): Use DominatorTreePreorder in more places (#11098)
|
|
Revision tags: v34.0.0 |
|
| #
a80dd80d |
| 09-Jun-2025 |
Nick Fitzgerald <[email protected]> |
Cranelift: Rewrite conditional branches to unconditional traps into conditional traps during legalization (#10988)
* Cranelift: Legalize via a backwards walk, rather than forwards
Note: the test ex
Cranelift: Rewrite conditional branches to unconditional traps into conditional traps during legalization (#10988)
* Cranelift: Legalize via a backwards walk, rather than forwards
Note: the test expectation change in `filetests/egraph/misc.clif` is simply because we happen to change the order in which we created the legalized `stack_addr` instructions that get GVN'd together, and therefore also changed their relative value numbering. We dedupe to the value that occurs first in the function, which is the one inserted into the DFG *after* the other now because of the backwards traversal, and it therefore has a different value number from before. The resulting program is identical, modulo value numbering.
* Cranelift: Rewrite conditional branches to unconditional traps into conditional traps during legalization
Given this instruction:
```clif brif v0, block1, block2 ```
If we know that `block1` does nothing but immediately trap then we can rewrite that `brif` into the following:
```clif trapz v0, <trapcode> jump block2 ```
(And we can do the equivalent with `trapz` if `block2` immediately traps).
This transformation allows for the conditional trap instructions to be GVN'd and for our egraphs mid-end to generally better optimize the program. We additionally have better codegen in our backends for `trapz` than branches to unconditional traps.
Fixes https://github.com/bytecodealliance/wasmtime/issues/10941
* Update CLIF filetests and Wasmtime disas tests
show more ...
|
| #
8a42768f |
| 06-Jun-2025 |
Alex Crichton <[email protected]> |
Update nightly used in CI (#10957)
A new lint was added to rustc so this updates the nightly used in CI and then additionally fixes the lints that are firing.
|
|
Revision tags: v33.0.0 |
|
| #
90ac295e |
| 19-May-2025 |
Alex Crichton <[email protected]> |
Update Wasmtime to the 2024 Rust Edition (#10806)
* Update Wasmtime to the 2024 Rust Edition
Now that our MSRV supports the 2024 edition it's possible to make this switch. This commit moves Wasmtim
Update Wasmtime to the 2024 Rust Edition (#10806)
* Update Wasmtime to the 2024 Rust Edition
Now that our MSRV supports the 2024 edition it's possible to make this switch. This commit moves Wasmtime to the 2024 Edition to keep up-to-date with Rust idioms and access many of the edition features exclusive to the 2024 edition.
prtest:full
* Reformat with the 2024 edition
show more ...
|
|
Revision tags: v32.0.0 |
|
| #
3da7fc8e |
| 08-Apr-2025 |
SingleAccretion <[email protected]> |
[DI] Dump value label assignments in a table (#10549)
* Dump compilation start/end
* [DI] Log value label ranges in a table
Sample table:
|Inst |IP |VL0 |VL1 |VL3 |VL4 |VL5
[DI] Dump value label assignments in a table (#10549)
* Dump compilation start/end
* [DI] Log value label ranges in a table
Sample table:
|Inst |IP |VL0 |VL1 |VL3 |VL4 |VL5 |VL7 |VL10 |VL11 |VL4294967294| |--------|----|--------|---------|---------|--------|--------|--------|---------|--------|------------| |Inst 0 |53 | | | | | | | | | | | | | | | | | | | |Inst 1 |53 | | | | | | | | | | | | | | | | | | | |Inst 2 |60 |v194|p2i|v232|p12i| | | | | | | | | | | | |v192|p7i | |Inst 3 |64 |* |p2i|* |p12i|v231|p13i| | | | | | | | | | |* |p7i | |Inst 4 |68 |* |p2i|* |p12i|* |p13i| | | | | | | | | | |* |p7i | |Inst 5 |72 |* |p2i|* |p12i|* |p13i| | | | | | | | | | |* |p7i | |Inst 6 |76 |* |p2i|* |p12i|* |p13i| | | | | | | | | | |* |p7i | |Inst 7 |87 |* | |* |p12i|* |p13i| | | | | | | | | | |* |p7i | |Inst 8 |92 |* | |* |p12i|* |p13i|v227|p0i| | | | | | | | |* |p15i | |Inst 9 |94 |* | |v204| |v204| |v204| |v204| |v204| |v204| |v204| |* |p15i | |Inst 10 |100 |* | |* | |* | |* | |* | |* | |* | |* | |* |p15i | |Inst 11 |105 |* | |* | |* | |* | |v226|p9i|* | |* | |* | |* |p15i | |Inst 12 |109 |* | |* | |* | |* | |* | |v225|p9i|* | |* | |* |p15i | |Inst 13 |114 |* | |* | |* | |* | |* | |* | |* | |* | |* |p15i | |Inst 14 |119 |* | |* | |* | |* | |* | |* | |* | |* | |* |p15i | |Inst 15 |125 |* | |* | |* | |* | |* | |* | |* | |* | |* |p15i | |Inst 16 |129 |* | |* | |* | |* | |* | |* | |v223|p11i|* | |* |p15i | |Inst 17 |134 |* | |* | |* | |* | |* | |* | |* | |* | |* |p15i | |Inst 18 |134 |* | |* | |* | |* | |* | |* | |* | |* | |* |p15i | |Inst 19 |139 |* | |* | |* | |* | |* | |* | |* | |v222|p0i|* |p15i | |Inst 20 |143 |* | |* | |* | |* | |* | |* | |* | |* |p0i|* |p15i | |Inst 21 |143 |* | |* | |* | |* | |* | |* | |* | |* |p0i|* | |
This will make it much easier to diagnose problems with incomplete/missing live ranges.
show more ...
|
| #
82c0a09b |
| 26-Mar-2025 |
Chris Fallin <[email protected]> |
Simplify aegraphs by removing union-find and canonical eclass IDs. (#10471)
I was recently re-thinking through some of the core data structure design in our aegraph implementation, and wondered: do
Simplify aegraphs by removing union-find and canonical eclass IDs. (#10471)
I was recently re-thinking through some of the core data structure design in our aegraph implementation, and wondered: do we really need the union-find data structure, the notion of "canonical" ID for an eclass separate from its latest ID (root of union-node tree), and the hashcons-key canonicalization using all of this? It's an awful lot of complexity and has led to some fairly subtle bugs (e.g., #6126), and is generally unsatisfying.
I had the realization: the only case where the distinction between canonical and latest ID matters is when we expand an eclass after its initial (eager) rewriting, which happens before we see its uses. If we hypothesize that this happens rarely, then it should be fine to canonicalize based only on latest ID -- we shouldn't lose much (and we can measure this loss empirically).
The chief case where this kind of "late eclass expansion" still happens is: if we have some expression E1 that eventually rewrites to E2 via some simplification, and E2 already exists earlier in the program, then E1 will join the eclass. If we then have some `E3 := E1 + 1`, and later `E4 := E2 + 1`, we need the union-find canonicalization for E4 to GVN to E3. Otherwise, the latest ID for the eclass that eventually contains E1 and E2 is different at the time that E3 uses it (and is GVN'd and rewritten) and when E4 does. Put another way: E3 captures a snapshot of its operand's eclass before a new node joins it, and is never reprocessed when that happens, so E3 remains distinct.
But if the `E2 -> E1` rewrite is truly "directional" toward a better representation that we will always want to choose -- say, `x + 0 -> x`, or any constant-propagation in general -- then if the eager rewriting for E2 produces E1's eclass ID directly *without* adding E2 to its nodes, then all users will still canonicalize as before. This "only return the rewrite target, don't union with it" before is exactly our `subsume` operator.
Put another way: subsumption prevents growing eclasses later, so snapshots in time remain the latest, and everyone canonicalizes with the same ID. We move to a true immutable data structure, with simple hashconsing with no magic.
The rewrite semantics are then much simpler too: if any value is marked "subsume", we pick it (pick an arbitrary one if multiple) as our rewrite result; otherwise, create an eclass with the original rewrite input and all rewrite outputs (by creating union-nodes in the DFG). No auto-subsume or factoring in availability -- that's it. "Subsume" means: always pick the rewritten value, don't keep the original, and we use it whenever that's unambiguously true for better canonicalization.
Given that, it turns out that we can remove the union-find mechanism entirely. It also turns out that we can unify the scoped-hashmap for "effectful/idempotent ops" with the ordinary hashmap for pure ops; everything can be scoped. To get working LICM we do need to retain our "available block" mechanism, but only to insert values at a higher scope level in the scoped hashmap -- it is now heuristic, not load-bearing for correctness.
I suspect that the fixpoint loop computing analysis results can go away too, now that we truly don't update arguments -- we have a simple immutable data structure with everything snapshotted at creation -- but I haven't made that change yet.
This change appears to be "in the noise" in both runtime and compile time -- a Sightglass run on the default suite shows only
``` compilation :: cycles :: benchmarks/pulldown-cmark/benchmark.wasm
Δ = 551234.50 ± 514580.62 (confidence = 99%)
new.so is 1.00x to 1.01x faster than old.so!
[61669181 72513567.85 98139932] new.so [60991071 73064802.35 120044089] old.so
execution :: cycles :: benchmarks/bz2/benchmark.wasm
Δ = 232827.80 ± 204621.12 (confidence = 99%)
old.so is 1.00x to 1.01x faster than new.so!
[67208140 72812782.32 89996076] new.so [69531172 72579954.52 80530142] old.so ```
which seem like suitably small swings that are fine. Spot-checking the aegraph stats on the same function before-and-after shows the same optimizations happening in all functions I examined, and we see the compile-tests showing no movement except for a value renumbering in one case. So: no effect objectively, but deletes code and significantly simplifies the core algorithm.
show more ...
|
|
Revision tags: v31.0.0, v30.0.2, v30.0.1, v30.0.0, v29.0.1, v29.0.0, v28.0.1, v28.0.0, v27.0.0, v26.0.1, v25.0.3, v24.0.2, v26.0.0, v21.0.2, v22.0.1, v23.0.3, v25.0.2, v24.0.1, v25.0.1 |
|
| #
eb0428eb |
| 23-Sep-2024 |
amartosch <[email protected]> |
Lower conditional traps in backend (#9072)
* Lower conditional traps in backend
Instead of legalizing `trapz` and `trapnz` in the mid-end, we now take them all the way to the backend. This allows u
Lower conditional traps in backend (#9072)
* Lower conditional traps in backend
Instead of legalizing `trapz` and `trapnz` in the mid-end, we now take them all the way to the backend. This allows us to GVN them and remove redundant trap checks. This also allows us to avoid creating new blocks in the legalizer and otherwise invalidating the control-flow graph.
* Lower `trap[n]z` clif instructions in Pulley
* Update disas tests
---------
Co-authored-by: Nick Fitzgerald <[email protected]>
show more ...
|
|
Revision tags: v25.0.0 |
|
| #
f96aac79 |
| 19-Sep-2024 |
bjorn3 <[email protected]> |
Deprecate Context::compile_and_emit (#9281)
The only thing it does over Context::compile is writing the machine code to a Vec specified by the user. Every user of Context::compile_and_emit in Cranel
Deprecate Context::compile_and_emit (#9281)
The only thing it does over Context::compile is writing the machine code to a Vec specified by the user. Every user of Context::compile_and_emit in Cranelift didn't actually need ownership over the machine code bytes and thus would have been able to use Context::compile instead to avoid an unnecessary allocation. This commit moves all in-tree users of compile_and_emit to compile and additionally to avoid other users adding an unnecessary allocation as they though it to be necessary, this commit additionally deprecates compile_and_emit.
show more ...
|
|
Revision tags: v24.0.0, v23.0.2, v23.0.1, v23.0.0, v22.0.0 |
|
| #
b3636ff6 |
| 18-Jun-2024 |
Nick Fitzgerald <[email protected]> |
Introduce the `cranelift-bitset` crate; use it for stack maps in both Cranelift and Wasmtime (#8826)
* Introduce the `cranelift-bitset` crate
The eventual goal is to deduplicate bitset types betwee
Introduce the `cranelift-bitset` crate; use it for stack maps in both Cranelift and Wasmtime (#8826)
* Introduce the `cranelift-bitset` crate
The eventual goal is to deduplicate bitset types between Cranelift and Wasmtime, especially their use in stack maps.
* Use the `cranelift-bitset` crate inside both Cranelift and Wasmtime
Mostly for stack maps, also for a variety of other random things where `cranelift_codegen::bitset::BitSet` was previously used.
* Fix stack maps unit test in cranelift-codegen
* Uncomment `no_std` declaration
* Fix `CompountBitSet::reserve` method
* Fix `CompoundBitSet::insert` method
* Keep track of the max in a `CompoundBitSet`
Makes a bunch of other stuff easier, and will be needed for replacing `cranelift_entity::EntitySet`'s bitset with this thing anyways.
* Add missing parens
* Fix a bug around insert and reserve
* Implement `with_capacity` in terms of `new` and `reserve`
* Rename `reserve` to `ensure_capacity`
show more ...
|
|
Revision tags: v21.0.1, v21.0.0 |
|
| #
c477424f |
| 15-May-2024 |
Jamey Sharp <[email protected]> |
cranelift: Resolve CLIF aliases before lowering (#8606)
The egraph pass was already doing this, when it ran, and it never adds any aliases. So do it slightly earlier and unconditionally, and avoid n
cranelift: Resolve CLIF aliases before lowering (#8606)
The egraph pass was already doing this, when it ran, and it never adds any aliases. So do it slightly earlier and unconditionally, and avoid needing to resolve any aliases during lowering.
show more ...
|
| #
b869b66b |
| 13-May-2024 |
Jamey Sharp <[email protected]> |
cranelift: Delete redundant DCE optimization pass (#8227)
The egraph pass and the dead-code elimination pass both remove instructions whose results are unused. If the optimization level is "none", n
cranelift: Delete redundant DCE optimization pass (#8227)
The egraph pass and the dead-code elimination pass both remove instructions whose results are unused. If the optimization level is "none", neither pass runs, and if it's anything else both passes run. I don't think we should do this work twice.
Note that the DCE pass is different than the "eliminate unreachable code" pass, which removes entire blocks that are unreachable from the entry block. That pass might still be necessary.
show more ...
|
|
Revision tags: v20.0.2, v20.0.1, v20.0.0, v17.0.3, v19.0.2, v18.0.4 |
|
| #
72a3b8b9 |
| 09-Apr-2024 |
Adam Bratschi-Kaye <[email protected]> |
NaN-canonicalization without branching on x64 (#8313)
* NaN-canonicalization without branching on x64
Modify the cranelift pass that performs NaN-canonicalization to avoid branches on x64. The curr
NaN-canonicalization without branching on x64 (#8313)
* NaN-canonicalization without branching on x64
Modify the cranelift pass that performs NaN-canonicalization to avoid branches on x64. The current implementation uses two branches.
* remove old fcmp case
* Revert "remove old fcmp case"
This reverts commit 48c3712b7ecfc75f5183b688677391f99e9fe8fe.
* add filetests
* use old version for riscv
show more ...
|
|
Revision tags: v19.0.1, v19.0.0 |
|
| #
d7c96a9e |
| 19-Mar-2024 |
Chris Fallin <[email protected]> |
PCC: add facts to all relevant iconsts to handle propagation through opts. (#8173)
We have various constant-propagation/folding rules in the mid-end that generate new `iconst`s in place of other exp
PCC: add facts to all relevant iconsts to handle propagation through opts. (#8173)
We have various constant-propagation/folding rules in the mid-end that generate new `iconst`s in place of other expressions. We got a fuzzbug with PCC wherein it was not able to verify that an iadd-iadd-uextend combination generating a Wasm address was in-range when rules reassociated the iadds to put constants together. Rather than carefully augment all rules to propagate constant facts only where they exist on the inputs, I opted to add a hook to the optimizer to generate brand-new assertions on *all* iconsts that we insert. This adds a little more work during verification (not too much hopefully: it's pretty low-overhead to check that `mov $1, %rax` puts `1` in `rax`) but should provide broader coverage of interesting corner-cases where optimization breaks the PCC chain.
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=67432.
show more ...
|
|
Revision tags: v18.0.3, v18.0.2, v17.0.2 |
|
| #
caa555f8 |
| 20-Feb-2024 |
Jamey Sharp <[email protected]> |
cranelift: Enable "chaos mode" in egraph pass (#7968)
First of all, thread a "chaos mode" control-plane into Context::optimize and from there into EgraphPass, OptimizeCtx, and Elaborator.
In this c
cranelift: Enable "chaos mode" in egraph pass (#7968)
First of all, thread a "chaos mode" control-plane into Context::optimize and from there into EgraphPass, OptimizeCtx, and Elaborator.
In this commit we use the control-plane to change the following behaviors in ways which shouldn't cause incorrect results:
- Dominator-tree block traversal order for both the rule application and elaboration passes - Order of evaluating optimization alternatives from `simplify` - Choose worst values instead of best in each eclass
Co-authored-by: L. Pereira <[email protected]>
show more ...
|
|
Revision tags: v18.0.1, v18.0.0 |
|
| #
e7ab3a46 |
| 12-Feb-2024 |
Maja Kądziołka <[email protected]> |
unionfind: robustly avoid changing `Idx`s in the GVN map (#7746)
* unionfind: robustly avoid changing `Idx`s in the GVN map
Stop hoping that keeping the smallest Idx as canonical will yield good re
unionfind: robustly avoid changing `Idx`s in the GVN map (#7746)
* unionfind: robustly avoid changing `Idx`s in the GVN map
Stop hoping that keeping the smallest Idx as canonical will yield good results, and instead explicitly inform the UnionFind of what we expect not to move.
Fixes #6126
* unionfind: track unions of pinned indices as stats
Emitting a warning in this situation is too much.
show more ...
|
|
Revision tags: v17.0.1, v17.0.0, v16.0.0, v15.0.1, v15.0.0, v14.0.4, v14.0.3, v14.0.2, v13.0.1, v14.0.1, v14.0.0 |
|
| #
f466aa26 |
| 06-Oct-2023 |
Chris Fallin <[email protected]> |
Skeleton and initial support for proof-carrying code. (#7165)
* WIP veriwasm 2.0
Co-Authored-By: Chris Fallin <[email protected]>
* PCC: successfully parse some simple facts.
Co-authored-by: Nic
Skeleton and initial support for proof-carrying code. (#7165)
* WIP veriwasm 2.0
Co-Authored-By: Chris Fallin <[email protected]>
* PCC: successfully parse some simple facts.
Co-authored-by: Nick Fitzgerald <[email protected]>
* PCC: plumb facts through VCode and add framework on LowerBackend to check them.
Co-authored-by: Nick Fitzgerald <[email protected]>
* PCC: code is carrying some proofs! Very simple test-case.
Co-authored-by: Nick Fitzgerald <[email protected]>
* PCC: add a `safe` flag for checked memory accesses.
* PCC: add pretty-printing of facts to CLIF output.
* PCC: misc. cleanups.
* PCC: lots of cleanup.
* Post-rebase fixups and some misc. fixes.
* Add serde traits to facts.
* PCC: add succeed and fail tests.
* Review feedback: rename `safe` memflag to `checked`.
* Review feedback.
---------
Co-authored-by: Nick Fitzgerald <[email protected]>
show more ...
|
|
Revision tags: minimum-viable-wasi-proxy-serve, v13.0.0, v12.0.2, v11.0.2, v10.0.2, v12.0.1, v12.0.0 |
|
| #
b9134e21 |
| 18-Aug-2023 |
Gurinder Singh <[email protected]> |
Call verifier after egraph pass (#6858)
|
|
Revision tags: v11.0.1, v11.0.0, v10.0.1, v10.0.0, v9.0.4, v9.0.3, v9.0.2, v9.0.1, v9.0.0, v6.0.2, v7.0.1, v8.0.1, v8.0.0 |
|
| #
230e2135 |
| 06-Apr-2023 |
Chris Fallin <[email protected]> |
Cranelift: remove non-egraphs optimization pipeline and `use_egraphs` option. (#6167)
* Cranelift: remove non-egraphs optimization pipeline and `use_egraphs` option.
This PR removes the LICM, GVN,
Cranelift: remove non-egraphs optimization pipeline and `use_egraphs` option. (#6167)
* Cranelift: remove non-egraphs optimization pipeline and `use_egraphs` option.
This PR removes the LICM, GVN, and preopt passes, and associated support pieces, from `cranelift-codegen`. Not to worry, we still have optimizations: the egraph framework subsumes all of these, and has been on by default since #5181.
A few decision points:
- Filetests for the legacy LICM, GVN and simple_preopt were removed too. As we built optimizations in the egraph framework we wrote new tests for the equivalent functionality, and many of the old tests were testing specific behaviors in the old implementations that may not be relevant anymore. However if folks prefer I could take a different approach here and try to port over all of the tests.
- The corresponding filetest modes (commands) were deleted too. The `test alias_analysis` mode remains, but no longer invokes a separate GVN first (since there is no separate GVN that will not also do alias analysis) so the tests were tweaked slightly to work with that. The egrpah testsuite also covers alias analysis.
- The `divconst_magic_numbers` module is removed since it's unused without `simple_preopt`, though this is the one remaining optimization we still need to build in the egraphs framework, pending #5908. The magic numbers will live forever in git history so removing this in the meantime is not a major issue IMHO.
- The `use_egraphs` setting itself was removed at both the Cranelift and Wasmtime levels. It has been marked deprecated for a few releases now (Wasmtime 6.0, 7.0, upcoming 8.0, and corresponding Cranelift versions) so I think this is probably OK. As an alternative if anyone feels strongly, we could leave the setting and make it a no-op.
* Update test outputs for remaining test differences.
show more ...
|
| #
7eb89140 |
| 05-Apr-2023 |
Remo Senekowitsch <[email protected]> |
Chaos mode MVP: Skip branch optimization in MachBuffer (#6039)
* fuzz: Add chaos mode control plane
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Wa
Chaos mode MVP: Skip branch optimization in MachBuffer (#6039)
* fuzz: Add chaos mode control plane
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fuzz: Skip branch optimization with chaos mode
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fuzz: Rename chaos engine -> control plane
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* chaos mode: refactoring ControlPlane to be passed through the call stack by reference
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Remo Senekowitsch <[email protected]>
* fuzz: annotate chaos todos
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fuzz: cleanup control plane
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fuzz: remove control plane from compiler context
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fuzz: move control plane into emit state
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fuzz: fix remaining compiler errors
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* fix tests
* refactor emission state ctrl plane accessors
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* centralize conditional compilation of chaos mode
Also cleanup a few straggling dependencies on cranelift-control that aren't needed anymore.
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* add cranelift-control to published crates
prtest:full
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
* add cranelift-control to public crates
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]>
---------
Co-authored-by: Falk Zwimpfer <[email protected]> Co-authored-by: Moritz Waser <[email protected]> Co-authored-by: Remo Senekowitsch <[email protected]>
show more ...
|
| #
94f2ff09 |
| 30-Mar-2023 |
Yoni L <[email protected]> |
cranelift::codegen::Context::optimize(): reduce verbosity of "egraph stats" traces (#6122)
|
|
Revision tags: v7.0.0 |
|
| #
108f7917 |
| 10-Mar-2023 |
bjorn3 <[email protected]> |
Support plugging external profilers into the Cranelift timing infrastructure (#5749)
* Remove no-std code for cranelift_codegen::timings
no-std mode isn't supported by Cranelift anymore
* Simplify
Support plugging external profilers into the Cranelift timing infrastructure (#5749)
* Remove no-std code for cranelift_codegen::timings
no-std mode isn't supported by Cranelift anymore
* Simplify define_passes macro
* Add egraph opt timings
* Replace the add_to_current api with PassTimes::add
* Omit a couple of unused time measurements
* Reduce divergence between run and run_passes a bit
* Introduce a Profiler trait
This allows plugging in external profilers into the Cranelift profiling framework.
* Add Pass::description method
* Remove duplicate usage of the compile pass timing
* Rustfmt
show more ...
|
|
Revision tags: v6.0.1, v5.0.1, v4.0.1 |
|
| #
8abfe928 |
| 23-Feb-2023 |
Trevor Elliott <[email protected]> |
Reuse the DominatorTree postorder travesal in BlockLoweringOrder (#5843)
* Rework the blockorder module to reuse the dom tree's cfg postorder
* Update domtree tests
* Treat br_table with an empty
Reuse the DominatorTree postorder travesal in BlockLoweringOrder (#5843)
* Rework the blockorder module to reuse the dom tree's cfg postorder
* Update domtree tests
* Treat br_table with an empty jump table as multiple block exits
* Bless tests
* Change branch_idx to succ_idx and fix the comment
show more ...
|