.. _omp110:

Moving globalized variable to the stack. [OMP110]
=================================================

This optimization remark indicates that a globalized variable was moved back to
thread-local stack memory on the device. This occurs when the optimization pass
can determine that a globalized variable cannot possibly be shared between
threads and globalization was ultimately unnecessary. Using stack memory is the
best-case scenario for data globalization as the variable can now be stored in
fast register files on the device. This optimization requires full visibility of
each variable.

Globalization typically occurs when a pointer to a thread-local variable escapes
the current scope. The compiler needs to be pessimistic and assume that the
pointer could be shared between multiple threads according to the OpenMP
standard. This is expensive on target offloading devices that do not allow
threads to share data by default. Instead, this data must be moved to memory
that can be shared, such as shared or global memory. This optimization moves the
data back from shared or global memory to thread-local stack memory if the data
is not actually shared between the threads.

Examples
--------

A trivial example of globalization occurring can be seen with this example. The
compiler sees that a pointer to the thread-local variable ``x`` escapes the
current scope and must globalize it even though it is not actually necessary.
Fortunately, this optimization can undo this by looking at its usage.

.. code-block:: c++

  void use(int *x) { }

  void foo() {
    int x;
    use(&x);
  }

  int main() {
  #pragma omp target parallel
    foo();
  }

.. code-block:: console

  $ clang++ -fopenmp -fopenmp-targets=nvptx64 omp110.cpp -O1 -Rpass=openmp-opt
  omp110.cpp:6:7: remark: Moving globalized variable to the stack. [OMP110]
    int x;
        ^

A less trivial example can be seen using C++'s complex numbers. In this case the
overloaded arithmetic operators cause pointers to the complex numbers to escape
the current scope, but they can again be removed once the usage is visible.

.. code-block:: c++

  #include <complex>

  using complex = std::complex<double>;

  void zaxpy(complex *X, complex *Y, const complex D, int N) {
  #pragma omp target teams distribute parallel for firstprivate(D)
    for (int i = 0; i < N; ++i)
      Y[i] = D * X[i] + Y[i];
  }

.. code-block:: console

  $ clang++ -fopenmp -fopenmp-targets=nvptx64 omp110.cpp -O1 -Rpass=openmp-opt
  In file included from omp110.cpp:1:
  In file included from /usr/bin/clang/lib/clang/13.0.0/include/openmp_wrappers/complex:27:
  /usr/include/c++/8/complex:328:20: remark: Moving globalized variable to the stack. [OMP110]
        complex<_Tp> __r = __x;
                     ^
  /usr/include/c++/8/complex:388:20: remark: Moving globalized variable to the stack. [OMP110]
        complex<_Tp> __r = __x;
                     ^

Diagnostic Scope
----------------

OpenMP target offloading optimization remark.
