diff options
-rw-r--r-- | CMakeLists.txt | 14 | ||||
-rwxr-xr-x | auto_update_tests.py | 2 | ||||
-rwxr-xr-x | check.py | 1 | ||||
-rw-r--r-- | src/binaryen-c.cpp | 8 | ||||
-rw-r--r-- | src/binaryen-c.h | 3 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 6 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 145 |
7 files changed, 178 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 4877a118b..461f092ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,10 +95,22 @@ SET(binaryen_c_SOURCES src/binaryen-c.cpp src/cfg/Relooper.cpp src/pass.cpp + src/passes/LowerIfElse.cpp + src/passes/MergeBlocks.cpp + src/passes/NameManager.cpp + src/passes/OptimizeInstructions.cpp + src/passes/PostEmscripten.cpp src/passes/Print.cpp + src/passes/RemoveImports.cpp + src/passes/RemoveUnusedBrs.cpp + src/passes/RemoveUnusedNames.cpp + src/passes/SimplifyLocals.cpp + src/passes/ReorderLocals.cpp + src/passes/Vacuum.cpp + src/passes/Metrics.cpp src/wasm.cpp ) -ADD_LIBRARY(binaryen-c STATIC ${binaryen_c_SOURCES}) +ADD_LIBRARY(binaryen-c SHARED ${binaryen_c_SOURCES}) SET(binaryen-shell_SOURCES src/binaryen-shell.cpp diff --git a/auto_update_tests.py b/auto_update_tests.py index bd9e5f695..7162bd8fd 100755 --- a/auto_update_tests.py +++ b/auto_update_tests.py @@ -2,6 +2,8 @@ import os, sys, subprocess, difflib +os.environ['LD_LIBRARY_PATH'] = 'lib' # find our dynamic libraries + print '[ processing and updating testcases... ]\n' for asm in sorted(os.listdir('test')): @@ -49,6 +49,7 @@ WATERFALL_BUILD_DIR = os.path.join(BASE_DIR, 'wasm-install') BIN_DIR = os.path.abspath(os.path.join(WATERFALL_BUILD_DIR, 'wasm-install', 'bin')) os.environ['BINARYEN'] = os.getcwd() +os.environ['LD_LIBRARY_PATH'] = 'lib' # find our dynamic libraries def fetch_waterfall(): rev = open(os.path.join('test', 'revision')).read().strip() diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index b2c695ec0..bbafdf49d 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -19,6 +19,7 @@ //=============================== #include "binaryen-c.h" +#include "pass.h" #include "wasm.h" #include "wasm-builder.h" #include "wasm-printing.h" @@ -384,6 +385,13 @@ void BinaryenModulePrint(BinaryenModuleRef module) { WasmPrinter::printModule((Module*)module); } +void BinaryenModuleOptimize(BinaryenModuleRef module) { + Module* wasm = (Module*)module; + PassRunner passRunner(wasm); + passRunner.addDefaultOptimizationPasses(); + passRunner.run(); +} + // // ========== CFG / Relooper ========== // diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 2dbf27076..2e0a7b996 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -266,6 +266,9 @@ void BinaryenSetStart(BinaryenModuleRef module, const char* name); // Print a module to stdout. void BinaryenModulePrint(BinaryenModuleRef module); +// Run the standard optimization passes on the module. +void BinaryenModuleOptimize(BinaryenModuleRef module); + // // ========== CFG / Relooper ========== // diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index 65355da4a..6a7b013e4 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -354,7 +354,13 @@ void test_relooper() { BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-tail", v, localTypes, 1, body); } + printf("raw:\n"); BinaryenModulePrint(module); + + printf("optimized:\n"); + BinaryenModuleOptimize(module); + BinaryenModulePrint(module); + BinaryenModuleDispose(module); } diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index 3c808c9a1..30444c886 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -346,6 +346,7 @@ BinaryenFloat64: 4 ) ) ) +raw: (module (memory 0) (type $v (func)) @@ -610,3 +611,147 @@ BinaryenFloat64: 4 ) ) ) +optimized: +(module + (memory 0) + (type $v (func)) + (func $just-one-block (type $v) + (i32.const 1337) + ) + (func $two-blocks (type $v) + (i32.const 0) + (i32.const 1) + ) + (func $two-blocks-plus-code (type $v) + (i32.const 0) + (i32.const 77) + (i32.const 1) + ) + (func $loop (type $v) + (loop $shape$0$break $shape$0$continue + (i32.const 0) + (i32.const 1) + (br $shape$0$continue) + ) + ) + (func $loop-plus-code (type $v) + (loop $shape$0$break $shape$0$continue + (i32.const 0) + (i32.const 33) + (i32.const 1) + (i32.const -66) + (br $shape$0$continue) + ) + ) + (func $split (type $v) + (i32.const 0) + (select + (i32.const 1) + (i32.const 2) + (i32.const 55) + ) + ) + (func $split-plus-code (type $v) + (i32.const 0) + (select + (block + (i32.const 10) + (i32.const 1) + ) + (block + (i32.const 20) + (i32.const 2) + ) + (i32.const 55) + ) + ) + (func $if (type $v) + (i32.const 0) + (if + (i32.const 55) + (i32.const 1) + ) + (i32.const 2) + ) + (func $if-plus-code (type $v) + (i32.const 0) + (select + (block + (i32.const -1) + (i32.const 1) + (i32.const -3) + ) + (i32.const -2) + (i32.const 55) + ) + (i32.const 2) + ) + (func $if-else (type $v) + (i32.const 0) + (select + (i32.const 1) + (i32.const 2) + (i32.const 55) + ) + (i32.const 3) + ) + (func $loop-tail (type $v) + (loop $shape$0$break $shape$0$continue + (i32.const 0) + (i32.const 1) + (if + (i32.const 10) + (br $shape$0$continue) + (br $shape$0$break) + ) + ) + (i32.const 2) + ) + (func $loop-tail (type $v) + (local $0 i32) + (i32.const 0) + (i32.const 10) + (loop $shape$1$break $shape$1$continue + (i32.const 1) + (if + (i32.eqz + (i32.const -2) + ) + (block + (i32.const 20) + (br $shape$1$break) + ) + ) + (i32.const 2) + (if + (i32.const -6) + (block + (set_local $0 + (i32.const 4) + ) + (br $shape$1$break) + ) + (block + (i32.const 30) + (br $shape$1$continue) + ) + ) + ) + (if + (i32.eq + (get_local $0) + (i32.const 4) + ) + (block + (i32.const 3) + (if + (i32.const -10) + (i32.const 4) + ) + (i32.const 5) + (i32.const 40) + ) + ) + (i32.const 6) + ) +) |