[flang-commits] [flang] [flang] Define ATOMIC_ADD as an intrinsic procedure (PR #122993)
via flang-commits
flang-commits at lists.llvm.org
Tue Jan 14 16:48:02 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Peter Klausler (klausler)
<details>
<summary>Changes</summary>
This one appears to have been omitted when other ATOMIC_xxx intrinsic procedures were defined. There's already tests for it, but they apparently work even when ATOMIC_ADD must be interpreted as an external procedure with an implicit interface. Extend the tests with INTRINSIC NONE(EXTERNAL, TYPE) statements to ensure that they require the intrinsic interpretation.
---
Full diff: https://github.com/llvm/llvm-project/pull/122993.diff
12 Files Affected:
- (modified) flang/lib/Evaluate/intrinsics.cpp (+10-3)
- (modified) flang/test/Semantics/atomic01.f90 (+1-1)
- (modified) flang/test/Semantics/atomic02.f90 (+1-1)
- (modified) flang/test/Semantics/atomic03.f90 (+1-1)
- (modified) flang/test/Semantics/atomic04.f90 (+1-1)
- (modified) flang/test/Semantics/atomic05.f90 (+1-1)
- (modified) flang/test/Semantics/atomic06.f90 (+1-1)
- (modified) flang/test/Semantics/atomic07.f90 (+1-1)
- (modified) flang/test/Semantics/atomic08.f90 (+1-1)
- (modified) flang/test/Semantics/atomic09.f90 (+1-1)
- (modified) flang/test/Semantics/atomic10.f90 (+1-1)
- (modified) flang/test/Semantics/atomic11.f90 (+1-1)
``````````diff
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index f234241cfe14a6..678ceecd8410a5 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -1311,6 +1311,14 @@ static const SpecificIntrinsicInterface specificIntrinsicFunction[]{
static const IntrinsicInterface intrinsicSubroutine[]{
{"abort", {}, {}, Rank::elemental, IntrinsicClass::impureSubroutine},
+ {"atomic_add",
+ {{"atom", AtomicInt, Rank::atom, Optionality::required,
+ common::Intent::InOut},
+ {"value", AnyInt, Rank::scalar, Optionality::required,
+ common::Intent::In},
+ {"stat", AnyInt, Rank::scalar, Optionality::optional,
+ common::Intent::Out}},
+ {}, Rank::elemental, IntrinsicClass::atomicSubroutine},
{"atomic_and",
{{"atom", AtomicInt, Rank::atom, Optionality::required,
common::Intent::InOut},
@@ -1585,7 +1593,6 @@ static const IntrinsicInterface intrinsicSubroutine[]{
};
// TODO: Intrinsic subroutine EVENT_QUERY
-// TODO: Atomic intrinsic subroutines: ATOMIC_ADD
// TODO: Collective intrinsic subroutines: co_reduce
// Finds a built-in derived type and returns it as a DynamicType.
@@ -3232,8 +3239,8 @@ static bool ApplySpecificChecks(SpecificCall &call, FoldingContext &context) {
arg ? arg->sourceLocation() : context.messages().at(),
"Argument of ALLOCATED() must be an ALLOCATABLE object or component"_err_en_US);
}
- } else if (name == "atomic_and" || name == "atomic_or" ||
- name == "atomic_xor") {
+ } else if (name == "atomic_add" || name == "atomic_and" ||
+ name == "atomic_or" || name == "atomic_xor") {
return CheckForCoindexedObject(
context.messages(), call.arguments[2], name, "stat");
} else if (name == "atomic_cas") {
diff --git a/flang/test/Semantics/atomic01.f90 b/flang/test/Semantics/atomic01.f90
index 046692e87c4adc..c696acd5163da3 100644
--- a/flang/test/Semantics/atomic01.f90
+++ b/flang/test/Semantics/atomic01.f90
@@ -5,7 +5,7 @@
program test_atomic_add
use iso_fortran_env, only : atomic_int_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) atom_object[*], atom_array(2)[*], quantity, array(1), coarray[*], non_coarray
integer non_atom_object[*], non_atom, non_scalar(1), status, stat_array(1), coindexed[*]
diff --git a/flang/test/Semantics/atomic02.f90 b/flang/test/Semantics/atomic02.f90
index 10a7c126dbb6d4..484239a23ede2f 100644
--- a/flang/test/Semantics/atomic02.f90
+++ b/flang/test/Semantics/atomic02.f90
@@ -4,7 +4,7 @@
program test_atomic_and
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic03.f90 b/flang/test/Semantics/atomic03.f90
index 9bb1d1c0df6b17..68313a1386474b 100644
--- a/flang/test/Semantics/atomic03.f90
+++ b/flang/test/Semantics/atomic03.f90
@@ -4,7 +4,7 @@
program test_atomic_cas
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: int_scalar_coarray[*], non_scalar_coarray(10)[*], non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], array(10)
diff --git a/flang/test/Semantics/atomic04.f90 b/flang/test/Semantics/atomic04.f90
index f065bf6404f1a3..c4b21fa19eafa6 100644
--- a/flang/test/Semantics/atomic04.f90
+++ b/flang/test/Semantics/atomic04.f90
@@ -4,7 +4,7 @@
program test_atomic_define
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic05.f90 b/flang/test/Semantics/atomic05.f90
index 04c29cdd6046ba..98d6b19b1f23d1 100644
--- a/flang/test/Semantics/atomic05.f90
+++ b/flang/test/Semantics/atomic05.f90
@@ -4,7 +4,7 @@
program test_atomic_fetch_add
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic06.f90 b/flang/test/Semantics/atomic06.f90
index e6307d129262e6..c6a23dd0077ca2 100644
--- a/flang/test/Semantics/atomic06.f90
+++ b/flang/test/Semantics/atomic06.f90
@@ -4,7 +4,7 @@
program test_atomic_fetch_and
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic07.f90 b/flang/test/Semantics/atomic07.f90
index 0ac7ad152e86b8..2bc544b7578642 100644
--- a/flang/test/Semantics/atomic07.f90
+++ b/flang/test/Semantics/atomic07.f90
@@ -4,7 +4,7 @@
program test_atomic_fetch_or
use iso_fortran_env, only: atomic_int_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10), val_coarray[*], old_val_coarray[*]
diff --git a/flang/test/Semantics/atomic08.f90 b/flang/test/Semantics/atomic08.f90
index a08512f1c7fe80..f519f9735e00e4 100644
--- a/flang/test/Semantics/atomic08.f90
+++ b/flang/test/Semantics/atomic08.f90
@@ -4,7 +4,7 @@
program test_atomic_fetch_xor
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic09.f90 b/flang/test/Semantics/atomic09.f90
index fc09724d53bc0d..e4e062252659a6 100644
--- a/flang/test/Semantics/atomic09.f90
+++ b/flang/test/Semantics/atomic09.f90
@@ -4,7 +4,7 @@
program test_atomic_or
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic10.f90 b/flang/test/Semantics/atomic10.f90
index 46fcf537f18100..13900c4dcc21a3 100644
--- a/flang/test/Semantics/atomic10.f90
+++ b/flang/test/Semantics/atomic10.f90
@@ -4,7 +4,7 @@
program test_atomic_ref
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)
diff --git a/flang/test/Semantics/atomic11.f90 b/flang/test/Semantics/atomic11.f90
index 1c50825e5541f4..d4f951ea02c322 100644
--- a/flang/test/Semantics/atomic11.f90
+++ b/flang/test/Semantics/atomic11.f90
@@ -4,7 +4,7 @@
program test_atomic_xor
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
- implicit none
+ implicit none(external, type)
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)
``````````
</details>
https://github.com/llvm/llvm-project/pull/122993
More information about the flang-commits
mailing list