================
@@ -366,22 +360,55 @@ bool SemaAMDGPU::checkCoopAtomicFunctionCall(CallExpr 
*TheCall, bool IsStore) {
   // Atomic ordering cannot be acq_rel in any case, acquire for stores or
   // release for loads.
   if (!llvm::isValidAtomicOrderingCABI((unsigned)Ord) ||
-      (Ord == llvm::AtomicOrderingCABI::acq_rel) ||
-      Ord == (IsStore ? llvm::AtomicOrderingCABI::acquire
-                      : llvm::AtomicOrderingCABI::release)) {
+      (!(MayLoad && MayStore) && (Ord == llvm::AtomicOrderingCABI::acq_rel)) ||
+      (!MayLoad && Ord == llvm::AtomicOrderingCABI::acquire) ||
+      (!MayStore && Ord == llvm::AtomicOrderingCABI::release)) {
     return Diag(AtomicOrdArg->getBeginLoc(),
                 diag::warn_atomic_op_has_invalid_memory_order)
            << 0 << AtomicOrdArg->getSourceRange();
   }
 
-  // Last argument is a string literal
+  return false;
+}
+
+bool SemaAMDGPU::checkStringLiteralArg(CallExpr *TheCall, unsigned ArgIdx) {
   Expr *Arg = TheCall->getArg(TheCall->getNumArgs() - 1);
   if (!isa<StringLiteral>(Arg->IgnoreParenImpCasts())) {
-    Fail = true;
     Diag(TheCall->getBeginLoc(), diag::err_expr_not_string_literal)
         << Arg->getSourceRange();
+    return true;
+  }
+  return false;
+}
+
+bool SemaAMDGPU::checkCoopAtomicFunctionCall(CallExpr *TheCall, bool IsStore) {
+  bool Fail = false;
+
+  // First argument is a global or generic pointer.
+  Expr *PtrArg = TheCall->getArg(0);
+  QualType PtrTy = PtrArg->getType()->getPointeeType();
+  unsigned AS = getASTContext().getTargetAddressSpace(PtrTy.getAddressSpace());
+  if (AS != llvm::AMDGPUAS::FLAT_ADDRESS &&
+      AS != llvm::AMDGPUAS::GLOBAL_ADDRESS) {
+    Fail = true;
+    Diag(TheCall->getBeginLoc(), diag::err_amdgcn_coop_atomic_invalid_as)
+        << PtrArg->getSourceRange();
   }
 
+  // Check atomic ordering
+  Fail |= checkAtomicOrderingCABIArg(
+      TheCall, IsStore ? 2 : 1, /*MayLoad=*/!IsStore, /*MayStore=*/IsStore);
+  // Last argument is the syncscope as a string literal.
+  Fail |= checkStringLiteralArg(TheCall, TheCall->getNumArgs() - 1);
+
+  return Fail;
+}
+
+bool SemaAMDGPU::checkAtomicMonitorLoad(CallExpr *TheCall) {
+  bool Fail = false;
+  Fail |= checkAtomicOrderingCABIArg(TheCall, 1, /*MayLoad=*/true,
+                                     /*MayStore=*/false);
+  Fail |= checkStringLiteralArg(TheCall, 2);
   return Fail;
----------------
jhuber6 wrote:

```suggestion
  if (checkAtomicOrderingCABIArg(TheCall, 1, /*MayLoad=*/true,
                                     /*MayStore=*/false))
    return true;
  return checkStringLiteralArg(TheCall, 2);
```
Personal preference, up to you.

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

Reply via email to