[llvm] [SPIR-V] Legalize vector arithmetic and intrinsics for large vectors (PR #170668)

Nathan Gauër via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 9 06:20:47 PST 2025


================
@@ -0,0 +1,194 @@
+; RUN: llc -O0 -verify-machineinstrs -mtriple=spirv-unknown-vulkan %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan %s -o - -filetype=obj | spirv-val %}
+
+; CHECK-DAG: OpName %[[#test_int32_double_conversion:]] "test_int32_double_conversion"
+; CHECK-DAG: %[[#int:]] = OpTypeInt 32 0
+; CHECK-DAG: %[[#v4i32:]] = OpTypeVector %[[#int]] 4
+; CHECK-DAG: %[[#double:]] = OpTypeFloat 64
+; CHECK-DAG: %[[#v4f64:]] = OpTypeVector %[[#double]] 4
+; CHECK-DAG: %[[#v2i32:]] = OpTypeVector %[[#int]] 2
+; CHECK-DAG: %[[#ptr_private_v4i32:]] = OpTypePointer Private %[[#v4i32]]
+; CHECK-DAG: %[[#ptr_private_v4f64:]] = OpTypePointer Private %[[#v4f64]]
+; CHECK-DAG: %[[#global_double:]] = OpVariable %[[#ptr_private_v4f64]] Private
+; CHECK-DAG: %[[#C15:]] = OpConstant %[[#int]] 15{{$}}
+; CHECK-DAG: %[[#C14:]] = OpConstant %[[#int]] 14{{$}}
+; CHECK-DAG: %[[#C13:]] = OpConstant %[[#int]] 13{{$}}
+; CHECK-DAG: %[[#C12:]] = OpConstant %[[#int]] 12{{$}}
+; CHECK-DAG: %[[#C11:]] = OpConstant %[[#int]] 11{{$}}
+; CHECK-DAG: %[[#C10:]] = OpConstant %[[#int]] 10{{$}}
+; CHECK-DAG: %[[#C9:]] = OpConstant %[[#int]] 9{{$}}
+; CHECK-DAG: %[[#C8:]] = OpConstant %[[#int]] 8{{$}}
+; CHECK-DAG: %[[#C7:]] = OpConstant %[[#int]] 7{{$}}
+; CHECK-DAG: %[[#C6:]] = OpConstant %[[#int]] 6{{$}}
+; CHECK-DAG: %[[#C5:]] = OpConstant %[[#int]] 5{{$}}
+; CHECK-DAG: %[[#C4:]] = OpConstant %[[#int]] 4{{$}}
+; CHECK-DAG: %[[#C3:]] = OpConstant %[[#int]] 3{{$}}
+; CHECK-DAG: %[[#C2:]] = OpConstant %[[#int]] 2{{$}}
+; CHECK-DAG: %[[#C1:]] = OpConstant %[[#int]] 1{{$}}
+; CHECK-DAG: %[[#C0:]] = OpConstant %[[#int]] 0{{$}}
+
+ at G_16 = internal addrspace(10) global [16 x i32] zeroinitializer
----------------
Keenuts wrote:

Do you know what the `Align` actually implies in SPIR-V stores?

Looking at:
```llvm
@var = internal addrspace(10) global [5 x double] zeroinitializer
%tmp = load <5 x double>, ptr addrspace(10) @var
store <5 x double> %tmp, ptr addrspace(10) @var
```

We get 5 OpAccessChain, with 5 loads `Aligned 8`, one for each double.
But at the store, we have:

```
         %37 = OpAccessChain %_ptr_Private_double %var %uint_0
         %38 = OpCompositeExtract %double %tmp1 0
               OpStore %37 %38 Aligned 64
         %39 = OpAccessChain %_ptr_Private_double %var %uint_1
         %40 = OpCompositeExtract %double %tmp1 1
               OpStore %39 %40 Aligned 8
         %41 = OpAccessChain %_ptr_Private_double %var %uint_2
         %42 = OpCompositeExtract %double %tmp1 2
               OpStore %41 %42 Aligned 16
         %43 = OpAccessChain %_ptr_Private_double %var %uint_3
         %44 = OpCompositeExtract %double %tmp1 3
               OpStore %43 %44 Aligned 8
         %45 = OpAccessChain %_ptr_Private_double %var %uint_4
         %46 = OpCompositeExtract %double %tmp2 0
               OpStore %45 %46 Aligned 32
```

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


More information about the llvm-commits mailing list