[flang-commits] [flang] 8870ce1 - [flang][docs] Add note about Cray pointers and the TARGET attribute (#137993)

via flang-commits flang-commits at lists.llvm.org
Mon May 5 08:32:12 PDT 2025


Author: Asher Mancinelli
Date: 2025-05-05T08:32:08-07:00
New Revision: 8870ce1aa0ddf4df4f25ae834a1fab167895892d

URL: https://github.com/llvm/llvm-project/commit/8870ce1aa0ddf4df4f25ae834a1fab167895892d
DIFF: https://github.com/llvm/llvm-project/commit/8870ce1aa0ddf4df4f25ae834a1fab167895892d.diff

LOG: [flang][docs] Add note about Cray pointers and the TARGET attribute (#137993)

We found some tests checking for loops assigning between Cray pointer
handles and their pointees which produced "incorrect" results with
optimizations enabled; this is because the compiler expects Cray
pointers not to alias with any other entity.

[The HPE documentation for Cray Fortran extensions
specifies:](https://support.hpe.com/hpesc/public/docDisplay?docId=a00113911en_us&docLocale=en_US&page=Types.html#cray-poiter-type)

> the compiler assumes that the storage of a pointee is
> never overlaid on the storage of another variable

Jean pointed out that if a user's code uses entities that alias via Cray
pointers, they may add the TARGET attribute to inform Flang of this
aliasing, but that Flang's behavior is in line with Cray's own
documentation and we should not make any changes to our alias analysis
to try and detect this case.

Updating documentation so that users that encounter this situation have
a way to allow their code to compile as they intend.

Added: 
    

Modified: 
    flang/docs/Aliasing.md

Removed: 
    


################################################################################
diff  --git a/flang/docs/Aliasing.md b/flang/docs/Aliasing.md
index 652b766541fd4..d5edf59f37c6e 100644
--- a/flang/docs/Aliasing.md
+++ b/flang/docs/Aliasing.md
@@ -264,11 +264,30 @@ Fortran also has no rule against associating read-only data with a pointer.
 Cray pointers are, or were, an extension that attempted to provide
 some of the capabilities of modern pointers and allocatables before those
 features were standardized.
-They had some aliasing restrictions; in particular, Cray pointers were
-not allowed to alias each other.
 
-They are now more or less obsolete and we have no plan in place to
-support them.
+They had some aliasing restrictions; in particular, Cray pointers were not
+allowed to alias each other.
+
+In this example, `handle` aliases with `target`.
+
+```
+integer(kind=8) :: target(10)
+integer(kind=8) :: ptr
+integer(kind=8) :: handle(10)
+pointer(ptr, handle)
+target = 1
+ptr = loc(target)
+print *, target
+end
+```
+
+Optimizations assume that Cray pointers do not alias any other variables.
+In the above example, it is assumed that `handle` and `target` do not alias,
+and optimizations will treat them as separate entities.
+
+In order to disable optimizations that assume that there is no aliasing between
+Cray pointer targets and entities they alias with, add the TARGET attribute to
+variables aliasing with a Cray pointer (the `target` variable in this example).
 
 ## Type considerations
 


        


More information about the flang-commits mailing list