summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt14
-rwxr-xr-xauto_update_tests.py2
-rwxr-xr-xcheck.py1
-rw-r--r--src/binaryen-c.cpp8
-rw-r--r--src/binaryen-c.h3
-rw-r--r--test/example/c-api-kitchen-sink.c6
-rw-r--r--test/example/c-api-kitchen-sink.txt145
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')):
diff --git a/check.py b/check.py
index 25e7e905c..b02ce14ce 100755
--- a/check.py
+++ b/check.py
@@ -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)
+ )
+)