Skip to content

Commit 0a6abf0

Browse files
authored
Add storage class memory semantics bit to LLVM IR atomic translation (#3826)
Deduce storage class memory semantic from the pointer accessed by atomic intrinsics Inspired by llvm/llvm-project#193696, llvm/llvm-project#195049
1 parent a1441b2 commit 0a6abf0

18 files changed

Lines changed: 176 additions & 139 deletions

lib/SPIRV/OCLToSPIRV.cpp

Lines changed: 2 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -69,87 +69,6 @@ using namespace OCLUtil;
6969

7070
namespace SPIRV {
7171

72-
static unsigned getAddressSpaceFromType(const Type *Ty) {
73-
assert(Ty && "Can't deduce pointer AS");
74-
if (auto *TypedPtr = dyn_cast<TypedPointerType>(Ty))
75-
return TypedPtr->getAddressSpace();
76-
if (auto *Ptr = dyn_cast<PointerType>(Ty))
77-
return Ptr->getAddressSpace();
78-
llvm_unreachable("Can't deduce pointer AS");
79-
}
80-
81-
// Performs an address space inference analysis.
82-
static unsigned getAddressSpaceFromValue(const Value *Ptr) {
83-
assert(Ptr && "Can't deduce pointer AS");
84-
85-
SmallPtrSet<const Value *, 8> Visited;
86-
SmallVector<const Value *, 8> Worklist;
87-
Worklist.push_back(Ptr);
88-
unsigned AS = SPIRAS_Generic;
89-
90-
while (!Worklist.empty()) {
91-
const Value *Current = Worklist.pop_back_val();
92-
if (!Visited.insert(Current).second)
93-
continue;
94-
95-
unsigned DeducedAS = getAddressSpaceFromType(Current->getType());
96-
if (DeducedAS != SPIRAS_Generic)
97-
return DeducedAS;
98-
AS = DeducedAS;
99-
100-
// Find origins of the pointer and add to the worklist.
101-
if (auto *Op = dyn_cast<Operator>(Current)) {
102-
switch (Op->getOpcode()) {
103-
case Instruction::AddrSpaceCast:
104-
case Instruction::BitCast:
105-
case Instruction::GetElementPtr:
106-
Worklist.push_back(Op->getOperand(0));
107-
break;
108-
case Instruction::Select:
109-
Worklist.push_back(Op->getOperand(1));
110-
Worklist.push_back(Op->getOperand(2));
111-
break;
112-
case Instruction::PHI: {
113-
auto *Phi = cast<PHINode>(Op);
114-
for (Value *Incoming : Phi->incoming_values())
115-
Worklist.push_back(Incoming);
116-
break;
117-
}
118-
default:
119-
break;
120-
}
121-
}
122-
}
123-
124-
return AS;
125-
}
126-
127-
// Sets memory semantic mask of an atomic depending on a pointer argument
128-
// address space.
129-
static unsigned
130-
getAtomicPointerMemorySemanticsMemoryMask(const Value *Ptr,
131-
const Type *RecordedType) {
132-
assert((Ptr && RecordedType) &&
133-
"Can't evaluate atomic builtin's memory semantic");
134-
unsigned AddrSpace = getAddressSpaceFromType(RecordedType);
135-
if (AddrSpace == SPIRAS_Generic)
136-
AddrSpace = getAddressSpaceFromValue(Ptr);
137-
138-
switch (AddrSpace) {
139-
case SPIRAS_Global:
140-
case SPIRAS_GlobalDevice:
141-
case SPIRAS_GlobalHost:
142-
return MemorySemanticsCrossWorkgroupMemoryMask;
143-
case SPIRAS_Local:
144-
return MemorySemanticsWorkgroupMemoryMask;
145-
case SPIRAS_Generic:
146-
return MemorySemanticsCrossWorkgroupMemoryMask |
147-
MemorySemanticsWorkgroupMemoryMask;
148-
default:
149-
return MemorySemanticsMaskNone;
150-
}
151-
}
152-
15372
static size_t getOCLCpp11AtomicMaxNumOps(StringRef Name) {
15473
return StringSwitch<size_t>(Name)
15574
.Cases({"load", "flag_test_and_set", "flag_clear"}, 3)
@@ -790,8 +709,8 @@ void OCLToSPIRVBase::transAtomicBuiltin(CallInst *CI,
790709

791710
unsigned PtrMemSemantics = MemorySemanticsMaskNone;
792711
if (Mutator.arg_size() > 0)
793-
PtrMemSemantics = getAtomicPointerMemorySemanticsMemoryMask(
794-
Mutator.getArg(0), Mutator.getType(0));
712+
PtrMemSemantics = getAtomicPointerMemorySemanticsMask(Mutator.getArg(0),
713+
Mutator.getType(0));
795714

796715
if (NeedsNegate) {
797716
Mutator.mapArg(1, [=](Value *V) {

lib/SPIRV/OCLUtil.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,13 @@
4141
#include "SPIRVFunction.h"
4242
#include "SPIRVInstruction.h"
4343
#include "SPIRVInternal.h"
44+
#include "llvm/ADT/SmallPtrSet.h"
4445
#include "llvm/ADT/StringSwitch.h"
46+
#include "llvm/IR/DerivedTypes.h"
4547
#include "llvm/IR/IRBuilder.h"
4648
#include "llvm/IR/InstVisitor.h"
4749
#include "llvm/IR/Instructions.h"
50+
#include "llvm/IR/Operator.h"
4851
#include "llvm/Pass.h"
4952
#include "llvm/Support/CommandLine.h"
5053
#include "llvm/Support/Debug.h"
@@ -670,6 +673,83 @@ template <> void LLVMSPIRVAtomicRmwOpCodeMap::init() {
670673

671674
namespace OCLUtil {
672675

676+
static unsigned getAddressSpaceFromType(const Type *Ty) {
677+
assert(Ty && "Can't deduce pointer AS");
678+
if (auto *TypedPtr = dyn_cast<TypedPointerType>(Ty))
679+
return TypedPtr->getAddressSpace();
680+
if (auto *Ptr = dyn_cast<PointerType>(Ty))
681+
return Ptr->getAddressSpace();
682+
llvm_unreachable("Can't deduce pointer AS");
683+
}
684+
685+
// Performs an address space inference analysis.
686+
static unsigned getAddressSpaceFromValue(const Value *Ptr) {
687+
assert(Ptr && "Can't deduce pointer AS");
688+
689+
SmallPtrSet<const Value *, 8> Visited;
690+
SmallVector<const Value *, 8> Worklist;
691+
Worklist.push_back(Ptr);
692+
unsigned AS = SPIRAS_Generic;
693+
694+
while (!Worklist.empty()) {
695+
const Value *Current = Worklist.pop_back_val();
696+
if (!Visited.insert(Current).second)
697+
continue;
698+
699+
unsigned DeducedAS = getAddressSpaceFromType(Current->getType());
700+
if (DeducedAS != SPIRAS_Generic)
701+
return DeducedAS;
702+
703+
// Find origins of the pointer and add to the worklist.
704+
if (auto *Op = dyn_cast<Operator>(Current)) {
705+
switch (Op->getOpcode()) {
706+
case Instruction::AddrSpaceCast:
707+
case Instruction::BitCast:
708+
case Instruction::GetElementPtr:
709+
Worklist.push_back(Op->getOperand(0));
710+
break;
711+
case Instruction::Select:
712+
Worklist.push_back(Op->getOperand(1));
713+
Worklist.push_back(Op->getOperand(2));
714+
break;
715+
case Instruction::PHI: {
716+
auto *Phi = cast<PHINode>(Op);
717+
for (Value *Incoming : Phi->incoming_values())
718+
Worklist.push_back(Incoming);
719+
break;
720+
}
721+
default:
722+
break;
723+
}
724+
}
725+
}
726+
727+
return AS;
728+
}
729+
730+
unsigned getAtomicPointerMemorySemanticsMask(const Value *Ptr,
731+
const Type *RecordedType) {
732+
assert((Ptr && RecordedType) &&
733+
"Can't evaluate atomic builtin's memory semantic");
734+
unsigned AddrSpace = getAddressSpaceFromType(RecordedType);
735+
if (AddrSpace == SPIRAS_Generic)
736+
AddrSpace = getAddressSpaceFromValue(Ptr);
737+
738+
switch (AddrSpace) {
739+
case SPIRAS_Global:
740+
case SPIRAS_GlobalDevice:
741+
case SPIRAS_GlobalHost:
742+
return MemorySemanticsCrossWorkgroupMemoryMask;
743+
case SPIRAS_Local:
744+
return MemorySemanticsWorkgroupMemoryMask;
745+
case SPIRAS_Generic:
746+
return MemorySemanticsCrossWorkgroupMemoryMask |
747+
MemorySemanticsWorkgroupMemoryMask;
748+
default:
749+
return MemorySemanticsMaskNone;
750+
}
751+
}
752+
673753
AtomicWorkItemFenceLiterals getAtomicWorkItemFenceLiterals(CallInst *CI) {
674754
return std::make_tuple(getArgAsInt(CI, 0),
675755
static_cast<OCLMemOrderKind>(getArgAsInt(CI, 1)),

lib/SPIRV/OCLUtil.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,12 @@ bool isPipeOrAddressSpaceCastBI(const StringRef MangledName);
508508
bool isEnqueueKernelBI(const StringRef MangledName);
509509
bool isKernelQueryBI(const StringRef MangledName);
510510

511+
// Returns the storage-class memory-semantics bit mask derived from the pointer
512+
// address space. RecordedType is checked first; if it resolves to Generic, Ptr
513+
// is analyzed via use-def walk.
514+
unsigned getAtomicPointerMemorySemanticsMask(const Value *Ptr,
515+
const Type *RecordedType);
516+
511517
/// Check that the type is the sampler_t
512518
bool isSamplerTy(Type *Ty);
513519

lib/SPIRV/SPIRVRegularizeLLVM.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -771,8 +771,12 @@ bool SPIRVRegularizeLLVMBase::regularize() {
771771
llvm::toCABI(Cmpxchg->getSuccessOrdering()));
772772
auto FailureOrder = static_cast<OCLMemOrderKind>(
773773
llvm::toCABI(Cmpxchg->getFailureOrdering()));
774-
Value *EqualSem = getInt32(M, OCLMemOrderMap::map(SuccessOrder));
775-
Value *UnequalSem = getInt32(M, OCLMemOrderMap::map(FailureOrder));
774+
unsigned SCMask =
775+
getAtomicPointerMemorySemanticsMask(Ptr, Ptr->getType());
776+
Value *EqualSem =
777+
getInt32(M, OCLMemOrderMap::map(SuccessOrder) | SCMask);
778+
Value *UnequalSem =
779+
getInt32(M, OCLMemOrderMap::map(FailureOrder) | SCMask);
776780
Value *Val = Cmpxchg->getNewValOperand();
777781
Value *Comparator = Cmpxchg->getCompareOperand();
778782

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,8 +2028,10 @@ SPIRVValue *LLVMToSPIRVBase::transAtomicStore(StoreInst *ST,
20282028
SPIRVBasicBlock *BB) {
20292029
spv::Scope S = toSPIRVScope(ST->getContext(), ST->getSyncScopeID());
20302030

2031-
std::vector<Value *> Ops{ST->getPointerOperand(), getUInt32(M, S),
2032-
getUInt32(M, transAtomicOrdering(ST->getOrdering())),
2031+
Value *Ptr = ST->getPointerOperand();
2032+
auto MemSem = transAtomicOrdering(ST->getOrdering()) |
2033+
getAtomicPointerMemorySemanticsMask(Ptr, Ptr->getType());
2034+
std::vector<Value *> Ops{Ptr, getUInt32(M, S), getUInt32(M, MemSem),
20332035
ST->getValueOperand()};
20342036
std::vector<SPIRVValue *> SPIRVOps = transValue(Ops, BB);
20352037

@@ -2041,9 +2043,10 @@ SPIRVValue *LLVMToSPIRVBase::transAtomicLoad(LoadInst *LD,
20412043
SPIRVBasicBlock *BB) {
20422044
spv::Scope S = toSPIRVScope(LD->getContext(), LD->getSyncScopeID());
20432045

2044-
std::vector<Value *> Ops{
2045-
LD->getPointerOperand(), getUInt32(M, S),
2046-
getUInt32(M, transAtomicOrdering(LD->getOrdering()))};
2046+
Value *Ptr = LD->getPointerOperand();
2047+
auto MemSem = transAtomicOrdering(LD->getOrdering()) |
2048+
getAtomicPointerMemorySemanticsMask(Ptr, Ptr->getType());
2049+
std::vector<Value *> Ops{Ptr, getUInt32(M, S), getUInt32(M, MemSem)};
20472050
std::vector<SPIRVValue *> SPIRVOps = transValue(Ops, BB);
20482051

20492052
return mapValue(LD, BM->addInstTemplate(OpAtomicLoad, BM->getIds(SPIRVOps),
@@ -2807,9 +2810,11 @@ LLVMToSPIRVBase::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB,
28072810
return nullptr;
28082811

28092812
AtomicOrderingCABI Ordering = llvm::toCABI(ARMW->getOrdering());
2810-
auto MemSem = OCLMemOrderMap::map(static_cast<OCLMemOrderKind>(Ordering));
2813+
Value *Ptr = ARMW->getPointerOperand();
2814+
auto MemSem = OCLMemOrderMap::map(static_cast<OCLMemOrderKind>(Ordering)) |
2815+
getAtomicPointerMemorySemanticsMask(Ptr, Ptr->getType());
28112816
std::vector<Value *> Operands(4);
2812-
Operands[0] = ARMW->getPointerOperand();
2817+
Operands[0] = Ptr;
28132818
spv::Scope S = toSPIRVScope(ARMW->getContext(), ARMW->getSyncScopeID());
28142819
Operands[1] = getUInt32(M, S);
28152820
Operands[2] = getUInt32(M, MemSem);

test/atomicrmw.ll

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,58 +8,82 @@
88
; RUN: llvm-spirv -to-text %t.spv -o - | FileCheck %s
99

1010
; CHECK: TypeInt [[Int:[0-9]+]] 32 0
11-
; CHECK-DAG: Constant [[Int]] [[MemSem_Relaxed:[0-9]+]] 0
12-
; CHECK-DAG: Constant [[Int]] [[MemSem_Acquire:[0-9]+]] 2
13-
; CHECK-DAG: Constant [[Int]] [[MemSem_Release:[0-9]+]] 4 {{$}}
14-
; CHECK-DAG: Constant [[Int]] [[MemSem_AcquireRelease:[0-9]+]] 8
15-
; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16
11+
; CHECK-DAG: Constant [[Int]] [[MemSem_CW_Relaxed:[0-9]+]] 512
12+
; CHECK-DAG: Constant [[Int]] [[MemSem_CW_Acquire:[0-9]+]] 514
13+
; CHECK-DAG: Constant [[Int]] [[MemSem_CW_Release:[0-9]+]] 516
14+
; CHECK-DAG: Constant [[Int]] [[MemSem_CW_AcquireRelease:[0-9]+]] 520
15+
; CHECK-DAG: Constant [[Int]] [[MemSem_CW_SequentiallyConsistent:[0-9]+]] 528
16+
; CHECK-DAG: Constant [[Int]] [[MemSem_WG_Relaxed:[0-9]+]] 256
17+
; CHECK-DAG: Constant [[Int]] [[MemSem_WG_AcquireRelease:[0-9]+]] 264
18+
; CHECK-DAG: Constant [[Int]] [[MemSem_WG_SequentiallyConsistent:[0-9]+]] 272
1619
; CHECK-DAG: Constant [[Int]] [[Value:[0-9]+]] 42
1720
; CHECK: TypeFloat [[Float:[0-9]+]] 32
1821
; CHECK: {{(Variable|UntypedVariableKHR)}} {{[0-9]+}} [[Pointer:[0-9]+]]
1922
; CHECK: {{(Variable|UntypedVariableKHR)}} {{[0-9]+}} [[FPPointer:[0-9]+]]
23+
; CHECK: {{(Variable|UntypedVariableKHR)}} {{[0-9]+}} [[LocalPointer:[0-9]+]]
2024
; CHECK: Constant [[Float]] [[FPValue:[0-9]+]] 1109917696
2125

2226
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
2327
target triple = "spir64"
2428

2529
@ui = common dso_local addrspace(1) global i32 0, align 4
2630
@f = common dso_local local_unnamed_addr addrspace(1) global float 0.000000e+00, align 4
31+
@li = common dso_local addrspace(3) global i32 0, align 4
2732

2833
; Function Attrs: nounwind
2934
define dso_local spir_func void @test_atomicrmw() local_unnamed_addr #0 {
3035
entry:
3136
%0 = atomicrmw xchg ptr addrspace(1) @ui, i32 42 acq_rel
32-
; CHECK: AtomicExchange [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_AcquireRelease]] [[Value]]
37+
; CHECK: AtomicExchange [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_AcquireRelease]] [[Value]]
3338

3439
%1 = atomicrmw xchg ptr addrspace(1) @f, float 42.000000e+00 seq_cst
35-
; CHECK: AtomicExchange [[Float]] {{[0-9]+}} [[FPPointer]] {{.+}} [[MemSem_SequentiallyConsistent]] [[FPValue]]
40+
; CHECK: AtomicExchange [[Float]] {{[0-9]+}} [[FPPointer]] {{.+}} [[MemSem_CW_SequentiallyConsistent]] [[FPValue]]
3641

3742
%2 = atomicrmw add ptr addrspace(1) @ui, i32 42 monotonic
38-
; CHECK: AtomicIAdd [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_Relaxed]] [[Value]]
43+
; CHECK: AtomicIAdd [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_Relaxed]] [[Value]]
3944

4045
%3 = atomicrmw sub ptr addrspace(1) @ui, i32 42 acquire
41-
; CHECK: AtomicISub [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_Acquire]] [[Value]]
46+
; CHECK: AtomicISub [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_Acquire]] [[Value]]
4247

4348
%4 = atomicrmw or ptr addrspace(1) @ui, i32 42 release
44-
; CHECK: AtomicOr [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_Release]] [[Value]]
49+
; CHECK: AtomicOr [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_Release]] [[Value]]
4550

4651
%5 = atomicrmw xor ptr addrspace(1) @ui, i32 42 acq_rel
47-
; CHECK: AtomicXor [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_AcquireRelease]] [[Value]]
52+
; CHECK: AtomicXor [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_AcquireRelease]] [[Value]]
4853

4954
%6 = atomicrmw and ptr addrspace(1) @ui, i32 42 seq_cst
50-
; CHECK: AtomicAnd [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_SequentiallyConsistent]] [[Value]]
55+
; CHECK: AtomicAnd [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_SequentiallyConsistent]] [[Value]]
5156

5257
%7 = atomicrmw max ptr addrspace(1) @ui, i32 42 monotonic
53-
; CHECK: AtomicSMax [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_Relaxed]] [[Value]]
58+
; CHECK: AtomicSMax [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_Relaxed]] [[Value]]
5459

5560
%8 = atomicrmw min ptr addrspace(1) @ui, i32 42 acquire
56-
; CHECK: AtomicSMin [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_Acquire]] [[Value]]
61+
; CHECK: AtomicSMin [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_Acquire]] [[Value]]
5762

