@@ -192,9 +192,17 @@ static Value *emitFPIntBuiltin(CodeGenFunction &CGF,
192192 return CGF.Builder .CreateCall (F, {Src0, Src1});
193193}
194194
195+ static inline StringRef mapScopeToSPIRV (StringRef AMDGCNScope) {
196+ if (AMDGCNScope == " agent" )
197+ return " device" ;
198+ if (AMDGCNScope == " wavefront" )
199+ return " subgroup" ;
200+ return AMDGCNScope;
201+ }
202+
195203// For processing memory ordering and memory scope arguments of various
196204// amdgcn builtins.
197- // \p Order takes a C++11 comptabile memory-ordering specifier and converts
205+ // \p Order takes a C++11 compatible memory-ordering specifier and converts
198206// it into LLVM's memory ordering specifier using atomic C ABI, and writes
199207// to \p AO. \p Scope takes a const char * and converts it into AMDGCN
200208// specific SyncScopeID and writes it to \p SSID.
@@ -227,6 +235,8 @@ void CodeGenFunction::ProcessOrderScopeAMDGCN(Value *Order, Value *Scope,
227235 // Some of the atomic builtins take the scope as a string name.
228236 StringRef scp;
229237 if (llvm::getConstantStringInfo (Scope, scp)) {
238+ if (getTarget ().getTriple ().isSPIRV ())
239+ scp = mapScopeToSPIRV (scp);
230240 SSID = getLLVMContext ().getOrInsertSyncScopeID (scp);
231241 return ;
232242 }
@@ -238,13 +248,19 @@ void CodeGenFunction::ProcessOrderScopeAMDGCN(Value *Order, Value *Scope,
238248 SSID = llvm::SyncScope::System;
239249 break ;
240250 case 1 : // __MEMORY_SCOPE_DEVICE
241- SSID = getLLVMContext ().getOrInsertSyncScopeID (" agent" );
251+ if (getTarget ().getTriple ().isSPIRV ())
252+ SSID = getLLVMContext ().getOrInsertSyncScopeID (" device" );
253+ else
254+ SSID = getLLVMContext ().getOrInsertSyncScopeID (" agent" );
242255 break ;
243256 case 2 : // __MEMORY_SCOPE_WRKGRP
244257 SSID = getLLVMContext ().getOrInsertSyncScopeID (" workgroup" );
245258 break ;
246259 case 3 : // __MEMORY_SCOPE_WVFRNT
247- SSID = getLLVMContext ().getOrInsertSyncScopeID (" wavefront" );
260+ if (getTarget ().getTriple ().isSPIRV ())
261+ SSID = getLLVMContext ().getOrInsertSyncScopeID (" subgroup" );
262+ else
263+ SSID = getLLVMContext ().getOrInsertSyncScopeID (" wavefront" );
248264 break ;
249265 case 4 : // __MEMORY_SCOPE_SINGLE
250266 SSID = llvm::SyncScope::SingleThread;
@@ -1510,7 +1526,10 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,
15101526 //
15111527 // The global/flat cases need to use agent scope to consistently produce
15121528 // the native instruction instead of a cmpxchg expansion.
1513- SSID = getLLVMContext ().getOrInsertSyncScopeID (" agent" );
1529+ if (getTarget ().getTriple ().isSPIRV ())
1530+ SSID = getLLVMContext ().getOrInsertSyncScopeID (" device" );
1531+ else
1532+ SSID = getLLVMContext ().getOrInsertSyncScopeID (" agent" );
15141533 AO = AtomicOrdering::Monotonic;
15151534
15161535 // The v2bf16 builtin uses i16 instead of a natural bfloat type.
0 commit comments