[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