[PATCH] D75459: [mlir] Add padding to 1-D Vector in CRunnerUtils.h
Nicolas Vasilache via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 2 07:39:55 PST 2020
nicolasvasilache created this revision.
nicolasvasilache added a reviewer: ftynse.
Herald added subscribers: llvm-commits, Joonsoo, liufengdb, lucyrfox, mgester, arpith-jacob, antiagainst, shauheen, burmako, jpienaar, rriddle, mehdi_amini.
Herald added a project: LLVM.
This revision adds padding for 1-D Vector in the common case of x86
execution with a stadard data layout. This supports properly interfacing
codegen with arrays of e.g. `vector<9xf32>`.
Such vectors are already assumed padded to the next power of 2 by LLVM
codegen with the default x86 data layout:
define void @test_vector_add_1d_2_3(<3 x float>* nocapture readnone %0,
<3 x float>* nocapture readonly %1, i64 %2, i64 %3, i64 %4, <3 x float>*
nocapture readnone %5, <3 x float>* nocapture readonly %6, i64 %7, i64
%8, i64 %9, <3 x float>* nocapture readnone %10, <3 x float>* nocapture
%11, i64 %12, i64 %13, i64 %14) local_unnamed_addr {
%16 = getelementptr <3 x float>, <3 x float>* %6, i64 1
%17 = load <3 x float>, <3 x float>* %16, align 16
%18 = getelementptr <3 x float>, <3 x float>* %1, i64 1
%19 = load <3 x float>, <3 x float>* %18, align 16
%20 = fadd <3 x float> %17, %19
%21 = getelementptr <3 x float>, <3 x float>* %11, i64 1
The pointer addressing a `vector<3xf32>` is assumed aligned `@16`.
Similarly, the pointer addressing a `vector<65xf32>` is assumed aligned
`@512`.
This revision allows using objects such as `vector<3xf32>` properly with
the standard x86 data layout used in the JitRunner. Integration testing
is done out of tree, at the moment such testing fails without this
change.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D75459
Files:
mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
mlir/include/mlir/ExecutionEngine/RunnerUtils.h
Index: mlir/include/mlir/ExecutionEngine/RunnerUtils.h
===================================================================
--- mlir/include/mlir/ExecutionEngine/RunnerUtils.h
+++ mlir/include/mlir/ExecutionEngine/RunnerUtils.h
@@ -92,7 +92,7 @@
static_assert(sizeof(val) == M * StaticSizeMult<Dims...>::value * sizeof(T),
"Incorrect vector size!");
// First
- os << "(" << val.vector[0];
+ os << "(" << val[0];
if (M > 1)
os << ", ";
if (sizeof...(Dims) > 1)
@@ -100,14 +100,14 @@
// Kernel
for (unsigned i = 1; i + 1 < M; ++i) {
printSpace(os, 2 * sizeof...(Dims));
- os << val.vector[i] << ", ";
+ os << val[i] << ", ";
if (sizeof...(Dims) > 1)
os << "\n";
}
// Last
if (M > 1) {
printSpace(os, sizeof...(Dims));
- os << val.vector[M - 1];
+ os << val[M - 1];
}
os << ")";
}
Index: mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
===================================================================
--- mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
+++ mlir/include/mlir/ExecutionEngine/CRunnerUtils.h
@@ -39,14 +39,47 @@
//===----------------------------------------------------------------------===//
// Codegen-compatible structures for Vector type.
//===----------------------------------------------------------------------===//
-template <typename T, int Dim, int... Dims>
-struct Vector {
+namespace detail {
+ template <unsigned N> constexpr unsigned nextPowerOf2();
+ template <> constexpr unsigned nextPowerOf2<0>() { return 1; }
+ template <> constexpr unsigned nextPowerOf2<1>() { return 1; }
+ template <unsigned N> constexpr unsigned nextPowerOf2() {
+ return (!(N & (N - 1))) ? N : 2 * nextPowerOf2<(N + 1) / 2>();
+ }
+} // end namespace detail
+
+// N-D vectors recurse down to 1-D.
+template <typename T, int Dim, int... Dims> struct Vector {
+ Vector() {
+ static_assert(detail::nextPowerOf2<sizeof(T[Dim])>() >= sizeof(T[Dim]),
+ "size error");
+ static_assert(detail::nextPowerOf2<sizeof(T[Dim])>() < 2 * sizeof(T[Dim]),
+ "size error");
+ }
+ constexpr Vector<T, Dims...> &operator[](unsigned i) { return vector[i]; }
+ constexpr const Vector<T, Dims...> &operator[](unsigned i) const {
+ return vector[i];
+ }
+
+private:
Vector<T, Dims...> vector[Dim];
};
-template <typename T, int Dim>
-struct Vector<T, Dim> {
+// 1-D vectors in LLVM are automatically padded to the next power of 2.
+// We insert explicit padding in to account for this.
+template <typename T, int Dim> struct Vector<T, Dim> {
+ Vector() {
+ static_assert(detail::nextPowerOf2<sizeof(T[Dim])>() >= sizeof(T[Dim]),
+ "size error");
+ static_assert(detail::nextPowerOf2<sizeof(T[Dim])>() < 2 * sizeof(T[Dim]),
+ "size error");
+ }
+ constexpr T &operator[](unsigned i) { return vector[i]; }
+ constexpr const T &operator[](unsigned i) const { return vector[i]; }
+
+private:
T vector[Dim];
+ char padding[detail::nextPowerOf2<sizeof(T[Dim])>() - sizeof(T[Dim])];
};
template <int D1, typename T>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75459.247647.patch
Type: text/x-patch
Size: 3102 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200302/15bcd0da/attachment.bin>
More information about the llvm-commits
mailing list