Skip to content

Commit 0bbbeac

Browse files
qichaogujsji
authored andcommitted
Handle removed OpAtomicCompareExchangeWeak (#2824)
OpAtomicCompareExchangeWeak has been removed and #2665 added a validation for it. This pull request replaces OpAtomicCompareExchangeWeak with OpAtomicCompareExchange. Original commit: KhronosGroup/SPIRV-LLVM-Translator@eb64e4d795006d5
1 parent f717bd2 commit 0bbbeac

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVEntry.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ SPIRVEntry *SPIRVEntry::create(Op OpCode) {
8989
if (OpCode == internal::OpTypeJointMatrixINTELv2)
9090
OpCode = internal::OpTypeJointMatrixINTEL;
9191

92+
// OpAtomicCompareExchangeWeak is removed starting from SPIR-V 1.4
93+
if (OpCode == OpAtomicCompareExchangeWeak)
94+
OpCode = OpAtomicCompareExchange;
95+
9296
OpToFactoryMapTy::const_iterator Loc = OpToFactoryMap.find(OpCode);
9397
if (Loc != OpToFactoryMap.end())
9498
return Loc->second();
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
; Check OpAtomicCompareExchangeWeak is treated as OpAtomicCompareExchange
2+
3+
; REQUIRES: spirv-as
4+
; RUN: spirv-as --target-env spv1.3 -o %t.spv %s
5+
; RUN: spirv-val %t.spv
6+
; RUN: llvm-spirv -r --spirv-target-env=CL2.0 --spirv-target-env="SPV-IR" -o - %t.spv | llvm-dis | FileCheck %s
7+
8+
OpCapability Addresses
9+
OpCapability Linkage
10+
OpCapability Kernel
11+
OpCapability Int8
12+
%1 = OpExtInstImport "OpenCL.std"
13+
OpMemoryModel Physical64 OpenCL
14+
OpEntryPoint Kernel %19 "test_atomic_global"
15+
OpSource OpenCL_C 200000
16+
OpName %test_atomic_global "test_atomic_global"
17+
OpName %dst "dst"
18+
OpName %object "object"
19+
OpName %expected "expected"
20+
OpName %desired "desired"
21+
OpName %dst_0 "dst"
22+
OpName %object_0 "object"
23+
OpName %expected_0 "expected"
24+
OpName %desired_0 "desired"
25+
OpDecorate %test_atomic_global LinkageAttributes "test_atomic_global" Export
26+
OpDecorate %dst_0 Volatile
27+
%uint = OpTypeInt 32 0
28+
%uchar = OpTypeInt 8 0
29+
%uint_1 = OpConstant %uint 1
30+
%uint_16 = OpConstant %uint 16
31+
%uint_0 = OpConstant %uint 0
32+
%void = OpTypeVoid
33+
%_ptr_CrossWorkgroup_uint = OpTypePointer CrossWorkgroup %uint
34+
%_ptr_CrossWorkgroup_uchar = OpTypePointer CrossWorkgroup %uchar
35+
%7 = OpTypeFunction %void %_ptr_CrossWorkgroup_uint %_ptr_CrossWorkgroup_uchar %_ptr_CrossWorkgroup_uchar %uint
36+
%test_atomic_global = OpFunction %void None %7
37+
%dst = OpFunctionParameter %_ptr_CrossWorkgroup_uint
38+
%object = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
39+
%expected = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
40+
%desired = OpFunctionParameter %uint
41+
%13 = OpLabel
42+
%17 = OpAtomicCompareExchange %uint %dst %uint_1 %uint_16 %uint_16 %uint_1 %uint_0
43+
%18 = OpAtomicCompareExchangeWeak %uint %dst %uint_1 %uint_16 %uint_16 %uint_1 %uint_0
44+
OpReturn
45+
OpFunctionEnd
46+
%19 = OpFunction %void None %7
47+
%dst_0 = OpFunctionParameter %_ptr_CrossWorkgroup_uint
48+
%object_0 = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
49+
%expected_0 = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
50+
%desired_0 = OpFunctionParameter %uint
51+
%24 = OpLabel
52+
%25 = OpFunctionCall %void %test_atomic_global %dst_0 %object_0 %expected_0 %desired_0
53+
OpReturn
54+
OpFunctionEnd
55+
56+
; CHECK: call spir_func i32 @_Z29__spirv_AtomicCompareExchangePU3AS1iiiiii(
57+
; CHECK-NOT: call spir_func i32 @_Z33__spirv_AtomicCompareExchangeWeakPU3AS1iiiiii(

0 commit comments

Comments
 (0)