https://github.com/chinmayingle created 
https://github.com/llvm/llvm-project/pull/233280

[Clang][NVPTX] Emit device scope for generic atomic builtins

The unscoped __nvvm_atom_*_gen_* builtins (CUDA's atomicAdd() etc.)
were emitted without a syncscope, which LLVM treats as system scope.
Since #222458, the NVPTX backend rejects system scope atomics below
sm_60, so these builtins failed to compile for sm_50-53.

Emit syncscope("device") for them instead. On sm_60 and newer, plain
atomicAdd now lowers to a device-scope atom rather than .sys, which
matches nvcc.

- Tests: regenerated atomic-ignore-denormal-mode-nvptx.cu and added
  syncscope("device") checks to builtins-nvptx.c.

Fixes #224420

>From 09fc9042fb7834958c0b0f0b2f694c831e7f00c0 Mon Sep 17 00:00:00 2001
From: chinmayingle <[email protected]>
Date: Mon, 19 Oct 2026 00:26:02 +0530
Subject: [PATCH] [Clang][NVPTX] Emit device scope for generic atomic builtins

---
 clang/lib/CodeGen/CGBuiltin.cpp               | 14 ++--
 clang/lib/CodeGen/CGBuiltin.h                 | 21 +++---
 clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp    | 55 +++++++++-----
 clang/test/CodeGen/builtins-nvptx.c           | 72 +++++++++----------
 .../atomic-ignore-denormal-mode-nvptx.cu      |  4 +-
 5 files changed, 97 insertions(+), 69 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index c93375ff3a18ef..22d89df39ef7ad 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -272,9 +272,10 @@ Address CheckAtomicAlignment(CodeGenFunction &CGF, const 
CallExpr *E) {
 
 /// Utility to insert an atomic instruction based on Intrinsic::ID
 /// and the expression node.
-Value *MakeBinaryAtomicValue(
-    CodeGenFunction &CGF, llvm::AtomicRMWInst::BinOp Kind, const CallExpr *E,
-    AtomicOrdering Ordering) {
+Value *MakeBinaryAtomicValue(CodeGenFunction &CGF,
+                             llvm::AtomicRMWInst::BinOp Kind, const CallExpr 
*E,
+                             AtomicOrdering Ordering,
+                             llvm::SyncScope::ID SSID) {
 
   QualType T = E->getType();
   assert(E->getArg(0)->getType()->isPointerType());
@@ -292,7 +293,7 @@ Value *MakeBinaryAtomicValue(
   Val = EmitToInt(CGF, Val, T, IntType);
 
   llvm::Value *Result =
-      CGF.Builder.CreateAtomicRMW(Kind, DestAddr, Val, Ordering);
+      CGF.Builder.CreateAtomicRMW(Kind, DestAddr, Val, Ordering, SSID);
   // Consider atomics to be volatile in MS kernel mode.
   if (CGF.CGM.getLangOpts().Kernel)
     cast<llvm::AtomicRMWInst>(Result)->setVolatile(true);
@@ -375,7 +376,8 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
 Value *MakeAtomicCmpXchgValue(CodeGenFunction &CGF, const CallExpr *E,
                               bool ReturnBool,
                               llvm::AtomicOrdering SuccessOrdering,
-                              llvm::AtomicOrdering FailureOrdering) {
+                              llvm::AtomicOrdering FailureOrdering,
+                              llvm::SyncScope::ID SSID) {
   QualType T = ReturnBool ? E->getArg(1)->getType() : E->getType();
   Address DestAddr = CheckAtomicAlignment(CGF, E);
 
@@ -388,7 +390,7 @@ Value *MakeAtomicCmpXchgValue(CodeGenFunction &CGF, const 
CallExpr *E,
   Value *New = EmitToInt(CGF, CGF.EmitScalarExpr(E->getArg(2)), T, IntType);
 
   Value *Pair = CGF.Builder.CreateAtomicCmpXchg(
-      DestAddr, Cmp, New, SuccessOrdering, FailureOrdering);
+      DestAddr, Cmp, New, SuccessOrdering, FailureOrdering, SSID);
   if (ReturnBool)
     // Extract boolean success flag and zext it to int.
     return CGF.Builder.CreateZExt(CGF.Builder.CreateExtractValue(Pair, 1),
diff --git a/clang/lib/CodeGen/CGBuiltin.h b/clang/lib/CodeGen/CGBuiltin.h
index 394b397fde6a9f..e651dd9cc03a9b 100644
--- a/clang/lib/CodeGen/CGBuiltin.h
+++ b/clang/lib/CodeGen/CGBuiltin.h
@@ -91,11 +91,12 @@ llvm::Value *EmitFromInt(clang::CodeGen::CodeGenFunction 
&CGF, llvm::Value *V,
 clang::CodeGen::Address CheckAtomicAlignment(clang::CodeGen::CodeGenFunction 
&CGF,
                                              const clang::CallExpr *E);
 
-llvm::Value *MakeBinaryAtomicValue(clang::CodeGen::CodeGenFunction &CGF,
-                                   llvm::AtomicRMWInst::BinOp Kind,
-                                   const clang::CallExpr *E,
-                                   llvm::AtomicOrdering Ordering =
-                                      
llvm::AtomicOrdering::SequentiallyConsistent);
+llvm::Value *
+MakeBinaryAtomicValue(clang::CodeGen::CodeGenFunction &CGF,
+                      llvm::AtomicRMWInst::BinOp Kind, const clang::CallExpr 
*E,
+                      llvm::AtomicOrdering Ordering =
+                          llvm::AtomicOrdering::SequentiallyConsistent,
+                      llvm::SyncScope::ID SSID = llvm::SyncScope::System);
 
 llvm::Value *EmitOverflowIntrinsic(clang::CodeGen::CodeGenFunction &CGF,
                                    const llvm::Intrinsic::ID IntrinsicID,
@@ -103,9 +104,11 @@ llvm::Value 
*EmitOverflowIntrinsic(clang::CodeGen::CodeGenFunction &CGF,
                                    llvm::Value *Y,
                                    llvm::Value *&Carry);
 
-llvm::Value *MakeAtomicCmpXchgValue(clang::CodeGen::CodeGenFunction &CGF,
-                                    const clang::CallExpr *E, bool ReturnBool,
-                                    llvm::AtomicOrdering SuccessOrdering,
-                                    llvm::AtomicOrdering FailureOrdering);
+llvm::Value *
+MakeAtomicCmpXchgValue(clang::CodeGen::CodeGenFunction &CGF,
+                       const clang::CallExpr *E, bool ReturnBool,
+                       llvm::AtomicOrdering SuccessOrdering,
+                       llvm::AtomicOrdering FailureOrdering,
+                       llvm::SyncScope::ID SSID = llvm::SyncScope::System);
 
 #endif
diff --git a/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp 
b/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
index a513fcc12953ba..cc230f451e8125 100644
--- a/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/NVPTX.cpp
@@ -451,6 +451,12 @@ static Value *MakeFPArith(unsigned IntrinsicID, 
APFloat::roundingMode RM,
 
 } // namespace
 
+static llvm::SyncScope::ID getDeviceSyncScope(CodeGenFunction &CGF) {
+  return CGF.getLLVMContext().getOrInsertSyncScopeID(
+      *llvm::getAtomicScopeIRString(CGF.getTarget().getTriple(),
+                                    llvm::AtomicScope::Device));
+}
+
 Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned BuiltinID,
                                              const CallExpr *E) {
   switch (BuiltinID) {
@@ -462,65 +468,79 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned 
BuiltinID,
         E->getType()->hasSignedIntegerRepresentation() ? Intrinsic::smulh
                                                        : Intrinsic::umulh,
         EmitScalarExpr(E->getArg(0)), EmitScalarExpr(E->getArg(1)));
+
+  // Unscoped __nvvm_atom_*_gen_* builtins (CUDA's atomicAdd() etc.) have 
device
+  // scope, but LLVM's default sync scope is system, so request device
+  // explicitly.
   case NVPTX::BI__nvvm_atom_add_gen_i:
   case NVPTX::BI__nvvm_atom_add_gen_l:
   case NVPTX::BI__nvvm_atom_add_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Add, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_sub_gen_i:
   case NVPTX::BI__nvvm_atom_sub_gen_l:
   case NVPTX::BI__nvvm_atom_sub_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Sub, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_and_gen_i:
   case NVPTX::BI__nvvm_atom_and_gen_l:
   case NVPTX::BI__nvvm_atom_and_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::And, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_or_gen_i:
   case NVPTX::BI__nvvm_atom_or_gen_l:
   case NVPTX::BI__nvvm_atom_or_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Or, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_xor_gen_i:
   case NVPTX::BI__nvvm_atom_xor_gen_l:
   case NVPTX::BI__nvvm_atom_xor_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xor, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_xchg_gen_i:
   case NVPTX::BI__nvvm_atom_xchg_gen_l:
   case NVPTX::BI__nvvm_atom_xchg_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Xchg, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_max_gen_i:
   case NVPTX::BI__nvvm_atom_max_gen_l:
   case NVPTX::BI__nvvm_atom_max_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Max, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_max_gen_ui:
   case NVPTX::BI__nvvm_atom_max_gen_ul:
   case NVPTX::BI__nvvm_atom_max_gen_ull:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMax, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_min_gen_i:
   case NVPTX::BI__nvvm_atom_min_gen_l:
   case NVPTX::BI__nvvm_atom_min_gen_ll:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::Min, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_min_gen_ui:
   case NVPTX::BI__nvvm_atom_min_gen_ul:
   case NVPTX::BI__nvvm_atom_min_gen_ull:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UMin, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_cas_gen_us:
   case NVPTX::BI__nvvm_atom_cas_gen_i:
@@ -528,9 +548,9 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned 
BuiltinID,
   case NVPTX::BI__nvvm_atom_cas_gen_ll:
     // __nvvm_atom_cas_gen_* should return the old value rather than the
     // success flag.
-    return MakeAtomicCmpXchgValue(*this, E, /*ReturnBool=*/false,
-                                  AtomicOrdering::Monotonic,
-                                  AtomicOrdering::Monotonic);
+    return MakeAtomicCmpXchgValue(
+        *this, E, /*ReturnBool=*/false, AtomicOrdering::Monotonic,
+        AtomicOrdering::Monotonic, getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_add_gen_f:
   case NVPTX::BI__nvvm_atom_add_gen_d: {
@@ -538,7 +558,8 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned 
BuiltinID,
     Value *Val = EmitScalarExpr(E->getArg(1));
 
     llvm::AtomicRMWInst *RMW = Builder.CreateAtomicRMW(
-        llvm::AtomicRMWInst::FAdd, DestAddr, Val, AtomicOrdering::Monotonic);
+        llvm::AtomicRMWInst::FAdd, DestAddr, Val, AtomicOrdering::Monotonic,
+        getDeviceSyncScope(*this));
 
     // CUDA's atomicAdd() is defined in terms of the native atom.add
     // instruction, whose denormal behavior is fixed by the hardware and need
@@ -550,11 +571,13 @@ Value *CodeGenFunction::EmitNVPTXBuiltinExpr(unsigned 
BuiltinID,
 
   case NVPTX::BI__nvvm_atom_inc_gen_ui:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UIncWrap, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_atom_dec_gen_ui:
     return MakeBinaryAtomicValue(*this, llvm::AtomicRMWInst::UDecWrap, E,
-                                 AtomicOrdering::Monotonic);
+                                 AtomicOrdering::Monotonic,
+                                 getDeviceSyncScope(*this));
 
   case NVPTX::BI__nvvm_ldg_c:
   case NVPTX::BI__nvvm_ldg_sc:
diff --git a/clang/test/CodeGen/builtins-nvptx.c 
b/clang/test/CodeGen/builtins-nvptx.c
index b7126a82b8064b..aad71845aa0790 100644
--- a/clang/test/CodeGen/builtins-nvptx.c
+++ b/clang/test/CodeGen/builtins-nvptx.c
@@ -339,94 +339,94 @@ __device__ void nvvm_atom(float *fp, float f, double 
*dfp, double df,
                           unsigned short *usp, unsigned short us, int *ip,
                           int i, unsigned int *uip, unsigned ui, long *lp,
                           long l, long long *llp, long long ll) {
-  // CHECK: atomicrmw add ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw add ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_add_gen_i(ip, i);
-  // CHECK: atomicrmw add ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw add ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_add_gen_l(&dl, l);
-  // CHECK: atomicrmw add ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw add ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_add_gen_ll(&sll, ll);
 
-  // CHECK: atomicrmw sub ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw sub ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_sub_gen_i(ip, i);
-  // CHECK: atomicrmw sub ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw sub ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_sub_gen_l(&dl, l);
-  // CHECK: atomicrmw sub ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw sub ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_sub_gen_ll(&sll, ll);
 
-  // CHECK: atomicrmw and ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw and ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_and_gen_i(ip, i);
-  // CHECK: atomicrmw and ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw and ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_and_gen_l(&dl, l);
-  // CHECK: atomicrmw and ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw and ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_and_gen_ll(&sll, ll);
 
-  // CHECK: atomicrmw or ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw or ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_or_gen_i(ip, i);
-  // CHECK: atomicrmw or ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw or ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_or_gen_l(&dl, l);
-  // CHECK: atomicrmw or ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw or ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_or_gen_ll(&sll, ll);
 
-  // CHECK: atomicrmw xor ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw xor ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_xor_gen_i(ip, i);
-  // CHECK: atomicrmw xor ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw xor ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_xor_gen_l(&dl, l);
-  // CHECK: atomicrmw xor ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw xor ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_xor_gen_ll(&sll, ll);
 
-  // CHECK: atomicrmw xchg ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw xchg ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_xchg_gen_i(ip, i);
-  // CHECK: atomicrmw xchg ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw xchg ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_xchg_gen_l(&dl, l);
-  // CHECK: atomicrmw xchg ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw xchg ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_xchg_gen_ll(&sll, ll);
 
-  // CHECK: atomicrmw max ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw max ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_max_gen_i(ip, i);
-  // CHECK: atomicrmw umax ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw umax ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_max_gen_ui((unsigned int *)ip, i);
-  // CHECK: atomicrmw max ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw max ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_max_gen_l(&dl, l);
-  // CHECK: atomicrmw umax ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw umax ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_max_gen_ul((unsigned long *)&dl, l);
-  // CHECK: atomicrmw max ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw max ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_max_gen_ll(&sll, ll);
-  // CHECK: atomicrmw umax ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw umax ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_max_gen_ull((unsigned long long *)&sll, ll);
 
-  // CHECK: atomicrmw min ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw min ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_min_gen_i(ip, i);
-  // CHECK: atomicrmw umin ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw umin ptr {{.*}} syncscope("device") monotonic, align 4
   __nvvm_atom_min_gen_ui((unsigned int *)ip, i);
-  // CHECK: atomicrmw min ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw min ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_min_gen_l(&dl, l);
-  // CHECK: atomicrmw umin ptr {{.*}} monotonic, align {{4|8}}
+  // CHECK: atomicrmw umin ptr {{.*}} syncscope("device") monotonic, align 
{{4|8}}
   __nvvm_atom_min_gen_ul((unsigned long *)&dl, l);
-  // CHECK: atomicrmw min ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw min ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_min_gen_ll(&sll, ll);
-  // CHECK: atomicrmw umin ptr {{.*}} monotonic, align 8
+  // CHECK: atomicrmw umin ptr {{.*}} syncscope("device") monotonic, align 8
   __nvvm_atom_min_gen_ull((unsigned long long *)&sll, ll);
 
-  // CHECK: cmpxchg ptr {{.*}} monotonic monotonic, align 4
+  // CHECK: cmpxchg ptr {{.*}} syncscope("device") monotonic monotonic, align 4
   // CHECK-NEXT: extractvalue { i32, i1 } {{%[0-9]+}}, 0
   __nvvm_atom_cas_gen_i(ip, 0, i);
-  // CHECK: cmpxchg ptr {{.*}} monotonic monotonic, align {{4|8}}
+  // CHECK: cmpxchg ptr {{.*}} syncscope("device") monotonic monotonic, align 
{{4|8}}
   // CHECK-NEXT: extractvalue { {{i32|i64}}, i1 } {{%[0-9]+}}, 0
   __nvvm_atom_cas_gen_l(&dl, 0, l);
-  // CHECK: cmpxchg ptr {{.*}} monotonic monotonic, align 8
+  // CHECK: cmpxchg ptr {{.*}} syncscope("device") monotonic monotonic, align 8
   // CHECK-NEXT: extractvalue { i64, i1 } {{%[0-9]+}}, 0
   __nvvm_atom_cas_gen_ll(&sll, 0, ll);
 
   // CUDA's atomicAdd() lowers to this builtin. The native atom.add has a fixed
   // denormal behavior, so the atomic is marked to keep it from being expanded
   // into a CAS loop when the function's denormal mode disagrees.
-  // CHECK: atomicrmw fadd ptr {{.*}} monotonic, align 4, 
!atomic.ignore.denormal.mode
+  // CHECK: atomicrmw fadd ptr {{.*}} syncscope("device") monotonic, align 4, 
!atomic.ignore.denormal.mode
   __nvvm_atom_add_gen_f(fp, f);
 
-  // CHECK: atomicrmw uinc_wrap ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw uinc_wrap ptr {{.*}} syncscope("device") monotonic, 
align 4
   __nvvm_atom_inc_gen_ui(uip, ui);
 
-  // CHECK: atomicrmw udec_wrap ptr {{.*}} monotonic, align 4
+  // CHECK: atomicrmw udec_wrap ptr {{.*}} syncscope("device") monotonic, 
align 4
   __nvvm_atom_dec_gen_ui(uip, ui);
 
 
diff --git a/clang/test/CodeGenCUDA/atomic-ignore-denormal-mode-nvptx.cu 
b/clang/test/CodeGenCUDA/atomic-ignore-denormal-mode-nvptx.cu
index e3ae34322a83d9..ba5eecfd37580e 100644
--- a/clang/test/CodeGenCUDA/atomic-ignore-denormal-mode-nvptx.cu
+++ b/clang/test/CodeGenCUDA/atomic-ignore-denormal-mode-nvptx.cu
@@ -169,7 +169,7 @@ __device__ void test_attr_off(float *a) {
 // DEV-NEXT:    store float [[V]], ptr [[V_ADDR]], align 4
 // DEV-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
 // DEV-NEXT:    [[TMP1:%.*]] = load float, ptr [[V_ADDR]], align 4
-// DEV-NEXT:    [[TMP2:%.*]] = atomicrmw fadd ptr [[TMP0]], float [[TMP1]] 
monotonic, align 4, !atomic.ignore.denormal.mode [[META2]]
+// DEV-NEXT:    [[TMP2:%.*]] = atomicrmw fadd ptr [[TMP0]], float [[TMP1]] 
syncscope("device") monotonic, align 4, !atomic.ignore.denormal.mode [[META2]]
 // DEV-NEXT:    ret float [[TMP2]]
 //
 // OPT-LABEL: define dso_local noundef float @_Z23test_atomic_add_builtinPff(
@@ -181,7 +181,7 @@ __device__ void test_attr_off(float *a) {
 // OPT-NEXT:    store float [[V]], ptr [[V_ADDR]], align 4
 // OPT-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
 // OPT-NEXT:    [[TMP1:%.*]] = load float, ptr [[V_ADDR]], align 4
-// OPT-NEXT:    [[TMP2:%.*]] = atomicrmw fadd ptr [[TMP0]], float [[TMP1]] 
monotonic, align 4, !atomic.ignore.denormal.mode [[META2]]
+// OPT-NEXT:    [[TMP2:%.*]] = atomicrmw fadd ptr [[TMP0]], float [[TMP1]] 
syncscope("device") monotonic, align 4, !atomic.ignore.denormal.mode [[META2]]
 // OPT-NEXT:    ret float [[TMP2]]
 //
 __device__ float test_atomic_add_builtin(float *a, float v) {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to