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: |
| 16 | https://build.chromium.org/p/client.wasm.llvm/console |
| 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: |
| 23 | github.com/WebAssembly/experimental/blob/master/buildbot/torture_test.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 | 81719f8 | 2015-11-25 16:55:01 +0000 | [diff] [blame] | 35 | set_local instructions have a return value. We should (a) model this, |
Dan Gohman | dfa81d8 | 2015-11-20 03:08:27 +0000 | [diff] [blame] | 36 | and (b) write optimizations which take advantage of it. Keep in mind that |
| 37 | many set_local instructions are implicit! |
| 38 | |
| 39 | //===---------------------------------------------------------------------===// |
| 40 | |
| 41 | Load and store instructions can have a constant offset. We should (a) model |
| 42 | this, and (b) do address-mode folding with it. |
| 43 | |
| 44 | //===---------------------------------------------------------------------===// |
| 45 | |
| 46 | Br, br_if, and tableswitch instructions can support having a value on the |
| 47 | expression stack across the jump (sometimes). We should (a) model this, and |
| 48 | (b) extend the stackifier to utilize it. |
| 49 | |
| 50 | //===---------------------------------------------------------------------===// |
Dan Gohman | 753abf8 | 2015-12-06 19:29:54 +0000 | [diff] [blame] | 51 | |
| 52 | The min/max operators aren't exactly a<b?a:b because of NaN and negative zero |
| 53 | behavior. The ARM target has the same kind of min/max instructions and has |
| 54 | implemented optimizations for them; we should do similar optimizations for |
| 55 | WebAssembly. |
| 56 | |
| 57 | //===---------------------------------------------------------------------===// |
| 58 | |
| 59 | AArch64 runs SeparateConstOffsetFromGEPPass, followed by EarlyCSE and LICM. |
| 60 | Would these be useful to run for WebAssembly too? Also, it has an option to |
| 61 | run SimplifyCFG after running the AtomicExpand pass. Would this be useful for |
| 62 | us too? |
| 63 | |
| 64 | //===---------------------------------------------------------------------===// |
| 65 | |
| 66 | When is it profitable to set isAsCheapAsAMove on instructions in WebAssembly? |
| 67 | |
| 68 | //===---------------------------------------------------------------------===// |
| 69 | |
| 70 | Register stackification uses the EXPR_STACK physical register to impose |
| 71 | ordering dependencies on instructions with stack operands. This is pessimistic; |
| 72 | we should consider alternate ways to model stack dependencies. |
| 73 | |
| 74 | //===---------------------------------------------------------------------===// |
| 75 | |
| 76 | Lots of things could be done in WebAssemblyTargetTransformInfo.cpp. Similarly, |
| 77 | there are numerous optimization-related hooks that can be overridden in |
| 78 | WebAssemblyTargetLowering. |
| 79 | |
| 80 | //===---------------------------------------------------------------------===// |
| 81 | |
| 82 | Instead of the OptimizeReturned pass, which should consider preserving the |
| 83 | "returned" attribute through to MachineInstrs and extending the StoreResults |
| 84 | pass to do this optimization on calls too. That would also let the |
| 85 | WebAssemblyPeephole pass clean up dead defs for such calls, as it does for |
| 86 | stores. |
| 87 | |
| 88 | //===---------------------------------------------------------------------===// |
| 89 | |
| 90 | Memset/memcpy/memmove should be marked with the "returned" attribute somehow, |
| 91 | even when they are translated through intrinsics. |
| 92 | |
| 93 | //===---------------------------------------------------------------------===// |