2021-02-14 03:23:06 +08:00
|
|
|
//===- execution_engine.c - Test for the C bindings for the MLIR JIT-------===//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM
|
|
|
|
// Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
/* RUN: mlir-capi-execution-engine-test 2>&1 | FileCheck %s
|
|
|
|
*/
|
2022-01-14 14:57:51 +08:00
|
|
|
/* REQUIRES: llvm_has_native_target
|
|
|
|
*/
|
2021-02-14 03:23:06 +08:00
|
|
|
|
|
|
|
#include "mlir-c/Conversion.h"
|
|
|
|
#include "mlir-c/ExecutionEngine.h"
|
|
|
|
#include "mlir-c/IR.h"
|
|
|
|
#include "mlir-c/Registration.h"
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
void lowerModuleToLLVM(MlirContext ctx, MlirModule module) {
|
|
|
|
MlirPassManager pm = mlirPassManagerCreate(ctx);
|
2021-10-13 07:14:57 +08:00
|
|
|
MlirOpPassManager opm = mlirPassManagerGetNestedUnder(
|
2022-03-08 11:16:03 +08:00
|
|
|
pm, mlirStringRefCreateFromCString("func.func"));
|
2022-03-02 06:53:41 +08:00
|
|
|
mlirPassManagerAddOwnedPass(pm, mlirCreateConversionConvertFuncToLLVM());
|
2021-10-13 07:14:57 +08:00
|
|
|
mlirOpPassManagerAddOwnedPass(opm,
|
|
|
|
mlirCreateConversionConvertArithmeticToLLVM());
|
2021-02-14 03:23:06 +08:00
|
|
|
MlirLogicalResult status = mlirPassManagerRun(pm, module);
|
|
|
|
if (mlirLogicalResultIsFailure(status)) {
|
|
|
|
fprintf(stderr, "Unexpected failure running pass pipeline\n");
|
|
|
|
exit(2);
|
|
|
|
}
|
|
|
|
mlirPassManagerDestroy(pm);
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK-LABEL: Running test 'testSimpleExecution'
|
|
|
|
void testSimpleExecution() {
|
|
|
|
MlirContext ctx = mlirContextCreate();
|
|
|
|
mlirRegisterAllDialects(ctx);
|
|
|
|
MlirModule module = mlirModuleCreateParse(
|
|
|
|
ctx, mlirStringRefCreateFromCString(
|
|
|
|
// clang-format off
|
2022-04-21 12:39:02 +08:00
|
|
|
"module { \n"
|
|
|
|
" func.func @add(%arg0 : i32) -> i32 attributes { llvm.emit_c_interface } { \n"
|
|
|
|
" %res = arith.addi %arg0, %arg0 : i32 \n"
|
|
|
|
" return %res : i32 \n"
|
|
|
|
" } \n"
|
2021-02-14 03:23:06 +08:00
|
|
|
"}"));
|
|
|
|
// clang-format on
|
|
|
|
lowerModuleToLLVM(ctx, module);
|
|
|
|
mlirRegisterAllLLVMTranslations(ctx);
|
2021-06-05 22:24:34 +08:00
|
|
|
MlirExecutionEngine jit = mlirExecutionEngineCreate(
|
|
|
|
module, /*optLevel=*/2, /*numPaths=*/0, /*sharedLibPaths=*/NULL);
|
2021-02-14 03:23:06 +08:00
|
|
|
if (mlirExecutionEngineIsNull(jit)) {
|
|
|
|
fprintf(stderr, "Execution engine creation failed");
|
|
|
|
exit(2);
|
|
|
|
}
|
|
|
|
int input = 42;
|
|
|
|
int result = -1;
|
|
|
|
void *args[2] = {&input, &result};
|
|
|
|
if (mlirLogicalResultIsFailure(mlirExecutionEngineInvokePacked(
|
|
|
|
jit, mlirStringRefCreateFromCString("add"), args))) {
|
|
|
|
fprintf(stderr, "Execution engine creation failed");
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
// CHECK: Input: 42 Result: 84
|
|
|
|
printf("Input: %d Result: %d\n", input, result);
|
|
|
|
mlirExecutionEngineDestroy(jit);
|
|
|
|
mlirModuleDestroy(module);
|
|
|
|
mlirContextDestroy(ctx);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
|
|
|
#define _STRINGIFY(x) #x
|
|
|
|
#define STRINGIFY(x) _STRINGIFY(x)
|
|
|
|
#define TEST(test) \
|
|
|
|
printf("Running test '" STRINGIFY(test) "'\n"); \
|
|
|
|
test();
|
|
|
|
|
|
|
|
TEST(testSimpleExecution);
|
|
|
|
return 0;
|
|
|
|
}
|