5863
%9 = atomicrmw umax ptr addrspace(1) @ui, i32 42 release
59-
; CHECK: AtomicUMax [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_Release]] [[Value]]
64+
; CHECK: AtomicUMax [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_Release]] [[Value]]
6065

6166
%10 = atomicrmw umin ptr addrspace(1) @ui, i32 42 acq_rel
62-
; CHECK: AtomicUMin [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_AcquireRelease]] [[Value]]
67+
; CHECK: AtomicUMin [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_AcquireRelease]] [[Value]]
68+
69+
%11 = atomicrmw add ptr addrspace(3) @li, i32 42 acq_rel
70+
; CHECK: AtomicIAdd [[Int]] {{[0-9]+}} [[LocalPointer]] {{.+}} [[MemSem_WG_AcquireRelease]] [[Value]]
71+
72+
ret void
73+
}
74+
75+
; Function Attrs: nounwind
76+
define dso_local spir_func void @test_atomic_load_store() local_unnamed_addr #0 {
77+
entry:
78+
%0 = load atomic i32, ptr addrspace(1) @ui seq_cst, align 4
79+
; CHECK: AtomicLoad [[Int]] {{[0-9]+}} [[Pointer]] {{.+}} [[MemSem_CW_SequentiallyConsistent]]
80+
store atomic i32 42, ptr addrspace(1) @ui monotonic, align 4
81+
; CHECK: AtomicStore [[Pointer]] {{.+}} [[MemSem_CW_Relaxed]] [[Value]]
82+
83+
%1 = load atomic i32, ptr addrspace(3) @li seq_cst, align 4
84+
; CHECK: AtomicLoad [[Int]] {{[0-9]+}} [[LocalPointer]] {{.+}} [[MemSem_WG_SequentiallyConsistent]]
85+
store atomic i32 42, ptr addrspace(3) @li monotonic, align 4
86+
; CHECK: AtomicStore [[LocalPointer]] {{.+}} [[MemSem_WG_Relaxed]] [[Value]]
6387

