From a23899ddfde13d400abac29f2cf04b71b743093b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 5 May 2016 09:23:13 -0700 Subject: add a relooper test --- test/example/c-api-kitchen-sink.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'test/example/c-api-kitchen-sink.c') diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index 28fd901a4..65355da4a 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -332,6 +332,27 @@ void test_relooper() { BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-tail", v, localTypes, 1, body); } + { // nontrivial loop + phi to head + RelooperRef relooper = RelooperCreate(); + RelooperBlockRef block0 = RelooperAddBlock(relooper, makeInt32(module, 0)); + RelooperBlockRef block1 = RelooperAddBlock(relooper, makeInt32(module, 1)); + RelooperBlockRef block2 = RelooperAddBlock(relooper, makeInt32(module, 2)); + RelooperBlockRef block3 = RelooperAddBlock(relooper, makeInt32(module, 3)); + RelooperBlockRef block4 = RelooperAddBlock(relooper, makeInt32(module, 4)); + RelooperBlockRef block5 = RelooperAddBlock(relooper, makeInt32(module, 5)); + RelooperBlockRef block6 = RelooperAddBlock(relooper, makeInt32(module, 6)); + RelooperAddBranch(block0, block1, NULL, makeInt32(module, 10)); + RelooperAddBranch(block1, block2, makeInt32(module, -2), NULL); + RelooperAddBranch(block1, block6, NULL, makeInt32(module, 20)); + RelooperAddBranch(block2, block3, makeInt32(module, -6), NULL); + RelooperAddBranch(block2, block1, NULL, makeInt32(module, 30)); + RelooperAddBranch(block3, block4, makeInt32(module, -10), NULL); + RelooperAddBranch(block3, block5, NULL, NULL); + RelooperAddBranch(block4, block5, NULL, NULL); + RelooperAddBranch(block5, block6, NULL, makeInt32(module, 40)); + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-tail", v, localTypes, 1, body); + } BinaryenModulePrint(module); BinaryenModuleDispose(module); -- cgit v1.2.3 From 715d1becddcb89c49d71aa19e62ed27f967e5860 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 5 May 2016 09:41:01 -0700 Subject: add optimization to c api, and so that we can find all passes in the c api library, make it dynamic --- CMakeLists.txt | 14 +++- auto_update_tests.py | 2 + check.py | 1 + src/binaryen-c.cpp | 8 ++ src/binaryen-c.h | 3 + test/example/c-api-kitchen-sink.c | 6 ++ test/example/c-api-kitchen-sink.txt | 145 ++++++++++++++++++++++++++++++++++++ 7 files changed, 178 insertions(+), 1 deletion(-) (limited to 'test/example/c-api-kitchen-sink.c') 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) + ) +) -- cgit v1.2.3 From bbf846554a407e0385f91f5b7eeb9594c12e0bc5 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 5 May 2016 10:30:36 -0700 Subject: improve test --- test/example/c-api-kitchen-sink.c | 2 +- test/example/c-api-kitchen-sink.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'test/example/c-api-kitchen-sink.c') diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index 6a7b013e4..b7b938c55 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -351,7 +351,7 @@ void test_relooper() { RelooperAddBranch(block4, block5, NULL, NULL); RelooperAddBranch(block5, block6, NULL, makeInt32(module, 40)); BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, block0, 0, module); - BinaryenFunctionRef sinker = BinaryenAddFunction(module, "loop-tail", v, localTypes, 1, body); + BinaryenFunctionRef sinker = BinaryenAddFunction(module, "nontrivial-loop-plus-phi-to-head", v, localTypes, 1, body); } printf("raw:\n"); diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index 30444c886..71b937219 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -533,7 +533,7 @@ raw: (i32.const 2) ) ) - (func $loop-tail (type $v) + (func $nontrivial-loop-plus-phi-to-head (type $v) (local $0 i32) (block (i32.const 0) @@ -707,7 +707,7 @@ optimized: ) (i32.const 2) ) - (func $loop-tail (type $v) + (func $nontrivial-loop-plus-phi-to-head (type $v) (local $0 i32) (i32.const 0) (i32.const 10) -- cgit v1.2.3