diff options
Diffstat (limited to 'test/example')
-rw-r--r-- | test/example/c-api-kitchen-sink.txt | 138 | ||||
-rw-r--r-- | test/example/c-api-kitchen-sink.txt.txt | 69 | ||||
-rw-r--r-- | test/example/relooper-merge1.txt | 7 | ||||
-rw-r--r-- | test/example/relooper-merge6.c | 201 | ||||
-rw-r--r-- | test/example/relooper-merge6.txt | 111 |
5 files changed, 385 insertions, 141 deletions
diff --git a/test/example/c-api-kitchen-sink.txt b/test/example/c-api-kitchen-sink.txt index b7ee4b8b7..90c26c3ae 100644 --- a/test/example/c-api-kitchen-sink.txt +++ b/test/example/c-api-kitchen-sink.txt @@ -563,15 +563,10 @@ raw: ) (func $two-blocks (; 2 ;) (type $v) (local $0 i32) - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) @@ -579,18 +574,15 @@ raw: ) (func $two-blocks-plus-code (; 3 ;) (type $v) (local $0 i32) - (block $block$2$break - (call $check - (i32.const 0) - ) + (block (block + (call $check + (i32.const 0) + ) (drop (i32.const 77) ) - (br $block$2$break) ) - ) - (block (call $check (i32.const 1) ) @@ -599,48 +591,40 @@ raw: (func $loop (; 4 ;) (type $v) (local $0 i32) (loop $shape$0$continue - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) - (block - (br $shape$0$continue) - ) + ) + (block + (br $shape$0$continue) ) ) ) (func $loop-plus-code (; 5 ;) (type $v) (local $0 i32) (loop $shape$0$continue - (block $block$2$break - (call $check - (i32.const 0) - ) + (block (block + (call $check + (i32.const 0) + ) (drop (i32.const 33) ) - (br $block$2$break) ) - ) - (block (call $check (i32.const 1) ) - (block - (drop - (i32.const -66) - ) - (br $shape$0$continue) + ) + (block + (drop + (i32.const -66) ) + (br $shape$0$continue) ) ) ) @@ -791,23 +775,18 @@ raw: (local $0 i32) (block $block$3$break (loop $shape$0$continue - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) - (if - (i32.const 10) - (br $shape$0$continue) - (br $block$3$break) - ) + ) + (if + (i32.const 10) + (br $shape$0$continue) + (br $block$3$break) ) ) ) @@ -2438,15 +2417,10 @@ raw: ) (func $two-blocks (; 2 ;) (type $v) (local $0 i32) - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) @@ -2454,18 +2428,15 @@ raw: ) (func $two-blocks-plus-code (; 3 ;) (type $v) (local $0 i32) - (block $block$2$break - (call $check - (i32.const 0) - ) + (block (block + (call $check + (i32.const 0) + ) (drop (i32.const 77) ) - (br $block$2$break) ) - ) - (block (call $check (i32.const 1) ) @@ -2474,48 +2445,40 @@ raw: (func $loop (; 4 ;) (type $v) (local $0 i32) (loop $shape$0$continue - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) - (block - (br $shape$0$continue) - ) + ) + (block + (br $shape$0$continue) ) ) ) (func $loop-plus-code (; 5 ;) (type $v) (local $0 i32) (loop $shape$0$continue - (block $block$2$break - (call $check - (i32.const 0) - ) + (block (block + (call $check + (i32.const 0) + ) (drop (i32.const 33) ) - (br $block$2$break) ) - ) - (block (call $check (i32.const 1) ) - (block - (drop - (i32.const -66) - ) - (br $shape$0$continue) + ) + (block + (drop + (i32.const -66) ) + (br $shape$0$continue) ) ) ) @@ -2666,23 +2629,18 @@ raw: (local $0 i32) (block $block$3$break (loop $shape$0$continue - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) - (if - (i32.const 10) - (br $shape$0$continue) - (br $block$3$break) - ) + ) + (if + (i32.const 10) + (br $shape$0$continue) + (br $block$3$break) ) ) ) diff --git a/test/example/c-api-kitchen-sink.txt.txt b/test/example/c-api-kitchen-sink.txt.txt index c2d518020..d23e109b5 100644 --- a/test/example/c-api-kitchen-sink.txt.txt +++ b/test/example/c-api-kitchen-sink.txt.txt @@ -546,15 +546,10 @@ ) (func $two-blocks (; 2 ;) (type $v) (local $0 i32) - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) @@ -562,18 +557,15 @@ ) (func $two-blocks-plus-code (; 3 ;) (type $v) (local $0 i32) - (block $block$2$break - (call $check - (i32.const 0) - ) + (block (block + (call $check + (i32.const 0) + ) (drop (i32.const 77) ) - (br $block$2$break) ) - ) - (block (call $check (i32.const 1) ) @@ -582,48 +574,40 @@ (func $loop (; 4 ;) (type $v) (local $0 i32) (loop $shape$0$continue - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) - (block - (br $shape$0$continue) - ) + ) + (block + (br $shape$0$continue) ) ) ) (func $loop-plus-code (; 5 ;) (type $v) (local $0 i32) (loop $shape$0$continue - (block $block$2$break - (call $check - (i32.const 0) - ) + (block (block + (call $check + (i32.const 0) + ) (drop (i32.const 33) ) - (br $block$2$break) ) - ) - (block (call $check (i32.const 1) ) - (block - (drop - (i32.const -66) - ) - (br $shape$0$continue) + ) + (block + (drop + (i32.const -66) ) + (br $shape$0$continue) ) ) ) @@ -774,23 +758,18 @@ (local $0 i32) (block $block$3$break (loop $shape$0$continue - (block $block$2$break + (block (call $check (i32.const 0) ) - (block - (br $block$2$break) - ) - ) - (block (call $check (i32.const 1) ) - (if - (i32.const 10) - (br $shape$0$continue) - (br $block$3$break) - ) + ) + (if + (i32.const 10) + (br $shape$0$continue) + (br $block$3$break) ) ) ) diff --git a/test/example/relooper-merge1.txt b/test/example/relooper-merge1.txt index b6d1f49f1..66153770c 100644 --- a/test/example/relooper-merge1.txt +++ b/test/example/relooper-merge1.txt @@ -44,7 +44,7 @@ (func $main (; 2 ;) (type $v) (local $0 i32) (local $1 i32) - (block $block$2$break + (block (block (call $print (i32.const 0) @@ -54,11 +54,6 @@ ) ) (block - (br $block$2$break) - ) - ) - (block - (block (call $print (i32.const 1) ) diff --git a/test/example/relooper-merge6.c b/test/example/relooper-merge6.c new file mode 100644 index 000000000..25004c9df --- /dev/null +++ b/test/example/relooper-merge6.c @@ -0,0 +1,201 @@ + + +#include <assert.h> +#include <stdio.h> + +#include "binaryen-c.h" + +// globals: address 4 is index +// decisions are at address 8+ + +int main() { + BinaryenModuleRef module = BinaryenModuleCreate(); + + // check() + + // if the end, halt + BinaryenExpressionRef halter = BinaryenIf(module, + BinaryenBinary(module, + BinaryenGeUInt32(), + BinaryenLoad(module, 4, 0, 0, 0, BinaryenTypeInt32(), + BinaryenConst(module, BinaryenLiteralInt32(4))), + BinaryenConst(module, BinaryenLiteralInt32(4 * 12)) // jumps of 4 bytes + ), + BinaryenUnreachable(module), + NULL + ); + // increment index + BinaryenExpressionRef incer = BinaryenStore(module, + 4, 0, 0, + BinaryenConst(module, BinaryenLiteralInt32(4)), + BinaryenBinary(module, + BinaryenAddInt32(), + BinaryenLoad(module, 4, 0, 0, 0, BinaryenTypeInt32(), + BinaryenConst(module, BinaryenLiteralInt32(4))), + BinaryenConst(module, BinaryenLiteralInt32(4)) + ), + BinaryenTypeInt32() + ); + + // optionally, print the return value + BinaryenExpressionRef args[] = { + BinaryenBinary(module, + BinaryenSubInt32(), + BinaryenConst(module, BinaryenLiteralInt32(0)), + BinaryenLoad(module, + 4, 0, 4, 0, BinaryenTypeInt32(), + BinaryenLoad(module, 4, 0, 0, 0, BinaryenTypeInt32(), + BinaryenConst(module, BinaryenLiteralInt32(4))) + ) + ) + }; + BinaryenExpressionRef debugger; + if (1) debugger = BinaryenCall(module, "print", args, 1, + BinaryenTypeNone()); + else debugger = BinaryenNop(module); + + // return the decision. need to subtract 4 that we just added, + // and add 8 since that's where we start, so overall offset 4 + BinaryenExpressionRef returner = BinaryenLoad(module, + 4, 0, 4, 0, BinaryenTypeInt32(), + BinaryenLoad(module, 4, 0, 0, 0, BinaryenTypeInt32(), + BinaryenConst(module, BinaryenLiteralInt32(4))) + ); + BinaryenExpressionRef checkBodyList[] = { halter, incer, debugger, + returner }; + BinaryenExpressionRef checkBody = BinaryenBlock(module, + NULL, checkBodyList, sizeof(checkBodyList) / sizeof(BinaryenExpressionRef), + BinaryenTypeInt32() + ); + BinaryenFunctionTypeRef i = BinaryenAddFunctionType(module, "i", + BinaryenTypeInt32(), + NULL, 0); + BinaryenAddFunction(module, "check", i, NULL, 0, checkBody); + + // contents of main() begin here + + RelooperRef relooper = RelooperCreate(module); + + + RelooperBlockRef b0; + { + BinaryenExpressionRef args[] = { + BinaryenConst(module, BinaryenLiteralInt32(0)) + }; + BinaryenExpressionRef list[] = { + BinaryenCall(module, "print", args, 1, BinaryenTypeNone()), + BinaryenSetLocal(module, 0, BinaryenCall(module, "check", NULL, 0, + BinaryenTypeInt32())) + }; + + b0 = RelooperAddBlockWithSwitch(relooper, + BinaryenBlock(module, NULL, list, 2, BinaryenTypeNone()), + BinaryenBinary(module, + BinaryenRemUInt32(), + BinaryenGetLocal(module, 0, BinaryenTypeInt32()), + BinaryenConst(module, BinaryenLiteralInt32(1)) + ) + ); + + } + + RelooperBlockRef b1; + { + BinaryenExpressionRef args[] = { + BinaryenConst(module, BinaryenLiteralInt32(1)) + }; + BinaryenExpressionRef list[] = { + BinaryenCall(module, "print", args, 1, BinaryenTypeNone()), + BinaryenSetLocal(module, 0, BinaryenCall(module, "check", NULL, 0, + BinaryenTypeInt32())) + }; + + b1 = RelooperAddBlock(relooper, BinaryenBlock(module, NULL, list, 2, BinaryenTypeNone())); + + } + + RelooperBlockRef b2; + { + BinaryenExpressionRef args[] = { + BinaryenConst(module, BinaryenLiteralInt32(1)) + }; + BinaryenExpressionRef list[] = { + BinaryenCall(module, "print", args, 1, BinaryenTypeNone()), + BinaryenSetLocal(module, 0, BinaryenCall(module, "check", NULL, 0, + BinaryenTypeInt32())) + }; + + b2 = RelooperAddBlock(relooper, BinaryenBlock(module, NULL, list, 2, BinaryenTypeNone())); + + } + + RelooperBlockRef b3; + { + BinaryenExpressionRef args[] = { + BinaryenConst(module, BinaryenLiteralInt32(1)) + }; + BinaryenExpressionRef list[] = { + BinaryenCall(module, "print", args, 1, BinaryenTypeNone()), + BinaryenSetLocal(module, 0, BinaryenCall(module, "check", NULL, 0, + BinaryenTypeInt32())) + }; + + b3 = RelooperAddBlock(relooper, BinaryenBlock(module, NULL, list, 2, BinaryenTypeNone())); + } + + RelooperBlockRef b4; + { + BinaryenExpressionRef args[] = { + BinaryenConst(module, BinaryenLiteralInt32(1)) + }; + BinaryenExpressionRef list[] = { + BinaryenCall(module, "print", args, 1, BinaryenTypeNone()), + BinaryenSetLocal(module, 0, BinaryenCall(module, "check", NULL, 0, + BinaryenTypeInt32())) + }; + + b4 = RelooperAddBlock(relooper, BinaryenBlock(module, NULL, list, 2, BinaryenTypeNone())); + } + + // Separate branch for each. + // In this testcase, we can merge multiple consecutive blocks with phis. + RelooperAddBranch(b0, b1, NULL, BinaryenDrop(module, BinaryenConst(module, BinaryenLiteralInt32(10)))); + RelooperAddBranch(b1, b2, NULL, BinaryenDrop(module, BinaryenConst(module, BinaryenLiteralInt32(11)))); + RelooperAddBranch(b2, b3, NULL, NULL); + RelooperAddBranch(b3, b4, NULL, BinaryenDrop(module, BinaryenConst(module, BinaryenLiteralInt32(12)))); + + BinaryenExpressionRef body = RelooperRenderAndDispose(relooper, b0, 1); + + BinaryenFunctionTypeRef v = BinaryenAddFunctionType(module, "v", + BinaryenTypeNone(), + NULL, 0); + // locals: state, free-for-label + BinaryenType localTypes[] = { BinaryenTypeInt32(), BinaryenTypeInt32() }; + BinaryenFunctionRef theMain = BinaryenAddFunction(module, "main", v, + localTypes, 2, body); + BinaryenSetStart(module, theMain); + + // import + + BinaryenType iparams[] = { BinaryenTypeInt32() }; + BinaryenFunctionTypeRef vi = BinaryenAddFunctionType(module, "vi", + BinaryenTypeNone(), + iparams, 1); + BinaryenAddFunctionImport(module, "print", "spectest", "print", vi); + + // memory + BinaryenSetMemory(module, 1, 1, "mem", NULL, NULL, NULL, 0, 0); + + // optionally, optimize + if (0) BinaryenModuleOptimize(module); + + assert(BinaryenModuleValidate(module)); + + // write it out + + BinaryenModulePrint(module); + + BinaryenModuleDispose(module); + + return 0; +} diff --git a/test/example/relooper-merge6.txt b/test/example/relooper-merge6.txt new file mode 100644 index 000000000..d79aabe3d --- /dev/null +++ b/test/example/relooper-merge6.txt @@ -0,0 +1,111 @@ +(module + (type $i (func (result i32))) + (type $v (func)) + (type $vi (func (param i32))) + (import "spectest" "print" (func $print (param i32))) + (memory $0 1 1) + (export "mem" (memory $0)) + (start $main) + (func $check (; 1 ;) (type $i) (result i32) + (if + (i32.ge_u + (i32.load + (i32.const 4) + ) + (i32.const 48) + ) + (unreachable) + ) + (i32.store + (i32.const 4) + (i32.add + (i32.load + (i32.const 4) + ) + (i32.const 4) + ) + ) + (call $print + (i32.sub + (i32.const 0) + (i32.load offset=4 + (i32.load + (i32.const 4) + ) + ) + ) + ) + (i32.load offset=4 + (i32.load + (i32.const 4) + ) + ) + ) + (func $main (; 2 ;) (type $v) + (local $0 i32) + (local $1 i32) + (block + (block + (block + (block + (block + (block + (block + (call $print + (i32.const 0) + ) + (set_local $0 + (call $check) + ) + ) + (drop + (i32.const 10) + ) + ) + (block + (call $print + (i32.const 1) + ) + (set_local $0 + (call $check) + ) + ) + ) + (drop + (i32.const 11) + ) + ) + (block + (block + (call $print + (i32.const 1) + ) + (set_local $0 + (call $check) + ) + ) + (block + (call $print + (i32.const 1) + ) + (set_local $0 + (call $check) + ) + ) + ) + ) + (drop + (i32.const 12) + ) + ) + (block + (call $print + (i32.const 1) + ) + (set_local $0 + (call $check) + ) + ) + ) + ) +) |