[clang] [llvm] [SPIRV] Add support for the `SPV_EXT_long_vector` extension (PR #210279)
Marcos Maronas via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 29 06:02:58 PDT 2026
================
@@ -0,0 +1,89 @@
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_EXT_long_vector %s -o - | FileCheck %s
+; spirv-val seems to have problems reading OpTypeVectorIdEXT correctly, enable once fixed
+; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_EXT_long_vector %s -o - -filetype=obj | spirv-val %}
+
+; CHECK-DAG: OpName %[[#idx:]] "idx"
+; CHECK-DAG: OpName %[[#idx2:]] "idx2"
+; CHECK-DAG: OpName %[[#val:]] "val"
+
+; CHECK-DAG: %[[#int:]] = OpTypeInt 32 0
+; CHECK-DAG: %[[#long:]] = OpTypeInt 64 0
+; CHECK-DAG: %[[#vec17:]] = OpTypeVectorIdEXT %[[#int]] 17
+; CHECK-DAG: %[[#ptr_vec17:]] = OpTypePointer Function %[[#vec17]]
+; CHECK-DAG: %[[#undef:]] = OpUndef %[[#vec17]]
+; CHECK-DAG: %[[#null:]] = OpConstantNull %[[#vec17]]
+
+; CHECK-DAG: %[[#out:]] = OpVariable %[[#ptr_p_int:]] CrossWorkgroup
+
+ at out = internal addrspace(1) global i32 0
+ at idx = internal addrspace(1) global i32 0
+ at idx2 = internal addrspace(1) global i32 0
+ at val = internal addrspace(1) global i32 0
+
+; CHECK: %[[#test_full:]] = OpFunction %[[#]] None %[[#]]
+define void @test_full() {
+ ; CHECK-DAG: %[[#i0:]] = OpLoad %[[#int]] %[[#idx]]
+ ; CHECK-DAG: %[[#i1:]] = OpLoad %[[#int]] %[[#idx2]]
+ ; CHECK-DAG: %[[#val_val:]] = OpLoad %[[#int]] %[[#val]]
+ ; CHECK-DAG: %[[#idx64:]] = OpUConvert %[[#long]] %[[#i0]]
+ ; CHECK-DAG: %[[#idx2_64:]] = OpUConvert %[[#long]] %[[#i1]]
+
+ %idx = load i32, ptr addrspace(1) @idx
+ %idx2 = load i32, ptr addrspace(1) @idx2
+ %val = load i32, ptr addrspace(1) @val
+
+ ; CHECK-DAG: %[[#ptr:]] = OpVariable %[[#ptr_vec17]] Function
+ ; CHECK-DAG: %[[#loaded:]] = OpLoad %[[#vec17]] %[[#ptr]]
+ %ptr = alloca <17 x i32>
+ %loaded = load <17 x i32>, ptr %ptr
+ %idx64 = zext i32 %idx to i64
+ %idx2_64 = zext i32 %idx2 to i64
+
+ ; Insertelement with dynamic index spills to stack
+ ; CHECK: %[[#inserted:]] = OpVectorInsertDynamic %[[#vec17]] %[[#loaded]] %[[#val_val]] %[[#idx64]]
+ %inserted = insertelement <17 x i32> %loaded, i32 %val, i64 %idx64
+
+ ; Extractelement with dynamic index spills to stack
----------------
maarquitos14 wrote:
```suggestion
; Extractelement with dynamic index spills to stack.
```
https://github.com/llvm/llvm-project/pull/210279
More information about the cfe-commits
mailing list