[PATCH] D153894: [mlir][llvm] Fix conversion of scalable vectors of rank > 1

Cullen Rhodes via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 27 09:58:00 PDT 2023

c-rhodes created this revision.
c-rhodes added reviewers: awarzynski, jsetoain.
c-rhodes added a project: MLIR.
Herald added subscribers: gysit, Dinistro, bviyer, Moerafaat, zero9178, bzcheeseman, sdasgup3, wenzhicui, wrengr, cota, teijeong, rdzhabarov, tatianashp, msifontes, jurahul, Kayjukh, grosul1, Joonsoo, liufengdb, aartbik, mgester, arpith-jacob, antiagainst, shauheen, rriddle, mehdi_amini.
Herald added a reviewer: aartbik.
Herald added a reviewer: ftynse.
Herald added a reviewer: dcaballe.
Herald added a project: All.
c-rhodes requested review of this revision.
Herald added subscribers: alextsao1999, stephenneuendorffer, nicolasvasilache.

Vector types of rank > 1 are converted to array(s) of vector type(s).
Arrays in LLVM cannot contain scalable vectors since the size is unknown
at compile-time, but it's currently trying to do so and creating 1-D
vector types where the number of scalable dims is greater than the rank,
triggering an assert in `llvm-project/llvm/include/llvm/ADT/ArrayRef.h:255`:

  Assertion `Index < Length && "Invalid index!"' failed.

This patch fixes this so there's only a single scalable dim. This needs
fixing properly by adding support for converting scalable vectors of
rank > 1 to LLVM but at least now it will fail expectedly during
conversion to LLVM with:

  Assertion `isValidElementType(ElementType) && "Invalid type for array
  element!"' failed.

rather than with a cryptic assert.

  rG LLVM Github Monorepo



Index: mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
--- mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
+++ mlir/test/Conversion/VectorToLLVM/vector-to-llvm.mlir
@@ -112,6 +112,21 @@
 // -----
+func.func @broadcast_scalable_vec2d_from_scalar(%arg0: f32) -> vector<[2x3]xf32> {
+  %0 = vector.broadcast %arg0 : f32 to vector<[2x3]xf32>
+  return %0 : vector<[2x3]xf32>
+// CHECK-LABEL: @broadcast_scalable_vec2d_from_scalar(
+// CHECK-SAME:  %[[A:.*]]: f32)
+// CHECK:       %[[T0:.*]] = llvm.insertelement %[[A]]
+// CHECK:       %[[T1:.*]] = llvm.shufflevector %[[T0]]
+// CHECK:       %[[T2:.*]] = llvm.insertvalue %[[T1]], %{{.*}}[0] : !llvm.array<2 x vector<[3]xf32>>
+// CHECK:       %[[T3:.*]] = llvm.insertvalue %[[T1]], %{{.*}}[1] : !llvm.array<2 x vector<[3]xf32>>
+// CHECK:       %[[T4:.*]] = builtin.unrealized_conversion_cast %[[T3]] : !llvm.array<2 x vector<[3]xf32>> to vector<[2x3]xf32>
+// CHECK:       return %[[T4]] : vector<[2x3]xf32>
+// -----
 func.func @broadcast_vec3d_from_scalar(%arg0: f32) -> vector<2x3x4xf32> {
   %0 = vector.broadcast %arg0 : f32 to vector<2x3x4xf32>
   return %0 : vector<2x3x4xf32>
Index: mlir/lib/Conversion/LLVMCommon/TypeConverter.cpp
--- mlir/lib/Conversion/LLVMCommon/TypeConverter.cpp
+++ mlir/lib/Conversion/LLVMCommon/TypeConverter.cpp
@@ -464,7 +464,7 @@
   if (type.getShape().empty())
     return VectorType::get({1}, elementType);
   Type vectorType = VectorType::get(type.getShape().back(), elementType,
-                                    type.getNumScalableDims());
+                                    type.isScalable());
   assert(LLVM::isCompatibleVectorType(vectorType) &&
          "expected vector type compatible with the LLVM dialect");
   auto shape = type.getShape();

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153894.535034.patch
Type: text/x-patch
Size: 1905 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230627/a1d7897b/attachment.bin>

More information about the llvm-commits mailing list