[mlir][crunner] Add support for invoking std::sort.
authorbixia1 <bixia@google.com>
Mon, 12 Dec 2022 21:39:55 +0000 (13:39 -0800)
committerbixia1 <bixia@google.com>
Tue, 13 Dec 2022 20:31:14 +0000 (12:31 -0800)
Reviewed By: aartbik

Differential Revision: https://reviews.llvm.org/D139880

mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
mlir/lib/ExecutionEngine/CRunnerUtils.cpp

index e145aaf..e7798b2 100644 (file)
@@ -486,4 +486,13 @@ extern "C" MLIR_CRUNNERUTILS_EXPORT uint64_t rtrand(void *, uint64_t m);
 // Deletes the random number generator.
 extern "C" MLIR_CRUNNERUTILS_EXPORT void rtdrand(void *);
 
+//===----------------------------------------------------------------------===//
+// Runtime support library to allow the use of std::sort in MLIR program.
+//===----------------------------------------------------------------------===//
+extern "C" MLIR_CRUNNERUTILS_EXPORT void
+_mlir_ciface_stdSortI64(uint64_t n, StridedMemRefType<int64_t, 1> *vref);
+extern "C" MLIR_CRUNNERUTILS_EXPORT void
+_mlir_ciface_stdSortF64(uint64_t n, StridedMemRefType<double, 1> *vref);
+extern "C" MLIR_CRUNNERUTILS_EXPORT void
+_mlir_ciface_stdSortF32(uint64_t n, StridedMemRefType<float, 1> *vref);
 #endif // MLIR_EXECUTIONENGINE_CRUNNERUTILS_H
index d9486f9..7f800e8 100644 (file)
@@ -26,6 +26,7 @@
 #include "malloc.h"
 #endif // _WIN32
 
+#include <algorithm>
 #include <cinttypes>
 #include <cstdio>
 #include <cstdlib>
 
 #ifdef MLIR_CRUNNERUTILS_DEFINE_FUNCTIONS
 
+namespace {
+template <typename V>
+void stdSort(uint64_t n, V *p) {
+  std::sort(p, p + n);
+}
+
+} // namespace
+
 // Small runtime support "lib" for vector.print lowering.
 // By providing elementary printing methods only, this
 // library can remain fully unaware of low-level implementation
@@ -165,4 +174,17 @@ extern "C" void rtdrand(void *g) {
   delete generator;
 }
 
+#define IMPL_STDSORT(VNAME, V)                                                 \
+  extern "C" void _mlir_ciface_stdSort##VNAME(uint64_t n,                      \
+                                              StridedMemRefType<V, 1> *vref) { \
+    assert(vref);                                                              \
+    assert(vref->strides[0] == 1);                                             \
+    V *values = vref->data + vref->offset;                                     \
+    stdSort(n, values);                                                        \
+  }
+IMPL_STDSORT(I64, int64_t)
+IMPL_STDSORT(F64, double)
+IMPL_STDSORT(F32, float)
+#undef IMPL_STDSORT
+
 #endif // MLIR_CRUNNERUTILS_DEFINE_FUNCTIONS