diff options
author | Daniel Wirtz <dcode@dcode.io> | 2020-02-13 22:48:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-13 13:48:12 -0800 |
commit | 32bb67f4660de4b5b03bdff5c9c59ab92f8a0049 (patch) | |
tree | bef65081c9ef8ae285addbcb76e44477d11eb2c0 | |
parent | 41e9d4b244986149603ad83a4f526d950b3a441b (diff) | |
download | binaryen-32bb67f4660de4b5b03bdff5c9c59ab92f8a0049.tar.gz binaryen-32bb67f4660de4b5b03bdff5c9c59ab92f8a0049.tar.bz2 binaryen-32bb67f4660de4b5b03bdff5c9c59ab92f8a0049.zip |
Add C-/JS-APIs for inlining options (#2655)
Allows a user to modify the inlining limits using the C- and JS-APIs.
* binaryen.**getAlwaysInlineMaxSize**(): `number`
* binaryen.**setAlwaysInlineMaxSize**(size: `number`): `void`
* binaryen.**getFlexibleInlineMaxSize**(): `number`
* binaryen.**setFlexibleInlineMaxSize**(size: `number`): `void`
* binaryen.**getOneCallerInlineMaxSize**(): `number`
* binaryen.**setOneCallerInlineMaxSize**(size: `number`): `void`
-rw-r--r-- | src/binaryen-c.cpp | 48 | ||||
-rw-r--r-- | src/binaryen-c.h | 24 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 30 | ||||
-rw-r--r-- | test/binaryen.js/inlining-options.js | 15 | ||||
-rw-r--r-- | test/binaryen.js/inlining-options.js.txt | 28 |
5 files changed, 145 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 17c95c96e..fc16eee42 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -3958,6 +3958,54 @@ void BinaryenClearPassArguments(void) { globalPassOptions.arguments.clear(); } +BinaryenIndex BinaryenGetAlwaysInlineMaxSize(void) { + if (tracing) { + std::cout << " BinaryenGetAlwaysInlineMaxSize();\n"; + } + + return globalPassOptions.inlining.alwaysInlineMaxSize; +} + +void BinaryenSetAlwaysInlineMaxSize(BinaryenIndex size) { + if (tracing) { + std::cout << " BinaryenSetAlwaysInlineMaxSize(" << size << ");\n"; + } + + globalPassOptions.inlining.alwaysInlineMaxSize = size; +} + +BinaryenIndex BinaryenGetFlexibleInlineMaxSize(void) { + if (tracing) { + std::cout << " BinaryenGetFlexibleInlineMaxSize();\n"; + } + + return globalPassOptions.inlining.flexibleInlineMaxSize; +} + +void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size) { + if (tracing) { + std::cout << " BinaryenSetFlexibleInlineMaxSize(" << size << ");\n"; + } + + globalPassOptions.inlining.flexibleInlineMaxSize = size; +} + +BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void) { + if (tracing) { + std::cout << " BinaryenGetOneCallerInlineMaxSize();\n"; + } + + return globalPassOptions.inlining.oneCallerInlineMaxSize; +} + +void BinaryenSetOneCallerInlineMaxSize(BinaryenIndex size) { + if (tracing) { + std::cout << " BinaryenSetOneCallerInlineMaxSize(" << size << ");\n"; + } + + globalPassOptions.inlining.oneCallerInlineMaxSize = size; +} + void BinaryenModuleRunPasses(BinaryenModuleRef module, const char** passes, BinaryenIndex numPasses) { diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 66a68e8d2..39e0aca33 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -1304,6 +1304,30 @@ BINARYEN_API void BinaryenSetPassArgument(const char* name, const char* value); // Applies to all modules, globally. BINARYEN_API void BinaryenClearPassArguments(); +// Gets the function size at which we always inline. +// Applies to all modules, globally. +BINARYEN_API BinaryenIndex BinaryenGetAlwaysInlineMaxSize(void); + +// Sets the function size at which we always inline. +// Applies to all modules, globally. +BINARYEN_API void BinaryenSetAlwaysInlineMaxSize(BinaryenIndex size); + +// Gets the function size which we inline when functions are lightweight. +// Applies to all modules, globally. +BINARYEN_API BinaryenIndex BinaryenGetFlexibleInlineMaxSize(void); + +// Sets the function size which we inline when functions are lightweight. +// Applies to all modules, globally. +BINARYEN_API void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size); + +// Gets the function size which we inline when there is only one caller. +// Applies to all modules, globally. +BINARYEN_API BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void); + +// Sets the function size which we inline when there is only one caller. +// Applies to all modules, globally. +BINARYEN_API void BinaryenSetOneCallerInlineMaxSize(BinaryenIndex size); + // Runs the specified passes on the module. Uses the currently set global // optimize and shrink level. BINARYEN_API void BinaryenModuleRunPasses(BinaryenModuleRef module, diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index d41e9575b..3ef19fd7d 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -2928,6 +2928,36 @@ Module['clearPassArguments'] = function() { Module['_BinaryenClearPassArguments'](); }; +// Gets the function size at which we always inline. +Module['getAlwaysInlineMaxSize'] = function() { + return Module['_BinaryenGetAlwaysInlineMaxSize'](); +}; + +// Sets the function size at which we always inline. +Module['setAlwaysInlineMaxSize'] = function(size) { + Module['_BinaryenSetAlwaysInlineMaxSize'](size); +}; + +// Gets the function size which we inline when functions are lightweight. +Module['getFlexibleInlineMaxSize'] = function() { + return Module['_BinaryenGetFlexibleInlineMaxSize'](); +}; + +// Sets the function size which we inline when functions are lightweight. +Module['setFlexibleInlineMaxSize'] = function(size) { + Module['_BinaryenSetFlexibleInlineMaxSize'](size); +}; + +// Gets the function size which we inline when there is only one caller. +Module['getOneCallerInlineMaxSize'] = function() { + return Module['_BinaryenGetOneCallerInlineMaxSize'](); +}; + +// Sets the function size which we inline when there is only one caller. +Module['setOneCallerInlineMaxSize'] = function(size) { + Module['_BinaryenSetOneCallerInlineMaxSize'](size); +}; + // Enables or disables C-API tracing Module['setAPITracing'] = function(on) { return Module['_BinaryenSetAPITracing'](on); diff --git a/test/binaryen.js/inlining-options.js b/test/binaryen.js/inlining-options.js new file mode 100644 index 000000000..7884f0ed4 --- /dev/null +++ b/test/binaryen.js/inlining-options.js @@ -0,0 +1,15 @@ +binaryen.setAPITracing(true); + +console.log("// alwaysInlineMaxSize=" + binaryen.getAlwaysInlineMaxSize()); +binaryen.setAlwaysInlineMaxSize(11); +assert(binaryen.getAlwaysInlineMaxSize() == 11); + +console.log("// flexibleInlineMaxSize=" + binaryen.getFlexibleInlineMaxSize()); +binaryen.setFlexibleInlineMaxSize(22); +assert(binaryen.getFlexibleInlineMaxSize() == 22); + +console.log("// oneCallerInlineMaxSize=" + binaryen.getOneCallerInlineMaxSize()); +binaryen.setOneCallerInlineMaxSize(33); +assert(binaryen.getOneCallerInlineMaxSize() == 33); + +binaryen.setAPITracing(false); diff --git a/test/binaryen.js/inlining-options.js.txt b/test/binaryen.js/inlining-options.js.txt new file mode 100644 index 000000000..4993fd0d6 --- /dev/null +++ b/test/binaryen.js/inlining-options.js.txt @@ -0,0 +1,28 @@ +// beginning a Binaryen API trace +#include <math.h> +#include <map> +#include "binaryen-c.h" +int main() { + std::map<size_t, BinaryenExpressionRef> expressions; + std::map<size_t, BinaryenFunctionRef> functions; + std::map<size_t, BinaryenGlobalRef> globals; + std::map<size_t, BinaryenEventRef> events; + std::map<size_t, BinaryenExportRef> exports; + std::map<size_t, RelooperBlockRef> relooperBlocks; + BinaryenModuleRef the_module = NULL; + RelooperRef the_relooper = NULL; + BinaryenGetAlwaysInlineMaxSize(); +// alwaysInlineMaxSize=2 + BinaryenSetAlwaysInlineMaxSize(11); + BinaryenGetAlwaysInlineMaxSize(); + BinaryenGetFlexibleInlineMaxSize(); +// flexibleInlineMaxSize=20 + BinaryenSetFlexibleInlineMaxSize(22); + BinaryenGetFlexibleInlineMaxSize(); + BinaryenGetOneCallerInlineMaxSize(); +// oneCallerInlineMaxSize=15 + BinaryenSetOneCallerInlineMaxSize(33); + BinaryenGetOneCallerInlineMaxSize(); + return 0; +} +// ending a Binaryen API trace |