.. _omp113:

Could not move globalized variable to the stack. Variable is potentially captured in call. Mark parameter as `__attribute__((noescape))` to override. [OMP113]
==============================================================================================================================================================

This missed remark indicates that a globalized value could not be moved to the
stack because it is potentially captured by a call to a function we cannot
analyze. In order for a globalized variable to be moved to the stack, copies to
its pointer cannot be stored. Otherwise it is considered captured and could
potentially be shared between the threads. This can be overridden using a
parameter level attribute as suggested in the remark text.

Globalization will occur when a pointer to a thread-local variable escapes the
current scope. In most cases it can be determined that the variable cannot be
shared if a copy of its pointer is never made. However, this remark indicates a
copy of the pointer is present or that sharing is possible because it is used
outside the current translation unit.

Examples
--------

If a pointer to a thread-local variable is passed to a function not visible in
the current translation unit we need to assume a copy is made of it that can be
shared between the threads. This prevents :ref:`OMP110 <omp110>` from
triggering, which will result in a performance penalty when executing on the
target device.

.. code-block:: c++

  extern 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 -O2 -Rpass-missed=openmp-opt omp113.cpp
   missed.cpp:4:7: remark: Could not move globalized variable to the stack. Variable is
   potentially captured in call. Mark parameter as `__attribute__((noescape))` to
   override. [OMP113]
     int x;
         ^

As the remark suggests, this behaviour can be overridden using the ``noescape``
attribute. This tells the compiler that no reference to the object the pointer
points to that is derived from the parameter value will survive after the
function returns. The user is responsible for verifying that this assertion is
correct.

.. code-block:: c++

  extern void use(__attribute__((noescape)) int *x);

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

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

.. code-block:: console

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

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

OpenMP target offloading missed remark.
