summaryrefslogtreecommitdiff
path: root/test
Commit message (Collapse)AuthorAgeFilesLines
...
* Bysyncify: async transform for wasm (#2172)Alon Zakai2019-06-159-0/+7013
| | | | | | | | | This adds a new pass, Bysyncify, which transforms code to allow unwind and rewinding the call stack and local state. This allows things like coroutines, turning synchronous code asynchronous, etc. The new pass file itself has a large comment on top with docs. So far the tests here seem to show this works, but this hasn't been tested heavily yet. My next step is to hook this up to emscripten as a replacement for asyncify/emterpreter, see emscripten-core/emscripten#8561 Note that this is completely usable by itself, so it could be useful for any language that needs coroutines etc., and not just ones using LLVM and/or emscripten. See docs on the ABI in the pass source.
* Copy debug info when inlining (#2168)Alon Zakai2019-06-0714-7/+199
|
* Fix bug and leak in relooper merge consecutive blocks (#2159)hobby82019-06-072-0/+86
| | | | | | | | | | | | | | | | | | Fixes in Relooper merge consecutive blocks: Entry block getting removed when it is part of a loop: bb1->AddBranchTo(bb2, nullptr); bb1->AddBranchTo(bb3, ...); bb2->AddBranchTo(bb1, nullptr); bb3->AddBranchTo(bb4, nullptr); relooper.AddBlock(bb1); relooper.AddBlock(bb2); relooper.AddBlock(bb3); relooper.AddBlock(bb4); relooper.Calculate(bb1); Branches memory leak
* Use splatted zero vector in makeZero (#2164)Thomas Lively2019-06-052-1/+21
| | | | | This prevents the optimizer from producing v128.const instructions, which are not supported by V8 at this time.
* Reduce interpreter recursion limit (#2162)Alon Zakai2019-06-042-8/+8
| | | | | | | This should be small enough to work in a 512K stack on Linux, which may then be small enough to work on all common OSes. I had to update some spec tests which actually did more recursive calls, but I don't think the change reduces any relevant amount of test coverage. This may fix the Mac bot finally, as with this it passes for me on the stack size I think Macs have by default.
* Add event section (#2151)Heejin Ahn2019-05-3135-704/+1186
| | | | | | | | | | | | | | | | | | This adds support for the event and the event section, as specified in https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md#changes-to-the-binary-model. Wasm events are features that suspend the current execution and transfer the control flow to a corresponding handler. Currently the only supported event kind is exceptions. For events, this includes support for - Binary file reading/writing - Wast file reading/writing - Binaryen.js API - Fuzzer - Validation - Metadce - Passes: metrics, minify-imports-and-exports, remove-unused-module-elements
* Add --print-function-map to print out a map of function index to name (#2155)Alon Zakai2019-05-312-0/+19
| | | | | | | | | | * work * fix * fix * format
* Add Features.MVP and Features.All to binaryen.js (#2148)Heejin Ahn2019-05-294-16/+15
| | | | This adds `Features.MVP` and `Features.All` to binaryen.js and make test cases use it.
* wasm2js: Switch optimizations (#2141)Alon Zakai2019-05-2810-37278/+37616
| | | | | This pattern-matches towers of blocks + a br_table into a JS switch. This is much smaller in code size and also avoids heavy nesting that can exceed the recursion limits of JS parsers. This is not enough yet, because it pattern-matches very specifically. In reality, switches can look slightly different. Followup PRs will extend this. For now, this passes the test suite (what passed before - not including the massive-switch tests) + fuzzing so it's a good start.
* Refactor type and function parsing (#2143)Heejin Ahn2019-05-24128-1450/+1487
| | | | | | | | | | | | | | | | | | | | | | | | | | | | - Refactored & fixed typeuse parsing rules so now the rules more closely follow the spec. There have been multiple parsing rules that were different in subtle ways, which are supposed to be the same according to the spec. - Duplicate types, i.e., types with the same signature, in the type section are allowed as long as they don't have the same given name. If a name is given, we use it; if type name is not given, we generate one in the form of `$FUNCSIG$` + signature string. If the same generated name already exists in the type section, we append `_` at the end. This causes most of the changes in the autogenerated type names in test outputs. - A typeuse has to be in the order of (type) -> (param) -> (result), if more than one of them exist. In case of function definitions, (local) has to be after all of these. Fixed some test cases that violate this rule. - When only (param)/(result) are given, its type will be the type with the smallest existing type index whose parameter and result are the same. If there's no such type, a new type will be created and inserted. - Added a test case `duplicate_types.wast` to test type namings for duplicate types. - Refactored `parseFunction` function. - Add more overrides to helper functions: `getSig` and `ensureFunctionType`.
* Add `getGlobal` to binaryen.js (#2142)Heejin Ahn2019-05-242-0/+3
| | | | | We have `getFunction`, but not `getGlobal` because its name clashed with APIs for the deprecated instruction `get_global`. Now we have reflected instruction renaming in code, we can add it for consistency.
* Show line/col for parsing exceptions in gen-s-parser (#2138)Heejin Ahn2019-05-241-0/+18
|
* Add BinaryenModuleWriteSExpr to write a module to a string in s-expr format ↵Siddharth2019-05-212-0/+35
| | | | | (#2106) Fixes #2103.
* Don't use colons in filenames (#2134)Derek Schuff2019-05-212-0/+0
| | | Windows filenames can't contain colons. Use @ instead for passing arguments to passes.
* Reflect instruction renaming in code (#2128)Heejin Ahn2019-05-2197-437/+437
| | | | | | | | | | | | | | | | | | | | | | | | | | | | - Reflected new renamed instruction names in code and tests: - `get_local` -> `local.get` - `set_local` -> `local.set` - `tee_local` -> `local.tee` - `get_global` -> `global.get` - `set_global` -> `global.set` - `current_memory` -> `memory.size` - `grow_memory` -> `memory.grow` - Removed APIs related to old instruction names in Binaryen.js and added APIs with new names if they are missing. - Renamed `typedef SortedVector LocalSet` to `SetsOfLocals` to prevent name clashes. - Resolved several TODO renaming items in wasm-binary.h: - `TableSwitch` -> `BrTable` - `I32ConvertI64` -> `I32WrapI64` - `I64STruncI32` -> `I64SExtendI32` - `I64UTruncI32` -> `I64UExtendI32` - `F32ConvertF64` -> `F32DemoteI64` - `F64ConvertF32` -> `F64PromoteF32` - Renamed `BinaryenGetFeatures` and `BinaryenSetFeatures` to `BinaryenModuleGetFeatures` and `BinaryenModuleSetFeatures` for consistency.
* Fix AvoidReinterprets on reinterpreted loads of fewer than the full size (#2123)Alon Zakai2019-05-172-0/+29
| | | | | | * fix * fix style
* Fix a vacuum bug with loads changing the type (#2124)Alon Zakai2019-05-172-0/+133
| | | This happened on wasm2js, where implicit traps are off by default, and this bug is specific to that (less-tested) mode.
* Remove llvm_autogenerated tests (#2120)Heejin Ahn2019-05-1754-12036/+0
| | | After s2wasm was removed, these tests don't seem to be used anymore.
* fix a dae fuzz bug (#2121)Alon Zakai2019-05-172-0/+103
|
* Fix an infinite loop in avoid-reinterprets in unreachable code with loops of ↵Alon Zakai2019-05-174-0/+97
| | | | | gets (#2118) In unreachable code, a get may have a single set that assigns to it, and that set may be assigned to by that very get.
* Features C/JS API (#2049)Thomas Lively2019-05-175-0/+61
| | | | | Add feature handling to the C/JS APIs. No features are enabled by default, so all used features will have to be explicitly enabled in order for modules to validate.
* Allow color API to enable and disable colors (#2111)Siddharth2019-05-171-0/+16
| | | | | | This is useful for front-ends which wish to selectively enable or disable coloring. Also expose these APIs from the C API.
* Add globals to metrics (#2110)Heejin Ahn2019-05-166-0/+16
|
* wasm2js: more coercion optimization (#2109)Alon Zakai2019-05-154-1/+170
|
* wasm2js: remove unnecessary labels (#2108)Alon Zakai2019-05-154-5/+5
|
* wasm2js: optimize away unneeded load coercions (#2107)Alon Zakai2019-05-1594-1/+238
|
* wasm2js: Emit table in a way that is friendly to emscripten minification (#2102)Alon Zakai2019-05-132-2/+4
| | | Set it to a local in the asmFunc scope, so that minifiers can easily see it's a simple local value (instead of using it as an upvar from the parameters higher up, which was how the emscripten glue was emitting it).
* wasm2js: precompute bitwise operations (#2101)Alon Zakai2019-05-1315-183/+183
| | | This happens on e.g. an i32 load of a constant offset, then we have constant >> 2.
* Add missing methods for globals to binaryen.js (#2099)Heejin Ahn2019-05-137-9/+76
| | | | | - Print `globals` array in the tracing mode like other arrays (`functions`, `exports`, `imports`, ...) - Add accessor functions for globals
* Look through fallthrough values in precompute-propagate (#2093)Alon Zakai2019-05-1013-357/+104
| | | This helps quite a lot on wasm2js.
* wasm2js: avoid reinterprets (#2094)Alon Zakai2019-05-1013-324/+469
| | | | | In JS a reinterpret is especially expensive, as we implement it as a write to a temp buffer and a read using another view. This finds places where we load a value from memory, then reinterpret it later - in that case, we can load it using another view, at the cost of another load and another local. This is helpful on things like Box2D, where there are many reinterprets due to the main 2D vector class being an union over two floats/ints, and LLVM likes to do a single i64 load of them.
* Add except_ref type (#2081)Heejin Ahn2019-05-078-2/+35
| | | | This adds except_ref type, which is a part of the exception handling proposal.
* wasm2js: optimize booleans (#2090)Alon Zakai2019-05-073-0/+26
|
* Add exception handling feature (#2083)Heejin Ahn2019-05-031-0/+3
| | | This only adds the feature and its flag and not the instructions yet.
* wasm2js: optimize loads (#2085)Alon Zakai2019-05-0394-124/+36
| | | | When loading a boolean, prefer the signed heap (which is more commonly used, and may be faster). We never use HEAPU32 (HEAP32 is always enough), just remove it.
* wasm2js: avoid some slow operations when not optimizing (#2082)Alon Zakai2019-05-0319-3747/+4081
| | | Without this PR, wasm2js0.test_printf in emscripten took an extremely long time to compile.
* wasm2js: don't emit obviously unnecessary parens (#2080)Alon Zakai2019-05-0249-8688/+5568
| | | A minifier would probably remove them later anyhow, but they make reading the code annoying and hard.
* wasm2js: ignore implicit traps (#2079)Alon Zakai2019-05-027-58/+31
| | | | | We don't actually try to emit traps for loads, stores, invalid float to ints, etc., so when optimizing we may as well do so under the assumption those traps do not exist. This lets us emit nice code for a select whose operands are loads, for example - otherwise, the values seem to have side effects.
* Optimize mutable globals (#2066)Alon Zakai2019-05-0215-65/+146
| | | | | | | If a global is marked mutable but not assigned to, make it immutable. If an immutable global is a copy of another, use the original, so we can remove the duplicates. Fixes #2011
* Add a pass to lower unaligned loads and stores (#2078)Alon Zakai2019-05-025-51/+711
| | | | | This replaces the wasm2js code that lowered them to pessimistic (1-byte aligned) loads and stores. The new pass will do the optimal thing, keeping 2-byte alignment where possible. This is also nicer as a standalone pass, which has the simple property that after it runs all loads and stores are aligned, instead of some code scattered inside wasm2js.
* wasm2js: don't run coalesce-locals if not optimizing (#2076)Alon Zakai2019-05-0151-16963/+22097
| | | That pass is very slow on unoptimized code (super-linear on the number of locals, which if unoptimized can be massive due to flatten).
* wasm2js: run more optimizations (#2073)Alon Zakai2019-05-0162-22433/+17246
| | | In particular, coalesce-locals is useful even if closure is run later (apparently it finds stuff closure can't).
* wasm2js: run full optimizations during the pipeline (#2071)Alon Zakai2019-04-3078-5965/+22887
| | | | | We flatten for the i64 lowering etc. passes, and it is worth optimizing afterwards, to clean up stuff they created. That is run if the user ran wasm2js with an optimization level (like wasm2js -O3). Split the test files to check both optimized and unoptimized code.
* wasm2js: optimize away casts going into a suitable store (#2069)Alon Zakai2019-04-303-6/+31
|
* I64ToI32Lowering: don't use alignment 1 everywhere (#2070)Alon Zakai2019-04-305-8/+296
| | | If an i64 load/store that is being broken up has higher alignment, use that.
* wasm2js: optimize switches (#2067)Alon Zakai2019-04-306-73950/+12
| | | | | | | | | | Don't emit unneeded breaks in switch cases, instead do case X: case Y: .. case W: break .. for each group. Also, the group with the default doesn't need any cases but the default itself.
* Properly handle optimizing out a set from inside the value of another set in ↵Alon Zakai2019-04-292-0/+51
| | | | | | | SimplifyLocals (#2064) Details in lengthy comment in the source. Fixes #2063
* Fix CI (#2061)Alon Zakai2019-04-261-1/+1
| | | | | | | We had CI breakage that prevented this from being noticed before. * Make binaryen.js not use NO_FILESYSTEM - need to investigate why recent emscripten changes broke our usage of that flag. * Update a binaryen.js test.
* wasm2js: remove unneeded break/continue labels (#2058)Alon Zakai2019-04-2612-56/+56
|
* wasm2js2: optimize call_indirect and select operands (#2056)Alon Zakai2019-04-2513-95/+231
| | | Don't use temp vars to reorder them unless we need to.