blob: 78faa31fdae06648842fd61645afda117ccfb9bc [file] [log] [blame]
// RUN: iree-compile %s --iree-hal-target-backends=llvm-cpu | custom-module-sync-run - example.main | FileCheck %s
module @example {
//===--------------------------------------------------------------------===//
// Imports
//===--------------------------------------------------------------------===//
// External function declarations for the methods implemented in the custom
// module C++ file. Note that they are prefixed with the `custom.` module
// name.
// Synchronous call that takes/returns a tensor.
// IREE will block and wait until the input tensor is available, make the
// import call, and assume that the returned tensor is immediately available
// for use.
func.func private @custom.call.sync(tensor<?xi32>) -> tensor<?xi32>
//===--------------------------------------------------------------------===//
// Sample methods
//===--------------------------------------------------------------------===//
// Note that there can be any number of publicly-exported methods; this simple
// sample just has one to keep things simple.
// CHECK-LABEL: INVOKE BEGIN example.main
func.func @main(%arg0: tensor<?xi32>) -> tensor<?xi32> {
// Compiler-generated dispatch work to show dataflow.
%0 = arith.muli %arg0, %arg0 : tensor<?xi32>
// Custom call to a synchronous import.
// The runtime will block and wait until %0 is ready before making the call
// and assume it can immediately start using the resulting %1 after the call
// returns. Note that the top-level invocation will block while this call is
// made and if we were running the compiler-generated dispatches above/below
// on a GPU it would fully synchronize the host and device (really bad!).
%1 = call @custom.call.sync(%0) : (tensor<?xi32>) -> tensor<?xi32>
// More generated dispatch work to show dataflow.
%2 = arith.muli %1, %1 : tensor<?xi32>
// CHECK: MATCHED!
return %2 : tensor<?xi32>
}
// CHECK-NEXT: INVOKE END
}