6488
ret void
6589
}

test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_double.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
; CHECK-DAG: Capability AtomicFloat64AddEXT
88
; CHECK: TypeInt [[Int:[0-9]+]] 32 0
99
; CHECK-DAG: Constant [[Int]] [[Scope_CrossDevice:[0-9]+]] 0 {{$}}
10-
; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16
10+
; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 528
1111
; CHECK: TypeFloat [[Double:[0-9]+]] 64
1212
; CHECK: Variable {{[0-9]+}} [[DoublePointer:[0-9]+]]
1313
; CHECK: Constant [[Double]] [[DoubleValue:[0-9]+]] 0 1078263808

test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_float.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
; CHECK-DAG: Capability AtomicFloat32AddEXT
88
; CHECK: TypeInt [[Int:[0-9]+]] 32 0
99
; CHECK-DAG: Constant [[Int]] [[Scope_CrossDevice:[0-9]+]] 0 {{$}}
10-
; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16
10+
; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 528
1111
; CHECK: TypeFloat [[Float:[0-9]+]] 32
1212
; CHECK: Variable {{[0-9]+}} [[FPPointer:[0-9]+]]
1313
; CHECK: Constant [[Float]] [[FPValue:[0-9]+]] 1109917696

test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_half.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
; CHECK-DAG: Capability AtomicFloat16AddEXT
99
; CHECK: TypeInt [[TypeIntID:[0-9]+]] 32 0
1010
; CHECK-DAG: Constant [[TypeIntID]] [[ScopeCrossDevice:[0-9]+]] 0 {{$}}
11-
; CHECK-DAG: Constant [[TypeIntID]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16
11+
; CHECK-DAG: Constant [[TypeIntID]] [[MemSem_SequentiallyConsistent:[0-9]+]] 528
1212
; CHECK: TypeFloat [[TypeFloatHalfID:[0-9]+]] 16
1313
; CHECK: Variable {{[0-9]+}} [[HalfPointer:[0-9]+]]
1414
; CHECK: Constant [[TypeFloatHalfID]] [[HalfValue:[0-9]+]] 20800

0 commit comments

Comments
 (0)