Dan Gohman | 10e730a | 2015-06-29 23:51:55 +0000 | [diff] [blame] | 1 | //===-- README.txt - Notes for WebAssembly code gen -----------------------===// |
| 2 | |
| 3 | This WebAssembly backend is presently in a very early stage of development. |
| 4 | The code should build and not break anything else, but don't expect a lot more |
| 5 | at this point. |
| 6 | |
| 7 | For more information on WebAssembly itself, see the design documents: |
| 8 | * https://github.com/WebAssembly/design/blob/master/README.md |
| 9 | |
| 10 | The following documents contain some information on the planned semantics and |
| 11 | binary encoding of WebAssembly itself: |
| 12 | * https://github.com/WebAssembly/design/blob/master/AstSemantics.md |
| 13 | * https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md |
| 14 | |
JF Bastien | f05f6fd | 2015-12-05 19:36:33 +0000 | [diff] [blame] | 15 | The backend is built, tested and archived on the following waterfall: |
JF Bastien | 4383a34 | 2016-01-22 04:21:49 +0000 | [diff] [blame] | 16 | https://wasm-stat.us |
JF Bastien | f05f6fd | 2015-12-05 19:36:33 +0000 | [diff] [blame] | 17 | |
| 18 | The backend's bringup is done using the GCC torture test suite first since it |
| 19 | doesn't require C library support. Current known failures are in |
| 20 | known_gcc_test_failures.txt, all other tests should pass. The waterfall will |
| 21 | turn red if not. Once most of these pass, further testing will use LLVM's own |
JF Bastien | c2b3048 | 2015-12-09 13:29:32 +0000 | [diff] [blame] | 22 | test suite. The tests can be run locally using: |
JF Bastien | 4383a34 | 2016-01-22 04:21:49 +0000 | [diff] [blame] | 23 | https://github.com/WebAssembly/waterfall/blob/master/src/compile_torture_tests.py |
JF Bastien | f05f6fd | 2015-12-05 19:36:33 +0000 | [diff] [blame] | 24 | |
JF Bastien | 86bc915 | 2015-07-06 21:41:59 +0000 | [diff] [blame] | 25 | Interesting work that remains to be done: |
| 26 | * Write a pass to restructurize irreducible control flow. This needs to be done |
| 27 | before register allocation to be efficient, because it may duplicate basic |
| 28 | blocks and WebAssembly performs register allocation at a whole-function |
| 29 | level. Note that LLVM's GPU code has such a pass, but it linearizes control |
| 30 | flow (e.g. both sides of branches execute and are masked) which is undesirable |
| 31 | for WebAssembly. |
JF Bastien | 86bc915 | 2015-07-06 21:41:59 +0000 | [diff] [blame] | 32 | |
Dan Gohman | 10e730a | 2015-06-29 23:51:55 +0000 | [diff] [blame] | 33 | //===---------------------------------------------------------------------===// |
Dan Gohman | dfa81d8 | 2015-11-20 03:08:27 +0000 | [diff] [blame] | 34 | |
Dan Gohman | dfa81d8 | 2015-11-20 03:08:27 +0000 | [diff] [blame] | 35 | Br, br_if, and tableswitch instructions can support having a value on the |
| 36 | expression stack across the jump (sometimes). We should (a) model this, and |
| 37 | (b) extend the stackifier to utilize it. |
| 38 | |
| 39 | //===---------------------------------------------------------------------===// |
Dan Gohman | 753abf8 | 2015-12-06 19:29:54 +0000 | [diff] [blame] | 40 | |
| 41 | The min/max operators aren't exactly a<b?a:b because of NaN and negative zero |
| 42 | behavior. The ARM target has the same kind of min/max instructions and has |
| 43 | implemented optimizations for them; we should do similar optimizations for |
| 44 | WebAssembly. |
| 45 | |
| 46 | //===---------------------------------------------------------------------===// |
| 47 | |
| 48 | AArch64 runs SeparateConstOffsetFromGEPPass, followed by EarlyCSE and LICM. |
| 49 | Would these be useful to run for WebAssembly too? Also, it has an option to |
| 50 | run SimplifyCFG after running the AtomicExpand pass. Would this be useful for |
| 51 | us too? |
| 52 | |
| 53 | //===---------------------------------------------------------------------===// |
| 54 | |
Dan Gohman | 753abf8 | 2015-12-06 19:29:54 +0000 | [diff] [blame] | 55 | Register stackification uses the EXPR_STACK physical register to impose |
| 56 | ordering dependencies on instructions with stack operands. This is pessimistic; |
| 57 | we should consider alternate ways to model stack dependencies. |
| 58 | |
| 59 | //===---------------------------------------------------------------------===// |
| 60 | |
| 61 | Lots of things could be done in WebAssemblyTargetTransformInfo.cpp. Similarly, |
| 62 | there are numerous optimization-related hooks that can be overridden in |
| 63 | WebAssemblyTargetLowering. |
| 64 | |
| 65 | //===---------------------------------------------------------------------===// |
| 66 | |
| 67 | Instead of the OptimizeReturned pass, which should consider preserving the |
| 68 | "returned" attribute through to MachineInstrs and extending the StoreResults |
| 69 | pass to do this optimization on calls too. That would also let the |
| 70 | WebAssemblyPeephole pass clean up dead defs for such calls, as it does for |
| 71 | stores. |
| 72 | |
| 73 | //===---------------------------------------------------------------------===// |
| 74 | |
Dan Gohman | 7f86ca1 | 2016-01-16 00:20:03 +0000 | [diff] [blame] | 75 | Consider implementing optimizeSelect, optimizeCompareInstr, optimizeCondBranch, |
| 76 | optimizeLoadInstr, and/or getMachineCombinerPatterns. |
| 77 | |
| 78 | //===---------------------------------------------------------------------===// |
| 79 | |
| 80 | Find a clean way to fix the problem which leads to the Shrink Wrapping pass |
| 81 | being run after the WebAssembly PEI pass. |
| 82 | |
| 83 | //===---------------------------------------------------------------------===// |
Dan Gohman | adf2817 | 2016-01-28 01:22:44 +0000 | [diff] [blame^] | 84 | |
| 85 | When setting multiple local variables to the same constant, we currently get |
| 86 | code like this: |
| 87 | |
| 88 | i32.const $4=, 0 |
| 89 | i32.const $3=, 0 |
| 90 | |
| 91 | It could be done with a smaller encoding like this: |
| 92 | |
| 93 | i32.const $push5=, 0 |
| 94 | tee_local $push6=, $4=, $pop5 |
| 95 | copy_local $3=, $pop6 |
| 96 | |
| 97 | //===---------------------------------------------------------------------===// |