[Mlir-commits] [mlir] [mlir][llvm] Add an op for the `llvm.vector.repeat` intrinsic (PR #236453)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Oct 28 08:49:27 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Andrzej WarzyƄski (banach-space)

<details>
<summary>Changes</summary>

Add an LLVM dialect op for `llvm.vector.repeat`, which repeats a
fixed-width vector to fill a scalable vector.

The LLVM intrinsic was introduced in:
https://github.com/llvm/llvm-project/pull/208212


---
Full diff: https://github.com/llvm/llvm-project/pull/236453.diff


3 Files Affected:

- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td (+16) 
- (modified) mlir/test/Target/LLVMIR/Import/intrinsic.ll (+10) 
- (modified) mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir (+8) 


``````````diff
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
index dfd36966644aaa..3695fcf52ebe14 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
@@ -1717,6 +1717,10 @@ def LLVM_UBSanTrap : LLVM_ZeroResultIntrOp<"ubsantrap",
   let assemblyFormat = "`failureKind` `=` $failureKind attr-dict";
 }
 
+//
+// Vector intrinsics.
+//
+
 /// Create a call to vscale intrinsic.
 def LLVM_vscale : LLVM_IntrOp<"vscale", [0], [], [], 1>;
 
@@ -1811,6 +1815,7 @@ def LLVM_vector_extract
   }];
 }
 
+/// Interleave2
 def LLVM_vector_interleave2
     : LLVM_OneResultIntrOp<"vector.interleave2",
         /*overloadedResults=*/[0], /*overloadedOperands=*/[],
@@ -1825,12 +1830,23 @@ def LLVM_vector_interleave2
         ]>,
         Arguments<(ins LLVM_AnyVector:$vec1, LLVM_AnyVector:$vec2)>;
 
+/// Deinterleave2
 def LLVM_vector_deinterleave2
     : LLVM_OneResultIntrOp<"vector.deinterleave2",
         /*overloadedResults=*/[], /*overloadedOperands=*/[0],
         /*traits=*/[Pure]>,
         Arguments<(ins LLVM_AnyVector:$vec)>;
 
+/// Repeat
+def LLVM_vector_repeat
+    : LLVM_OneResultIntrOp<"vector.repeat",
+        /*overloadedResults=*/[0], /*overloadedOperands=*/[0],
+        /*traits=*/[Pure]>,
+        Arguments<(ins LLVM_AnyVector:$vec)> {
+  let assemblyFormat = "`(` operands `)` attr-dict `:` "
+                       "functional-type(operands, results)";
+}
+
 //
 // LLVM Vector Predication operations.
 //
diff --git a/mlir/test/Target/LLVMIR/Import/intrinsic.ll b/mlir/test/Target/LLVMIR/Import/intrinsic.ll
index f5d4cc9a113c59..2a541bf1556154 100644
--- a/mlir/test/Target/LLVMIR/Import/intrinsic.ll
+++ b/mlir/test/Target/LLVMIR/Import/intrinsic.ll
@@ -1124,6 +1124,13 @@ define void @vector_deinterleave2(<4 x double> %0, <vscale x 8 x i32> %1) {
   ret void
 }
 
+; CHECK-LABEL: llvm.func @vector_repeat
+define void @vector_repeat(<4 x float> %0) {
+  ; CHECK: llvm.intr.vector.repeat(%{{.*}}) : (vector<4xf32>) -> vector<[4]xf32>
+  %4 = call <vscale x 4 x float> @llvm.vector.repeat.nxv4f32.v4f32(<4 x float> %0);
+  ret void
+}
+
 ; CHECK-LABEL:  llvm.func @vector_predication_intrinsics
 define void @vector_predication_intrinsics(<8 x i32> %0, <8 x i32> %1, <8 x float> %2, <8 x float> %3, <8 x i64> %4, <8 x double> %5, <8 x ptr> %6, i32 %7, float %8, ptr %9, ptr %10, <8 x i1> %11, i32 %12) {
   ; CHECK: llvm.add %{{.*}}, %{{.*}} : vector<8xi32>
@@ -2063,6 +2070,9 @@ declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
 declare <8 x ptr> @llvm.ptrmask.v8p0.v8i64(<8 x ptr>, <8 x i64>)
 declare <vscale x 4 x float> @llvm.vector.insert.nxv4f32.v4f32(<vscale x 4 x float>, <4 x float>, i64)
 declare <4 x float> @llvm.vector.extract.v4f32.nxv4f32(<vscale x 4 x float>, i64)
+declare { <2 x double>, <2 x double> } @llvm.vector.deinterleave2.v4f64(<4 x double>)
+declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32>)
+declare <vscale x 4 x float> @llvm.vector.repeat.nxv4f32.v4f32(<4 x float>)
 declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
 declare <4 x float> @llvm.experimental.constrained.fadd.v4f32(<4 x float>, <4 x float>, metadata, metadata)
 declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)
diff --git a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
index 865aa620031940..00755c1627725c 100644
--- a/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir
@@ -1246,6 +1246,13 @@ llvm.func @vector_deinterleave2(%vec1: vector<4xf64>, %vec2: vector<[8]xi32>) {
   llvm.return
 }
 
+// CHECK-LABEL: @vector_repeat
+llvm.func @vector_repeat(%src: vector<4xf32>) {
+  // CHECK:  call <vscale x 4 x float> @llvm.vector.repeat.nxv4f32.v4f32
+  %0 = llvm.intr.vector.repeat (%src) : (vector<4xf32>) -> vector<[4]xf32>
+  llvm.return
+}
+
 // CHECK-LABEL: @lifetime
 llvm.func @lifetime() {
   %c = llvm.mlir.constant(16 : i64) : i64
@@ -2198,6 +2205,7 @@ llvm.func @vector_scmp(%a: vector<4 x i32>, %b: vector<4 x i32>) -> vector<4 x i
 // CHECK-DAG: declare <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32>, i64 immarg)
 // CHECK-DAG: declare { <2 x double>, <2 x double> } @llvm.vector.deinterleave2.v4f64(<4 x double>)
 // CHECK-DAG: declare { <vscale x 4 x i32>, <vscale x 4 x i32> } @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32>)
+// CHECK-DAG: declare <vscale x 4 x float> @llvm.vector.repeat.nxv4f32.v4f32(<4 x float>)
 // CHECK-DAG: declare void @llvm.lifetime.start.p0(ptr captures(none))
 // CHECK-DAG: declare void @llvm.lifetime.end.p0(ptr captures(none))
 // CHECK-DAG: declare ptr @llvm.invariant.start.p0(i64 immarg, ptr captures(none))

``````````

</details>


https://github.com/llvm/llvm-project/pull/236453


More information about the Mlir-commits mailing list