| |
| #include <assert.h> |
| #include <stdio.h> |
| |
| #include "binaryen-c.h" |
| |
| int main() { |
| BinaryenModuleRef module = BinaryenModuleCreate(); |
| |
| RelooperRef relooper = RelooperCreate(module); |
| |
| // Create the basic blocks |
| RelooperBlockRef b[4]; |
| int hasTerminator[4] = {0, 0, 0, 1}; |
| |
| int numBlocks = sizeof(b) / sizeof(RelooperBlockRef); |
| assert(sizeof(hasTerminator) / sizeof(int) == numBlocks); |
| int i; |
| for (i = 0; i < numBlocks; i++) { |
| BinaryenExpressionRef args[] = { |
| BinaryenConst(module, BinaryenLiteralInt32(i))}; |
| BinaryenExpressionRef list[] = { |
| BinaryenCall(module, "print", args, 1, BinaryenTypeNone()), |
| BinaryenReturn(module, NULL) // relevant only if hasTerminator[i] |
| }; |
| b[i] = RelooperAddBlock( |
| relooper, |
| BinaryenBlock( |
| module, NULL, list, 1 + hasTerminator[i], BinaryenTypeNone())); |
| } |
| |
| // Create the branches. |
| // In this testcase, only b[2] and b[3] can be merged. |
| RelooperAddBranch(b[0], b[1], NULL, NULL); |
| RelooperAddBranch( |
| b[0], b[2], BinaryenConst(module, BinaryenLiteralInt32(-10)), NULL); |
| RelooperAddBranch(b[1], b[0], NULL, NULL); |
| RelooperAddBranch(b[2], b[3], NULL, NULL); |
| |
| BinaryenExpressionRef all = RelooperRenderAndDispose(relooper, b[0], 1); |
| |
| // Print it out |
| BinaryenExpressionPrint(all); |
| |
| // Clean up the module, which owns all the objects we created above |
| BinaryenModuleDispose(module); |
| |
| return 0; |
| } |