summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
...
* Use `= default` rather than {} for empty destructors (#1794)Sam Clegg2018-12-032-2/+2
|
* Add virtual destructor to fix build warning/error (#1793)Sam Clegg2018-11-301-0/+1
| | | | | | | | This error started showing up after: #1779 error: delete called on non-final 'wasm::ShellExternalInterface' that has virtual functions but non-virtual destructor
* wasm-emscripten-finalize: Remove stack pointer global from shared libs (#1791)Sam Clegg2018-11-303-14/+82
| | | | | | | | | | | | | The wasm backend uses a wasm global (__stack_pointer) for the shadow stack location. In order to make this work with shared libraries the main module would have to export this global and shared libraries would need to import it. This means we'd be relying of mutable globals which are not yet implemented in all browsers. This change allows is to move forward with shared libraries without mutable global support by replacing all stack pointer access in shared libraries with functions calls.
* Fuzzing: log values during execution (#1779)Alon Zakai2018-11-307-14/+65
| | | | | | | | Before we just looked at function return values when looking for differences before and after running some passes, while fuzzing. This adds logging of values during execution, which can represent control flow, monitor locals, etc., giving a lot more opportunities for the fuzzer to find problems. Also: * Clean up the sigToFunctionType function, which allocated a struct and returned it. This makes it safer by returning the struct by value, which is also easier to use in this PR. * Fix printing of imported function calls without a function type - turns out we always generate function types in loading, so we didn't notice this was broken, but this new fuzzer feature hit it.
* Add support for a mutable globals as a Feature (#1785)Sam Clegg2018-11-305-4/+17
| | | | | This picks up from #1644 and indeed borrows the test case from there.
* Cleanup shared constants (#1784)Sam Clegg2018-11-297-12/+10
|
* Add v128 type (#1777)Thomas Lively2018-11-2924-5/+84
|
* standardize on 'template<' over 'template <' (i.e., remove a space) (#1782)Alon Zakai2018-11-2917-32/+32
|
* LocalCSE fuzz fix: invalidate the set operations too (#1778)Alon Zakai2018-11-281-2/+23
| | | | | We invalidated based on effects of set values, but not of the sets themselves. Without that, a set could be overridden by something irrelevant and we thought we could still reuse the old value. Before this PR, the testcase would have the last set's value be optimized into a get, incorrectly.
* Start to implement #1764 (#1776)Alon Zakai2018-11-281-0/+34
| | | | | | This adds a first instance of the rules discussed in #1764 , specifically, x == y || x > y => x >= y
* Remove default cases (#1757)Thomas Lively2018-11-2727-107/+176
| | | | | | Where reasonable from a readability perspective, remove default cases in switches over types and instructions. This makes future feature additions easier by making the compiler complain about each location where new types and instructions are not yet handled.
* Stricter Canonicalization (#1774)Alon Zakai2018-11-271-18/+69
| | | In OptimizeInstructions we canonicalized a const on the right side. This PR adds further canonicalization, of a get to the right, and of sorting by binary and unary op ids. This guarantees fixed orders for small combinations of instructions that can then be pattern-matched in a simple way in future PRs.
* ReFinalize fuzz fix (#1771)Alon Zakai2018-11-274-125/+242
| | | | | | If we refinalize after adding a value that flows out of a block, we need to fix up any branches that might exist without a value, which is possible if the branches were not taken in practice Also refactor ReFinalize into a separate file.
* add an option to work on text files in wasm-reduce (#1772)Alon Zakai2018-11-271-6/+19
| | | Reducing on text files can be useful as in binaryen the binary reading and writing has some noticeable effects (due to wasm and binaryen IR not being identical, while the text format is a closer match.
* fix some () vs (void) C warnings in the C API (#1768)Alon Zakai2018-11-262-6/+6
| | | Fixes #1766
* Relooper: Merge consecutive blocks (#1770)Alon Zakai2018-11-261-0/+40
| | | That is, A -> B where no other branches go to B. In that case we are guaranteed to not increase code size.
* initialize binary writer debug info even without a source map, as debug info ↵Alon Zakai2018-11-262-1/+6
| | | | may exist without a source map (#1733)
* Branches only invalidate side effects (#1765)Alon Zakai2018-11-261-3/+4
| | | Previously we assumed that we can't reorder a branching instruction and anything else. However, the only risk is when the other thing has side effects.
* Merge-Blocks improvements (#1760)Alon Zakai2018-11-261-18/+57
| | | | | | | | | | | | | | | | | | | | | | Previously we didn't try to merge a block into the parent if the block had a name. This lets us merge part of it, that is: (block (..a..) (block $child (..b..) (.. some br to $child ..) (..c..) ) ) => (block (..a..) (..b..) ;; moved out (block $child (.. some br to $child ..) (..c..) ) ) This is beneficial for 2 reasons: the child may now be a singleton, so we can remove the block; or, now that we canonicalized the br-containing code to the head of the child, we may be able to turn it into an if.
* Merge pull request #1761 from juj/minify_exportsjuj2018-11-223-5/+19
|\ | | | | minify_exports
| * Adjust MinifyImportsAndExports to optionally minify the export names, ↵Jukka Jylänki2018-11-223-5/+19
| | | | | | | | sometimes that is not desirable.
* | Relooper CFG optimizations (#1759)Alon Zakai2018-11-219-115/+619
|/ | | | | | | | | | | | | | | | Previously the relooper would do some optimizations when deciding when to use an if vs a switch, how to group blocks, etc. This PR adds an additional pre-optimization phase with some basic but useful simplify-cfg style passes, * Skip empty blocks when they have just one exit. * Merge exiting branches when they are equivalent. * Canonicalize block contents to make such comparisons more useful. * Turn a trivial one-target switch into a simple branch. This can help in noticeable ways when running the rereloop pass, e.g. on LLVM wasm backend output. Also: * Binaryen C API changes to the relooper, which now gets a Module for its constructor. It needs it for the optimizations, as it may construct new nodes. * Many relooper-fuzzer improvements. * Clean up HashType usage.
* Use getTempRet0/setTempRet0 in LegalizeJSInterface.cpp (#1709)Sam Clegg2018-11-201-57/+26
| | | | | | | | | | | | | | | | Its simpler if we always import these functions from the embedder rather then synthesizing them various placed. This is part of a 4 part change: LLVM: https://reviews.llvm.org/D53240 fastcomp: https://github.com/kripken/emscripten-fastcomp/pull/237 emscripten: https://github.com/kripken/emscripten/pull/7358 binaryen: https://github.com/kripken/emscripten/pull/7358 Fixes: https://github.com/kripken/emscripten/issues/7273 Fixes: https://github.com/kripken/emscripten/issues/7304
* Switch optimizations in remove-unused-brs (#1753)Alon Zakai2018-11-204-47/+95
| | | | | | * Switch optimizations in remove-unused-brs: thread switch jumps, and turn a switch with all identical targets into a br * refinalize in interm operations in remove-unused-brs, as we can be confused by it
* Reject all nonexistent instructions in sexp format (#1756)Thomas Lively2018-11-191-191/+869
|
* Fix a merge-blocks fuzz bug (#1755)Alon Zakai2018-11-192-58/+73
| | | | | | * Moving blocks into if arms may change the block type, and the code we had was written under the assumption that was not true. * Move block sinking merge-blocks => remove-unused-brs, as it's more natural there. that pass refinalizes everything anyhow
* Generate sexp instruction parser (#1754)Thomas Lively2018-11-193-292/+704
| | | Also fix broken tests surfaced by the new parser.
* wasm-opt: Add an option to select generation of atomic opcodes at runtime ↵Benjamin Bouvier2018-11-161-1/+5
| | | | | (#1751) partially solves #1676.
* wasm-reduce: reduce switch targets (#1752)Alon Zakai2018-11-161-2/+21
| | | This tries to reduce by replacing targets with the default, and by shrinking the list of targets.
* Use assert in addition to abort for WASM_UNREACHABLE (#1747)Thomas Lively2018-11-151-1/+2
| | | | This yields more useful information when something goes wrong.
* Optimize an if exit block into an if arm (#1749)Alon Zakai2018-11-152-1/+41
| | | If an if is enclosed in a block which is only used to exit one arm, move it into that arm, so it can be better optimized. Similar to what we did for loops in #1736.
* wasm-emscripten-finalize: Initial support for handling shared libraries (#1746)Sam Clegg2018-11-153-25/+36
| | | | In this case we won't want generate any of the normal memory helper functions (they come from the main module).
* Fix segment size validation for imported memories (#1745)Sam Clegg2018-11-151-2/+7
| | | | | | | | | | | Without this wasm-opt can't operation on emscripten-produced SIDE_MODULES's which have zero sized memory imports. Technically is not a validation failure if you have segments that are larger than your initial memory, regardless of whether you import them. For non-imported memories it can be helpful though, so leaving it in to catch those errors.
* Don't try to optimize away unused names in RemoveUnusedBrs (#1750)Alon Zakai2018-11-152-2/+2
| | | | | Rely on the dedicated pass for that. It's not worth the extra complexity to try, as we can't easily handle all the cases anyhow. Add another run of the dedicated name-removing pass in the default passes.
* Avoid segfault when printing null nameThomas Lively2018-11-151-3/+3
| | | | `strpbrk` segfaults when `name.str` is nullptr, so check first.
* MergeBlocks: canonicalize loop exit block position on the inside (#1736)Alon Zakai2018-11-141-1/+19
| | | | * move a loop exit block (block with a name, and one child which is the loop) into the loop in MergeBlocks, as that is better for other passes
* Handle EM_ASM functions in Tables (#1739)Jacob Gravelle2018-11-141-7/+27
| | | | | Not at all sure why we're seeing any there, but it's easy enough to handle that we might as well.
* Restructure ifs with a value (#1743)Alon Zakai2018-11-141-20/+70
| | | We previously had code to recreate an if from a block+branch when possible, but not when the block had a return value. This PR adds support to restructure that too, into an if with a value.
* clean up unnecessary type setting in binary format loading - finalize() will ↵Alon Zakai2018-11-141-62/+61
| | | | do it properly later (#1744)
* ReFinalize fix (#1742)Alon Zakai2018-11-141-14/+52
| | | | | | | Handle a corner case in ReFinalize, which incrementally re-types code after changes. The problem is that if we need to figure out the type of a block, we look to the last element flowing out, or to breaks with values. If there is no such last element, and the breaks are not taken - they have unreachable values - then they don't tell us the block's proper type. We asserted that in such a case the block still had a type, and didn't handle this. To fix it, we could look on the parent to see what type would fit. However, it seem simpler to just remove untaken breaks/switches as part of ReFinalization - they carry no useful info anyhow. After removing them, if the block has no other signal of a concrete type, it can just be unreachable. This bug existed for at least 1.5 years - I didn't look back further. I think it was noticed by the fuzzer now due to recent fuzzing improvements and optimizer improvements, as I just saw this bug found a second time.
* Add wasm-emscripten-finalize flag to separate data segments into a file (#1741)Derek Schuff2018-11-144-0/+31
| | | | This writes the data section into a file suitable for use with emscripten's --memory-init-file flag
* Modernize relooper code (#1738)Alon Zakai2018-11-132-177/+176
| | | Use c++11 auto, iterators, etc.
* Fix alignment in MixedAllocator (#1740)Alon Zakai2018-11-133-21/+32
| | | Necessary for simd, as we add a type with alignment >8. We were just broken on that before this PR.
* Better fuzzing (#1735)Alon Zakai2018-11-131-10/+189
| | | | | | * Recombine function pieces after randomly generating them, by creating copies and moving them around. This gives a realistic probability to seeing duplicate expressions, which some optimizations look for, which otherwise the fuzzer would have almost never reached. * Mutate function pieces after recombination, giving not only perfect duplicates but also near-duplicates. These operations take into account the type, but not the nesting and uniqueness of labels, so we fix that up afterwards (when something is broken, we replace it with something trivial).
* fix flipping in dataflow graph generation (#1732)Alon Zakai2018-11-081-8/+8
| | | For souper we need to flip some operations in DataFlow IR, since souper doesn't have any redundant ones. But we flipped not just left and right but also equal/not equal, which was wrong.
* Rename tableBase/memoryBase to __table_base/__memory_base (#1731)Sam Clegg2018-11-084-14/+14
|
* Fix a merge-blocks fuzz bug (#1730)Alon Zakai2018-11-081-1/+18
| | | | | | | | | | | | | | | If a block has code after an unreachable element, it makes merging to an outer block tricky - the child block may be unreachable, but the parent have a return type, (block (result i32) .. (block (unreachable) (nop) ) ) It's ok to end an unreachable block with a nop, but not a typed one. To avoid this, if a child block has dce-able code, just ignore it.
* Fix a DataFlowOpts bug (#1729)Alon Zakai2018-11-072-8/+10
| | | | | | | We create some fake nodes for internal use, and were looking at one by mistake. This fixes that by * Creating a non-ambiguous fake node, a call (which represents an unknown value properly, unlike a zero which we had before). * Make DFO not rely on those values, if it knows a node is constant, apply those constant values. Found by the fuzzer.
* Fix a bug with (add (sub 0 X) Y) => (sub Y X) (#1727)Alon Zakai2018-11-073-3/+27
| | | | | We need to verify that the reordering is valid if there are side effects. Original bug report: https://groups.google.com/forum/?nomobile=true#!topic/emscripten-discuss/HIlGf8o2Ato
* wasm-ctor-eval: Hard error if requested ctor does not exist (#1728)Sam Clegg2018-11-061-1/+5
| | | | | Not being able to evaluate a ctor is different to that ctor being absent. This is masked a bug in emscripten where we were spelling the names of the ctors wrong on the command line.