Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package spirv-llvm-translator for
openSUSE:Factory checked in at 2026-11-05 18:19:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/spirv-llvm-translator (Old)
and /work/SRC/openSUSE:Factory/.spirv-llvm-translator.new.3759290 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "spirv-llvm-translator"
Thu Nov 5 18:19:20 2026 rev:37 rq:1394805 version:23.1.3
Changes:
--------
---
/work/SRC/openSUSE:Factory/spirv-llvm-translator/spirv-llvm-translator.changes
2026-10-13 17:43:19.445233001 +0200
+++
/work/SRC/openSUSE:Factory/.spirv-llvm-translator.new.3759290/spirv-llvm-translator.changes
2026-11-05 18:19:28.387587652 +0100
@@ -1,0 +2,11 @@
+Sun Nov 1 22:24:14 UTC 2026 - Aaron Puchert <[email protected]>
+
+- Update to version 23.1.3.
+ * Emit FPFastMathMode for Call.
+ * Rework translation of memset to restore better performance.
+ * Add support for SPV_INTEL_subgroup_bitcast_shuffle.
+- Add Add-support-for-SPV_INTEL_subgroup_bitcast_shuffle.patch to
+ revert latest change: our version of spirv-headers doesn't have
+ the extension yet.
+
+-------------------------------------------------------------------
Old:
----
SPIRV-LLVM-Translator-23.1.2.tar.gz
New:
----
Add-support-for-SPV_INTEL_subgroup_bitcast_shuffle.patch
SPIRV-LLVM-Translator-23.1.3.tar.gz
----------(New B)----------
New: * Add support for SPV_INTEL_subgroup_bitcast_shuffle.
- Add Add-support-for-SPV_INTEL_subgroup_bitcast_shuffle.patch to
revert latest change: our version of spirv-headers doesn't have
----------(New E)----------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ spirv-llvm-translator.spec ++++++
--- /var/tmp/diff_new_pack.65XlWC/_old 2026-11-05 18:19:29.152619132 +0100
+++ /var/tmp/diff_new_pack.65XlWC/_new 2026-11-05 18:19:29.154619214 +0100
@@ -23,7 +23,7 @@
%define sover 23
Name: spirv-llvm-translator
-Version: 23.1.2
+Version: 23.1.3
Release: 0
Summary: LLVM/SPIR-V Bi-Directional Translator library
License: BSD-3-Clause
@@ -31,6 +31,7 @@
URL: https://github.com/KhronosGroup/SPIRV-LLVM-Translator
Source:
https://github.com/KhronosGroup/SPIRV-LLVM-Translator/archive/refs/tags/v%{version}.tar.gz#/SPIRV-LLVM-Translator-%{version}.tar.gz
Source101: %{name}.rpmlintrc
+Patch1: Add-support-for-SPV_INTEL_subgroup_bitcast_shuffle.patch
BuildRequires: cmake >= 3.3
BuildRequires: gcc%{?gcc_version} >= 9
BuildRequires: gcc%{?gcc_version}-c++ >= 9
@@ -66,6 +67,7 @@
%prep
%setup -q -n SPIRV-LLVM-Translator-%{version}
+%patch -P1 -p1 -R
%build
%cmake \
++++++ Add-support-for-SPV_INTEL_subgroup_bitcast_shuffle.patch ++++++
>From db5855d76a0ff33228bcf48032b350b25dcdbcf2 Mon Sep 17 00:00:00 2001
From: Piotr Kanclerz <[email protected]>
Date: Thu, 29 Oct 2026 16:45:41 +0100
Subject: [PATCH] [Backport to 23] Add support for
SPV_INTEL_subgroup_bitcast_shuffle (#4022) (#4124)
Spec:
https://github.khronos.org/SPIRV-Registry/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle.html
Also includes the fix from #4121 removing the duplicated
SubgroupBitcastShuffleINTEL name map entry.
Co-authored-by: Ben Ashbaugh <[email protected]>
---
include/LLVMSPIRVExtensions.inc | 1 +
lib/SPIRV/SPIRVReader.cpp | 6 +-
lib/SPIRV/libSPIRV/SPIRVEntry.h | 2 +
lib/SPIRV/libSPIRV/SPIRVInstruction.h | 14 +
lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h | 1 +
lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h | 1 +
spirv-headers-tag.conf | 2 +-
.../bitcast_shuffle.ll | 276 ++++++++++++++++++
8 files changed, 300 insertions(+), 3 deletions(-)
create mode 100644
test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
diff --git a/include/LLVMSPIRVExtensions.inc b/include/LLVMSPIRVExtensions.inc
index af89697f9f..c1bf59a4cd 100644
--- a/include/LLVMSPIRVExtensions.inc
+++ b/include/LLVMSPIRVExtensions.inc
@@ -81,6 +81,7 @@ EXT(SPV_INTEL_task_sequence)
EXT(SPV_INTEL_maximum_registers)
EXT(SPV_INTEL_bindless_images)
EXT(SPV_INTEL_2d_block_io)
+EXT(SPV_INTEL_subgroup_bitcast_shuffle)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate_float4)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate_float8)
diff --git a/lib/SPIRV/SPIRVReader.cpp b/lib/SPIRV/SPIRVReader.cpp
index bc87849405..7c4ccb2b3d 100644
--- a/lib/SPIRV/SPIRVReader.cpp
+++ b/lib/SPIRV/SPIRVReader.cpp
@@ -4007,7 +4007,7 @@ Instruction *SPIRVToLLVM::transBuiltinFromInst(const
std::string &FuncName,
Func->addFnAttr(Attribute::NoUnwind);
if (isGroupOpCode(OC) || isGroupNonUniformOpcode(OC) ||
isIntelSubgroupOpCode(OC) || isSplitBarrierINTELOpCode(OC) ||
- OC == OpControlBarrier)
+ OC == OpSubgroupBitcastShuffleINTEL || OC == OpControlBarrier)
Func->addFnAttr(Attribute::Convergent);
}
CallInst *Call;
@@ -4189,6 +4189,7 @@ Instruction
*SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI,
case internal::OpClampConvertFToSINTEL:
case internal::OpStochasticRoundFToFINTEL:
case internal::OpClampStochasticRoundFToSINTEL:
+ case OpSubgroupBitcastShuffleINTEL:
// Old opcodes, for backward compatibility.
case internal::OpClampConvertFToFINTEL:
case internal::OpClampStochasticRoundFToFINTEL:
@@ -4202,13 +4203,14 @@ Instruction
*SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI,
}
bool IsRetSigned = true;
- switch (OC) {
+ switch (static_cast<size_t>(OC)) {
case OpConvertFToU:
case OpSatConvertSToU:
case OpUConvert:
case OpUDotKHR:
case OpUDotAccSatKHR:
case OpReadClockKHR:
+ case OpSubgroupBitcastShuffleINTEL:
IsRetSigned = false;
break;
case OpImageRead:
diff --git a/lib/SPIRV/libSPIRV/SPIRVEntry.h b/lib/SPIRV/libSPIRV/SPIRVEntry.h
index e3f94484d6..27dcef0bd0 100644
--- a/lib/SPIRV/libSPIRV/SPIRVEntry.h
+++ b/lib/SPIRV/libSPIRV/SPIRVEntry.h
@@ -945,6 +945,8 @@ class SPIRVCapability : public SPIRVEntryNoId<OpCapability>
{
case CapabilityVectorComputeINTEL:
case CapabilityVectorAnyINTEL:
return ExtensionID::SPV_INTEL_vector_compute;
+ case CapabilitySubgroupBitcastShuffleINTEL:
+ return ExtensionID::SPV_INTEL_subgroup_bitcast_shuffle;
case internal::CapabilitySubgroupRequirementsINTEL:
return ExtensionID::SPV_INTEL_subgroup_requirements;
case CapabilityFPFastMathModeINTEL:
diff --git a/lib/SPIRV/libSPIRV/SPIRVInstruction.h
b/lib/SPIRV/libSPIRV/SPIRVInstruction.h
index ff803fb696..9dbfa0a120 100644
--- a/lib/SPIRV/libSPIRV/SPIRVInstruction.h
+++ b/lib/SPIRV/libSPIRV/SPIRVInstruction.h
@@ -4856,6 +4856,20 @@ _SPIRV_OP_FTOF(StochasticRoundFToF, true, 5, true)
_SPIRV_OP_FTOF(ClampStochasticRoundFToF, true, 5, true)
#undef _SPIRV_OP_FTOF
+class SPIRVSubgroupBitcastShuffleINTELInst : public SPIRVInstTemplateBase {
+public:
+ std::optional<ExtensionID> getRequiredExtension() const override {
+ return ExtensionID::SPV_INTEL_subgroup_bitcast_shuffle;
+ }
+ SPIRVCapVec getRequiredCapability() const override {
+ return getVec(CapabilitySubgroupBitcastShuffleINTEL);
+ }
+};
+
+typedef SPIRVInstTemplate<SPIRVSubgroupBitcastShuffleINTELInst,
+ OpSubgroupBitcastShuffleINTEL, true, 4>
+ SPIRVSubgroupBitcastShuffleINTEL;
+
class SPIRVFPConversionFtoSINTELInstBase : public SPIRVInstTemplateBase {
public:
SPIRVCapVec getRequiredCapability() const override {
diff --git a/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
b/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
index cfd7e90da4..4104cc5f64 100644
--- a/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
+++ b/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
@@ -565,6 +565,7 @@ template <> inline void SPIRVMap<Capability,
std::string>::init() {
add(CapabilityDemoteToHelperInvocation, "DemoteToHelperInvocation");
add(CapabilityDemoteToHelperInvocationEXT, "DemoteToHelperInvocationEXT");
add(CapabilityBindlessTextureNV, "BindlessTextureNV");
+ add(CapabilitySubgroupBitcastShuffleINTEL, "SubgroupBitcastShuffleINTEL");
add(CapabilitySubgroupShuffleINTEL, "SubgroupShuffleINTEL");
add(CapabilitySubgroupBufferBlockIOINTEL, "SubgroupBufferBlockIOINTEL");
add(CapabilitySubgroupBufferPrefetchINTEL, "SubgroupBufferPrefetchINTEL");
diff --git a/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
b/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
index ab96b81a9e..2857d4c07e 100644
--- a/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
+++ b/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
@@ -578,6 +578,7 @@ _SPIRV_OP(ConvertBF16ToFINTEL, 6117)
_SPIRV_OP(ControlBarrierArriveINTEL, 6142)
_SPIRV_OP(ControlBarrierWaitINTEL, 6143)
_SPIRV_OP(ArithmeticFenceEXT, 6145)
+_SPIRV_OP(SubgroupBitcastShuffleINTEL, 6208)
_SPIRV_OP(SubgroupBlockPrefetchINTEL, 6221)
_SPIRV_OP(Subgroup2DBlockLoadINTEL, 6231)
_SPIRV_OP(Subgroup2DBlockLoadTransformINTEL, 6232)
diff --git a/spirv-headers-tag.conf b/spirv-headers-tag.conf
index 708c8a3749..c10d046927 100644
--- a/spirv-headers-tag.conf
+++ b/spirv-headers-tag.conf
@@ -1 +1 @@
-575b6512579ebde466ed3dfc04e413439d14d95d
+cb42dec3830d3ac67fa449ecdc0c0f73d5e74498
diff --git
a/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
b/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
new file mode 100644
index 0000000000..983e6417c4
--- /dev/null
+++
b/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
@@ -0,0 +1,276 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_subgroup_bitcast_shuffle -o
%t.spv
+; RUN: llvm-spirv %t.spv --to-text -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
+
+; RUN: not llvm-spirv %t.bc 2>&1 -o %t.err.spv | FileCheck %s
--check-prefix=CHECK-ERROR
+; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V
extension:
+; CHECK-ERROR-NEXT: SPV_INTEL_subgroup_bitcast_shuffle
+
+; CHECK-SPIRV-DAG: Capability SubgroupBitcastShuffleINTEL
+; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_bitcast_shuffle"
+
+; CHECK-SPIRV-DAG: TypeInt [[#TI8:]] 8 0
+; CHECK-SPIRV-DAG: TypeInt [[#TI16:]] 16 0
+; CHECK-SPIRV-DAG: TypeInt [[#TI32:]] 32 0
+; CHECK-SPIRV-DAG: TypeInt [[#TI64:]] 64 0
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I8:]] [[#TI8]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I8:]] [[#TI8]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I8:]] [[#TI8]] 8
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I16:]] [[#TI16]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I16:]] [[#TI16]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I32:]] [[#TI32]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV16I8:]] [[#TI8]] 16
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I16:]] [[#TI16]] 8
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I32:]] [[#TI32]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I64:]] [[#TI64]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV16I16:]] [[#TI16]] 16
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I32:]] [[#TI32]] 8
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I64:]] [[#TI64]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV16I32:]] [[#TI32]] 16
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I64:]] [[#TI64]] 8
+
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I32]]
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_16bit()
+; CHECK-LLVM: call spir_func i16
@_Z43__spirv_SubgroupBitcastShuffleINTEL_RushortDv2_c(<2 x i8>
+; CHECK-LLVM: call spir_func <2 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar2s(i16
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_32bit()
+; CHECK-LLVM: call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2Dv4_c(<4 x i8>
+; CHECK-LLVM: call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4Dv2_s(<2 x i16>
+; CHECK-LLVM: call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv4_c(<4 x i8>
+; CHECK-LLVM: call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4i(i32
+; CHECK-LLVM: call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv2_s(<2 x i16>
+; CHECK-LLVM: call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2i(i32
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_64bit()
+; CHECK-LLVM: call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv8_c(<8 x i8>
+; CHECK-LLVM: call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv4_s(<4 x i16>
+; CHECK-LLVM: call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv8_c(<8 x i8>
+; CHECK-LLVM: call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv2_i(<2 x i32>
+; CHECK-LLVM: call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv8_c(<8 x i8>
+; CHECK-LLVM: call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8l(i64
+; CHECK-LLVM: call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv4_s(<4 x i16>
+; CHECK-LLVM: call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv2_i(<2 x i32>
+; CHECK-LLVM: call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv4_s(<4 x i16>
+; CHECK-LLVM: call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4l(i64
+; CHECK-LLVM: call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv2_i(<2 x i32>
+; CHECK-LLVM: call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2l(i64
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_128bit()
+; CHECK-LLVM: call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv16_c(<16 x i8>
+; CHECK-LLVM: call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv8_s(<8 x i16>
+; CHECK-LLVM: call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv16_c(<16 x i8>
+; CHECK-LLVM: call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv4_i(<4 x i32>
+; CHECK-LLVM: call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv16_c(<16 x i8>
+; CHECK-LLVM: call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv2_l(<2 x i64>
+; CHECK-LLVM: call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv8_s(<8 x i16>
+; CHECK-LLVM: call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv4_i(<4 x i32>
+; CHECK-LLVM: call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv8_s(<8 x i16>
+; CHECK-LLVM: call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv2_l(<2 x i64>
+; CHECK-LLVM: call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv4_i(<4 x i32>
+; CHECK-LLVM: call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv2_l(<2 x i64>
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_256bit()
+; CHECK-LLVM: call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv16_s(<16 x i16>
+; CHECK-LLVM: call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv8_i(<8 x i32>
+; CHECK-LLVM: call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv16_s(<16 x i16>
+; CHECK-LLVM: call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv4_l(<4 x i64>
+; CHECK-LLVM: call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv8_i(<8 x i32>
+; CHECK-LLVM: call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv4_l(<4 x i64>
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_512bit()
+; CHECK-LLVM: call spir_func <8 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong8Dv16_i(<16 x i32>
+; CHECK-LLVM: call spir_func <16 x i32>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruint16Dv8_l(<8 x i64>
+
+target datalayout =
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir"
+
+define spir_kernel void @test_16bit() {
+entry:
+ %v2i8 = load <2 x i8>, ptr undef
+ %s16 = load i16, ptr undef
+
+ %r2x8to16 = call spir_func i16
@_Z43__spirv_SubgroupBitcastShuffleINTEL_RushortDv2_c(<2 x i8> %v2i8)
+ %r16to2x8 = call spir_func <2 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar2s(i16 %s16)
+ ret void
+}
+
+define spir_kernel void @test_32bit() {
+entry:
+ %v4i8 = load <4 x i8>, ptr undef
+ %v2i16 = load <2 x i16>, ptr undef
+ %s32 = load i32, ptr undef
+
+ %r4x8to2x16 = call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2Dv4_c(<4 x i8> %v4i8)
+ %r2x16to4x8 = call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4Dv2_s(<2 x i16> %v2i16)
+ %r4x8to32 = call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv4_c(<4 x i8> %v4i8)
+ %r32to4x8 = call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4i(i32 %s32)
+ %r2x16to32 = call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv2_s(<2 x i16> %v2i16)
+ %r32to2x16 = call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2i(i32 %s32)
+ ret void
+}
+
+define spir_kernel void @test_64bit() {
+entry:
+ %v8i8 = load <8 x i8>, ptr undef
+ %v4i16 = load <4 x i16>, ptr undef
+ %v2i32 = load <2 x i32>, ptr undef
+ %s64 = load i64, ptr undef
+
+ %r8x8to4x16 = call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv8_c(<8 x i8> %v8i8)
+ %r4x16to8x8 = call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv4_s(<4 x i16> %v4i16)
+ %r8x8to2x32 = call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv8_c(<8 x i8> %v8i8)
+ %r2x32to8x8 = call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv2_i(<2 x i32> %v2i32)
+ %r8x8to64 = call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv8_c(<8 x i8> %v8i8)
+ %r64to8x8 = call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8l(i64 %s64)
+ %r4x16to2x32 = call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv4_s(<4 x i16> %v4i16)
+ %r2x32to4x16 = call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv2_i(<2 x i32> %v2i32)
+ %r4x16to64 = call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv4_s(<4 x i16> %v4i16)
+ %r64to4x16 = call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4l(i64 %s64)
+ %r2x32to64 = call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv2_i(<2 x i32> %v2i32)
+ %r64to2x32 = call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2l(i64 %s64)
+ ret void
+}
+
+define spir_kernel void @test_128bit() {
+entry:
+ %v16i8 = load <16 x i8>, ptr undef
+ %v8i16 = load <8 x i16>, ptr undef
+ %v4i32 = load <4 x i32>, ptr undef
+ %v2i64 = load <2 x i64>, ptr undef
+
+ %r16x8to8x16 = call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv16_c(<16 x i8> %v16i8)
+ %r8x16to16x8 = call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv8_s(<8 x i16> %v8i16)
+ %r16x8to4x32 = call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv16_c(<16 x i8> %v16i8)
+ %r4x32to16x8 = call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv4_i(<4 x i32> %v4i32)
+ %r16x8to2x64 = call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv16_c(<16 x i8> %v16i8)
+ %r2x64to16x8 = call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv2_l(<2 x i64> %v2i64)
+ %r8x16to4x32 = call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv8_s(<8 x i16> %v8i16)
+ %r4x32to8x16 = call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv4_i(<4 x i32> %v4i32)
+ %r8x16to2x64 = call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv8_s(<8 x i16> %v8i16)
+ %r2x64to8x16 = call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv2_l(<2 x i64> %v2i64)
+ %r4x32to2x64 = call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv4_i(<4 x i32> %v4i32)
+ %r2x64to4x32 = call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv2_l(<2 x i64> %v2i64)
+ ret void
+}
+
+define spir_kernel void @test_256bit() {
+entry:
+ %v16i16 = load <16 x i16>, ptr undef
+ %v8i32 = load <8 x i32>, ptr undef
+ %v4i64 = load <4 x i64>, ptr undef
+
+ %r16x16to8x32 = call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv16_s(<16 x i16> %v16i16)
+ %r8x32to16x16 = call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv8_i(<8 x i32> %v8i32)
+ %r16x16to4x64 = call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv16_s(<16 x i16> %v16i16)
+ %r4x64to16x16 = call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv4_l(<4 x i64> %v4i64)
+ %r8x32to4x64 = call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv8_i(<8 x i32> %v8i32)
+ %r4x64to8x32 = call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv4_l(<4 x i64> %v4i64)
+ ret void
+}
+
+define spir_kernel void @test_512bit() {
+entry:
+ %v16i32 = load <16 x i32>, ptr undef
+ %v8i64 = load <8 x i64>, ptr undef
+
+ %r16x32to8x64 = call spir_func <8 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong8Dv16_i(<16 x i32> %v16i32)
+ %r8x64to16x32 = call spir_func <16 x i32>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruint16Dv8_l(<8 x i64> %v8i64)
+ ret void
+}
+
+declare dso_local spir_func i16
@_Z43__spirv_SubgroupBitcastShuffleINTEL_RushortDv2_c(<2 x i8>)
+declare dso_local spir_func <2 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar2s(i16)
+
+declare dso_local spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2Dv4_c(<4 x i8>)
+declare dso_local spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4Dv2_s(<2 x i16>)
+declare dso_local spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv4_c(<4 x i8>)
+declare dso_local spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4i(i32)
+declare dso_local spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv2_s(<2 x i16>)
+declare dso_local spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2i(i32)
+
+declare dso_local spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv8_c(<8 x i8>)
+declare dso_local spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv4_s(<4 x i16>)
+declare dso_local spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv8_c(<8 x i8>)
+declare dso_local spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv2_i(<2 x i32>)
+declare dso_local spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv8_c(<8 x i8>)
+declare dso_local spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8l(i64)
+declare dso_local spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv4_s(<4 x i16>)
+declare dso_local spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv2_i(<2 x i32>)
+declare dso_local spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv4_s(<4 x i16>)
+declare dso_local spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4l(i64)
+declare dso_local spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv2_i(<2 x i32>)
+declare dso_local spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2l(i64)
+
+declare dso_local spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv16_c(<16 x i8>)
+declare dso_local spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv8_s(<8 x i16>)
+declare dso_local spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv16_c(<16 x i8>)
+declare dso_local spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv4_i(<4 x i32>)
+declare dso_local spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv16_c(<16 x i8>)
+declare dso_local spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv2_l(<2 x i64>)
+declare dso_local spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv8_s(<8 x i16>)
+declare dso_local spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv4_i(<4 x i32>)
+declare dso_local spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv8_s(<8 x i16>)
+declare dso_local spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv2_l(<2 x i64>)
+declare dso_local spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv4_i(<4 x i32>)
+declare dso_local spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv2_l(<2 x i64>)
+
+declare dso_local spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv16_s(<16 x i16>)
+declare dso_local spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv8_i(<8 x i32>)
+declare dso_local spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv16_s(<16 x i16>)
+declare dso_local spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv4_l(<4 x i64>)
+declare dso_local spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv8_i(<8 x i32>)
+declare dso_local spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv4_l(<4 x i64>)
+
+declare dso_local spir_func <8 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong8Dv16_i(<16 x i32>)
+declare dso_local spir_func <16 x i32>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruint16Dv8_l(<8 x i64>)
+
+!llvm.module.flags = !{!0}
+!opencl.spir.version = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, i32 2}
++++++ SPIRV-LLVM-Translator-23.1.2.tar.gz ->
SPIRV-LLVM-Translator-23.1.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/.github/workflows/check-in-tree-build.yml
new/SPIRV-LLVM-Translator-23.1.3/.github/workflows/check-in-tree-build.yml
--- old/SPIRV-LLVM-Translator-23.1.2/.github/workflows/check-in-tree-build.yml
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/.github/workflows/check-in-tree-build.yml
2026-10-29 16:45:41.000000000 +0100
@@ -52,6 +52,8 @@
env:
LLVM_VERSION: 23
SPIRV_TOOLS_INSTALL: ${{ github.workspace }}/spirv-tools-install
+ # Latest SPIRV-Tools release at the time of the LLVM 23 release.
+ SPIRV_TOOLS_TAG: v2026.3
jobs:
build_and_test_linux:
@@ -76,15 +78,26 @@
# Linux systems in GitHub Actions already have older versions of
clang
# pre-installed. Make sure to override these with the relevant
version.
sudo update-alternatives --install /usr/bin/clang clang
/usr/bin/clang-${{ env.LLVM_VERSION }} 1000
- - name: Restore SPIRV-Tools cache
- # The prebuild-spirv-tools workflow owns populating this cache.
- # The primary key never matches (no one saves it); restore-keys
- # pulls the most recent prebuild entry.
- uses: actions/cache/restore@v5
+ - name: Cache SPIRV-Tools ${{ env.SPIRV_TOOLS_TAG }}
+ id: spirv-tools-cache
+ uses: actions/cache@v5
with:
path: ${{ env.SPIRV_TOOLS_INSTALL }}
- key: spirv-tools-main-latest
- restore-keys: spirv-tools-main-
+ key: spirv-tools-${{ env.SPIRV_TOOLS_TAG }}
+ - name: Build and install SPIRV-Tools ${{ env.SPIRV_TOOLS_TAG }}
+ if: steps.spirv-tools-cache.outputs.cache-hit != 'true'
+ run: |
+ git clone --depth=1 --branch ${{ env.SPIRV_TOOLS_TAG }}
https://github.com/KhronosGroup/SPIRV-Tools SPIRV-Tools
+ python3 SPIRV-Tools/utils/git-sync-deps
+ cmake -S SPIRV-Tools -B SPIRV-Tools/build \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=${{ env.SPIRV_TOOLS_INSTALL }} \
+ -DSPIRV_SKIP_TESTS=ON \
+ -G "Unix Makefiles"
+ make -C SPIRV-Tools/build install -j$(nproc)
+ - name: Check SPIRV-Tools version
+ run: |
+ ${{ env.SPIRV_TOOLS_INSTALL }}/bin/spirv-val --version | grep
"^SPIRV-Tools ${{ env.SPIRV_TOOLS_TAG }} "
- name: Checkout LLVM sources
uses: actions/checkout@v5
with:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/.github/workflows/check-out-of-tree-build.yml
new/SPIRV-LLVM-Translator-23.1.3/.github/workflows/check-out-of-tree-build.yml
---
old/SPIRV-LLVM-Translator-23.1.2/.github/workflows/check-out-of-tree-build.yml
2026-09-29 15:35:16.000000000 +0200
+++
new/SPIRV-LLVM-Translator-23.1.3/.github/workflows/check-out-of-tree-build.yml
2026-10-29 16:45:41.000000000 +0100
@@ -48,6 +48,8 @@
env:
LLVM_VERSION: 23
SPIRV_TOOLS_INSTALL: ${{ github.workspace }}/spirv-tools-install
+ # Latest SPIRV-Tools release at the time of the LLVM 23 release.
+ SPIRV_TOOLS_TAG: v2026.3
jobs:
build_and_test:
@@ -75,15 +77,26 @@
# Linux systems in GitHub Actions already have older versions of
clang
# pre-installed. Make sure to override these with the relevant
version.
sudo update-alternatives --install /usr/bin/clang clang
/usr/bin/clang-${{ env.LLVM_VERSION }} 1000
- - name: Restore SPIRV-Tools cache
- # The prebuild-spirv-tools workflow owns populating this cache.
- # The primary key never matches (no one saves it); restore-keys
- # pulls the most recent prebuild entry.
- uses: actions/cache/restore@v5
+ - name: Cache SPIRV-Tools ${{ env.SPIRV_TOOLS_TAG }}
+ id: spirv-tools-cache
+ uses: actions/cache@v5
with:
path: ${{ env.SPIRV_TOOLS_INSTALL }}
- key: spirv-tools-main-latest
- restore-keys: spirv-tools-main-
+ key: spirv-tools-${{ env.SPIRV_TOOLS_TAG }}
+ - name: Build and install SPIRV-Tools ${{ env.SPIRV_TOOLS_TAG }}
+ if: steps.spirv-tools-cache.outputs.cache-hit != 'true'
+ run: |
+ git clone --depth=1 --branch ${{ env.SPIRV_TOOLS_TAG }}
https://github.com/KhronosGroup/SPIRV-Tools SPIRV-Tools
+ python3 SPIRV-Tools/utils/git-sync-deps
+ cmake -S SPIRV-Tools -B SPIRV-Tools/build \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=${{ env.SPIRV_TOOLS_INSTALL }} \
+ -DSPIRV_SKIP_TESTS=ON \
+ -G "Unix Makefiles"
+ make -C SPIRV-Tools/build install -j$(nproc)
+ - name: Check SPIRV-Tools version
+ run: |
+ ${{ env.SPIRV_TOOLS_INSTALL }}/bin/spirv-val --version | grep
"^SPIRV-Tools ${{ env.SPIRV_TOOLS_TAG }} "
- name: Checkout the translator sources
uses: actions/checkout@v5
with:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/.github/workflows/prebuild-spirv-tools.yml
new/SPIRV-LLVM-Translator-23.1.3/.github/workflows/prebuild-spirv-tools.yml
--- old/SPIRV-LLVM-Translator-23.1.2/.github/workflows/prebuild-spirv-tools.yml
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/.github/workflows/prebuild-spirv-tools.yml
1970-01-01 01:00:00.000000000 +0100
@@ -1,50 +0,0 @@
-# This workflow builds SPIRV-Tools from main once per day and caches the
-# install tree. The build- and test-workflows only restore from this cache
-# (via restore-keys prefix match), so this workflow owns the freshness of
-# the tools.
-#
-# workflow_dispatch is provided for manual refresh when a SPIRV-Tools fix
-# needs to be picked up before the next scheduled run, or to bootstrap the
-# cache on first deployment.
-name: Prebuild SPIRV-Tools
-
-on:
- schedule:
- - cron: 0 23 * * *
- workflow_dispatch:
-
-env:
- SPIRV_TOOLS_INSTALL: ${{ github.workspace }}/spirv-tools-install
-
-jobs:
- prebuild:
- name: Build and cache SPIRV-Tools main
- runs-on: ubuntu-24.04
- steps:
- - name: Get current date for SPIRV-Tools cache key
- id: date
- run: echo "date=$(date -u +%Y-%m-%d)" >> $GITHUB_OUTPUT
- - name: Check for existing cache entry
- id: spirv-tools-cache
- uses: actions/cache/restore@v5
- with:
- path: ${{ env.SPIRV_TOOLS_INSTALL }}
- key: spirv-tools-main-${{ steps.date.outputs.date }}
- lookup-only: true
- - name: Build and install SPIRV-Tools
- if: steps.spirv-tools-cache.outputs.cache-hit != 'true'
- run: |
- git clone --depth=1 https://github.com/KhronosGroup/SPIRV-Tools
SPIRV-Tools
- python3 SPIRV-Tools/utils/git-sync-deps
- cmake -S SPIRV-Tools -B SPIRV-Tools/build \
- -DCMAKE_BUILD_TYPE=Release \
- -DCMAKE_INSTALL_PREFIX=${{ env.SPIRV_TOOLS_INSTALL }} \
- -DSPIRV_SKIP_TESTS=ON \
- -G "Unix Makefiles"
- make -C SPIRV-Tools/build install -j$(nproc)
- - name: Save SPIRV-Tools cache
- if: steps.spirv-tools-cache.outputs.cache-hit != 'true'
- uses: actions/cache/save@v5
- with:
- path: ${{ env.SPIRV_TOOLS_INSTALL }}
- key: spirv-tools-main-${{ steps.date.outputs.date }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/include/LLVMSPIRVExtensions.inc
new/SPIRV-LLVM-Translator-23.1.3/include/LLVMSPIRVExtensions.inc
--- old/SPIRV-LLVM-Translator-23.1.2/include/LLVMSPIRVExtensions.inc
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/include/LLVMSPIRVExtensions.inc
2026-10-29 16:45:41.000000000 +0100
@@ -81,6 +81,7 @@
EXT(SPV_INTEL_maximum_registers)
EXT(SPV_INTEL_bindless_images)
EXT(SPV_INTEL_2d_block_io)
+EXT(SPV_INTEL_subgroup_bitcast_shuffle)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate_float4)
EXT(SPV_INTEL_subgroup_matrix_multiply_accumulate_float8)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/SPIRVReader.cpp
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/SPIRVReader.cpp
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/SPIRVReader.cpp 2026-09-29
15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/SPIRVReader.cpp 2026-10-29
16:45:41.000000000 +0100
@@ -2810,6 +2810,7 @@
Args, BC->getName(), BB);
setCallingConv(Call);
setAttrByCalledFunc(Call);
+ applyFPFastMathModeDecorations(BV, Call);
return mapValue(BV, Call);
}
@@ -4006,7 +4007,7 @@
Func->addFnAttr(Attribute::NoUnwind);
if (isGroupOpCode(OC) || isGroupNonUniformOpcode(OC) ||
isIntelSubgroupOpCode(OC) || isSplitBarrierINTELOpCode(OC) ||
- OC == OpControlBarrier)
+ OC == OpSubgroupBitcastShuffleINTEL || OC == OpControlBarrier)
Func->addFnAttr(Attribute::Convergent);
}
CallInst *Call;
@@ -4188,6 +4189,7 @@
case internal::OpClampConvertFToSINTEL:
case internal::OpStochasticRoundFToFINTEL:
case internal::OpClampStochasticRoundFToSINTEL:
+ case OpSubgroupBitcastShuffleINTEL:
// Old opcodes, for backward compatibility.
case internal::OpClampConvertFToFINTEL:
case internal::OpClampStochasticRoundFToFINTEL:
@@ -4201,13 +4203,14 @@
}
bool IsRetSigned = true;
- switch (OC) {
+ switch (static_cast<size_t>(OC)) {
case OpConvertFToU:
case OpSatConvertSToU:
case OpUConvert:
case OpUDotKHR:
case OpUDotAccSatKHR:
case OpReadClockKHR:
+ case OpSubgroupBitcastShuffleINTEL:
IsRetSigned = false;
break;
case OpImageRead:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/SPIRVWriter.cpp
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/SPIRVWriter.cpp
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/SPIRVWriter.cpp 2026-09-29
15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/SPIRVWriter.cpp 2026-10-29
16:45:41.000000000 +0100
@@ -641,6 +641,16 @@
return 0;
}
+// Lower global_device and global_host address spaces that were added in
+// SYCL as part of SYCL_INTEL_usm_address_spaces extension to just global
+// address space if device doesn't support SPV_INTEL_usm_storage_classes
+// extension
+bool LLVMToSPIRVBase::shouldLowerUSMAddrSpace(unsigned AddrSpc) const {
+ return !BM->isAllowedToUseExtension(
+ ExtensionID::SPV_INTEL_usm_storage_classes) &&
+ (AddrSpc == SPIRAS_GlobalDevice || AddrSpc == SPIRAS_GlobalHost);
+}
+
SPIRVType *LLVMToSPIRVBase::transPointerType(Type *ET, unsigned AddrSpc) {
Type *T = PointerType::get(ET->getContext(), AddrSpc);
if (ET->isFunctionTy() &&
@@ -656,15 +666,8 @@
// A pointer to image or pipe type in LLVM is translated to a SPIRV
// (non-pointer) image or pipe type.
auto *ST = dyn_cast<StructType>(ET);
- // Lower global_device and global_host address spaces that were added in
- // SYCL as part of SYCL_INTEL_usm_address_spaces extension to just global
- // address space if device doesn't support SPV_INTEL_usm_storage_classes
- // extension
- if (!BM->isAllowedToUseExtension(
- ExtensionID::SPV_INTEL_usm_storage_classes) &&
- ((AddrSpc == SPIRAS_GlobalDevice) || (AddrSpc == SPIRAS_GlobalHost))) {
+ if (shouldLowerUSMAddrSpace(AddrSpc))
return transPointerType(ET, SPIRAS_Global);
- }
// Lower function pointer address space to private if
// spirv-emit-function-ptr-addr-space is not passed
if (AddrSpc == SPIRAS_CodeSectionINTEL &&
@@ -766,6 +769,8 @@
return Loc->second;
SPIRVType *TranslatedTy = nullptr;
+ if (shouldLowerUSMAddrSpace(AddrSpc))
+ return transPointerType(ET, SPIRAS_Global);
if (AddrSpc == SPIRAS_CodeSectionINTEL &&
!BM->shouldEmitFunctionPtrAddrSpace())
return transPointerType(ET, SPIRAS_Private);
@@ -3285,12 +3290,16 @@
if (auto *BVF = dyn_cast_or_null<FPMathOperator>(V)) {
auto Opcode = BVF->getOpcode();
+ bool IsSPV16Op = (Opcode == Instruction::FNeg ||
+ Opcode == Instruction::FCmp || BV->isExtInst()) &&
+ BM->isAllowedToUseVersion(VersionNumber::SPIRV_1_6);
+ bool IsFC2Op =
+ BV->getOpCode() == OpFunctionCall &&
+ BM->isAllowedToUseExtension(ExtensionID::SPV_KHR_float_controls2);
if (Opcode == Instruction::FAdd || Opcode == Instruction::FSub ||
Opcode == Instruction::FMul || Opcode == Instruction::FDiv ||
Opcode == Instruction::FRem || BV->getOpCode() == OpFmaKHR ||
- ((Opcode == Instruction::FNeg || Opcode == Instruction::FCmp ||
- BV->isExtInst()) &&
- BM->isAllowedToUseVersion(VersionNumber::SPIRV_1_6))) {
+ IsSPV16Op || IsFC2Op) {
bool AllowFloatControls2 =
BM->isAllowedToUseExtension(ExtensionID::SPV_KHR_float_controls2);
bool AllowIntelFpFastMathMode =
@@ -3391,9 +3400,13 @@
}
if (M != 0) {
BV->setFPFastMathMode(M);
- if (Opcode == Instruction::FNeg || Opcode == Instruction::FCmp ||
- BV->isExtInst())
+ if (IsSPV16Op)
BM->setMinSPIRVVersion(VersionNumber::SPIRV_1_6);
+ if (IsFC2Op) {
+ BM->setMinSPIRVVersion(VersionNumber::SPIRV_1_6);
+ BM->addCapability(CapabilityFloatControls2);
+ BM->addExtension(ExtensionID::SPV_KHR_float_controls2);
+ }
}
}
}
@@ -5053,8 +5066,8 @@
return nullptr;
}
uint64_t NumElements = static_cast<ConstantInt *>(Len)->getZExtValue();
- // A zero-sized memset is a no-op. Emitting OpCopyMemorySized with a Size
- // operand of 0 is invalid SPIR-V, so drop the intrinsic entirely.
+ // A zero-sized memset is a no-op. Emitting OpTypeArray with zero length
+ // is invalid SPIR-V, so drop the intrinsic entirely.
if (NumElements == 0)
return nullptr;
auto *AT = ArrayType::get(Val->getType(), NumElements);
@@ -5072,20 +5085,13 @@
std::vector<SPIRVValue *> Elts(TNumElts, transValue(Val, BB));
Init = BM->addCompositeConstant(CompositeTy, Elts);
}
- SPIRVType *VarTy = transPointerType(AT, SPIRAS_Private);
- SPIRVBasicBlock *EntryBB = BB->getParent()->getBasicBlock(0);
- SPIRVValue *Var = BM->addVariable(VarTy, nullptr, /*isConstant*/ false,
- spv::internal::LinkageTypeInternal, Init,
- "", StorageClassFunction, EntryBB);
std::vector<SPIRVWord> MemAccess = GetMemoryAccess(
MSI, BM->isAllowedToUseVersion(VersionNumber::SPIRV_1_4));
- if (!MemAccess.empty() && MemAccess[0] == MemoryAccessAlignedMask)
- Var->setAlignment(MemAccess[1]);
- SPIRVType *SourceTy = transPointerType(Val->getType(), SPIRAS_Private);
- SPIRVValue *Source = BM->addUnaryInst(OpBitcast, SourceTy, Var, BB);
SPIRVValue *Target = transValue(MSI->getRawDest(), BB);
- return BM->addCopyMemorySizedInst(Target, Source, CompositeTy->getLength(),
- MemAccess, BB);
+ SPIRVType *StorePtrTy = transPointerType(
+ CompositeTy, MSI->getRawDest()->getType()->getPointerAddressSpace());
+ SPIRVValue *StorePtr = BM->addUnaryInst(OpBitcast, StorePtrTy, Target, BB);
+ return BM->addStoreInst(StorePtr, Init, MemAccess, BB);
} break;
case Intrinsic::memcpy:
// A zero-sized memcpy is a no-op. Emitting OpCopyMemorySized with a Size
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/SPIRVWriter.h
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/SPIRVWriter.h
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/SPIRVWriter.h 2026-09-29
15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/SPIRVWriter.h 2026-10-29
16:45:41.000000000 +0100
@@ -165,6 +165,7 @@
bool CreateForward = true,
FuncTransMode FuncTrans = FuncTransMode::Decl);
void transGlobalIOPipeStorage(GlobalVariable *V, MDNode *IO);
+ bool shouldLowerUSMAddrSpace(unsigned AddrSpace) const;
static SPIRVInstruction *applyRoundingModeConstraint(Value *V,
SPIRVInstruction *I);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVEntry.h
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVEntry.h
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVEntry.h
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVEntry.h
2026-10-29 16:45:41.000000000 +0100
@@ -945,6 +945,8 @@
case CapabilityVectorComputeINTEL:
case CapabilityVectorAnyINTEL:
return ExtensionID::SPV_INTEL_vector_compute;
+ case CapabilitySubgroupBitcastShuffleINTEL:
+ return ExtensionID::SPV_INTEL_subgroup_bitcast_shuffle;
case internal::CapabilitySubgroupRequirementsINTEL:
return ExtensionID::SPV_INTEL_subgroup_requirements;
case CapabilityFPFastMathModeINTEL:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVInstruction.h
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVInstruction.h
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVInstruction.h
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVInstruction.h
2026-10-29 16:45:41.000000000 +0100
@@ -4856,6 +4856,20 @@
_SPIRV_OP_FTOF(ClampStochasticRoundFToF, true, 5, true)
#undef _SPIRV_OP_FTOF
+class SPIRVSubgroupBitcastShuffleINTELInst : public SPIRVInstTemplateBase {
+public:
+ std::optional<ExtensionID> getRequiredExtension() const override {
+ return ExtensionID::SPV_INTEL_subgroup_bitcast_shuffle;
+ }
+ SPIRVCapVec getRequiredCapability() const override {
+ return getVec(CapabilitySubgroupBitcastShuffleINTEL);
+ }
+};
+
+typedef SPIRVInstTemplate<SPIRVSubgroupBitcastShuffleINTELInst,
+ OpSubgroupBitcastShuffleINTEL, true, 4>
+ SPIRVSubgroupBitcastShuffleINTEL;
+
class SPIRVFPConversionFtoSINTELInstBase : public SPIRVInstTemplateBase {
public:
SPIRVCapVec getRequiredCapability() const override {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
2026-10-29 16:45:41.000000000 +0100
@@ -565,6 +565,7 @@
add(CapabilityDemoteToHelperInvocation, "DemoteToHelperInvocation");
add(CapabilityDemoteToHelperInvocationEXT, "DemoteToHelperInvocationEXT");
add(CapabilityBindlessTextureNV, "BindlessTextureNV");
+ add(CapabilitySubgroupBitcastShuffleINTEL, "SubgroupBitcastShuffleINTEL");
add(CapabilitySubgroupShuffleINTEL, "SubgroupShuffleINTEL");
add(CapabilitySubgroupBufferBlockIOINTEL, "SubgroupBufferBlockIOINTEL");
add(CapabilitySubgroupBufferPrefetchINTEL, "SubgroupBufferPrefetchINTEL");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
--- old/SPIRV-LLVM-Translator-23.1.2/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
2026-10-29 16:45:41.000000000 +0100
@@ -578,6 +578,7 @@
_SPIRV_OP(ControlBarrierArriveINTEL, 6142)
_SPIRV_OP(ControlBarrierWaitINTEL, 6143)
_SPIRV_OP(ArithmeticFenceEXT, 6145)
+_SPIRV_OP(SubgroupBitcastShuffleINTEL, 6208)
_SPIRV_OP(SubgroupBlockPrefetchINTEL, 6221)
_SPIRV_OP(Subgroup2DBlockLoadINTEL, 6231)
_SPIRV_OP(Subgroup2DBlockLoadTransformINTEL, 6232)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/SPIRV-LLVM-Translator-23.1.2/spirv-headers-tag.conf
new/SPIRV-LLVM-Translator-23.1.3/spirv-headers-tag.conf
--- old/SPIRV-LLVM-Translator-23.1.2/spirv-headers-tag.conf 2026-09-29
15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/spirv-headers-tag.conf 2026-10-29
16:45:41.000000000 +0100
@@ -1 +1 @@
-575b6512579ebde466ed3dfc04e413439d14d95d
+cb42dec3830d3ac67fa449ecdc0c0f73d5e74498
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
new/SPIRV-LLVM-Translator-23.1.3/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
---
old/SPIRV-LLVM-Translator-23.1.2/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-23.1.3/test/extensions/INTEL/SPV_INTEL_subgroup_bitcast_shuffle/bitcast_shuffle.ll
2026-10-29 16:45:41.000000000 +0100
@@ -0,0 +1,276 @@
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_subgroup_bitcast_shuffle -o
%t.spv
+; RUN: llvm-spirv %t.spv --to-text -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
+
+; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
+; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
+
+; RUN: not llvm-spirv %t.bc 2>&1 -o %t.err.spv | FileCheck %s
--check-prefix=CHECK-ERROR
+; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V
extension:
+; CHECK-ERROR-NEXT: SPV_INTEL_subgroup_bitcast_shuffle
+
+; CHECK-SPIRV-DAG: Capability SubgroupBitcastShuffleINTEL
+; CHECK-SPIRV-DAG: Extension "SPV_INTEL_subgroup_bitcast_shuffle"
+
+; CHECK-SPIRV-DAG: TypeInt [[#TI8:]] 8 0
+; CHECK-SPIRV-DAG: TypeInt [[#TI16:]] 16 0
+; CHECK-SPIRV-DAG: TypeInt [[#TI32:]] 32 0
+; CHECK-SPIRV-DAG: TypeInt [[#TI64:]] 64 0
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I8:]] [[#TI8]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I8:]] [[#TI8]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I8:]] [[#TI8]] 8
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I16:]] [[#TI16]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I16:]] [[#TI16]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I32:]] [[#TI32]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV16I8:]] [[#TI8]] 16
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I16:]] [[#TI16]] 8
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I32:]] [[#TI32]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV2I64:]] [[#TI64]] 2
+; CHECK-SPIRV-DAG: TypeVector [[#TV16I16:]] [[#TI16]] 16
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I32:]] [[#TI32]] 8
+; CHECK-SPIRV-DAG: TypeVector [[#TV4I64:]] [[#TI64]] 4
+; CHECK-SPIRV-DAG: TypeVector [[#TV16I32:]] [[#TI32]] 16
+; CHECK-SPIRV-DAG: TypeVector [[#TV8I64:]] [[#TI64]] 8
+
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TI64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I8]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV2I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I16]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV4I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I32]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV8I64]]
+; CHECK-SPIRV: SubgroupBitcastShuffleINTEL [[#TV16I32]]
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_16bit()
+; CHECK-LLVM: call spir_func i16
@_Z43__spirv_SubgroupBitcastShuffleINTEL_RushortDv2_c(<2 x i8>
+; CHECK-LLVM: call spir_func <2 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar2s(i16
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_32bit()
+; CHECK-LLVM: call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2Dv4_c(<4 x i8>
+; CHECK-LLVM: call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4Dv2_s(<2 x i16>
+; CHECK-LLVM: call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv4_c(<4 x i8>
+; CHECK-LLVM: call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4i(i32
+; CHECK-LLVM: call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv2_s(<2 x i16>
+; CHECK-LLVM: call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2i(i32
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_64bit()
+; CHECK-LLVM: call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv8_c(<8 x i8>
+; CHECK-LLVM: call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv4_s(<4 x i16>
+; CHECK-LLVM: call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv8_c(<8 x i8>
+; CHECK-LLVM: call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv2_i(<2 x i32>
+; CHECK-LLVM: call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv8_c(<8 x i8>
+; CHECK-LLVM: call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8l(i64
+; CHECK-LLVM: call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv4_s(<4 x i16>
+; CHECK-LLVM: call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv2_i(<2 x i32>
+; CHECK-LLVM: call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv4_s(<4 x i16>
+; CHECK-LLVM: call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4l(i64
+; CHECK-LLVM: call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv2_i(<2 x i32>
+; CHECK-LLVM: call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2l(i64
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_128bit()
+; CHECK-LLVM: call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv16_c(<16 x i8>
+; CHECK-LLVM: call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv8_s(<8 x i16>
+; CHECK-LLVM: call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv16_c(<16 x i8>
+; CHECK-LLVM: call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv4_i(<4 x i32>
+; CHECK-LLVM: call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv16_c(<16 x i8>
+; CHECK-LLVM: call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv2_l(<2 x i64>
+; CHECK-LLVM: call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv8_s(<8 x i16>
+; CHECK-LLVM: call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv4_i(<4 x i32>
+; CHECK-LLVM: call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv8_s(<8 x i16>
+; CHECK-LLVM: call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv2_l(<2 x i64>
+; CHECK-LLVM: call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv4_i(<4 x i32>
+; CHECK-LLVM: call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv2_l(<2 x i64>
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_256bit()
+; CHECK-LLVM: call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv16_s(<16 x i16>
+; CHECK-LLVM: call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv8_i(<8 x i32>
+; CHECK-LLVM: call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv16_s(<16 x i16>
+; CHECK-LLVM: call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv4_l(<4 x i64>
+; CHECK-LLVM: call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv8_i(<8 x i32>
+; CHECK-LLVM: call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv4_l(<4 x i64>
+
+; CHECK-LLVM-LABEL: define spir_kernel void @test_512bit()
+; CHECK-LLVM: call spir_func <8 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong8Dv16_i(<16 x i32>
+; CHECK-LLVM: call spir_func <16 x i32>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruint16Dv8_l(<8 x i64>
+
+target datalayout =
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir"
+
+define spir_kernel void @test_16bit() {
+entry:
+ %v2i8 = load <2 x i8>, ptr undef
+ %s16 = load i16, ptr undef
+
+ %r2x8to16 = call spir_func i16
@_Z43__spirv_SubgroupBitcastShuffleINTEL_RushortDv2_c(<2 x i8> %v2i8)
+ %r16to2x8 = call spir_func <2 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar2s(i16 %s16)
+ ret void
+}
+
+define spir_kernel void @test_32bit() {
+entry:
+ %v4i8 = load <4 x i8>, ptr undef
+ %v2i16 = load <2 x i16>, ptr undef
+ %s32 = load i32, ptr undef
+
+ %r4x8to2x16 = call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2Dv4_c(<4 x i8> %v4i8)
+ %r2x16to4x8 = call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4Dv2_s(<2 x i16> %v2i16)
+ %r4x8to32 = call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv4_c(<4 x i8> %v4i8)
+ %r32to4x8 = call spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4i(i32 %s32)
+ %r2x16to32 = call spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv2_s(<2 x i16> %v2i16)
+ %r32to2x16 = call spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2i(i32 %s32)
+ ret void
+}
+
+define spir_kernel void @test_64bit() {
+entry:
+ %v8i8 = load <8 x i8>, ptr undef
+ %v4i16 = load <4 x i16>, ptr undef
+ %v2i32 = load <2 x i32>, ptr undef
+ %s64 = load i64, ptr undef
+
+ %r8x8to4x16 = call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv8_c(<8 x i8> %v8i8)
+ %r4x16to8x8 = call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv4_s(<4 x i16> %v4i16)
+ %r8x8to2x32 = call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv8_c(<8 x i8> %v8i8)
+ %r2x32to8x8 = call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv2_i(<2 x i32> %v2i32)
+ %r8x8to64 = call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv8_c(<8 x i8> %v8i8)
+ %r64to8x8 = call spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8l(i64 %s64)
+ %r4x16to2x32 = call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv4_s(<4 x i16> %v4i16)
+ %r2x32to4x16 = call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv2_i(<2 x i32> %v2i32)
+ %r4x16to64 = call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv4_s(<4 x i16> %v4i16)
+ %r64to4x16 = call spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4l(i64 %s64)
+ %r2x32to64 = call spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv2_i(<2 x i32> %v2i32)
+ %r64to2x32 = call spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2l(i64 %s64)
+ ret void
+}
+
+define spir_kernel void @test_128bit() {
+entry:
+ %v16i8 = load <16 x i8>, ptr undef
+ %v8i16 = load <8 x i16>, ptr undef
+ %v4i32 = load <4 x i32>, ptr undef
+ %v2i64 = load <2 x i64>, ptr undef
+
+ %r16x8to8x16 = call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv16_c(<16 x i8> %v16i8)
+ %r8x16to16x8 = call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv8_s(<8 x i16> %v8i16)
+ %r16x8to4x32 = call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv16_c(<16 x i8> %v16i8)
+ %r4x32to16x8 = call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv4_i(<4 x i32> %v4i32)
+ %r16x8to2x64 = call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv16_c(<16 x i8> %v16i8)
+ %r2x64to16x8 = call spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv2_l(<2 x i64> %v2i64)
+ %r8x16to4x32 = call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv8_s(<8 x i16> %v8i16)
+ %r4x32to8x16 = call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv4_i(<4 x i32> %v4i32)
+ %r8x16to2x64 = call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv8_s(<8 x i16> %v8i16)
+ %r2x64to8x16 = call spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv2_l(<2 x i64> %v2i64)
+ %r4x32to2x64 = call spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv4_i(<4 x i32> %v4i32)
+ %r2x64to4x32 = call spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv2_l(<2 x i64> %v2i64)
+ ret void
+}
+
+define spir_kernel void @test_256bit() {
+entry:
+ %v16i16 = load <16 x i16>, ptr undef
+ %v8i32 = load <8 x i32>, ptr undef
+ %v4i64 = load <4 x i64>, ptr undef
+
+ %r16x16to8x32 = call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv16_s(<16 x i16> %v16i16)
+ %r8x32to16x16 = call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv8_i(<8 x i32> %v8i32)
+ %r16x16to4x64 = call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv16_s(<16 x i16> %v16i16)
+ %r4x64to16x16 = call spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv4_l(<4 x i64> %v4i64)
+ %r8x32to4x64 = call spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv8_i(<8 x i32> %v8i32)
+ %r4x64to8x32 = call spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv4_l(<4 x i64> %v4i64)
+ ret void
+}
+
+define spir_kernel void @test_512bit() {
+entry:
+ %v16i32 = load <16 x i32>, ptr undef
+ %v8i64 = load <8 x i64>, ptr undef
+
+ %r16x32to8x64 = call spir_func <8 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong8Dv16_i(<16 x i32> %v16i32)
+ %r8x64to16x32 = call spir_func <16 x i32>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruint16Dv8_l(<8 x i64> %v8i64)
+ ret void
+}
+
+declare dso_local spir_func i16
@_Z43__spirv_SubgroupBitcastShuffleINTEL_RushortDv2_c(<2 x i8>)
+declare dso_local spir_func <2 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar2s(i16)
+
+declare dso_local spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2Dv4_c(<4 x i8>)
+declare dso_local spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4Dv2_s(<2 x i16>)
+declare dso_local spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv4_c(<4 x i8>)
+declare dso_local spir_func <4 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar4i(i32)
+declare dso_local spir_func i32
@_Z41__spirv_SubgroupBitcastShuffleINTEL_RuintDv2_s(<2 x i16>)
+declare dso_local spir_func <2 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort2i(i32)
+
+declare dso_local spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv8_c(<8 x i8>)
+declare dso_local spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv4_s(<4 x i16>)
+declare dso_local spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv8_c(<8 x i8>)
+declare dso_local spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8Dv2_i(<2 x i32>)
+declare dso_local spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv8_c(<8 x i8>)
+declare dso_local spir_func <8 x i8>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruchar8l(i64)
+declare dso_local spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2Dv4_s(<4 x i16>)
+declare dso_local spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4Dv2_i(<2 x i32>)
+declare dso_local spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv4_s(<4 x i16>)
+declare dso_local spir_func <4 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort4l(i64)
+declare dso_local spir_func i64
@_Z42__spirv_SubgroupBitcastShuffleINTEL_RulongDv2_i(<2 x i32>)
+declare dso_local spir_func <2 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint2l(i64)
+
+declare dso_local spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv16_c(<16 x i8>)
+declare dso_local spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv8_s(<8 x i16>)
+declare dso_local spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv16_c(<16 x i8>)
+declare dso_local spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv4_i(<4 x i32>)
+declare dso_local spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv16_c(<16 x i8>)
+declare dso_local spir_func <16 x i8>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Ruchar16Dv2_l(<2 x i64>)
+declare dso_local spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv8_s(<8 x i16>)
+declare dso_local spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv4_i(<4 x i32>)
+declare dso_local spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv8_s(<8 x i16>)
+declare dso_local spir_func <8 x i16>
@_Z44__spirv_SubgroupBitcastShuffleINTEL_Rushort8Dv2_l(<2 x i64>)
+declare dso_local spir_func <2 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong2Dv4_i(<4 x i32>)
+declare dso_local spir_func <4 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint4Dv2_l(<2 x i64>)
+
+declare dso_local spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv16_s(<16 x i16>)
+declare dso_local spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv8_i(<8 x i32>)
+declare dso_local spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv16_s(<16 x i16>)
+declare dso_local spir_func <16 x i16>
@_Z45__spirv_SubgroupBitcastShuffleINTEL_Rushort16Dv4_l(<4 x i64>)
+declare dso_local spir_func <4 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong4Dv8_i(<8 x i32>)
+declare dso_local spir_func <8 x i32>
@_Z42__spirv_SubgroupBitcastShuffleINTEL_Ruint8Dv4_l(<4 x i64>)
+
+declare dso_local spir_func <8 x i64>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Rulong8Dv16_i(<16 x i32>)
+declare dso_local spir_func <16 x i32>
@_Z43__spirv_SubgroupBitcastShuffleINTEL_Ruint16Dv8_l(<8 x i64>)
+
+!llvm.module.flags = !{!0}
+!opencl.spir.version = !{!1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, i32 2}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/extensions/KHR/SPV_KHR_float_controls2/fp-fast-math-mode-function-call.ll
new/SPIRV-LLVM-Translator-23.1.3/test/extensions/KHR/SPV_KHR_float_controls2/fp-fast-math-mode-function-call.ll
---
old/SPIRV-LLVM-Translator-23.1.2/test/extensions/KHR/SPV_KHR_float_controls2/fp-fast-math-mode-function-call.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-23.1.3/test/extensions/KHR/SPV_KHR_float_controls2/fp-fast-math-mode-function-call.ll
2026-10-29 16:45:41.000000000 +0100
@@ -0,0 +1,48 @@
+; Verify that FPFastMathMode decorations are emitted for OpFunctionCall when
+; SPV_KHR_float_controls2 is enabled. Also verify that non-core instructions
+; (e.g. OpGroupFMulKHR from SPV_KHR_uniform_group_instructions) do NOT get a
+; spurious FPFastMathMode decoration. SPV_KHR_float_controls2 extends
+; FPFastMathMode to all *core* instructions, but not to extension-defined ones.
+
+; Without FC2: no decoration on call.
+; RUN: llvm-spirv -spirv-text %s --spirv-max-version=1.5
--spirv-ext=+SPV_KHR_uniform_group_instructions -o - | FileCheck %s
--check-prefix=NO-DECO
+; RUN: llvm-spirv -spirv-text %s
--spirv-ext=+SPV_KHR_uniform_group_instructions -o - | FileCheck %s
--check-prefix=NO-DECO
+
+; With FC2: decoration emitted on OpFunctionCall, not on extension
instructions.
+; RUN: llvm-spirv -spirv-text %s
--spirv-ext=+SPV_KHR_float_controls2,+SPV_KHR_uniform_group_instructions -o - |
FileCheck %s --check-prefix=SPIRV
+
+; Roundtrip with FC2.
+; RUN: llvm-spirv %s
--spirv-ext=+SPV_KHR_float_controls2,+SPV_KHR_uniform_group_instructions -o
%t.spv
+; RUN: spirv-val %t.spv
+; RUN: llvm-spirv -r %t.spv -o - | llvm-dis | FileCheck %s --check-prefix=IR
+
+target triple = "spirv-unknown-unknown"
+
+define internal spir_func float @helper(float %x) {
+ %r = fmul float %x, %x
+ ret float %r
+}
+
+declare spir_func float @_Z20__spirv_GroupFMulKHRjjf(i32, i32, float)
+
+; NO-DECO-NOT: FPFastMathMode
+
+; SPIRV-DAG: FunctionCall [[#]] [[#CALL:]]
+; SPIRV-DAG: GroupFMulKHR [[#]] [[#GFMUL:]]
+; SPIRV-DAG: Decorate [[#CALL]] FPFastMathMode 458767
+
+; OpGroupFMulKHR is defined by SPV_KHR_uniform_group_instructions, not core.
+; It should NOT get FPFastMathMode because FC2 only covers core instructions.
+; SPIRV-NOT: Decorate [[#GFMUL]] FPFastMathMode
+
+define spir_kernel void @test(ptr addrspace(1) %out, float %a) {
+entry:
+ ; IR: %call_fast = call reassoc nnan ninf nsz arcp contract spir_func float
@helper(float %a)
+ %call_fast = call fast spir_func float @helper(float %a)
+ store float %call_fast, ptr addrspace(1) %out, align 4
+
+ %gfmul_fast = call fast spir_func float @_Z20__spirv_GroupFMulKHRjjf(i32 2,
i32 0, float %a)
+ store float %gfmul_fast, ptr addrspace(1) %out, align 4
+
+ ret void
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-align.ll
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-align.ll
--- old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-align.ll
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-align.ll
2026-10-29 16:45:41.000000000 +0100
@@ -16,16 +16,18 @@
%r.sroa.0 = alloca [2 x i64], i32 1, align 16
%r.sroa.0.0.r.ascast.sroa_cast1 = addrspacecast ptr %r.sroa.0 to ptr
addrspace(4)
-; CHECK-SPIRV: Decorate [[#]] Alignment 16
-; CHECK-SPIRV: Decorate [[#SrcVar:]] Alignment [[#SrcAlignment:]]
-; CHECK-SPIRV: Variable [[#]] [[#SrcVar]] 7
-; CHECK-SPIRV: Bitcast [[#]] [[#]] [[#]]
-; CHECK-SPIRV: Bitcast [[#]] [[#Src:]] [[#SrcVar]]
-; CHECK-SPIRV: CopyMemorySized [[#]] [[#Src]] [[#]] 2 [[#SrcAlignment]]
-; CHECK-LLVM: %{{[0-9]+}} = alloca [16 x i8], align [[#SrcAlignment:]]
-; CHECK-LLVM: store [16 x i8] zeroinitializer, ptr %{{[0-9]+}}, align 1
-; CHECK-LLVM: [[SrcOp:%[0-9]+]] = bitcast ptr %{{[0-9]+}} to ptr
-; CHECK-LLVM: call void @llvm.memcpy.p4.p0.i64(ptr addrspace(4) align 16
%{{[0-9]+}}, ptr align [[#SrcAlignment]] [[SrcOp]], i64 16, i1 false)
+; CHECK-SPIRV: Decorate [[#Var:]] Alignment 16
+; CHECK-SPIRV: ConstantNull [[#]] [[#Init:]]
+; CHECK-SPIRV: Variable [[#]] [[#Var]]
+; CHECK-SPIRV: PtrCastToGeneric [[#]] [[#Generic:]] [[#Var]]
+; CHECK-SPIRV: Bitcast [[#]] [[#BytePtr:]] [[#Generic]]
+; CHECK-SPIRV: Bitcast [[#]] [[#StorePtr:]] [[#BytePtr]]
+; CHECK-SPIRV: Store [[#StorePtr]] [[#Init]] 2 16
+; CHECK-LLVM: %[[X:.+]] = alloca [2 x i64], align 16
+; CHECK-LLVM: %[[Generic:.+]] = addrspacecast ptr %[[X]] to ptr addrspace(4)
+; CHECK-LLVM: %[[#BytePtr:]] = bitcast ptr addrspace(4) %[[Generic]] to ptr
addrspace(4)
+; CHECK-LLVM: %[[#ArrayPtr:]] = bitcast ptr addrspace(4) %[[#BytePtr]] to ptr
addrspace(4)
+; CHECK-LLVM: store [16 x i8] zeroinitializer, ptr addrspace(4)
%[[#ArrayPtr]], align 16
call void @llvm.memset.p4.i64(ptr addrspace(4) align 16
%r.sroa.0.0.r.ascast.sroa_cast1, i8 0, i64 16, i1 false)
ret void
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-long-composite.ll
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-long-composite.ll
---
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-long-composite.ll
1970-01-01 01:00:00.000000000 +0100
+++
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-long-composite.ll
2026-10-29 16:45:41.000000000 +0100
@@ -0,0 +1,40 @@
+; Test memset with non-zero fill, and a constant length too large for
+; a single OpConstantComposite that exceeds maximum WordCount.
+
+; RUN: llvm-as %s -o %t.bc
+; RUN: not llvm-spirv %t.bc -o %t.spv 2>&1 | FileCheck %s
--check-prefix=CHECK-ERROR
+
+; RUN: llvm-spirv --spirv-ext=+SPV_INTEL_long_composites %t.bc -o %t.spv
+; RUN: llvm-spirv %t.spv --to-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV --implicit-check-not=Variable
--implicit-check-not=CopyMemorySized
+; RUN: llvm-spirv -r %t.spv -o - | llvm-dis | FileCheck %s
--check-prefix=CHECK-LLVM
+; TODO: currently spirv-val falsely rejects OpConstantCompositeContinuedINTEL
in the module.
+; Re-enable spirv-val once it's fixed. Tracker:
https://github.com/KhronosGroup/SPIRV-Tools/issues/6954
+; RUNx: spirv-val %t.spv
+
+; CHECK-ERROR: InvalidWordCount: Can't encode instruction with word count
greater than 65535:
+; CHECK-ERROR-NEXT: Id: [[#]], OpCode: ConstantComposite
+
+; CHECK-SPIRV: Capability LongCompositesINTEL
+; CHECK-SPIRV: Extension "SPV_INTEL_long_composites"
+; CHECK-SPIRV: TypeInt [[#ByteTy:]] 8 0
+; CHECK-SPIRV: Constant [[#]] [[#Length:]] 70000
+; CHECK-SPIRV: Constant [[#ByteTy]] [[#Byte:]] 3
+; CHECK-SPIRV: TypeArray [[#ArrayTy:]] [[#ByteTy]] [[#Length]]
+; CHECK-SPIRV: TypePointer [[#StorePtrTy:]] 5 [[#ArrayTy]]
+; CHECK-SPIRV: 65535 ConstantComposite [[#ArrayTy]] [[#Init:]]
[[#Byte]]{{( [0-9]+)+ ?$}}
+; CHECK-SPIRV-NEXT: 4469 ConstantCompositeContinuedINTEL [[#Byte]]{{( [0-9]+)+
?$}}
+; CHECK-SPIRV: Bitcast [[#StorePtrTy]] [[#ArrayPtr:]] [[#]]
+; CHECK-SPIRV: Store [[#ArrayPtr]] [[#Init]] 2 4
+
+; CHECK-LLVM: store [70000 x i8] c"{{(\\03)+}}", ptr addrspace(1) %[[#]],
align 4
+
+target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir64-unknown-unknown"
+
+define spir_kernel void @fill(ptr addrspace(1) %dst) {
+entry:
+ call void @llvm.memset.p1.i64(ptr addrspace(1) align 4 %dst, i8 3, i64
70000, i1 false)
+ ret void
+}
+
+declare void @llvm.memset.p1.i64(ptr addrspace(1) noalias writeonly, i8, i64,
i1 immarg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-opaque.ll
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-opaque.ll
--- old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-opaque.ll
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-opaque.ll
2026-10-29 16:45:41.000000000 +0100
@@ -23,24 +23,26 @@
; CHECK-SPIRV: Constant {{[0-9]+}} [[Lenmemset0:[0-9]+]] 12
; CHECK-SPIRV: Constant {{[0-9]+}} [[Const21:[0-9]+]] 21
; CHECK-SPIRV: TypeArray [[Int8x4:[0-9]+]] [[Int8]] [[Lenmemset21]]
+; CHECK-SPIRV: TypePointer [[#Int8x4Ptr:]] 7 [[Int8x4]]
; CHECK-SPIRV-UNTYPED-PTR: TypeUntypedPointerKHR [[Int8Ptr:[0-9]+]] 8
; CHECK-SPIRV-TYPED-PTR: TypePointer [[Int8Ptr:[0-9]+]] 8 [[Int8]]
; CHECK-SPIRV: TypeArray [[Int8x12:[0-9]+]] [[Int8]] [[Lenmemset0]]
-; CHECK-SPIRV-TYPED-PTR: TypePointer [[Int8PtrConst:[0-9]+]] 7 [[Int8]]
-; CHECK-SPIRV-UNTYPED-PTR: TypeUntypedPointerKHR [[Int8PtrConst:[0-9]+]] 7
+; CHECK-SPIRV: TypePointer [[#Int8x12Ptr:]] 8 [[Int8x12]]
; CHECK-SPIRV: ConstantNull [[Int8x12]] [[Init:[0-9]+]]
; CHECK-SPIRV: 7 ConstantComposite [[Int8x4]] [[InitComp:[0-9]+]] [[Const21]]
[[Const21]] [[Const21]] [[Const21]]
; CHECK-SPIRV: ConstantFalse [[#]] [[#False:]]
-; CHECK-SPIRV: Variable {{[0-9]+}} [[Val:[0-9]+]] 7 [[Init]]
-; CHECK-SPIRV: Variable {{[0-9]+}} [[ValComp:[0-9]+]] 7 [[InitComp]]
-; CHECK-SPIRV: Bitcast [[Int8Ptr]] [[Target:[0-9]+]] {{[0-9]+}}
-; CHECK-SPIRV: Bitcast [[Int8PtrConst]] [[Source:[0-9]+]] [[Val]]
-; CHECK-SPIRV: CopyMemorySized [[Target]] [[Source]] [[Lenmemset0]] 2 4
+; CHECK-SPIRV: FunctionParameter [[#]] [[#AggResult:]]
+; CHECK-SPIRV: Variable [[#Int8x4Ptr]] [[#X:]] 7
-; CHECK-SPIRV: Bitcast [[Int8PtrConst]] [[SourceComp:[0-9]+]] [[ValComp]]
-; CHECK-SPIRV: CopyMemorySized {{[0-9]+}} [[SourceComp]] [[Lenmemset21]] 2 4
+; CHECK-SPIRV: Bitcast [[Int8Ptr]] [[Target:[0-9]+]] [[#AggResult]]
+; CHECK-SPIRV: Bitcast [[#Int8x12Ptr]] [[#TargetArray:]] [[Target]]
+; CHECK-SPIRV: Store [[#TargetArray]] [[Init]] 2 4
+
+; CHECK-SPIRV: Bitcast [[#]] [[#XBytePtr:]] [[#X]]
+; CHECK-SPIRV: Bitcast [[#Int8x4Ptr]] [[#TargetComp:]] [[#XBytePtr]]
+; CHECK-SPIRV: Store [[#TargetComp]] [[InitComp]] 2 4
; CHECK-SPIRV: FunctionCall [[#]] [[#]] [[#NonConstMemset]] [[#]] [[#]] [[#]]
[[#False]]
@@ -74,18 +76,18 @@
%struct.S1 = type { i32, i32, i32 }
-; CHECK-LLVM-OPAQUE: %{{[0-9]+}} = alloca [12 x i8], align 4
-; CHECK-LLVM-OPAQUE: store [12 x i8] zeroinitializer, ptr %{{[0-9]+}}, align 1
-; CHECK-LLVM-OPAQUE: %{{[0-9]+}} = alloca [4 x i8], align 4
-; CHECK-LLVM-OPAQUE: store [4 x i8] c"\15\15\15\15", ptr %{{[0-9]+}}, align 1
-
; Function Attrs: nounwind
define spir_func void @_Z5foo11v(ptr addrspace(4) noalias captures(none)
sret(%struct.S1) %agg.result, i32 %s1, i64 %s2, i8 %v) #0 {
%x = alloca [4 x i8]
+; CHECK-LLVM-OPAQUE: %[[X:.+]] = alloca [4 x i8]
tail call void @llvm.memset.p4.i32(ptr addrspace(4) align 4 %agg.result, i8
0, i32 12, i1 false)
-; CHECK-LLVM-OPAQUE: call void @llvm.memcpy.p4.p0.i32(ptr addrspace(4) align 4
%{{[0-9]+}}, ptr align 4 %{{[0-9]+}}, i32 12, i1 false)
+; CHECK-LLVM-OPAQUE: %[[#DstBytePtr:]] = bitcast ptr addrspace(4) %agg.result
to ptr addrspace(4)
+; CHECK-LLVM-OPAQUE: %[[#DstArrayPtr:]] = bitcast ptr addrspace(4)
%[[#DstBytePtr]] to ptr addrspace(4)
+; CHECK-LLVM-OPAQUE: store [12 x i8] zeroinitializer, ptr addrspace(4)
%[[#DstArrayPtr]], align 4
tail call void @llvm.memset.p0.i32(ptr align 4 %x, i8 21, i32 4, i1 false)
-; CHECK-LLVM-OPAQUE: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %{{[0-9]+}},
ptr align 4 %{{[0-9]+}}, i32 4, i1 false)
+; CHECK-LLVM-OPAQUE: %[[#XBytePtr:]] = bitcast ptr %[[X]] to ptr
+; CHECK-LLVM-OPAQUE: %[[#XArrayPtr:]] = bitcast ptr %[[#XBytePtr]] to ptr
+; CHECK-LLVM-OPAQUE: store [4 x i8] c"\15\15\15\15", ptr %[[#XArrayPtr]],
align 4
; non-const value
tail call void @llvm.memset.p0.i32(ptr align 4 %x, i8 %v, i32 3, i1 false)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-store.ll
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-store.ll
--- old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/memset-store.ll
1970-01-01 01:00:00.000000000 +0100
+++ new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/memset-store.ll
2026-10-29 16:45:41.000000000 +0100
@@ -0,0 +1,109 @@
+; Test that memset is lowered to a single OpStore of a composite constant,
+; with non-zero fill.
+; Also test the global_device & global_host address spaces are translated
+; correctly so that the target pointer matches the (bitcast) store pointer,
+; with and without SPV_INTEL_usm_storage_classes extension.
+
+; RUN: llvm-as %s -o %t.bc
+; RUN: llvm-spirv %t.bc -spirv-text -o %t.spt
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
--implicit-check-not=Variable --implicit-check-not=CopyMemorySized
--implicit-check-not="Capability USMStorageClassesINTEL"
+; RUN: llvm-spirv %t.bc -o %t.spv
+; RUN: spirv-val %t.spv
+; RUN: llvm-spirv -r %t.spv -o - | llvm-dis | FileCheck %s
--check-prefixes=CHECK-LLVM,CHECK-LLVM-GLOBAL
+
+; TODO: currently the Translator has a bug that it doesn't emit "OpExtension
SPV_INTEL_usm_storage_classes"
+; when the extension is enabled, therefore spirv-val will reject it. Re-enable
spirv-val once this bug is
+; fixed in the translator.
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_usm_storage_classes -o
%t.usm.spv
+; RUN: llvm-spirv %t.usm.spv --to-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV-USM
+; RUN: llvm-spirv -r %t.usm.spv -o - | llvm-dis | FileCheck %s
--check-prefixes=CHECK-LLVM,CHECK-LLVM-USM
+; RUNx: spirv-val %t.usm.spv
+
+; Without SPV_INTEL_usm_storage_classes both USM address spaces are lowered to
+; CrossWorkgroup (storage class 5), so all three kernels share one destination
+; pointer type, and fill_device and fill_host share one store pointer type.
+; CHECK-SPIRV: TypeInt [[#ByteTy:]] 8 0
+; CHECK-SPIRV: Constant [[#]] [[#Length:]] 3
+; CHECK-SPIRV: Constant [[#ByteTy]] [[#Byte:]] 42
+; CHECK-SPIRV: TypePointer [[#BytePtrTy:]] 5 [[#ByteTy]]
+; CHECK-SPIRV: TypeArray [[#ArrayTy:]] [[#ByteTy]] [[#Length]]
+; CHECK-SPIRV: TypePointer [[#StorePtrTy:]] 5 [[#ArrayTy]]
+; CHECK-SPIRV: TypeArray [[#UsmArrayTy:]] [[#ByteTy]] [[#]]
+; CHECK-SPIRV: TypePointer [[#UsmStorePtrTy:]] 5 [[#UsmArrayTy]]
+; CHECK-SPIRV: ConstantComposite [[#ArrayTy]] [[#Init:]] [[#Byte]] [[#Byte]]
[[#Byte]]
+; CHECK-SPIRV: ConstantNull [[#UsmArrayTy]] [[#DeviceInit:]]
+; CHECK-SPIRV: ConstantNull [[#UsmArrayTy]] [[#HostInit:]]
+
+; CHECK-SPIRV: FunctionParameter [[#BytePtrTy]] [[#Base:]]
+; CHECK-SPIRV: PtrAccessChain [[#BytePtrTy]] [[#OffsetPtr:]] [[#Base]] [[#]]
+; CHECK-SPIRV: Bitcast [[#StorePtrTy]] [[#ArrayPtr:]] [[#OffsetPtr]]
+; CHECK-SPIRV: Store [[#ArrayPtr]] [[#Init]] 3 1
+
+; CHECK-SPIRV: FunctionParameter [[#BytePtrTy]] [[#Device:]]
+; CHECK-SPIRV: Bitcast [[#UsmStorePtrTy]] [[#DeviceStorePtr:]] [[#Device]]
+; CHECK-SPIRV: Store [[#DeviceStorePtr]] [[#DeviceInit]] 2 4
+
+; CHECK-SPIRV: FunctionParameter [[#BytePtrTy]] [[#Host:]]
+; CHECK-SPIRV: Bitcast [[#UsmStorePtrTy]] [[#HostStorePtr:]] [[#Host]]
+; CHECK-SPIRV: Store [[#HostStorePtr]] [[#HostInit]] 2 4
+
+; CHECK-LLVM: %[[Dest:[a-zA-Z0-9.]+]] = getelementptr i8, ptr addrspace(1)
%base, i64 1
+; CHECK-LLVM: %[[#StorePtr:]] = bitcast ptr addrspace(1) %[[Dest]] to ptr
addrspace(1)
+; CHECK-LLVM: store volatile [3 x i8] c"***", ptr addrspace(1) %[[#StorePtr]],
align 1
+
+; The global_device and global_host destinations were lowered to
CrossWorkgroup,
+; so they come back as global (addrspace(1)) pointers.
+; CHECK-LLVM-GLOBAL: define spir_kernel void @fill_device(ptr addrspace(1)
%dst)
+; CHECK-LLVM-GLOBAL: %[[#DeviceStorePtr:]] = bitcast ptr addrspace(1) %dst to
ptr addrspace(1)
+; CHECK-LLVM-GLOBAL: store [8 x i8] zeroinitializer, ptr addrspace(1)
%[[#DeviceStorePtr]], align 4
+; CHECK-LLVM-GLOBAL: define spir_kernel void @fill_host(ptr addrspace(1) %dst)
+; CHECK-LLVM-GLOBAL: %[[#HostStorePtr:]] = bitcast ptr addrspace(1) %dst to
ptr addrspace(1)
+; CHECK-LLVM-GLOBAL: store [8 x i8] zeroinitializer, ptr addrspace(1)
%[[#HostStorePtr]], align 4
+
+; With SPV_INTEL_usm_storage_classes enabled each target pointer keeps its own
+; storage class, DeviceOnlyINTEL (5936) and HostOnlyINTEL (5937), and so does
+; its store pointer.
+; CHECK-SPIRV-USM: TypePointer [[#DeviceBytePtrTy:]] 5936 [[#]]
+; CHECK-SPIRV-USM: TypeArray [[#UsmArrayTyE:]] [[#]] [[#]]
+; CHECK-SPIRV-USM: TypePointer [[#DeviceStorePtrTy:]] 5936 [[#UsmArrayTyE]]
+; CHECK-SPIRV-USM: TypePointer [[#HostBytePtrTy:]] 5937 [[#]]
+; CHECK-SPIRV-USM: TypePointer [[#HostStorePtrTy:]] 5937 [[#UsmArrayTyE]]
+; CHECK-SPIRV-USM: FunctionParameter [[#DeviceBytePtrTy]] [[#DeviceE:]]
+; CHECK-SPIRV-USM: Bitcast [[#DeviceStorePtrTy]] [[#DeviceStorePtrE:]]
[[#DeviceE]]
+; CHECK-SPIRV-USM: Store [[#DeviceStorePtrE]] [[#]] 2 4
+; CHECK-SPIRV-USM: FunctionParameter [[#HostBytePtrTy]] [[#HostE:]]
+; CHECK-SPIRV-USM: Bitcast [[#HostStorePtrTy]] [[#HostStorePtrE:]] [[#HostE]]
+; CHECK-SPIRV-USM: Store [[#HostStorePtrE]] [[#]] 2 4
+
+; CHECK-LLVM-USM: define spir_kernel void @fill_device(ptr addrspace(5) %dst)
+; CHECK-LLVM-USM: %[[#DeviceStorePtrE:]] = bitcast ptr addrspace(5) %dst to
ptr addrspace(5)
+; CHECK-LLVM-USM: store [8 x i8] zeroinitializer, ptr addrspace(5)
%[[#DeviceStorePtrE]], align 4
+; CHECK-LLVM-USM: define spir_kernel void @fill_host(ptr addrspace(6) %dst)
+; CHECK-LLVM-USM: %[[#HostStorePtrE:]] = bitcast ptr addrspace(6) %dst to ptr
addrspace(6)
+; CHECK-LLVM-USM: store [8 x i8] zeroinitializer, ptr addrspace(6)
%[[#HostStorePtrE]], align 4
+
+target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
+target triple = "spir64-unknown-unknown"
+
+define spir_kernel void @fill(ptr addrspace(1) %base) {
+entry:
+ %dst = getelementptr i8, ptr addrspace(1) %base, i64 1
+ call void @llvm.memset.p1.i64(ptr addrspace(1) align 1 %dst, i8 42, i64 3,
i1 true)
+ ret void
+}
+
+define spir_kernel void @fill_device(ptr addrspace(5) %dst) {
+entry:
+ call void @llvm.memset.p5.i64(ptr addrspace(5) align 4 %dst, i8 0, i64 8, i1
false)
+ ret void
+}
+
+define spir_kernel void @fill_host(ptr addrspace(6) %dst) {
+entry:
+ call void @llvm.memset.p6.i64(ptr addrspace(6) align 4 %dst, i8 0, i64 8, i1
false)
+ ret void
+}
+
+declare void @llvm.memset.p1.i64(ptr addrspace(1), i8, i64, i1 immarg)
+declare void @llvm.memset.p5.i64(ptr addrspace(5), i8, i64, i1 immarg)
+declare void @llvm.memset.p6.i64(ptr addrspace(6), i8, i64, i1 immarg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/zero-length-mem-intrinsics.ll
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/zero-length-mem-intrinsics.ll
---
old/SPIRV-LLVM-Translator-23.1.2/test/llvm-intrinsics/zero-length-mem-intrinsics.ll
2026-09-29 15:35:16.000000000 +0200
+++
new/SPIRV-LLVM-Translator-23.1.3/test/llvm-intrinsics/zero-length-mem-intrinsics.ll
2026-10-29 16:45:41.000000000 +0100
@@ -1,15 +1,16 @@
; Constant zero-sized memcpy/memmove/memset are no-ops. Emitting
-; OpCopyMemorySized with a Size operand of 0 is invalid SPIR-V, so the
+; OpCopyMemorySized or OpTypeArray with a Size operand of 0 is invalid SPIR-V,
so the
; translator must drop these intrinsics. A non-zero copy is unaffected.
-; RUN: llvm-spirv %s -spirv-text -o - | FileCheck %s --check-prefix=CHECK-SPIRV
+; RUN: llvm-spirv %s -spirv-text -o - | FileCheck %s
--check-prefix=CHECK-SPIRV --implicit-check-not=Store
; RUN: llvm-spirv %s -o %t.spv
; RUN: spirv-val %t.spv
target datalayout =
"e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
target triple = "spir-unknown-unknown"
-; A single CopyMemorySized is emitted, for the non-zero memcpy only.
+; A single CopyMemorySized is emitted, for the non-zero memcpy only, and the
+; dropped zero-sized memset leaves no Store behind.
; CHECK-SPIRV-COUNT-1: CopyMemorySized
define spir_func void @zero_memcpy(ptr %dst, ptr %src) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/SPIRV-LLVM-Translator-23.1.2/test/transcoding/intrinsic_result_store.ll
new/SPIRV-LLVM-Translator-23.1.3/test/transcoding/intrinsic_result_store.ll
--- old/SPIRV-LLVM-Translator-23.1.2/test/transcoding/intrinsic_result_store.ll
2026-09-29 15:35:16.000000000 +0200
+++ new/SPIRV-LLVM-Translator-23.1.3/test/transcoding/intrinsic_result_store.ll
2026-10-29 16:45:41.000000000 +0100
@@ -10,18 +10,15 @@
target datalayout =
"e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
target triple = "spir64-unknown-unknown"
-; CHECK-LLVM: %[[ZERO_INIT:[0-9]+]] = alloca [8 x i8], align 8
-; CHECK-LLVM: store [8 x i8] zeroinitializer, ptr %[[ZERO_INIT]], align 1
-
; Function Attrs: convergent noinline nounwind optnone
define spir_kernel void @test_memset(ptr addrspace(1) %data, i32 %input) #0
!kernel_arg_addr_space !1 !kernel_arg_access_qual !5 !kernel_arg_type !6
!kernel_arg_base_type !6 !kernel_arg_type_qual !7 {
entry:
-; CHECK-LLVM: %[[BITCAST_RES:[[:alnum:].]+]] = bitcast ptr addrspace(1)
%{{[[:alnum:].]+}} to ptr addrspace(1)
+; CHECK-LLVM: %[[B:.+]] = bitcast ptr addrspace(1) %data to ptr addrspace(1)
%ptr = bitcast ptr addrspace(1) %data to ptr addrspace(1)
-; CHECK-LLVM: %[[#ZERO_INIT_BITCAST:]] = bitcast ptr %[[ZERO_INIT]] to ptr
-; CHECK-LLVM: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 8
%[[BITCAST_RES]], ptr align 8 %[[#ZERO_INIT_BITCAST]], i64 8, i1 false)
+; CHECK-LLVM: %[[#ArrayPtr:]] = bitcast ptr addrspace(1) %[[B]] to ptr
addrspace(1)
+; CHECK-LLVM: store [8 x i8] zeroinitializer, ptr addrspace(1) %[[#ArrayPtr]],
align 8
call void @llvm.memset.p1.i64(ptr addrspace(1) align 8 %ptr, i8 0, i64 8, i1
false)
-; CHECK-LLVM: store i8 0, ptr addrspace(1) %[[BITCAST_RES]]
+; CHECK-LLVM: store i8 0, ptr addrspace(1) %[[B]]
store i8 0, ptr addrspace(1) %ptr
ret void
}