Add vmvx_sync HAL device in `iree/samples/simple_embedding` (#6285)

The device should support all architectures and the bare-metal config.
diff --git a/build_tools/kokoro/gcp_ubuntu/cmake/linux/riscv64/test.sh b/build_tools/kokoro/gcp_ubuntu/cmake/linux/riscv64/test.sh
index 923d359..8e68788 100755
--- a/build_tools/kokoro/gcp_ubuntu/cmake/linux/riscv64/test.sh
+++ b/build_tools/kokoro/gcp_ubuntu/cmake/linux/riscv64/test.sh
@@ -24,7 +24,10 @@
 -L "${RISCV_TOOLCHAIN_ROOT?}/sysroot" simple_embedding_dylib
 
 /usr/src/qemu-riscv/qemu-riscv64 -cpu rv64,x-v=true,x-k=true,vlen=256,elen=64,vext_spec=v1.0 \
--L "${RISCV_TOOLCHAIN_ROOT?}/sysroot" simple_embedding_local_sync
+-L "${RISCV_TOOLCHAIN_ROOT?}/sysroot" simple_embedding_embedded_sync
+
+/usr/src/qemu-riscv/qemu-riscv64 -cpu rv64,x-v=true,x-k=true,vlen=256,elen=64,vext_spec=v1.0 \
+-L "${RISCV_TOOLCHAIN_ROOT?}/sysroot" simple_embedding_vmvx_sync
 
 popd > /dev/null
 
diff --git a/iree/samples/simple_embedding/BUILD b/iree/samples/simple_embedding/BUILD
index 9bc9827..dab8f75 100644
--- a/iree/samples/simple_embedding/BUILD
+++ b/iree/samples/simple_embedding/BUILD
@@ -16,6 +16,55 @@
 
 iree_cmake_extra_content(
     content = """
+if(${IREE_TARGET_BACKEND_VMVX} AND ${IREE_HAL_DRIVER_VMVX})
+""",
+    inline = True,
+)
+
+cc_binary(
+    name = "simple_embedding_vmvx_sync",
+    srcs = [
+        "device_vmvx_sync.c",
+        "simple_embedding.c",
+    ],
+    deps = [
+        ":simple_embedding_test_bytecode_module_vmvx_c",
+        "//iree/base",
+        "//iree/hal",
+        "//iree/hal/local",
+        "//iree/hal/local:sync_driver",
+        "//iree/hal/local/loaders:vmvx_module_loader",
+        "//iree/modules/hal",
+        "//iree/vm",
+        "//iree/vm:bytecode_module",
+    ],
+)
+
+iree_bytecode_module(
+    name = "simple_embedding_test_bytecode_module_vmvx",
+    src = "simple_embedding_test.mlir",
+    c_identifier = "iree_samples_simple_embedding_test_module_vmvx",
+    flags = [
+        "-iree-input-type=mhlo",
+        "-iree-mlir-to-vm-bytecode-module",
+        "-iree-hal-target-backends=vmvx",
+    ],
+)
+
+run_binary_test(
+    name = "simple_embedding_vmvx_sync_test",
+    test_binary = ":simple_embedding_vmvx_sync",
+)
+
+iree_cmake_extra_content(
+    content = """
+endif()
+""",
+    inline = True,
+)
+
+iree_cmake_extra_content(
+    content = """
 if(${IREE_TARGET_BACKEND_DYLIB-LLVM-AOT} AND ${IREE_HAL_DRIVER_DYLIB})
 """,
     inline = True,
@@ -23,9 +72,9 @@
 
 # TODO(llvm-bazel/#228): re-enable bazel.
 #cc_binary(
-#    name = "simple_embedding_local_sync",
+#    name = "simple_embedding_embedded_sync",
 #    srcs = [
-#        "device_local_sync.c",
+#        "device_embedded_sync.c",
 #        "simple_embedding.c",
 #    ],
 #    deps = [
@@ -124,8 +173,8 @@
 #)
 #
 #run_binary_test(
-#    name = "simple_embedding_local_sync_test",
-#    test_binary = ":simple_embedding_local_sync",
+#    name = "simple_embedding_embedded_sync_test",
+#    test_binary = ":simple_embedding_embedded_sync",
 #)
 
 iree_cmake_extra_content(
diff --git a/iree/samples/simple_embedding/CMakeLists.txt b/iree/samples/simple_embedding/CMakeLists.txt
index da913b0..ce3636b 100644
--- a/iree/samples/simple_embedding/CMakeLists.txt
+++ b/iree/samples/simple_embedding/CMakeLists.txt
@@ -3,13 +3,56 @@
 
 iree_add_all_subdirs()
 
+if(${IREE_TARGET_BACKEND_VMVX} AND ${IREE_HAL_DRIVER_VMVX})
+
+iree_cc_binary(
+  NAME
+    simple_embedding_vmvx_sync
+  SRCS
+    "device_vmvx_sync.c"
+    "simple_embedding.c"
+  DEPS
+    ::simple_embedding_test_bytecode_module_vmvx_c
+    iree::base
+    iree::hal
+    iree::hal::local
+    iree::hal::local::loaders::vmvx_module_loader
+    iree::hal::local::sync_driver
+    iree::modules::hal
+    iree::vm
+    iree::vm::bytecode_module
+)
+
+iree_bytecode_module(
+  NAME
+    simple_embedding_test_bytecode_module_vmvx
+  SRC
+    "simple_embedding_test.mlir"
+  C_IDENTIFIER
+    "iree_samples_simple_embedding_test_module_vmvx"
+  FLAGS
+    "-iree-input-type=mhlo"
+    "-iree-mlir-to-vm-bytecode-module"
+    "-iree-hal-target-backends=vmvx"
+  PUBLIC
+)
+
+iree_run_binary_test(
+  NAME
+    "simple_embedding_vmvx_sync_test"
+  TEST_BINARY
+    ::simple_embedding_vmvx_sync
+)
+
+endif()
+
 if(${IREE_TARGET_BACKEND_DYLIB-LLVM-AOT} AND ${IREE_HAL_DRIVER_DYLIB})
 
 iree_cc_binary(
   NAME
-    simple_embedding_local_sync
+    simple_embedding_embedded_sync
   SRCS
-    "device_local_sync.c"
+    "device_embedded_sync.c"
     "simple_embedding.c"
   DEPS
     ::simple_embedding_test_bytecode_module_dylib_arm_32_c
@@ -122,9 +165,9 @@
 
 iree_run_binary_test(
   NAME
-    "simple_embedding_local_sync_test"
+    "simple_embedding_embedded_sync_test"
   TEST_BINARY
-    ::simple_embedding_local_sync
+    ::simple_embedding_embedded_sync
 )
 
 if(${IREE_ENABLE_THREADING})
diff --git a/iree/samples/simple_embedding/device_dylib.c b/iree/samples/simple_embedding/device_dylib.c
index f11f23a..ffdabcf 100644
--- a/iree/samples/simple_embedding/device_dylib.c
+++ b/iree/samples/simple_embedding/device_dylib.c
@@ -31,18 +31,19 @@
       &loader));
 
   iree_task_executor_t* executor = NULL;
-  IREE_RETURN_IF_ERROR(
-      iree_task_executor_create_from_flags(iree_allocator_system(), &executor));
+  iree_status_t status =
+      iree_task_executor_create_from_flags(iree_allocator_system(), &executor);
 
   iree_string_view_t identifier = iree_make_cstring_view("dylib");
-
-  // Create the device and release the executor and loader afterwards.
-  IREE_RETURN_IF_ERROR(iree_hal_task_device_create(
-      identifier, &params, executor, /*loader_count=*/1, &loader,
-      iree_allocator_system(), device));
+  if (iree_status_is_ok(status)) {
+    // Create the device.
+    status = iree_hal_task_device_create(identifier, &params, executor,
+                                         /*loader_count=*/1, &loader,
+                                         iree_allocator_system(), device);
+  }
   iree_task_executor_release(executor);
   iree_hal_executable_loader_release(loader);
-  return iree_ok_status();
+  return status;
 }
 
 const iree_const_byte_span_t load_bytecode_module_data() {
diff --git a/iree/samples/simple_embedding/device_local_sync.c b/iree/samples/simple_embedding/device_embedded_sync.c
similarity index 93%
rename from iree/samples/simple_embedding/device_local_sync.c
rename to iree/samples/simple_embedding/device_embedded_sync.c
index 8b1a692..356c8c0 100644
--- a/iree/samples/simple_embedding/device_local_sync.c
+++ b/iree/samples/simple_embedding/device_embedded_sync.c
@@ -4,7 +4,7 @@
 // See https://llvm.org/LICENSE.txt for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-// A example of setting up the dylib-sync driver.
+// A example of setting up the embedded-sync driver.
 
 #include <stddef.h>
 
@@ -22,7 +22,7 @@
 #include "iree/samples/simple_embedding/simple_embedding_test_bytecode_module_dylib_x86_64_c.h"
 
 iree_status_t create_sample_device(iree_hal_device_t** device) {
-  // Set paramters for the device created in the next step.
+  // Set parameters for the device created in the next step.
   iree_hal_sync_device_params_t params;
   iree_hal_sync_device_params_initialize(&params);
 
@@ -34,11 +34,11 @@
   iree_string_view_t identifier = iree_make_cstring_view("dylib");
 
   // Create the synchronous device and release the loader afterwards.
-  IREE_RETURN_IF_ERROR(
+  iree_status_t status =
       iree_hal_sync_device_create(identifier, &params, /*loader_count=*/1,
-                                  &loader, iree_allocator_system(), device));
+                                  &loader, iree_allocator_system(), device);
   iree_hal_executable_loader_release(loader);
-  return iree_ok_status();
+  return status;
 }
 
 const iree_const_byte_span_t load_bytecode_module_data() {
diff --git a/iree/samples/simple_embedding/device_vmvx_sync.c b/iree/samples/simple_embedding/device_vmvx_sync.c
new file mode 100644
index 0000000..a41fb9d
--- /dev/null
+++ b/iree/samples/simple_embedding/device_vmvx_sync.c
@@ -0,0 +1,50 @@
+// Copyright 2021 The IREE Authors
+//
+// Licensed 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
+
+// A example of setting up the vmvx-sync driver.
+
+#include <stddef.h>
+
+#include "iree/base/api.h"
+#include "iree/hal/api.h"
+#include "iree/hal/local/executable_loader.h"
+#include "iree/hal/local/loaders/vmvx_module_loader.h"
+#include "iree/hal/local/sync_device.h"
+
+// Compiled module embedded here to avoid file IO:
+#include "iree/samples/simple_embedding/simple_embedding_test_bytecode_module_vmvx_c.h"
+
+iree_status_t create_sample_device(iree_hal_device_t** device) {
+  // Set parameters for the device created in the next step.
+  iree_hal_sync_device_params_t params;
+  iree_hal_sync_device_params_initialize(&params);
+
+  iree_vm_instance_t* instance = NULL;
+  IREE_RETURN_IF_ERROR(
+      iree_vm_instance_create(iree_allocator_system(), &instance));
+
+  iree_hal_executable_loader_t* loader = NULL;
+  iree_status_t status = iree_hal_vmvx_module_loader_create(
+      instance, iree_allocator_system(), &loader);
+  iree_vm_instance_release(instance);
+
+  iree_string_view_t identifier = iree_make_cstring_view("vmvx");
+  if (iree_status_is_ok(status)) {
+    // Create the synchronous device.
+    status =
+        iree_hal_sync_device_create(identifier, &params, /*loader_count=*/1,
+                                    &loader, iree_allocator_system(), device);
+  }
+  iree_hal_executable_loader_release(loader);
+  return status;
+}
+
+const iree_const_byte_span_t load_bytecode_module_data() {
+  const struct iree_file_toc_t* module_file_toc =
+      iree_samples_simple_embedding_test_module_vmvx_create();
+  return iree_make_const_byte_span(module_file_toc->data,
+                                   module_file_toc->size);
+}
diff --git a/iree/samples/simple_embedding/simple_embedding.c b/iree/samples/simple_embedding/simple_embedding.c
index ecc54d0..2f5645d 100644
--- a/iree/samples/simple_embedding/simple_embedding.c
+++ b/iree/samples/simple_embedding/simple_embedding.c
@@ -164,6 +164,6 @@
     iree_status_fprint(stderr, result);
     iree_status_free(result);
   }
-  fprintf(stdout, "simple_embedding passed\n");
+  fprintf(stdout, "simple_embedding done\n");
   return ret;
 }