[flang] Add FIR attributes and apply them to dummy arguments (#115686)

To determine if a function's dummy argument is nocapture, add the
asynchronous attribute to the FIR attribute. The volatile attribute will
also be used to determine nocapture assignment, but this will remain a
TODO until other processing using volatile is implemented.

I will post another patch to apply nocapture. See also the discussion in
the following discourse post.

https://discourse.llvm.org/t/applying-the-nocapture-attribute-to-reference-passed-arguments-in-fortran-subroutines/81401
This commit is contained in:
s-watanabe314 2024-11-14 14:18:26 +09:00 committed by GitHub
parent d3da78863c
commit 0b54e33fd5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 30 additions and 7 deletions

View File

@ -75,6 +75,16 @@ constexpr llvm::StringRef getOptionalAttrName() { return "fir.optional"; }
/// Attribute to mark Fortran entities with the TARGET attribute.
static constexpr llvm::StringRef getTargetAttrName() { return "fir.target"; }
/// Attribute to mark Fortran entities with the ASYNCHRONOUS attribute.
static constexpr llvm::StringRef getAsynchronousAttrName() {
return "fir.asynchronous";
}
/// Attribute to mark Fortran entities with the VOLATILE attribute.
static constexpr llvm::StringRef getVolatileAttrName() {
return "fir.volatile";
}
/// Attribute to mark that a function argument is a character dummy procedure.
/// Character dummy procedure have special ABI constraints.
static constexpr llvm::StringRef getCharacterProcedureDummyAttrName() {

View File

@ -1107,17 +1107,22 @@ private:
};
if (obj.attrs.test(Attrs::Optional))
addMLIRAttr(fir::getOptionalAttrName());
// Skipping obj.attrs.test(Attrs::Asynchronous), this does not impact the
// way the argument is passed given flang implement asynch IO synchronously.
// TODO: it would be safer to treat them as volatile because since Fortran
// 2018 asynchronous can also be used for C defined asynchronous user
// processes (see 18.10.4 Asynchronous communication).
if (obj.attrs.test(Attrs::Contiguous))
addMLIRAttr(fir::getContiguousAttrName());
if (obj.attrs.test(Attrs::Value))
isValueAttr = true; // TODO: do we want an mlir::Attribute as well?
if (obj.attrs.test(Attrs::Volatile))
if (obj.attrs.test(Attrs::Volatile)) {
TODO(loc, "VOLATILE in procedure interface");
addMLIRAttr(fir::getVolatileAttrName());
}
// obj.attrs.test(Attrs::Asynchronous) does not impact the way the argument
// is passed given flang implement asynch IO synchronously. However, it's
// added to determine whether the argument is captured.
// TODO: it would be safer to treat them as volatile because since Fortran
// 2018 asynchronous can also be used for C defined asynchronous user
// processes (see 18.10.4 Asynchronous communication).
if (obj.attrs.test(Attrs::Asynchronous))
addMLIRAttr(fir::getAsynchronousAttrName());
if (obj.attrs.test(Attrs::Target))
addMLIRAttr(fir::getTargetAttrName());
if (obj.cudaDataAttr)

View File

@ -416,7 +416,7 @@ end subroutine
! CHECK: }
! CHECK-LABEL: func.func @_QPtest_rank_star_attributes(
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<*:f32>> {fir.bindc_name = "x", fir.optional, fir.target}) {
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<*:f32>> {fir.asynchronous, fir.bindc_name = "x", fir.optional, fir.target}) {
! CHECK: %[[VAL_1:.*]] = fir.dummy_scope : !fir.dscope
! CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_1]] {fortran_attrs = #fir.var_attrs<asynchronous, optional, target>, uniq_name = "_QFtest_rank_star_attributesEx"} : (!fir.box<!fir.array<*:f32>>, !fir.dscope) -> (!fir.box<!fir.array<*:f32>>, !fir.box<!fir.array<*:f32>>)
! CHECK: %[[VAL_3:.*]] = arith.constant 2 : i8

View File

@ -27,3 +27,11 @@ end subroutine
subroutine foo3(x)
real, optional, contiguous :: x(:)
end subroutine
! CHECK-LABEL: func @_QPfoo4
! CHECK-SAME: %arg0: !fir.ref<f32> {fir.bindc_name = "x", fir.target}
! CHECK-SAME: %arg1: !fir.ref<f32> {fir.asynchronous, fir.bindc_name = "y"}
subroutine foo4(x, y)
real, target :: x
real, asynchronous :: y
end subroutine