diff options
Diffstat (limited to 'clang')
78 files changed, 4676 insertions, 1630 deletions
| diff --git a/clang/AreaTeamMembers.txt b/clang/AreaTeamMembers.txt index 964d11e..2928943 100644 --- a/clang/AreaTeamMembers.txt +++ b/clang/AreaTeamMembers.txt @@ -13,5 +13,5 @@ rnk@google.com (email), rnk (Discourse), rnk (GitHub), rnk (Discord)  Other Members  -------------  Eli Friedman -efriedma@quicinc.com> (email), efriedma-quic (Discourse), efriedma-quic (GitHub) +efriedma@qti.qualcomm.com> (email), efriedma-quic (Discourse), efriedma-quic (GitHub) diff --git a/clang/Maintainers.rst b/clang/Maintainers.rst index 8fb2201..1d16ea9 100644 --- a/clang/Maintainers.rst +++ b/clang/Maintainers.rst @@ -46,7 +46,7 @@ Clang LLVM IR generation  | rjmccall\@apple.com (email), rjmccall (Phabricator), rjmccall (GitHub)  | Eli Friedman -| efriedma\@quicinc.com (email), efriedma (Phabricator), efriedma-quic (GitHub) +| efriedma\@qti.qualcomm.com (email), efriedma (Phabricator), efriedma-quic (GitHub)  | Anton Korobeynikov  | anton\@korobeynikov.info (email), asl (Phabricator), asl (GitHub) diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py index 2786add..c48bc9c 100644 --- a/clang/bindings/python/clang/cindex.py +++ b/clang/bindings/python/clang/cindex.py @@ -2363,6 +2363,13 @@ class Cursor(Structure):          return conf.lib.clang_getFieldDeclBitWidth(self)  # type: ignore [no-any-return]      @cursor_null_guard +    def is_function_inlined(self) -> bool: +        """ +        Check if the function is inlined. +        """ +        return bool(conf.lib.clang_Cursor_isFunctionInlined(self)) + +    @cursor_null_guard      def has_attrs(self) -> bool:          """          Determine whether the given cursor has any attributes. @@ -4310,6 +4317,7 @@ FUNCTION_LIST: list[LibFunc] = [      ("clang_Cursor_isAnonymous", [Cursor], bool),      ("clang_Cursor_isAnonymousRecordDecl", [Cursor], bool),      ("clang_Cursor_isBitField", [Cursor], bool), +    ("clang_Cursor_isFunctionInlined", [Cursor], c_uint),      ("clang_Location_isInSystemHeader", [SourceLocation], bool),      ("clang_PrintingPolicy_dispose", [PrintingPolicy]),      ("clang_PrintingPolicy_getProperty", [PrintingPolicy, c_int], c_uint), diff --git a/clang/bindings/python/tests/cindex/test_cursor.py b/clang/bindings/python/tests/cindex/test_cursor.py index eb0d1d5..7cb616a7 100644 --- a/clang/bindings/python/tests/cindex/test_cursor.py +++ b/clang/bindings/python/tests/cindex/test_cursor.py @@ -784,6 +784,21 @@ int count(int a, int b){          cursor = get_cursor(tu, "reg")          self.assertEqual(cursor.storage_class, StorageClass.REGISTER) +    def test_function_inlined(self): +        tu = get_tu( +            """ +inline void f_inline(void); +void f_noninline(void); +int d_noninline; +""" +        ) +        cursor = get_cursor(tu, "f_inline") +        self.assertEqual(cursor.is_function_inlined(), True) +        cursor = get_cursor(tu, "f_noninline") +        self.assertEqual(cursor.is_function_inlined(), False) +        cursor = get_cursor(tu, "d_noninline") +        self.assertEqual(cursor.is_function_inlined(), False) +      def test_availability(self):          tu = get_tu("class A { A(A const&) = delete; };", lang="cpp") diff --git a/clang/docs/AMDGPUSupport.rst b/clang/docs/AMDGPUSupport.rst index 3eada5f..18e3de8 100644 --- a/clang/docs/AMDGPUSupport.rst +++ b/clang/docs/AMDGPUSupport.rst @@ -49,10 +49,6 @@ Predefined Macros       - Defined as 1 if the CU mode is enabled and 0 if the WGP mode is enabled.     * - ``__AMDGCN_UNSAFE_FP_ATOMICS__``       - Defined if unsafe floating-point atomics are allowed. -   * - ``__AMDGCN_WAVEFRONT_SIZE__`` -     - Defines the wavefront size. Allowed values are 32 and 64 (deprecated). -   * - ``__AMDGCN_WAVEFRONT_SIZE`` -     - Alias to ``__AMDGCN_WAVEFRONT_SIZE__`` (deprecated).     * - ``__HAS_FMAF__``       - Defined if FMAF instruction is available (deprecated).     * - ``__HAS_LDEXPF__`` diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst index 570cab2..0b4a484 100644 --- a/clang/docs/ClangFormatStyleOptions.rst +++ b/clang/docs/ClangFormatStyleOptions.rst @@ -197,57 +197,29 @@ the configuration (without a prefix: ``Auto``).  .. _AlignAfterOpenBracket: -**AlignAfterOpenBracket** (``BracketAlignmentStyle``) :versionbadge:`clang-format 3.8` :ref:`¶ <AlignAfterOpenBracket>` +**AlignAfterOpenBracket** (``Boolean``) :versionbadge:`clang-format 3.8` :ref:`¶ <AlignAfterOpenBracket>`    If ``true``, horizontally aligns arguments after an open bracket. -  This applies to round brackets (parentheses), angle brackets and square -  brackets. - -  Possible values: - -  * ``BAS_Align`` (in configuration: ``Align``) -    Align parameters on the open bracket, e.g.: - -    .. code-block:: c++ - -      someLongFunction(argument1, -                       argument2); - -  * ``BAS_DontAlign`` (in configuration: ``DontAlign``) -    Don't align, instead use ``ContinuationIndentWidth``, e.g.: - -    .. code-block:: c++ - -      someLongFunction(argument1, -          argument2); - -  * ``BAS_AlwaysBreak`` (in configuration: ``AlwaysBreak``) -    Always break after an open bracket, if the parameters don't fit -    on a single line, e.g.: - -    .. code-block:: c++ -      someLongFunction( -          argument1, argument2); - -  * ``BAS_BlockIndent`` (in configuration: ``BlockIndent``) -    Always break after an open bracket, if the parameters don't fit -    on a single line. Closing brackets will be placed on a new line. -    E.g.: - -    .. code-block:: c++ +  .. code-block:: c++ -      someLongFunction( -          argument1, argument2 -      ) +    true:                         vs.   false +    someLongFunction(argument1,         someLongFunction(argument1, +                     argument2);            argument2); -    .. note:: - -     This currently only applies to braced initializer lists (when -     ``Cpp11BracedListStyle`` is not ``Block``) and parentheses. +  .. note:: +    As of clang-format 22 this option is a bool with the previous +    option of ``Align`` replaced with ``true``, ``DontAlign`` replaced +    with ``false``, and the options of ``AlwaysBreak`` and ``BlockIndent`` +    replaced with ``true`` and with setting of new style options using +    ``BreakAfterOpenBracketBracedList``, ``BreakAfterOpenBracketFunction``, +    ``BreakAfterOpenBracketIf``, ``BreakBeforeCloseBracketBracedList``, +    ``BreakBeforeCloseBracketFunction``, and ``BreakBeforeCloseBracketIf``. +  This applies to round brackets (parentheses), angle brackets and square +  brackets.  .. _AlignArrayOfStructures: @@ -2746,6 +2718,67 @@ the configuration (without a prefix: ``Auto``).       @Mock       DataLoad loader; +.. _BreakAfterOpenBracketBracedList: + +**BreakAfterOpenBracketBracedList** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakAfterOpenBracketBracedList>` +  Force break after the left bracket of a braced initializer list (when +  ``Cpp11BracedListStyle`` is ``true``) when the list exceeds the column +  limit. + +  .. code-block:: c++ + +    true:                             false: +    vector<int> x {         vs.       vector<int> x {1, +       1, 2, 3}                            2, 3} + +.. _BreakAfterOpenBracketFunction: + +**BreakAfterOpenBracketFunction** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakAfterOpenBracketFunction>` +  Force break after the left parenthesis of a function (declaration, +  definition, call) when the parameters exceed the column limit. + +  .. code-block:: c++ + +    true:                             false: +    foo (                   vs.       foo (a, +       a , b)                              b) + +.. _BreakAfterOpenBracketIf: + +**BreakAfterOpenBracketIf** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakAfterOpenBracketIf>` +  Force break after the left parenthesis of an if control statement +  when the expression exceeds the column limit. + +  .. code-block:: c++ + +    true:                             false: +    if constexpr (          vs.       if constexpr (a || +       a || b)                                      b) + +.. _BreakAfterOpenBracketLoop: + +**BreakAfterOpenBracketLoop** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakAfterOpenBracketLoop>` +  Force break after the left parenthesis of a loop control statement +  when the expression exceeds the column limit. + +  .. code-block:: c++ + +    true:                             false: +    while (                  vs.      while (a && +       a && b) {                             b) { + +.. _BreakAfterOpenBracketSwitch: + +**BreakAfterOpenBracketSwitch** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakAfterOpenBracketSwitch>` +  Force break after the left parenthesis of a switch control statement +  when the expression exceeds the column limit. + +  .. code-block:: c++ + +    true:                             false: +    switch (                 vs.      switch (a + +       a + b) {                               b) { +  .. _BreakAfterReturnType:  **BreakAfterReturnType** (``ReturnTypeBreakingStyle``) :versionbadge:`clang-format 19` :ref:`¶ <BreakAfterReturnType>` @@ -3383,6 +3416,79 @@ the configuration (without a prefix: ``Auto``). +.. _BreakBeforeCloseBracketBracedList: + +**BreakBeforeCloseBracketBracedList** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakBeforeCloseBracketBracedList>` +  Force break before the right bracket of a braced initializer list (when +  ``Cpp11BracedListStyle`` is ``true``) when the list exceeds the column +  limit. The break before the right bracket is only made if there is a +  break after the opening bracket. + +  .. code-block:: c++ + +    true:                             false: +    vector<int> x {         vs.       vector<int> x { +       1, 2, 3                           1, 2, 3} +    } + +.. _BreakBeforeCloseBracketFunction: + +**BreakBeforeCloseBracketFunction** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakBeforeCloseBracketFunction>` +  Force break before the right parenthesis of a function (declaration, +  definition, call) when the parameters exceed the column limit. + +  .. code-block:: c++ + +    true:                             false: +    foo (                   vs.       foo ( +       a , b                             a , b) +    ) + +.. _BreakBeforeCloseBracketIf: + +**BreakBeforeCloseBracketIf** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakBeforeCloseBracketIf>` +  Force break before the right parenthesis of an if control statement +  when the expression exceeds the column limit. The break before the +  closing parenthesis is only made if there is a break after the opening +  parenthesis. + +  .. code-block:: c++ + +    true:                             false: +    if constexpr (          vs.       if constexpr ( +       a || b                            a || b ) +    ) + +.. _BreakBeforeCloseBracketLoop: + +**BreakBeforeCloseBracketLoop** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakBeforeCloseBracketLoop>` +  Force break before the right parenthesis of a loop control statement +  when the expression exceeds the column limit. The break before the +  closing parenthesis is only made if there is a break after the opening +  parenthesis. + +  .. code-block:: c++ + +    true:                             false: +    while (                  vs.      while ( +       a && b                            a && b) { +    ) { + +.. _BreakBeforeCloseBracketSwitch: + +**BreakBeforeCloseBracketSwitch** (``Boolean``) :versionbadge:`clang-format 22` :ref:`¶ <BreakBeforeCloseBracketSwitch>` +  Force break before the right parenthesis of a switch control statement +  when the expression exceeds the column limit. The break before the +  closing parenthesis is only made if there is a break after the opening +  parenthesis. + +  .. code-block:: c++ + +    true:                             false: +    switch (                 vs.      switch ( +       a + b                             a + b) { +    ) { +  .. _BreakBeforeConceptDeclarations:  **BreakBeforeConceptDeclarations** (``BreakBeforeConceptDeclarationsStyle``) :versionbadge:`clang-format 12` :ref:`¶ <BreakBeforeConceptDeclarations>` diff --git a/clang/docs/HIPSupport.rst b/clang/docs/HIPSupport.rst index ec2af2a..ab9ea11 100644 --- a/clang/docs/HIPSupport.rst +++ b/clang/docs/HIPSupport.rst @@ -180,8 +180,7 @@ Predefined Macros       - Alias to ``__HIP_API_PER_THREAD_DEFAULT_STREAM__``. Deprecated.  Note that some architecture specific AMDGPU macros will have default values when -used from the HIP host compilation. Other :doc:`AMDGPU macros <AMDGPUSupport>` -like ``__AMDGCN_WAVEFRONT_SIZE__`` (deprecated) will default to 64 for example. +used from the HIP host compilation.  Compilation Modes  ================= diff --git a/clang/docs/Modules.rst b/clang/docs/Modules.rst index acbe45e..e45ee9f 100644 --- a/clang/docs/Modules.rst +++ b/clang/docs/Modules.rst @@ -421,13 +421,7 @@ As an example, the module map file for the C standard library might look a bit l  .. parsed-literal:: -  module std [system] [extern_c] { -    module assert { -      textual header "assert.h" -      header "bits/assert-decls.h" -      export * -    } - +  module std [system] {      module complex {        header "complex.h"        export * @@ -440,7 +434,6 @@ As an example, the module map file for the C standard library might look a bit l      module errno {        header "errno.h" -      header "sys/errno.h"        export *      } @@ -673,14 +666,14 @@ of checking *use-declaration*\s, and must still be a lexically-valid header  file. In the future, we intend to pre-tokenize such headers and include the  token sequence within the prebuilt module representation. -A header with the ``exclude`` specifier is excluded from the module. It will not be included when the module is built, nor will it be considered to be part of the module, even if an ``umbrella`` header or directory would otherwise make it part of the module. +A header with the ``exclude`` specifier is excluded from the module. It will not be included when the module is built, nor will it be considered to be part of the module, even if an ``umbrella`` directory would otherwise make it part of the module. -**Example:** The C header ``assert.h`` is an excellent candidate for a textual header, because it is meant to be included multiple times (possibly with different ``NDEBUG`` settings). However, declarations within it should typically be split into a separate modular header. +**Example:** A "X macro" header is an excellent candidate for a textual header, because it is can't be compiled standalone, and by itself does not contain any declarations.  .. parsed-literal:: -  module std [system] { -    textual header "assert.h" +  module MyLib [system] { +    textual header "xmacros.h"    }  A given header shall not be referenced by more than one *header-declaration*. diff --git a/clang/docs/OpenMPSupport.rst b/clang/docs/OpenMPSupport.rst index 61b5bab..10a8d09 100644 --- a/clang/docs/OpenMPSupport.rst +++ b/clang/docs/OpenMPSupport.rst @@ -1,662 +1,662 @@ -.. raw:: html
 -
 -  <style type="text/css">
 -    .none { background-color: #FFCCCC }
 -    .part { background-color: #FFFF99 }
 -    .good { background-color: #CCFF99 }
 -  </style>
 -
 -.. role:: none
 -.. role:: part
 -.. role:: good
 -
 -.. contents::
 -   :local:
 -
 -==============
 -OpenMP Support
 -==============
 -
 -Clang fully supports OpenMP 4.5, almost all of 5.0 and most of 5.1/2.
 -Clang supports offloading to X86_64, AArch64, PPC64[LE], NVIDIA GPUs (all models) and AMD GPUs (all models).
 -
 -In addition, the LLVM OpenMP runtime `libomp` supports the OpenMP Tools
 -Interface (OMPT) on x86, x86_64, AArch64, and PPC64 on Linux, Windows, and macOS.
 -OMPT is also supported for NVIDIA and AMD GPUs.
 -
 -For the list of supported features from OpenMP 5.0 and 5.1
 -see `OpenMP implementation details`_ and `OpenMP 51 implementation details`_.
 -
 -General improvements
 -====================
 -- New collapse clause scheme to avoid expensive remainder operations.
 -  Compute loop index variables after collapsing a loop nest via the
 -  collapse clause by replacing the expensive remainder operation with
 -  multiplications and additions.
 -
 -- When using the collapse clause on a loop nest the default behavior
 -  is to automatically extend the representation of the loop counter to
 -  64 bits for the cases where the sizes of the collapsed loops are not
 -  known at compile time. To prevent this conservative choice and use
 -  at most 32 bits, compile your program with the
 -  `-fopenmp-optimistic-collapse`.
 -
 -
 -GPU devices support
 -===================
 -
 -Data-sharing modes
 -------------------
 -
 -Clang supports two data-sharing models for Cuda devices: `Generic` and `Cuda`
 -modes. The default mode is `Generic`. `Cuda` mode can give an additional
 -performance and can be activated using the `-fopenmp-cuda-mode` flag. In
 -`Generic` mode all local variables that can be shared in the parallel regions
 -are stored in the global memory. In `Cuda` mode local variables are not shared
 -between the threads and it is user responsibility to share the required data
 -between the threads in the parallel regions. Often, the optimizer is able to
 -reduce the cost of `Generic` mode to the level of `Cuda` mode, but the flag,
 -as well as other assumption flags, can be used for tuning.
 -
 -Features not supported or with limited support for Cuda devices
 ----------------------------------------------------------------
 -
 -- Cancellation constructs are not supported.
 -
 -- Doacross loop nest is not supported.
 -
 -- User-defined reductions are supported only for trivial types.
 -
 -- Nested parallelism: inner parallel regions are executed sequentially.
 -
 -- Debug information for OpenMP target regions is supported, but sometimes it may
 -  be required to manually specify the address class of the inspected variables.
 -  In some cases the local variables are actually allocated in the global memory,
 -  but the debug info may be not aware of it.
 -
 -
 -.. _OpenMP implementation details:
 -
 -OpenMP 5.0 Implementation Details
 -=================================
 -
 -The following table provides a quick overview over various OpenMP 5.0 features
 -and their implementation status. Please post on the
 -`Discourse forums (Runtimes - OpenMP category)`_ for more
 -information or if you want to help with the
 -implementation.
 -
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -|Category                      | Feature                                                      | Status                   | Reviews                                                               |
 -+==============================+==============================================================+==========================+=======================================================================+
 -| loop                         | support != in the canonical loop form                        | :good:`done`             | D54441                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | #pragma omp loop (directive)                                 | :part:`partial`          | D145823 (combined forms)                                              |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | #pragma omp loop bind                                        | :part:`worked on`        | D144634 (needs review)                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | collapse imperfectly nested loop                             | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | collapse non-rectangular nested loop                         | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | C++ range-base for loop                                      | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | clause: if for SIMD directives                               | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | inclusive scan (matching C++17 PSTL)                         | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | memory allocators                                            | :good:`done`             | r341687,r357929                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | allocate directive and allocate clause                       | :good:`done`             | r355614,r335952                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPD                         | OMPD interfaces                                              | :good:`done`             | https://reviews.llvm.org/D99914   (Supports only HOST(CPU) and Linux  |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPT                         | OMPT interfaces (callback support)                           | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| thread affinity              | thread affinity                                              | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | taskloop reduction                                           | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | task affinity                                                | :part:`not upstream`     | https://github.com/jklinkenberg/openmp/tree/task-affinity             |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | clause: depend on the taskwait construct                     | :good:`done`             | D113540 (regular codegen only)                                        |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | depend objects and detachable tasks                          | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | mutexinoutset dependence-type for tasks                      | :good:`done`             | D53380,D57576                                                         |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | combined taskloop constructs                                 | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | master taskloop                                              | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | parallel master taskloop                                     | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | master taskloop simd                                         | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | parallel master taskloop simd                                | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| SIMD                         | atomic and simd constructs inside SIMD code                  | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| SIMD                         | SIMD nontemporal                                             | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | infer target functions from initializers                     | :part:`worked on`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | infer target variables from initializers                     | :good:`done`             | D146418                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | OMP_TARGET_OFFLOAD environment variable                      | :good:`done`             | D50522                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | support full 'defaultmap' functionality                      | :good:`done`             | D69204                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | device specific functions                                    | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: device_type                                          | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: extended device                                      | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: uses_allocators clause                               | :good:`done`             | https://github.com/llvm/llvm-project/pull/157025                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: in_reduction                                         | :part:`worked on`        | r308768                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | omp_get_device_num()                                         | :good:`done`             | D54342,D128347                                                        |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | structure mapping of references                              | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | nested target declare                                        | :good:`done`             | D51378                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | implicitly map 'this' (this[:1])                             | :good:`done`             | D55982                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | allow access to the reference count (omp_target_is_present)  | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | requires directive                                           | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: unified_shared_memory                                | :good:`done`             | D52625,D52359                                                         |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: unified_address                                      | :part:`partial`          |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: reverse_offload                                      | :part:`partial`          | D52780,D155003                                                        |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: atomic_default_mem_order                             | :good:`done`             | D53513                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: dynamic_allocators                                   | :part:`unclaimed parts`  | D53079                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | user-defined mappers                                         | :good:`done`             | D56326,D58638,D58523,D58074,D60972,D59474                             |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | map array-section with implicit mapper                       | :good:`done`             |  https://github.com/llvm/llvm-project/pull/101101                     |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | mapping lambda expression                                    | :good:`done`             | D51107                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | clause: use_device_addr for target data                      | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | support close modifier on map clause                         | :good:`done`             | D55719,D55892                                                         |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | teams construct on the host device                           | :good:`done`             | r371553                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | support non-contiguous array sections for target update      | :good:`done`             | https://github.com/llvm/llvm-project/pull/144635                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | pointer attachment                                           | :part:`being repaired`   | @abhinavgaba (https://github.com/llvm/llvm-project/pull/153683)       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| atomic                       | hints for the atomic construct                               | :good:`done`             | D51233                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| base language                | C11 support                                                  | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| base language                | C++11/14/17 support                                          | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| base language                | lambda support                                               | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | array shaping                                                | :good:`done`             | D74144                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | library shutdown (omp_pause_resource[_all])                  | :good:`done`             | D55078                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | metadirectives                                               | :part:`mostly done`      | D91944, https://github.com/llvm/llvm-project/pull/128640              |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | conditional modifier for lastprivate clause                  | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | iterator and multidependences                                | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | depobj directive and depobj dependency kind                  | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | user-defined function variants                               | :good:`done`.            | D67294, D64095, D71847, D71830, D109635                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | pointer/reference to pointer based array reductions          | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | prevent new type definitions in clauses                      | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory model                 | memory model update (seq_cst, acq_rel, release, acquire,...) | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -
 -
 -.. _OpenMP 51 implementation details:
 -
 -OpenMP 5.1 Implementation Details
 -=================================
 -
 -The following table provides a quick overview over various OpenMP 5.1 features
 -and their implementation status.
 -Please post on the
 -`Discourse forums (Runtimes - OpenMP category)`_ for more
 -information or if you want to help with the
 -implementation.
 -
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -|Category                      | Feature                                                      | Status                   | Reviews                                                               |
 -+==============================+==============================================================+==========================+=======================================================================+
 -| atomic                       | 'compare' clause on atomic construct                         | :good:`done`             | D120290, D120007, D118632, D120200, D116261, D118547, D116637         |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| atomic                       | 'fail' clause on atomic construct                            | :part:`worked on`        | D123235 (in progress)                                                 |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| base language                | C++ attribute specifier syntax                               | :good:`done`             | D105648                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | 'present' map type modifier                                  | :good:`done`             | D83061, D83062, D84422                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | 'present' motion modifier                                    | :good:`done`             | D84711, D84712                                                        |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | 'present' in defaultmap clause                               | :good:`done`             | D92427                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | map clause reordering based on 'present' modifier            | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | device-specific environment variables                        | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | omp_target_is_accessible routine                             | :good:`done`             | https://github.com/llvm/llvm-project/pull/138294                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | omp_get_mapped_ptr routine                                   | :good:`done`             | D141545                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | new async target memory copy routines                        | :good:`done`             | D136103                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | thread_limit clause on target construct                      | :part:`partial`          | D141540 (offload), D152054 (host, in progress)                        |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | has_device_addr clause on target construct                   | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | iterators in map clause or motion clauses                    | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | indirect clause on declare target directive                  | :part:`In Progress`      |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | allow virtual functions calls for mapped object on device    | :part:`partial`          |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | interop construct                                            | :part:`partial`          | parsing/sema done: D98558, D98834, D98815                             |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| device                       | assorted routines for querying interoperable properties      | :part:`partial`          | D106674                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | Loop tiling transformation                                   | :good:`done`             | D76342                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | Loop unrolling transformation                                | :good:`done`             | D99459                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| loop                         | 'reproducible'/'unconstrained' modifiers in 'order' clause   | :part:`partial`          | D127855                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | alignment for allocate directive and clause                  | :good:`done`             | D115683                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | 'allocator' modifier for allocate clause                     | :good:`done`             | https://github.com/llvm/llvm-project/pull/114883                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | 'align' modifier for allocate clause                         | :good:`done`             | https://github.com/llvm/llvm-project/pull/121814                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | new memory management routines                               | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory management            | changes to omp_alloctrait_key enum                           | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| memory model                 | seq_cst clause on flush construct                            | :good:`done`             | https://github.com/llvm/llvm-project/pull/114072                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | 'omp_all_memory' keyword and use in 'depend' clause          | :good:`done`             | D125828, D126321                                                      |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | error directive                                              | :good:`done`             | D139166                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | scope construct                                              | :good:`done`             | D157933, https://github.com/llvm/llvm-project/pull/109197             |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | routines for controlling and querying team regions           | :part:`partial`          | D95003 (libomp only)                                                  |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | changes to ompt_scope_endpoint_t enum                        | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | omp_display_env routine                                      | :good:`done`             | D74956                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | extended OMP_PLACES syntax                                   | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | OMP_NUM_TEAMS and OMP_TEAMS_THREAD_LIMIT env vars            | :good:`done`             | D138769                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | 'target_device' selector in context specifier                | :none:`worked on`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | begin/end declare variant                                    | :good:`done`             | D71179                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | dispatch construct and function variant argument adjustment  | :part:`worked on`        | D99537, D99679                                                        |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | assumes directives                                           | :part:`worked on`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | assume directive                                             | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | nothing directive                                            | :good:`done`             | D123286                                                               |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | masked construct and related combined constructs             | :good:`done`             | D99995, D100514, PR-121741(parallel_masked_taskloop)                  |
 -|                              |                                                              |                          | PR-121746(parallel_masked_task_loop_simd),PR-121914(masked_taskloop)  |
 -|                              |                                                              |                          | PR-121916(masked_taskloop_simd)                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| misc                         | default(firstprivate) & default(private)                     | :good:`done`             | D75591 (firstprivate), D125912 (private)                              |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| other                        | deprecating master construct                                 | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPT                         | new barrier types added to ompt_sync_region_t enum           | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPT                         | async data transfers added to ompt_target_data_op_t enum     | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPT                         | new barrier state values added to ompt_state_t enum          | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPT                         | new 'emi' callbacks for external monitoring interfaces       | :good:`done`             |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| OMPT                         | device tracing interface                                     | :none:`in progress`      | jplehr                                                                |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | 'strict' modifier for taskloop construct                     | :none:`unclaimed`        |                                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | inoutset in depend clause                                    | :good:`done`             | D97085, D118383                                                       |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -| task                         | nowait clause on taskwait                                    | :part:`partial`          | parsing/sema done: D131830, D141531                                   |
 -+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 -
 -
 -.. _OpenMP 5.2 implementation details:
 -
 -OpenMP 5.2 Implementation Details
 -=================================
 -
 -The following table provides a quick overview of various OpenMP 5.2 features
 -and their implementation status. Please post on the
 -`Discourse forums (Runtimes - OpenMP category)`_ for more
 -information or if you want to help with the
 -implementation.
 -
 -
 -
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -|Feature                                                      | C/C++ Status              |  Fortran Status           | Reviews                                                                  |
 -+=============================================================+===========================+===========================+==========================================================================+
 -| omp_in_explicit_task()                                      | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| semantics of explicit_task_var and implicit_task_var        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| ompx sentinel for C/C++ directive extensions                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| ompx prefix for clause extensions                           | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| if clause on teams construct                                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| step modifier added                                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| declare mapper: Add iterator modifier on map clause         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| declare mapper: Add iterator modifier on map clause         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| memspace and traits modifiers to uses allocator         i   | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Add otherwise clause to metadirectives                      | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| doacross clause with support for omp_cur_iteration          | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| position of interop_type in init clause on iterop           | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| implicit map type for target enter/exit data                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| work OMPT type for work-sharing loop constructs             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| allocate and firstprivate on scope directive                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Change loop consistency for order clause                    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Add memspace and traits modifiers to uses_allocators        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Keep original base pointer on map w/o matched candidate     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Pure procedure support for certain directives               | :none:`N/A`               | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| ALLOCATE statement support for allocators                   | :none:`N/A`               | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| dispatch construct extension to support end directive       | :none:`N/A`               | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -
 -
 -
 -.. _OpenMP 5.2 Deprecations:
 -
 -OpenMP 5.2 Deprecations
 -=======================
 -
 -
 -
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -|                                                             | C/C++ Status              |  Fortran Status           | Reviews                                                                  |
 -+=============================================================+===========================+===========================+==========================================================================+
 -| Linear clause syntax                                        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| The minus operator                                          | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Map clause modifiers without commas                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| The use of allocate directives with ALLOCATE statement      | :good:`N/A`               | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| uses_allocators list syntax                                 | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| The default clause on metadirectives                        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| The delimited form of the declare target directive          | :none:`unclaimed`         | :good:`N/A`               |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| The use of the to clause on the declare target directive    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| The syntax of the destroy clause on the depobj construct    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| keyword source and sink as task-dependence modifiers        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| interop types in any position on init clause of interop     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| ompd prefix usage for some ICVs                             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -
 -.. _OpenMP 6.0 implementation details:
 -
 -OpenMP 6.0 Implementation Details
 -=================================
 -
 -The following table provides a quick overview of various OpenMP 6.0 features
 -and their implementation status. Please post on the
 -`Discourse forums (Runtimes - OpenMP category)`_ for more
 -information or if you want to help with the
 -implementation.
 -
 -
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -|Feature                                                      | C/C++ Status              |  Fortran Status           | Reviews                                                                  |
 -+=============================================================+===========================+===========================+==========================================================================+
 -| free-agent threads                                          | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| threadset clause                                            | :part:`in progress`       | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Recording of task graphs                                    | :part:`in progress`       | :part:`in progress`       | clang: jtb20, flang: kparzysz                                            |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Parallel inductions                                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| init_complete for scan directive                            | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop interchange transformation                             | :good:`done`              | :none:`unclaimed`         | Clang (interchange): https://github.com/llvm/llvm-project/pull/93022     |
 -|                                                             |                           |                           | Clang (permutation): https://github.com/llvm/llvm-project/pull/92030     |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop reverse transformation                                 | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/92916                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop stripe transformation                                  | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/119891                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop fusion transformation                                  | :part:`in progress`       | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/139293                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop index set splitting transformation                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop transformation apply clause                            | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop fuse transformation                                    | :good:`done`              | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| workdistribute construct                                    |                           | :none:`in progress`       | @skc7, @mjklemm                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| task_iteration                                              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| memscope clause for atomic and flush                        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| transparent clause (hull tasks)                             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| rule-based compound directives                              | :part:`In Progress`       | :part:`In Progress`       | kparzysz                                                                 |
 -|                                                             |                           |                           | Testing for Fortran missing                                              |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| C23, C++23                                                  | :none:`unclaimed`         |                           |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Fortran 2023                                                |                           | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| decl attribute for declarative directives                   | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| C attribute syntax                                          | :none:`unclaimed`         |                           |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| pure directives in DO CONCURRENT                            |                           | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Optional argument for all clauses                           | :none:`partial`           | :none:`In Progress`       | Parse/Sema (nowait): https://github.com/llvm/llvm-project/pull/159628    |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Function references for locator list items                  | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| All clauses accept directive name modifier                  | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Extensions to depobj construct                              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Extensions to atomic construct                              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Private reductions                                          | :good:`mostly`            | :none:`unclaimed`         | Parse/Sema:https://github.com/llvm/llvm-project/pull/129938              |
 -|                                                             |                           |                           | Codegen: https://github.com/llvm/llvm-project/pull/134709                |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Self maps                                                   | :part:`partial`           | :none:`unclaimed`         | parsing/sema done: https://github.com/llvm/llvm-project/pull/129888      |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Release map type for declare mapper                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Extensions to interop construct                             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| no_openmp_constructs                                        | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125933                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| safe_sync and progress with identifier and API              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| OpenMP directives in concurrent loop regions                | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125621                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| atomics constructs on concurrent loop regions               | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125621                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Loop construct with DO CONCURRENT                           |                           | :part:`In Progress`       |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| device_type clause for target construct                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| nowait for ancestor target directives                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| New API for devices' num_teams/thread_limit                 | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Host and device environment variables                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| num_threads ICV and clause accepts list                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Numeric names for environment variables                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Increment between places for OMP_PLACES                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| OMP_AVAILABLE_DEVICES envirable                             | :none:`unclaimed`         | :none:`unclaimed`         | (should wait for "Traits for default device envirable" being done)       |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Traits for default device envirable                         | :part:`in progress`       | :none:`unclaimed`         | ro-i                                                                     |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Optionally omit array length expression                     | :good:`done`              | :none:`unclaimed`         | (Parse) https://github.com/llvm/llvm-project/pull/148048,                |
 -|                                                             |                           |                           | (Sema) https://github.com/llvm/llvm-project/pull/152786                  |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Canonical loop sequences                                    | :part:`in progress`       | :part:`in progress`       | Clang: https://github.com/llvm/llvm-project/pull/139293                  |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Clarifications to Fortran map semantics                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| default clause at target construct                          | :part:`In Progress`       | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| ref count update use_device_{ptr, addr}                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Clarifications to implicit reductions                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| ref modifier for map clauses                                | :part:`In Progress`       | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| map-type modifiers in arbitrary position                    | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/90499                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Lift nesting restriction on concurrent loop                 | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125621                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| priority clause for target constructs                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| changes to target_data construct                            | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Non-const do_not_sync for nowait/nogroup                    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| need_device_addr modifier for adjust_args clause            | :part:`partial`           | :none:`unclaimed`         | Parsing/Sema: https://github.com/llvm/llvm-project/pull/143442           |
 -|                                                             |                           |                           |               https://github.com/llvm/llvm-project/pull/149586           |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Prescriptive num_threads                                    | :good:`done`              | :none:`unclaimed`         |  https://github.com/llvm/llvm-project/pull/160659                        |
 -|                                                             |                           |                           |  https://github.com/llvm/llvm-project/pull/146403                        |
 -|                                                             |                           |                           |  https://github.com/llvm/llvm-project/pull/146404                        |
 -|                                                             |                           |                           |  https://github.com/llvm/llvm-project/pull/146405                        |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Message and severity clauses                                | :good:`done`              | :none:`unclaimed`         |  https://github.com/llvm/llvm-project/pull/146093                        |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Local clause on declare target                              | :part:`In Progress`       | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| groupprivate directive                                      | :part:`In Progress`       | :part:`partial`           | Flang: kparzysz, mjklemm                                                 |
 -|                                                             |                           |                           |                                                                          |
 -|                                                             |                           |                           | Flang parser: https://github.com/llvm/llvm-project/pull/153807           |
 -|                                                             |                           |                           | Flang sema: https://github.com/llvm/llvm-project/pull/154779             |
 -|                                                             |                           |                           | Clang parse/sema: https://github.com/llvm/llvm-project/pull/158134       |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| variable-category on default clause                         | :good:`done`              | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| Changes to omp_target_is_accessible                         | :part:`In Progress`       | :part:`In Progress`       |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| defaultmap implicit-behavior 'storage'                      | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/158336                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| defaultmap implicit-behavior 'private'                      | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/158712                         |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -
 -.. _OpenMP 6.1 implementation details:
 -
 -OpenMP 6.1 Implementation Details (Experimental)
 -================================================
 -
 -The following table provides a quick overview over various OpenMP 6.1 features
 -and their implementation status. Since OpenMP 6.1 has not yet been released, the
 -following features are experimental and are subject to change at any time.
 -Please post on the `Discourse forums (Runtimes - OpenMP category)`_ for more
 -information or if you want to help with the
 -implementation.
 -
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -|Feature                                                      | C/C++ Status              | Fortran Status            | Reviews                                                                  |
 -+=============================================================+===========================+===========================+==========================================================================+
 -| dyn_groupprivate clause                                     | :part:`In Progress`       | :part:`In Progress`       | C/C++: kevinsala (https://github.com/llvm/llvm-project/pull/152651       |
 -|                                                             |                           |                           | https://github.com/llvm/llvm-project/pull/152830                         |
 -|                                                             |                           |                           | https://github.com/llvm/llvm-project/pull/152831)                        |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop flatten transformation                                 | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| loop grid/tile modifiers for sizes clause                   | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -| attach map-type modifier                                    | :part:`In Progress`       | :none:`unclaimed`         | C/C++: @abhinavgaba;                                                     |
 -|                                                             |                           |                           | RT: @abhinavgaba (https://github.com/llvm/llvm-project/pull/149036,      |
 -|                                                             |                           |                           | https://github.com/llvm/llvm-project/pull/158370)                        |
 -+-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+
 -
 -
 -OpenMP Extensions
 -=================
 -
 -The following table provides a quick overview over various OpenMP
 -extensions and their implementation status.  These extensions are not
 -currently defined by any standard, so links to associated LLVM
 -documentation are provided.  As these extensions mature, they will be
 -considered for standardization. Please post on the
 -`Discourse forums (Runtimes - OpenMP category)`_ to provide feedback.
 -
 -+------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
 -|Category                      | Feature                                                                           | Status                   | Reviews                                                |
 -+==============================+===================================================================================+==========================+========================================================+
 -| atomic extension             | `'atomic' strictly nested within 'teams'                                          | :good:`prototyped`       | D126323                                                |
 -|                              | <https://openmp.llvm.org/docs/openacc/OpenMPExtensions.html#atomicWithinTeams>`_  |                          |                                                        |
 -+------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
 -| device extension             | `'ompx_hold' map type modifier                                                    | :good:`prototyped`       | D106509, D106510                                       |
 -|                              | <https://openmp.llvm.org/docs/openacc/OpenMPExtensions.html#ompx-hold>`_          |                          |                                                        |
 -+------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
 -| device extension             | `'ompx_bare' clause on 'target teams' construct                                   | :good:`prototyped`       | #66844, #70612                                         |
 -|                              | <https://www.osti.gov/servlets/purl/2205717>`_                                    |                          |                                                        |
 -+------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
 -| device extension             | Multi-dim 'num_teams' and 'thread_limit' clause on 'target teams ompx_bare'       | :good:`partial`          | #99732, #101407, #102715                               |
 -|                              | construct                                                                         |                          |                                                        |
 -+------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
 -
 -.. _Discourse forums (Runtimes - OpenMP category): https://discourse.llvm.org/c/runtimes/openmp/35
 +.. raw:: html + +  <style type="text/css"> +    .none { background-color: #FFCCCC } +    .part { background-color: #FFFF99 } +    .good { background-color: #CCFF99 } +  </style> + +.. role:: none +.. role:: part +.. role:: good + +.. contents:: +   :local: + +============== +OpenMP Support +============== + +Clang fully supports OpenMP 4.5, almost all of 5.0 and most of 5.1/2. +Clang supports offloading to X86_64, AArch64, PPC64[LE], NVIDIA GPUs (all models) and AMD GPUs (all models). + +In addition, the LLVM OpenMP runtime `libomp` supports the OpenMP Tools +Interface (OMPT) on x86, x86_64, AArch64, and PPC64 on Linux, Windows, and macOS. +OMPT is also supported for NVIDIA and AMD GPUs. + +For the list of supported features from OpenMP 5.0 and 5.1 +see `OpenMP implementation details`_ and `OpenMP 51 implementation details`_. + +General improvements +==================== +- New collapse clause scheme to avoid expensive remainder operations. +  Compute loop index variables after collapsing a loop nest via the +  collapse clause by replacing the expensive remainder operation with +  multiplications and additions. + +- When using the collapse clause on a loop nest the default behavior +  is to automatically extend the representation of the loop counter to +  64 bits for the cases where the sizes of the collapsed loops are not +  known at compile time. To prevent this conservative choice and use +  at most 32 bits, compile your program with the +  `-fopenmp-optimistic-collapse`. + + +GPU devices support +=================== + +Data-sharing modes +------------------ + +Clang supports two data-sharing models for Cuda devices: `Generic` and `Cuda` +modes. The default mode is `Generic`. `Cuda` mode can give an additional +performance and can be activated using the `-fopenmp-cuda-mode` flag. In +`Generic` mode all local variables that can be shared in the parallel regions +are stored in the global memory. In `Cuda` mode local variables are not shared +between the threads and it is user responsibility to share the required data +between the threads in the parallel regions. Often, the optimizer is able to +reduce the cost of `Generic` mode to the level of `Cuda` mode, but the flag, +as well as other assumption flags, can be used for tuning. + +Features not supported or with limited support for Cuda devices +--------------------------------------------------------------- + +- Cancellation constructs are not supported. + +- Doacross loop nest is not supported. + +- User-defined reductions are supported only for trivial types. + +- Nested parallelism: inner parallel regions are executed sequentially. + +- Debug information for OpenMP target regions is supported, but sometimes it may +  be required to manually specify the address class of the inspected variables. +  In some cases the local variables are actually allocated in the global memory, +  but the debug info may be not aware of it. + + +.. _OpenMP implementation details: + +OpenMP 5.0 Implementation Details +================================= + +The following table provides a quick overview over various OpenMP 5.0 features +and their implementation status. Please post on the +`Discourse forums (Runtimes - OpenMP category)`_ for more +information or if you want to help with the +implementation. + ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +|Category                      | Feature                                                      | Status                   | Reviews                                                               | ++==============================+==============================================================+==========================+=======================================================================+ +| loop                         | support != in the canonical loop form                        | :good:`done`             | D54441                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | #pragma omp loop (directive)                                 | :part:`partial`          | D145823 (combined forms)                                              | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | #pragma omp loop bind                                        | :part:`worked on`        | D144634 (needs review)                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | collapse imperfectly nested loop                             | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | collapse non-rectangular nested loop                         | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | C++ range-base for loop                                      | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | clause: if for SIMD directives                               | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | inclusive scan (matching C++17 PSTL)                         | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | memory allocators                                            | :good:`done`             | r341687,r357929                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | allocate directive and allocate clause                       | :good:`done`             | r355614,r335952                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPD                         | OMPD interfaces                                              | :good:`done`             | https://reviews.llvm.org/D99914   (Supports only HOST(CPU) and Linux  | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPT                         | OMPT interfaces (callback support)                           | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| thread affinity              | thread affinity                                              | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | taskloop reduction                                           | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | task affinity                                                | :part:`not upstream`     | https://github.com/jklinkenberg/openmp/tree/task-affinity             | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | clause: depend on the taskwait construct                     | :good:`done`             | D113540 (regular codegen only)                                        | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | depend objects and detachable tasks                          | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | mutexinoutset dependence-type for tasks                      | :good:`done`             | D53380,D57576                                                         | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | combined taskloop constructs                                 | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | master taskloop                                              | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | parallel master taskloop                                     | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | master taskloop simd                                         | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | parallel master taskloop simd                                | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| SIMD                         | atomic and simd constructs inside SIMD code                  | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| SIMD                         | SIMD nontemporal                                             | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | infer target functions from initializers                     | :part:`worked on`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | infer target variables from initializers                     | :good:`done`             | D146418                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | OMP_TARGET_OFFLOAD environment variable                      | :good:`done`             | D50522                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | support full 'defaultmap' functionality                      | :good:`done`             | D69204                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | device specific functions                                    | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: device_type                                          | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: extended device                                      | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: uses_allocators clause                               | :good:`done`             | https://github.com/llvm/llvm-project/pull/157025                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: in_reduction                                         | :part:`worked on`        | r308768                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | omp_get_device_num()                                         | :good:`done`             | D54342,D128347                                                        | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | structure mapping of references                              | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | nested target declare                                        | :good:`done`             | D51378                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | implicitly map 'this' (this[:1])                             | :good:`done`             | D55982                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | allow access to the reference count (omp_target_is_present)  | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | requires directive                                           | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: unified_shared_memory                                | :good:`done`             | D52625,D52359                                                         | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: unified_address                                      | :part:`partial`          |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: reverse_offload                                      | :part:`partial`          | D52780,D155003                                                        | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: atomic_default_mem_order                             | :good:`done`             | D53513                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: dynamic_allocators                                   | :part:`unclaimed parts`  | D53079                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | user-defined mappers                                         | :good:`done`             | D56326,D58638,D58523,D58074,D60972,D59474                             | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | map array-section with implicit mapper                       | :good:`done`             |  https://github.com/llvm/llvm-project/pull/101101                     | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | mapping lambda expression                                    | :good:`done`             | D51107                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | clause: use_device_addr for target data                      | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | support close modifier on map clause                         | :good:`done`             | D55719,D55892                                                         | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | teams construct on the host device                           | :good:`done`             | r371553                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | support non-contiguous array sections for target update      | :good:`done`             | https://github.com/llvm/llvm-project/pull/144635                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | pointer attachment                                           | :part:`being repaired`   | @abhinavgaba (https://github.com/llvm/llvm-project/pull/153683)       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| atomic                       | hints for the atomic construct                               | :good:`done`             | D51233                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| base language                | C11 support                                                  | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| base language                | C++11/14/17 support                                          | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| base language                | lambda support                                               | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | array shaping                                                | :good:`done`             | D74144                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | library shutdown (omp_pause_resource[_all])                  | :good:`done`             | D55078                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | metadirectives                                               | :part:`mostly done`      | D91944, https://github.com/llvm/llvm-project/pull/128640              | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | conditional modifier for lastprivate clause                  | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | iterator and multidependences                                | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | depobj directive and depobj dependency kind                  | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | user-defined function variants                               | :good:`done`.            | D67294, D64095, D71847, D71830, D109635                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | pointer/reference to pointer based array reductions          | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | prevent new type definitions in clauses                      | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory model                 | memory model update (seq_cst, acq_rel, release, acquire,...) | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ + + +.. _OpenMP 51 implementation details: + +OpenMP 5.1 Implementation Details +================================= + +The following table provides a quick overview over various OpenMP 5.1 features +and their implementation status. +Please post on the +`Discourse forums (Runtimes - OpenMP category)`_ for more +information or if you want to help with the +implementation. + ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +|Category                      | Feature                                                      | Status                   | Reviews                                                               | ++==============================+==============================================================+==========================+=======================================================================+ +| atomic                       | 'compare' clause on atomic construct                         | :good:`done`             | D120290, D120007, D118632, D120200, D116261, D118547, D116637         | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| atomic                       | 'fail' clause on atomic construct                            | :part:`worked on`        | D123235 (in progress)                                                 | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| base language                | C++ attribute specifier syntax                               | :good:`done`             | D105648                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | 'present' map type modifier                                  | :good:`done`             | D83061, D83062, D84422                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | 'present' motion modifier                                    | :good:`done`             | D84711, D84712                                                        | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | 'present' in defaultmap clause                               | :good:`done`             | D92427                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | map clause reordering based on 'present' modifier            | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | device-specific environment variables                        | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | omp_target_is_accessible routine                             | :good:`done`             | https://github.com/llvm/llvm-project/pull/138294                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | omp_get_mapped_ptr routine                                   | :good:`done`             | D141545                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | new async target memory copy routines                        | :good:`done`             | D136103                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | thread_limit clause on target construct                      | :part:`partial`          | D141540 (offload), D152054 (host, in progress)                        | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | has_device_addr clause on target construct                   | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | iterators in map clause or motion clauses                    | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | indirect clause on declare target directive                  | :part:`In Progress`      |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | allow virtual functions calls for mapped object on device    | :part:`partial`          |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | interop construct                                            | :part:`partial`          | parsing/sema done: D98558, D98834, D98815                             | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| device                       | assorted routines for querying interoperable properties      | :part:`partial`          | D106674                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | Loop tiling transformation                                   | :good:`done`             | D76342                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | Loop unrolling transformation                                | :good:`done`             | D99459                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| loop                         | 'reproducible'/'unconstrained' modifiers in 'order' clause   | :part:`partial`          | D127855                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | alignment for allocate directive and clause                  | :good:`done`             | D115683                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | 'allocator' modifier for allocate clause                     | :good:`done`             | https://github.com/llvm/llvm-project/pull/114883                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | 'align' modifier for allocate clause                         | :good:`done`             | https://github.com/llvm/llvm-project/pull/121814                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | new memory management routines                               | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory management            | changes to omp_alloctrait_key enum                           | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| memory model                 | seq_cst clause on flush construct                            | :good:`done`             | https://github.com/llvm/llvm-project/pull/114072                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | 'omp_all_memory' keyword and use in 'depend' clause          | :good:`done`             | D125828, D126321                                                      | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | error directive                                              | :good:`done`             | D139166                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | scope construct                                              | :good:`done`             | D157933, https://github.com/llvm/llvm-project/pull/109197             | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | routines for controlling and querying team regions           | :part:`partial`          | D95003 (libomp only)                                                  | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | changes to ompt_scope_endpoint_t enum                        | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | omp_display_env routine                                      | :good:`done`             | D74956                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | extended OMP_PLACES syntax                                   | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | OMP_NUM_TEAMS and OMP_TEAMS_THREAD_LIMIT env vars            | :good:`done`             | D138769                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | 'target_device' selector in context specifier                | :none:`worked on`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | begin/end declare variant                                    | :good:`done`             | D71179                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | dispatch construct and function variant argument adjustment  | :part:`worked on`        | D99537, D99679                                                        | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | assumes directives                                           | :part:`worked on`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | assume directive                                             | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | nothing directive                                            | :good:`done`             | D123286                                                               | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | masked construct and related combined constructs             | :good:`done`             | D99995, D100514, PR-121741(parallel_masked_taskloop)                  | +|                              |                                                              |                          | PR-121746(parallel_masked_task_loop_simd),PR-121914(masked_taskloop)  | +|                              |                                                              |                          | PR-121916(masked_taskloop_simd)                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| misc                         | default(firstprivate) & default(private)                     | :good:`done`             | D75591 (firstprivate), D125912 (private)                              | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| other                        | deprecating master construct                                 | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPT                         | new barrier types added to ompt_sync_region_t enum           | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPT                         | async data transfers added to ompt_target_data_op_t enum     | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPT                         | new barrier state values added to ompt_state_t enum          | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPT                         | new 'emi' callbacks for external monitoring interfaces       | :good:`done`             |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| OMPT                         | device tracing interface                                     | :none:`in progress`      | jplehr                                                                | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | 'strict' modifier for taskloop construct                     | :none:`unclaimed`        |                                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | inoutset in depend clause                                    | :good:`done`             | D97085, D118383                                                       | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ +| task                         | nowait clause on taskwait                                    | :part:`partial`          | parsing/sema done: D131830, D141531                                   | ++------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+ + + +.. _OpenMP 5.2 implementation details: + +OpenMP 5.2 Implementation Details +================================= + +The following table provides a quick overview of various OpenMP 5.2 features +and their implementation status. Please post on the +`Discourse forums (Runtimes - OpenMP category)`_ for more +information or if you want to help with the +implementation. + + + ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +|Feature                                                      | C/C++ Status              |  Fortran Status           | Reviews                                                                  | ++=============================================================+===========================+===========================+==========================================================================+ +| omp_in_explicit_task()                                      | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| semantics of explicit_task_var and implicit_task_var        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| ompx sentinel for C/C++ directive extensions                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| ompx prefix for clause extensions                           | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| if clause on teams construct                                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| step modifier added                                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| declare mapper: Add iterator modifier on map clause         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| declare mapper: Add iterator modifier on map clause         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| memspace and traits modifiers to uses allocator         i   | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Add otherwise clause to metadirectives                      | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| doacross clause with support for omp_cur_iteration          | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| position of interop_type in init clause on iterop           | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| implicit map type for target enter/exit data                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| work OMPT type for work-sharing loop constructs             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| allocate and firstprivate on scope directive                | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Change loop consistency for order clause                    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Add memspace and traits modifiers to uses_allocators        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Keep original base pointer on map w/o matched candidate     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Pure procedure support for certain directives               | :none:`N/A`               | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| ALLOCATE statement support for allocators                   | :none:`N/A`               | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| dispatch construct extension to support end directive       | :none:`N/A`               | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ + + + +.. _OpenMP 5.2 Deprecations: + +OpenMP 5.2 Deprecations +======================= + + + ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +|                                                             | C/C++ Status              |  Fortran Status           | Reviews                                                                  | ++=============================================================+===========================+===========================+==========================================================================+ +| Linear clause syntax                                        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| The minus operator                                          | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Map clause modifiers without commas                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| The use of allocate directives with ALLOCATE statement      | :good:`N/A`               | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| uses_allocators list syntax                                 | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| The default clause on metadirectives                        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| The delimited form of the declare target directive          | :none:`unclaimed`         | :good:`N/A`               |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| The use of the to clause on the declare target directive    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| The syntax of the destroy clause on the depobj construct    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| keyword source and sink as task-dependence modifiers        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| interop types in any position on init clause of interop     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| ompd prefix usage for some ICVs                             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ + +.. _OpenMP 6.0 implementation details: + +OpenMP 6.0 Implementation Details +================================= + +The following table provides a quick overview of various OpenMP 6.0 features +and their implementation status. Please post on the +`Discourse forums (Runtimes - OpenMP category)`_ for more +information or if you want to help with the +implementation. + + ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +|Feature                                                      | C/C++ Status              |  Fortran Status           | Reviews                                                                  | ++=============================================================+===========================+===========================+==========================================================================+ +| free-agent threads                                          | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| threadset clause                                            | :part:`partial`           | :none:`unclaimed`         | Parse/Sema/Codegen : https://github.com/llvm/llvm-project/pull/13580     | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Recording of task graphs                                    | :part:`in progress`       | :part:`in progress`       | clang: jtb20, flang: kparzysz                                            | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Parallel inductions                                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| init_complete for scan directive                            | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop interchange transformation                             | :good:`done`              | :none:`unclaimed`         | Clang (interchange): https://github.com/llvm/llvm-project/pull/93022     | +|                                                             |                           |                           | Clang (permutation): https://github.com/llvm/llvm-project/pull/92030     | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop reverse transformation                                 | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/92916                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop stripe transformation                                  | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/119891                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop fusion transformation                                  | :part:`in progress`       | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/139293                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop index set splitting transformation                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop transformation apply clause                            | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop fuse transformation                                    | :good:`done`              | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| workdistribute construct                                    |                           | :none:`in progress`       | @skc7, @mjklemm                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| task_iteration                                              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| memscope clause for atomic and flush                        | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| transparent clause (hull tasks)                             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| rule-based compound directives                              | :part:`In Progress`       | :part:`In Progress`       | kparzysz                                                                 | +|                                                             |                           |                           | Testing for Fortran missing                                              | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| C23, C++23                                                  | :none:`unclaimed`         |                           |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Fortran 2023                                                |                           | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| decl attribute for declarative directives                   | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| C attribute syntax                                          | :none:`unclaimed`         |                           |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| pure directives in DO CONCURRENT                            |                           | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Optional argument for all clauses                           | :none:`partial`           | :none:`In Progress`       | Parse/Sema (nowait): https://github.com/llvm/llvm-project/pull/159628    | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Function references for locator list items                  | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| All clauses accept directive name modifier                  | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Extensions to depobj construct                              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Extensions to atomic construct                              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Private reductions                                          | :good:`mostly`            | :none:`unclaimed`         | Parse/Sema:https://github.com/llvm/llvm-project/pull/129938              | +|                                                             |                           |                           | Codegen: https://github.com/llvm/llvm-project/pull/134709                | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Self maps                                                   | :part:`partial`           | :none:`unclaimed`         | parsing/sema done: https://github.com/llvm/llvm-project/pull/129888      | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Release map type for declare mapper                         | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Extensions to interop construct                             | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| no_openmp_constructs                                        | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125933                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| safe_sync and progress with identifier and API              | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| OpenMP directives in concurrent loop regions                | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125621                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| atomics constructs on concurrent loop regions               | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125621                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Loop construct with DO CONCURRENT                           |                           | :part:`In Progress`       |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| device_type clause for target construct                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| nowait for ancestor target directives                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| New API for devices' num_teams/thread_limit                 | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Host and device environment variables                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| num_threads ICV and clause accepts list                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Numeric names for environment variables                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Increment between places for OMP_PLACES                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| OMP_AVAILABLE_DEVICES envirable                             | :none:`unclaimed`         | :none:`unclaimed`         | (should wait for "Traits for default device envirable" being done)       | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Traits for default device envirable                         | :part:`in progress`       | :none:`unclaimed`         | ro-i                                                                     | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Optionally omit array length expression                     | :good:`done`              | :none:`unclaimed`         | (Parse) https://github.com/llvm/llvm-project/pull/148048,                | +|                                                             |                           |                           | (Sema) https://github.com/llvm/llvm-project/pull/152786                  | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Canonical loop sequences                                    | :part:`in progress`       | :part:`in progress`       | Clang: https://github.com/llvm/llvm-project/pull/139293                  | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Clarifications to Fortran map semantics                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| default clause at target construct                          | :part:`In Progress`       | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| ref count update use_device_{ptr, addr}                     | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Clarifications to implicit reductions                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| ref modifier for map clauses                                | :part:`In Progress`       | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| map-type modifiers in arbitrary position                    | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/90499                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Lift nesting restriction on concurrent loop                 | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/125621                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| priority clause for target constructs                       | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| changes to target_data construct                            | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Non-const do_not_sync for nowait/nogroup                    | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| need_device_addr modifier for adjust_args clause            | :part:`partial`           | :none:`unclaimed`         | Parsing/Sema: https://github.com/llvm/llvm-project/pull/143442           | +|                                                             |                           |                           |               https://github.com/llvm/llvm-project/pull/149586           | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Prescriptive num_threads                                    | :good:`done`              | :none:`unclaimed`         |  https://github.com/llvm/llvm-project/pull/160659                        | +|                                                             |                           |                           |  https://github.com/llvm/llvm-project/pull/146403                        | +|                                                             |                           |                           |  https://github.com/llvm/llvm-project/pull/146404                        | +|                                                             |                           |                           |  https://github.com/llvm/llvm-project/pull/146405                        | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Message and severity clauses                                | :good:`done`              | :none:`unclaimed`         |  https://github.com/llvm/llvm-project/pull/146093                        | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Local clause on declare target                              | :part:`In Progress`       | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| groupprivate directive                                      | :part:`In Progress`       | :part:`partial`           | Flang: kparzysz, mjklemm                                                 | +|                                                             |                           |                           |                                                                          | +|                                                             |                           |                           | Flang parser: https://github.com/llvm/llvm-project/pull/153807           | +|                                                             |                           |                           | Flang sema: https://github.com/llvm/llvm-project/pull/154779             | +|                                                             |                           |                           | Clang parse/sema: https://github.com/llvm/llvm-project/pull/158134       | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| variable-category on default clause                         | :good:`done`              | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| Changes to omp_target_is_accessible                         | :part:`In Progress`       | :part:`In Progress`       |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| defaultmap implicit-behavior 'storage'                      | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/158336                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| defaultmap implicit-behavior 'private'                      | :good:`done`              | :none:`unclaimed`         | https://github.com/llvm/llvm-project/pull/158712                         | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ + +.. _OpenMP 6.1 implementation details: + +OpenMP 6.1 Implementation Details (Experimental) +================================================ + +The following table provides a quick overview over various OpenMP 6.1 features +and their implementation status. Since OpenMP 6.1 has not yet been released, the +following features are experimental and are subject to change at any time. +Please post on the `Discourse forums (Runtimes - OpenMP category)`_ for more +information or if you want to help with the +implementation. + ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +|Feature                                                      | C/C++ Status              | Fortran Status            | Reviews                                                                  | ++=============================================================+===========================+===========================+==========================================================================+ +| dyn_groupprivate clause                                     | :part:`In Progress`       | :part:`In Progress`       | C/C++: kevinsala (https://github.com/llvm/llvm-project/pull/152651       | +|                                                             |                           |                           | https://github.com/llvm/llvm-project/pull/152830                         | +|                                                             |                           |                           | https://github.com/llvm/llvm-project/pull/152831)                        | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop flatten transformation                                 | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| loop grid/tile modifiers for sizes clause                   | :none:`unclaimed`         | :none:`unclaimed`         |                                                                          | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ +| attach map-type modifier                                    | :part:`In Progress`       | :none:`unclaimed`         | C/C++: @abhinavgaba;                                                     | +|                                                             |                           |                           | RT: @abhinavgaba (https://github.com/llvm/llvm-project/pull/149036,      | +|                                                             |                           |                           | https://github.com/llvm/llvm-project/pull/158370)                        | ++-------------------------------------------------------------+---------------------------+---------------------------+--------------------------------------------------------------------------+ + + +OpenMP Extensions +================= + +The following table provides a quick overview over various OpenMP +extensions and their implementation status.  These extensions are not +currently defined by any standard, so links to associated LLVM +documentation are provided.  As these extensions mature, they will be +considered for standardization. Please post on the +`Discourse forums (Runtimes - OpenMP category)`_ to provide feedback. + ++------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+ +|Category                      | Feature                                                                           | Status                   | Reviews                                                | ++==============================+===================================================================================+==========================+========================================================+ +| atomic extension             | `'atomic' strictly nested within 'teams'                                          | :good:`prototyped`       | D126323                                                | +|                              | <https://openmp.llvm.org/docs/openacc/OpenMPExtensions.html#atomicWithinTeams>`_  |                          |                                                        | ++------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+ +| device extension             | `'ompx_hold' map type modifier                                                    | :good:`prototyped`       | D106509, D106510                                       | +|                              | <https://openmp.llvm.org/docs/openacc/OpenMPExtensions.html#ompx-hold>`_          |                          |                                                        | ++------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+ +| device extension             | `'ompx_bare' clause on 'target teams' construct                                   | :good:`prototyped`       | #66844, #70612                                         | +|                              | <https://www.osti.gov/servlets/purl/2205717>`_                                    |                          |                                                        | ++------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+ +| device extension             | Multi-dim 'num_teams' and 'thread_limit' clause on 'target teams ompx_bare'       | :good:`partial`          | #99732, #101407, #102715                               | +|                              | construct                                                                         |                          |                                                        | ++------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+ + +.. _Discourse forums (Runtimes - OpenMP category): https://discourse.llvm.org/c/runtimes/openmp/35 diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index add1582..73aaaad 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -613,6 +613,14 @@ clang-format    literals.  - Add ``Leave`` suboption to ``IndentPPDirectives``.  - Add ``AllowBreakBeforeQtProperty`` option. +- Add ``BreakAfterOpenBracketBracedList'', ``BreakAfterOpenBracketFunction'', +  ``BreakAfterOpenBracketIf``, ``BreakAfterOpenBracketLoop``, +  ``BreakAfterOpenBracketSwitch``, ``BreakBeforeCloseBracketBracedList'', +  ``BreakBeforeCloseBracketFunction``, ``BreakBeforeCloseBracketIf``, +  ``BreakBeforeCloseBracketLoop``, ``BreakBeforeCloseBracketSwitch`` options. +- Deprecate ``AlwaysBreak`` and ``BlockIndent`` suboptions from the +  ``AlignAfterOpenBracket`` option, and make ``AlignAfterOpenBracket`` a +  ``bool`` type.  libclang  -------- @@ -651,6 +659,7 @@ Sanitizers  Python Binding Changes  ---------------------- +- Exposed ``clang_Cursor_isFunctionInlined``.  - Exposed ``clang_getCursorLanguage`` via ``Cursor.language``.  - Add all missing ``CursorKind``s, ``TypeKind``s and    ``ExceptionSpecificationKind``s from ``Index.h`` @@ -661,6 +670,7 @@ OpenMP Support    modifier in the ``adjust_args`` clause.  - Allow array length to be omitted in array section subscript expression.  - Fixed non-contiguous strided update in the ``omp target update`` directive with the ``from`` clause. +- Added support for threadset clause in task and taskloop directives.  - Properly handle array section/assumed-size array privatization in C/C++.  - Added support to handle new syntax of the ``uses_allocators`` clause.  - Added support for ``variable-category`` modifier in ``default clause``. diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index bc791e4..4f50748 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -1424,6 +1424,86 @@ public:    }  }; +/// This represents 'threadset' clause in the '#pragma omp task ...' directive. +/// +/// \code +/// #pragma omp task threadset(omp_pool) +/// \endcode +/// In this example directive '#pragma omp task' has simple 'threadset' +/// clause with kind 'omp_pool'. +class OMPThreadsetClause final : public OMPClause { +  friend class OMPClauseReader; + +  /// Location of '('. +  SourceLocation LParenLoc; + +  /// A kind of the 'threadset' clause. +  OpenMPThreadsetKind Kind = OMPC_THREADSET_unknown; + +  /// Start location of the kind in source code. +  SourceLocation KindLoc; + +  /// Set kind of the clauses. +  /// +  /// \param K Argument of clause. +  void setThreadsetKind(OpenMPThreadsetKind K) { Kind = K; } + +  /// Set argument location. +  /// +  /// \param KLoc Argument location. +  void setThreadsetKindLoc(SourceLocation KLoc) { KindLoc = KLoc; } + +public: +  /// Build 'threadset' clause with argument \a A ('omp_team' or 'omp_pool'). +  /// +  /// \param A Argument of the clause ('omp_team' or 'omp_pool'). +  /// \param ALoc Starting location of the argument. +  /// \param StartLoc Starting location of the clause. +  /// \param LParenLoc Location of '('. +  /// \param EndLoc Ending location of the clause. +  OMPThreadsetClause(OpenMPThreadsetKind A, SourceLocation ALoc, +                     SourceLocation StartLoc, SourceLocation LParenLoc, +                     SourceLocation EndLoc) +      : OMPClause(llvm::omp::OMPC_threadset, StartLoc, EndLoc), +        LParenLoc(LParenLoc), Kind(A), KindLoc(ALoc) {} + +  /// Build an empty clause. +  OMPThreadsetClause() +      : OMPClause(llvm::omp::OMPC_threadset, SourceLocation(), +                  SourceLocation()) {} + +  /// Sets the location of '('. +  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } + +  /// Returns the location of '('. +  SourceLocation getLParenLoc() const { return LParenLoc; } + +  /// Returns kind of the clause. +  OpenMPThreadsetKind getThreadsetKind() const { return Kind; } + +  /// Returns location of clause kind. +  SourceLocation getThreadsetKindLoc() const { return KindLoc; } + +  child_range children() { +    return child_range(child_iterator(), child_iterator()); +  } + +  const_child_range children() const { +    return const_child_range(const_child_iterator(), const_child_iterator()); +  } + +  child_range used_children() { +    return child_range(child_iterator(), child_iterator()); +  } +  const_child_range used_children() const { +    return const_child_range(const_child_iterator(), const_child_iterator()); +  } + +  static bool classof(const OMPClause *T) { +    return T->getClauseKind() == llvm::omp::OMPC_threadset; +  } +}; +  /// This represents 'proc_bind' clause in the '#pragma omp ...'  /// directive.  /// diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 32b2b6b..8cb0a65 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -3524,6 +3524,12 @@ bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {  }  template <typename Derived> +bool RecursiveASTVisitor<Derived>::VisitOMPThreadsetClause( +    OMPThreadsetClause *) { +  return true; +} + +template <typename Derived>  bool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {    return true;  } diff --git a/clang/include/clang/Basic/Builtins.def b/clang/include/clang/Basic/Builtins.def index b856ad1..3a5b72e 100644 --- a/clang/include/clang/Basic/Builtins.def +++ b/clang/include/clang/Basic/Builtins.def @@ -43,6 +43,7 @@  //  SJ -> sigjmp_buf  //  K -> ucontext_t  //  p -> pid_t +//  e -> _Float16 for HIP/C++ and __fp16 for OpenCL  //  . -> "...".  This may only occur at the end of the function list.  //  // Types may be prefixed with the following modifiers: diff --git a/clang/include/clang/Basic/BuiltinsAMDGPU.def b/clang/include/clang/Basic/BuiltinsAMDGPU.def index f265d82..36cb527 100644 --- a/clang/include/clang/Basic/BuiltinsAMDGPU.def +++ b/clang/include/clang/Basic/BuiltinsAMDGPU.def @@ -967,6 +967,47 @@ TARGET_BUILTIN(__builtin_amdgcn_image_sample_3d_v4f32_f32, "V4fifffQtV4ibii", "n  TARGET_BUILTIN(__builtin_amdgcn_image_sample_3d_v4f16_f32, "V4hifffQtV4ibii", "nc", "image-insts")  TARGET_BUILTIN(__builtin_amdgcn_image_sample_cube_v4f32_f32, "V4fifffQtV4ibii", "nc", "image-insts")  TARGET_BUILTIN(__builtin_amdgcn_image_sample_cube_v4f16_f32, "V4hifffQtV4ibii", "nc", "image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_1d_v4f32_f32, "V4fifQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_1d_v4f16_f32, "V4eifQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32, "V4fiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32, "V4eiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_2d_f32_f32, "fiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_2d_v4f32_f32, "V4fiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_2d_v4f16_f32, "V4eiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_2darray_f32_f32, "fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32, "V4fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32, "V4eifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_3d_v4f32_f32, "V4fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_3d_v4f16_f32, "V4eifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_cube_v4f32_f32, "V4fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_lz_cube_v4f16_f32, "V4eifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_1d_v4f32_f32, "V4fiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_1d_v4f16_f32, "V4eiffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_1darray_v4f32_f32, "V4fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_1darray_v4f16_f32, "V4eifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_2d_f32_f32, "fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_2d_v4f32_f32, "V4fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_2d_v4f16_f32, "V4eifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_2darray_f32_f32, "fiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_2darray_v4f32_f32, "V4fiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_2darray_v4f16_f32, "V4eiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_3d_v4f32_f32, "V4fiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_3d_v4f16_f32, "V4eiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_cube_v4f32_f32, "V4fiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_l_cube_v4f16_f32, "V4eiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_1d_v4f32_f32, "V4fifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_1d_v4f16_f32, "V4eifffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_1darray_v4f32_f32, "V4fiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_1darray_v4f16_f32, "V4eiffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_2d_f32_f32, "fiffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_2d_v4f32_f32, "V4fiffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_2d_v4f16_f32, "V4eiffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_2darray_f32_f32, "fifffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_2darray_v4f32_f32, "V4fifffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_2darray_v4f16_f32, "V4eifffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_3d_v4f32_f32, "V4fifffffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_sample_d_3d_v4f16_f32, "V4eifffffffffQtV4ibii", "nc", "extended-image-insts") +TARGET_BUILTIN(__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32, "V4fiffQtV4ibii", "nc", "extended-image-insts")  #undef BUILTIN  #undef TARGET_BUILTIN diff --git a/clang/include/clang/Basic/BuiltinsX86.td b/clang/include/clang/Basic/BuiltinsX86.td index 500aa85..9e877b9 100644 --- a/clang/include/clang/Basic/BuiltinsX86.td +++ b/clang/include/clang/Basic/BuiltinsX86.td @@ -328,7 +328,6 @@ let Features = "ssse3", Attributes = [NoThrow, Const, Constexpr, RequiredVectorW  }  let Features = "sse4.1", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in { -  def insertps128 : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>, _Constant char)">;    def roundps : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Constant int)">;    def roundss : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>, _Constant int)">;    def roundsd : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>, _Constant int)">; @@ -342,6 +341,8 @@ let Features = "sse4.1", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]  let Features = "sse4.1",      Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in { +  def insertps128 : X86Builtin<"_Vector<4, float>(_Vector<4, float>, " +                               "_Vector<4, float>, _Constant char)">;    def ptestz128        : X86Builtin<"int(_Vector<2, long long int>, _Vector<2, long long int>)">;    def ptestc128 diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def index 202d06f..328a0747 100644 --- a/clang/include/clang/Basic/OpenMPKinds.def +++ b/clang/include/clang/Basic/OpenMPKinds.def @@ -98,6 +98,9 @@  #ifndef OPENMP_ALLOCATE_MODIFIER  #define OPENMP_ALLOCATE_MODIFIER(Name)  #endif +#ifndef OPENMP_THREADSET_KIND +#define OPENMP_THREADSET_KIND(Name) +#endif  // Static attributes for 'schedule' clause.  OPENMP_SCHEDULE_KIND(static) @@ -255,6 +258,9 @@ OPENMP_DOACROSS_MODIFIER(sink)  OPENMP_DOACROSS_MODIFIER(sink_omp_cur_iteration)  OPENMP_DOACROSS_MODIFIER(source_omp_cur_iteration) +OPENMP_THREADSET_KIND(omp_pool) +OPENMP_THREADSET_KIND(omp_team) +  #undef OPENMP_NUMTASKS_MODIFIER  #undef OPENMP_NUMTHREADS_MODIFIER  #undef OPENMP_GRAINSIZE_MODIFIER @@ -284,4 +290,4 @@ OPENMP_DOACROSS_MODIFIER(source_omp_cur_iteration)  #undef OPENMP_DEFAULTMAP_MODIFIER  #undef OPENMP_DOACROSS_MODIFIER  #undef OPENMP_ALLOCATE_MODIFIER - +#undef OPENMP_THREADSET_KIND diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h index ed89a31..c9ddbcd 100644 --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -250,6 +250,13 @@ enum OpenMPAllocateClauseModifier {    OMPC_ALLOCATE_unknown  }; +/// OpenMP modifiers for 'threadset' clause. +enum OpenMPThreadsetKind { +#define OPENMP_THREADSET_KIND(Name) OMPC_THREADSET_##Name, +#include "clang/Basic/OpenMPKinds.def" +  OMPC_THREADSET_unknown +}; +  /// Number of allowed allocate-modifiers.  static constexpr unsigned NumberOfOMPAllocateClauseModifiers =      OMPC_ALLOCATE_unknown; diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index 2852c4a..f246def 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -62,49 +62,28 @@ struct FormatStyle {    /// \version 3.3    int AccessModifierOffset; -  /// Different styles for aligning after open brackets. -  enum BracketAlignmentStyle : int8_t { -    /// Align parameters on the open bracket, e.g.: -    /// \code -    ///   someLongFunction(argument1, -    ///                    argument2); -    /// \endcode -    BAS_Align, -    /// Don't align, instead use ``ContinuationIndentWidth``, e.g.: -    /// \code -    ///   someLongFunction(argument1, -    ///       argument2); -    /// \endcode -    BAS_DontAlign, -    /// Always break after an open bracket, if the parameters don't fit -    /// on a single line, e.g.: -    /// \code -    ///   someLongFunction( -    ///       argument1, argument2); -    /// \endcode -    BAS_AlwaysBreak, -    /// Always break after an open bracket, if the parameters don't fit -    /// on a single line. Closing brackets will be placed on a new line. -    /// E.g.: -    /// \code -    ///   someLongFunction( -    ///       argument1, argument2 -    ///   ) -    /// \endcode -    /// -    /// \note -    ///  This currently only applies to braced initializer lists (when -    ///  ``Cpp11BracedListStyle`` is not ``Block``) and parentheses. -    /// \endnote -    BAS_BlockIndent, -  }; -    /// If ``true``, horizontally aligns arguments after an open bracket.    /// +  /// \code +  ///   true:                         vs.   false +  ///   someLongFunction(argument1,         someLongFunction(argument1, +  ///                    argument2);            argument2); +  /// \endcode +  /// +  /// \note +  ///   As of clang-format 22 this option is a bool with the previous +  ///   option of ``Align`` replaced with ``true``, ``DontAlign`` replaced +  ///   with ``false``, and the options of ``AlwaysBreak`` and ``BlockIndent`` +  ///   replaced with ``true`` and with setting of new style options using +  ///   ``BreakAfterOpenBracketBracedList``, ``BreakAfterOpenBracketFunction``, +  ///   ``BreakAfterOpenBracketIf``, ``BreakBeforeCloseBracketBracedList``, +  ///   ``BreakBeforeCloseBracketFunction``, and ``BreakBeforeCloseBracketIf``. +  /// \endnote +  ///    /// This applies to round brackets (parentheses), angle brackets and square    /// brackets.    /// \version 3.8 -  BracketAlignmentStyle AlignAfterOpenBracket; +  bool AlignAfterOpenBracket;    /// Different style for aligning array initializers.    enum ArrayInitializerAlignmentStyle : int8_t { @@ -1708,6 +1687,57 @@ struct FormatStyle {    /// \version 16    AttributeBreakingStyle BreakAfterAttributes; +  /// Force break after the left bracket of a braced initializer list (when +  /// ``Cpp11BracedListStyle`` is ``true``) when the list exceeds the column +  /// limit. +  /// \code +  ///   true:                             false: +  ///   vector<int> x {         vs.       vector<int> x {1, +  ///      1, 2, 3}                            2, 3} +  /// \endcode +  /// \version 22 +  bool BreakAfterOpenBracketBracedList; + +  /// Force break after the left parenthesis of a function (declaration, +  /// definition, call) when the parameters exceed the column limit. +  /// \code +  ///   true:                             false: +  ///   foo (                   vs.       foo (a, +  ///      a , b)                              b) +  /// \endcode +  /// \version 22 +  bool BreakAfterOpenBracketFunction; + +  /// Force break after the left parenthesis of an if control statement +  /// when the expression exceeds the column limit. +  /// \code +  ///   true:                             false: +  ///   if constexpr (          vs.       if constexpr (a || +  ///      a || b)                                      b) +  /// \endcode +  /// \version 22 +  bool BreakAfterOpenBracketIf; + +  /// Force break after the left parenthesis of a loop control statement +  /// when the expression exceeds the column limit. +  /// \code +  ///   true:                             false: +  ///   while (                  vs.      while (a && +  ///      a && b) {                             b) { +  /// \endcode +  /// \version 22 +  bool BreakAfterOpenBracketLoop; + +  /// Force break after the left parenthesis of a switch control statement +  /// when the expression exceeds the column limit. +  /// \code +  ///   true:                             false: +  ///   switch (                 vs.      switch (a + +  ///      a + b) {                               b) { +  /// \endcode +  /// \version 22 +  bool BreakAfterOpenBracketSwitch; +    /// The function declaration return type breaking style to use.    /// \version 19    ReturnTypeBreakingStyle BreakAfterReturnType; @@ -2221,6 +2251,69 @@ struct FormatStyle {    /// \version 3.7    BraceBreakingStyle BreakBeforeBraces; +  /// Force break before the right bracket of a braced initializer list (when +  /// ``Cpp11BracedListStyle`` is ``true``) when the list exceeds the column +  /// limit. The break before the right bracket is only made if there is a +  /// break after the opening bracket. +  /// \code +  ///   true:                             false: +  ///   vector<int> x {         vs.       vector<int> x { +  ///      1, 2, 3                           1, 2, 3} +  ///   } +  /// \endcode +  /// \version 22 +  bool BreakBeforeCloseBracketBracedList; + +  /// Force break before the right parenthesis of a function (declaration, +  /// definition, call) when the parameters exceed the column limit. +  /// \code +  ///   true:                             false: +  ///   foo (                   vs.       foo ( +  ///      a , b                             a , b) +  ///   ) +  /// \endcode +  /// \version 22 +  bool BreakBeforeCloseBracketFunction; + +  /// Force break before the right parenthesis of an if control statement +  /// when the expression exceeds the column limit. The break before the +  /// closing parenthesis is only made if there is a break after the opening +  /// parenthesis. +  /// \code +  ///   true:                             false: +  ///   if constexpr (          vs.       if constexpr ( +  ///      a || b                            a || b ) +  ///   ) +  /// \endcode +  /// \version 22 +  bool BreakBeforeCloseBracketIf; + +  /// Force break before the right parenthesis of a loop control statement +  /// when the expression exceeds the column limit. The break before the +  /// closing parenthesis is only made if there is a break after the opening +  /// parenthesis. +  /// \code +  ///   true:                             false: +  ///   while (                  vs.      while ( +  ///      a && b                            a && b) { +  ///   ) { +  /// \endcode +  /// \version 22 +  bool BreakBeforeCloseBracketLoop; + +  /// Force break before the right parenthesis of a switch control statement +  /// when the expression exceeds the column limit. The break before the +  /// closing parenthesis is only made if there is a break after the opening +  /// parenthesis. +  /// \code +  ///   true:                             false: +  ///   switch (                 vs.      switch ( +  ///      a + b                             a + b) { +  ///   ) { +  /// \endcode +  /// \version 22 +  bool BreakBeforeCloseBracketSwitch; +    /// Different ways to break before concept declarations.    enum BreakBeforeConceptDeclarationsStyle : int8_t {      /// Keep the template declaration line together with ``concept``. @@ -5530,10 +5623,23 @@ struct FormatStyle {             BreakAdjacentStringLiterals == R.BreakAdjacentStringLiterals &&             BreakAfterAttributes == R.BreakAfterAttributes &&             BreakAfterJavaFieldAnnotations == R.BreakAfterJavaFieldAnnotations && +           BreakAfterOpenBracketBracedList == +               R.BreakAfterOpenBracketBracedList && +           BreakAfterOpenBracketFunction == R.BreakAfterOpenBracketFunction && +           BreakAfterOpenBracketIf == R.BreakAfterOpenBracketIf && +           BreakAfterOpenBracketLoop == R.BreakAfterOpenBracketLoop && +           BreakAfterOpenBracketSwitch == R.BreakAfterOpenBracketSwitch &&             BreakAfterReturnType == R.BreakAfterReturnType &&             BreakArrays == R.BreakArrays &&             BreakBeforeBinaryOperators == R.BreakBeforeBinaryOperators &&             BreakBeforeBraces == R.BreakBeforeBraces && +           BreakBeforeCloseBracketBracedList == +               R.BreakBeforeCloseBracketBracedList && +           BreakBeforeCloseBracketFunction == +               R.BreakBeforeCloseBracketFunction && +           BreakBeforeCloseBracketIf == R.BreakBeforeCloseBracketIf && +           BreakBeforeCloseBracketLoop == R.BreakBeforeCloseBracketLoop && +           BreakBeforeCloseBracketSwitch == R.BreakBeforeCloseBracketSwitch &&             BreakBeforeConceptDeclarations == R.BreakBeforeConceptDeclarations &&             BreakBeforeInlineASMColon == R.BreakBeforeInlineASMColon &&             BreakBeforeTemplateCloser == R.BreakBeforeTemplateCloser && diff --git a/clang/include/clang/Sema/SemaOpenMP.h b/clang/include/clang/Sema/SemaOpenMP.h index f9baeed..ba12b40 100644 --- a/clang/include/clang/Sema/SemaOpenMP.h +++ b/clang/include/clang/Sema/SemaOpenMP.h @@ -975,6 +975,12 @@ public:                             OpenMPDefaultClauseVariableCategory VCKind,                             SourceLocation VCKindLoc, SourceLocation StartLoc,                             SourceLocation LParenLoc, SourceLocation EndLoc); +  /// Called on well-formed 'threadset' clause. +  OMPClause *ActOnOpenMPThreadsetClause(OpenMPThreadsetKind Kind, +                                        SourceLocation KindLoc, +                                        SourceLocation StartLoc, +                                        SourceLocation LParenLoc, +                                        SourceLocation EndLoc);    /// Called on well-formed 'proc_bind' clause.    OMPClause *ActOnOpenMPProcBindClause(llvm::omp::ProcBindKind Kind,                                         SourceLocation KindLoc, diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 687cd46..2669f62 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -12403,6 +12403,11 @@ static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,    // Read the base type.    switch (*Str++) {    default: llvm_unreachable("Unknown builtin type letter!"); +  case 'e': +    assert(HowLong == 0 && !Signed && !Unsigned && +           "Bad modifiers used with 'e'!"); +    Type = Context.getLangOpts().OpenCL ? Context.HalfTy : Context.Float16Ty; +    break;    case 'x':      assert(HowLong == 0 && !Signed && !Unsigned &&             "Bad modifiers used with 'x'!"); diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index b3ab82d..8b57b96 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -3411,7 +3411,7 @@ static bool interp__builtin_x86_byteshift(  static bool interp__builtin_ia32_shuffle_generic(      InterpState &S, CodePtr OpPC, const CallExpr *Call, -    llvm::function_ref<std::pair<unsigned, unsigned>(unsigned, unsigned)> +    llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>          GetSourceIndex) {    assert(Call->getNumArgs() == 3); @@ -3428,8 +3428,19 @@ static bool interp__builtin_ia32_shuffle_generic(    for (unsigned DstIdx = 0; DstIdx != NumElems; ++DstIdx) {      auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask); -    const Pointer &Src = (SrcVecIdx == 0) ? A : B; -    TYPE_SWITCH(ElemT, { Dst.elem<T>(DstIdx) = Src.elem<T>(SrcIdx); }); + +    if (SrcIdx < 0) { +      // Zero out this element +      if (ElemT == PT_Float) { +        Dst.elem<Floating>(DstIdx) = Floating( +            S.getASTContext().getFloatTypeSemantics(VecT->getElementType())); +      } else { +        INT_TYPE_SWITCH_NO_BOOL(ElemT, { Dst.elem<T>(DstIdx) = T::from(0); }); +      } +    } else { +      const Pointer &Src = (SrcVecIdx == 0) ? A : B; +      TYPE_SWITCH(ElemT, { Dst.elem<T>(DstIdx) = Src.elem<T>(SrcIdx); }); +    }    }    Dst.initializeAllElements(); @@ -4382,7 +4393,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,            unsigned SrcIdx = ElemInLane >= NumSelectableElems ? 1 : 0;            unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;            unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -          return std::pair<unsigned, unsigned>{SrcIdx, LaneOffset + Index}; +          return std::pair<unsigned, int>{SrcIdx, +                                          static_cast<int>(LaneOffset + Index)};          });    case X86::BI__builtin_ia32_shufpd:    case X86::BI__builtin_ia32_shufpd256: @@ -4400,7 +4412,27 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,            unsigned SrcIdx = ElemInLane >= NumSelectableElems ? 1 : 0;            unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;            unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -          return std::pair<unsigned, unsigned>{SrcIdx, LaneOffset + Index}; +          return std::pair<unsigned, int>{SrcIdx, +                                          static_cast<int>(LaneOffset + Index)}; +        }); +  case X86::BI__builtin_ia32_insertps128: +    return interp__builtin_ia32_shuffle_generic( +        S, OpPC, Call, [](unsigned DstIdx, unsigned Mask) { +          // Bits [3:0]: zero mask - if bit is set, zero this element +          if ((Mask & (1 << DstIdx)) != 0) { +            return std::pair<unsigned, int>{0, -1}; +          } +          // Bits [7:6]: select element from source vector Y (0-3) +          // Bits [5:4]: select destination position (0-3) +          unsigned SrcElem = (Mask >> 6) & 0x3; +          unsigned DstElem = (Mask >> 4) & 0x3; +          if (DstIdx == DstElem) { +            // Insert element from source vector (B) at this position +            return std::pair<unsigned, int>{1, static_cast<int>(SrcElem)}; +          } else { +            // Copy from destination vector (A) +            return std::pair<unsigned, int>{0, static_cast<int>(DstIdx)}; +          }          });    case X86::BI__builtin_ia32_pshufb128:    case X86::BI__builtin_ia32_pshufb256: diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d0404b9..97eeba8 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11621,7 +11621,7 @@ static bool evalPackBuiltin(const CallExpr *E, EvalInfo &Info, APValue &Result,  static bool evalShuffleGeneric(      EvalInfo &Info, const CallExpr *Call, APValue &Out, -    llvm::function_ref<std::pair<unsigned, unsigned>(unsigned, unsigned)> +    llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>          GetSourceIndex) {    const auto *VT = Call->getType()->getAs<VectorType>(); @@ -11644,8 +11644,16 @@ static bool evalShuffleGeneric(    for (unsigned DstIdx = 0; DstIdx != NumElts; ++DstIdx) {      auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask); -    const APValue &Src = (SrcVecIdx == 0) ? A : B; -    ResultElements.push_back(Src.getVectorElt(SrcIdx)); + +    if (SrcIdx < 0) { +      // Zero out this element +      QualType ElemTy = VT->getElementType(); +      ResultElements.push_back( +          APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy)))); +    } else { +      const APValue &Src = (SrcVecIdx == 0) ? A : B; +      ResultElements.push_back(Src.getVectorElt(SrcIdx)); +    }    }    Out = APValue(ResultElements.data(), ResultElements.size()); @@ -12438,7 +12446,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {      if (!evalShuffleGeneric(              Info, E, R,              [](unsigned DstIdx, -               unsigned ShuffleMask) -> std::pair<unsigned, unsigned> { +               unsigned ShuffleMask) -> std::pair<unsigned, int> {                constexpr unsigned LaneBits = 128u;                unsigned NumElemPerLane = LaneBits / 32;                unsigned NumSelectableElems = NumElemPerLane / 2; @@ -12451,7 +12459,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {                unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;                unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;                unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -              return {SrcIdx, LaneOffset + Index}; +              return {SrcIdx, static_cast<int>(LaneOffset + Index)};              }))        return false;      return Success(R, E); @@ -12463,7 +12471,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {      if (!evalShuffleGeneric(              Info, E, R,              [](unsigned DstIdx, -               unsigned ShuffleMask) -> std::pair<unsigned, unsigned> { +               unsigned ShuffleMask) -> std::pair<unsigned, int> {                constexpr unsigned LaneBits = 128u;                unsigned NumElemPerLane = LaneBits / 64;                unsigned NumSelectableElems = NumElemPerLane / 2; @@ -12476,7 +12484,31 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {                unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;                unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;                unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -              return {SrcIdx, LaneOffset + Index}; +              return {SrcIdx, static_cast<int>(LaneOffset + Index)}; +            })) +      return false; +    return Success(R, E); +  } +  case X86::BI__builtin_ia32_insertps128: { +    APValue R; +    if (!evalShuffleGeneric( +            Info, E, R, +            [](unsigned DstIdx, unsigned Mask) -> std::pair<unsigned, int> { +              // Bits [3:0]: zero mask - if bit is set, zero this element +              if ((Mask & (1 << DstIdx)) != 0) { +                return {0, -1}; +              } +              // Bits [7:6]: select element from source vector Y (0-3) +              // Bits [5:4]: select destination position (0-3) +              unsigned SrcElem = (Mask >> 6) & 0x3; +              unsigned DstElem = (Mask >> 4) & 0x3; +              if (DstIdx == DstElem) { +                // Insert element from source vector (B) at this position +                return {1, static_cast<int>(SrcElem)}; +              } else { +                // Copy from destination vector (A) +                return {0, static_cast<int>(DstIdx)}; +              }              }))        return false;      return Success(R, E); diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp index 791df7e..59d9459 100644 --- a/clang/lib/AST/OpenMPClause.cpp +++ b/clang/lib/AST/OpenMPClause.cpp @@ -124,6 +124,7 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {    case OMPC_nowait:    case OMPC_untied:    case OMPC_mergeable: +  case OMPC_threadset:    case OMPC_threadprivate:    case OMPC_groupprivate:    case OMPC_flush: @@ -2035,6 +2036,13 @@ void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) {    OS << ")";  } +void OMPClausePrinter::VisitOMPThreadsetClause(OMPThreadsetClause *Node) { +  OS << "threadset(" +     << getOpenMPSimpleClauseTypeName(OMPC_threadset, +                                      unsigned(Node->getThreadsetKind())) +     << ")"; +} +  void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) {    OS << "proc_bind("       << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index 05b64cc..c909e1b 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -546,6 +546,8 @@ void OMPClauseProfiler::VisitOMPNocontextClause(const OMPNocontextClause *C) {  void OMPClauseProfiler::VisitOMPDefaultClause(const OMPDefaultClause *C) { } +void OMPClauseProfiler::VisitOMPThreadsetClause(const OMPThreadsetClause *C) {} +  void OMPClauseProfiler::VisitOMPProcBindClause(const OMPProcBindClause *C) { }  void OMPClauseProfiler::VisitOMPUnifiedAddressClause( diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp index 64b2bff..3d41f2d 100644 --- a/clang/lib/Basic/OpenMPKinds.cpp +++ b/clang/lib/Basic/OpenMPKinds.cpp @@ -210,6 +210,15 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,  #define OPENMP_ALLOCATE_MODIFIER(Name) .Case(#Name, OMPC_ALLOCATE_##Name)  #include "clang/Basic/OpenMPKinds.def"          .Default(OMPC_ALLOCATE_unknown); +  case OMPC_threadset: { +    unsigned Type = llvm::StringSwitch<unsigned>(Str) +#define OPENMP_THREADSET_KIND(Name) .Case(#Name, OMPC_THREADSET_##Name) +#include "clang/Basic/OpenMPKinds.def" +                        .Default(OMPC_THREADSET_unknown); +    if (LangOpts.OpenMP < 60) +      return OMPC_THREADSET_unknown; +    return Type; +  }    case OMPC_num_threads: {      unsigned Type = llvm::StringSwitch<unsigned>(Str)  #define OPENMP_NUMTHREADS_MODIFIER(Name) .Case(#Name, OMPC_NUMTHREADS_##Name) @@ -565,6 +574,16 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,  #include "clang/Basic/OpenMPKinds.def"      }      llvm_unreachable("Invalid OpenMP 'num_threads' clause modifier"); +  case OMPC_threadset: +    switch (Type) { +    case OMPC_THREADSET_unknown: +      return "unknown"; +#define OPENMP_THREADSET_KIND(Name)                                            \ +  case OMPC_THREADSET_##Name:                                                  \ +    return #Name; +#include "clang/Basic/OpenMPKinds.def" +    } +    llvm_unreachable("Invalid OpenMP 'threadset' clause modifier");    case OMPC_unknown:    case OMPC_threadprivate:    case OMPC_groupprivate: diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index d4de704..d4d696b 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -356,12 +356,6 @@ void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,    if (hasFastFMA())      Builder.defineMacro("FP_FAST_FMA"); -  Builder.defineMacro("__AMDGCN_WAVEFRONT_SIZE__", Twine(WavefrontSize), -                      "compile-time-constant access to the wavefront size will " -                      "be removed in a future release"); -  Builder.defineMacro("__AMDGCN_WAVEFRONT_SIZE", Twine(WavefrontSize), -                      "compile-time-constant access to the wavefront size will " -                      "be removed in a future release");    Builder.defineMacro("__AMDGCN_CUMODE__", Twine(CUMode));  } diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 07a2cfb..ca579c9 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -345,7 +345,7 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {    if (Loc.isInvalid())      return; -  CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc); +  CurLoc = CGM.getContext().getSourceManager().getFileLoc(Loc);    // If we've changed files in the middle of a lexical scope go ahead    // and create a new lexical scope with file node if it's different @@ -572,7 +572,7 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {      FileName = TheCU->getFile()->getFilename();      CSInfo = TheCU->getFile()->getChecksum();    } else { -    PresumedLoc PLoc = SM.getPresumedLoc(Loc); +    PresumedLoc PLoc = SM.getPresumedLoc(SM.getFileLoc(Loc));      FileName = PLoc.getFilename();      if (FileName.empty()) { @@ -599,7 +599,8 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {      if (CSKind)        CSInfo.emplace(*CSKind, Checksum);    } -  return createFile(FileName, CSInfo, getSource(SM, SM.getFileID(Loc))); +  return createFile(FileName, CSInfo, +                    getSource(SM, SM.getFileID(SM.getFileLoc(Loc))));  }  llvm::DIFile *CGDebugInfo::createFile( @@ -654,7 +655,7 @@ unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {    if (Loc.isInvalid())      return 0;    SourceManager &SM = CGM.getContext().getSourceManager(); -  return SM.getPresumedLoc(Loc).getLine(); +  return SM.getPresumedLoc(SM.getFileLoc(Loc)).getLine();  }  unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) { @@ -666,7 +667,8 @@ unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {    if (Loc.isInvalid() && CurLoc.isInvalid())      return 0;    SourceManager &SM = CGM.getContext().getSourceManager(); -  PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc); +  PresumedLoc PLoc = +      SM.getPresumedLoc(Loc.isValid() ? SM.getFileLoc(Loc) : CurLoc);    return PLoc.isValid() ? PLoc.getColumn() : 0;  } @@ -1174,7 +1176,10 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {  }  llvm::DIType *CGDebugInfo::CreateType(const BitIntType *Ty) { -  StringRef Name = Ty->isUnsigned() ? "unsigned _BitInt" : "_BitInt"; +  SmallString<32> Name; +  llvm::raw_svector_ostream OS(Name); +  OS << (Ty->isUnsigned() ? "unsigned _BitInt(" : "_BitInt(") +     << Ty->getNumBits() << ")";    llvm::dwarf::TypeKind Encoding = Ty->isUnsigned()                                         ? llvm::dwarf::DW_ATE_unsigned                                         : llvm::dwarf::DW_ATE_signed; @@ -4999,7 +5004,7 @@ void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {    // Update our current location    setLocation(Loc); -  if (CurLoc.isInvalid() || CurLoc.isMacroID() || LexicalBlockStack.empty()) +  if (CurLoc.isInvalid() || LexicalBlockStack.empty())      return;    llvm::MDNode *Scope = LexicalBlockStack.back(); @@ -6275,7 +6280,8 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,  void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,                                              const StringLiteral *S) {    SourceLocation Loc = S->getStrTokenLoc(0); -  PresumedLoc PLoc = CGM.getContext().getSourceManager().getPresumedLoc(Loc); +  SourceManager &SM = CGM.getContext().getSourceManager(); +  PresumedLoc PLoc = SM.getPresumedLoc(SM.getFileLoc(Loc));    if (!PLoc.isValid())      return; diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 66fea92..121de42 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -3731,6 +3731,7 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc,      DestructorsFlag = 0x8,      PriorityFlag = 0x20,      DetachableFlag = 0x40, +    FreeAgentFlag = 0x80,    };    unsigned Flags = Data.Tied ? TiedFlag : 0;    bool NeedsCleanup = false; @@ -3740,6 +3741,11 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc,      if (NeedsCleanup)        Flags = Flags | DestructorsFlag;    } +  if (const auto *Clause = D.getSingleClause<OMPThreadsetClause>()) { +    OpenMPThreadsetKind Kind = Clause->getThreadsetKind(); +    if (Kind == OMPC_THREADSET_omp_pool) +      Flags = Flags | FreeAgentFlag; +  }    if (Data.Priority.getInt())      Flags = Flags | PriorityFlag;    if (D.hasClausesOfKind<OMPDetachClause>()) diff --git a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp index f49a5af..9eab709 100644 --- a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp +++ b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp @@ -647,8 +647,8 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,    case AMDGPU::BI__builtin_amdgcn_ballot_w64: {      llvm::Type *ResultType = ConvertType(E->getType());      llvm::Value *Src = EmitScalarExpr(E->getArg(0)); -    Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_ballot, { ResultType }); -    return Builder.CreateCall(F, { Src }); +    Function *F = CGM.getIntrinsic(Intrinsic::amdgcn_ballot, {ResultType}); +    return Builder.CreateCall(F, {Src});    }    case AMDGPU::BI__builtin_amdgcn_inverse_ballot_w32:    case AMDGPU::BI__builtin_amdgcn_inverse_ballot_w64: { @@ -1139,6 +1139,83 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned BuiltinID,    case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:      return emitAMDGCNImageOverloadedReturnType(          *this, E, Intrinsic::amdgcn_image_sample_cube, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_lz_1d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_l_1d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_d_1d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_lz_2d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_l_2d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_d_2d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_lz_3d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_l_3d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_d_3d, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_lz_cube, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_l_cube, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_lz_1darray, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_l_1darray, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_d_1darray, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_lz_2darray, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_l_2darray, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32: +  case clang::AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_sample_d_2darray, false); +  case clang::AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32: +    return emitAMDGCNImageOverloadedReturnType( +        *this, E, Intrinsic::amdgcn_image_gather4_lz_2d, false);    case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_16x16x128_f8f6f4:    case AMDGPU::BI__builtin_amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {      llvm::FixedVectorType *VT = FixedVectorType::get(Builder.getInt32Ty(), 8); diff --git a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp index 60f9b86..15fa78d 100644 --- a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp +++ b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp @@ -1193,14 +1193,22 @@ static const ARMVectorIntrinsicInfo AArch64SISDIntrinsicMap[] = {    NEONMAP1(vaddlvq_s32, aarch64_neon_saddlv, AddRetType | Add1ArgType),    NEONMAP1(vaddlvq_u32, aarch64_neon_uaddlv, AddRetType | Add1ArgType),    NEONMAP1(vaddv_f32, aarch64_neon_faddv, AddRetType | Add1ArgType), -  NEONMAP1(vaddv_s32, aarch64_neon_saddv, AddRetType | Add1ArgType), -  NEONMAP1(vaddv_u32, aarch64_neon_uaddv, AddRetType | Add1ArgType), +  NEONMAP1(vaddv_s16, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddv_s32, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddv_s8, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddv_u16, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddv_u32, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddv_u8, vector_reduce_add, Add1ArgType),    NEONMAP1(vaddvq_f32, aarch64_neon_faddv, AddRetType | Add1ArgType),    NEONMAP1(vaddvq_f64, aarch64_neon_faddv, AddRetType | Add1ArgType), -  NEONMAP1(vaddvq_s32, aarch64_neon_saddv, AddRetType | Add1ArgType), -  NEONMAP1(vaddvq_s64, aarch64_neon_saddv, AddRetType | Add1ArgType), -  NEONMAP1(vaddvq_u32, aarch64_neon_uaddv, AddRetType | Add1ArgType), -  NEONMAP1(vaddvq_u64, aarch64_neon_uaddv, AddRetType | Add1ArgType), +  NEONMAP1(vaddvq_s16, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_s32, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_s64, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_s8, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_u16, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_u32, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_u64, vector_reduce_add, Add1ArgType), +  NEONMAP1(vaddvq_u8, vector_reduce_add, Add1ArgType),    NEONMAP1(vcaged_f64, aarch64_neon_facge, AddRetType | Add1ArgType),    NEONMAP1(vcages_f32, aarch64_neon_facge, AddRetType | Add1ArgType),    NEONMAP1(vcagtd_f64, aarch64_neon_facgt, AddRetType | Add1ArgType), @@ -1243,27 +1251,43 @@ static const ARMVectorIntrinsicInfo AArch64SISDIntrinsicMap[] = {    NEONMAP1(vmaxnmvq_f32, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType),    NEONMAP1(vmaxnmvq_f64, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType),    NEONMAP1(vmaxv_f32, aarch64_neon_fmaxv, AddRetType | Add1ArgType), -  NEONMAP1(vmaxv_s32, aarch64_neon_smaxv, AddRetType | Add1ArgType), -  NEONMAP1(vmaxv_u32, aarch64_neon_umaxv, AddRetType | Add1ArgType), +  NEONMAP1(vmaxv_s16, vector_reduce_smax, Add1ArgType), +  NEONMAP1(vmaxv_s32, vector_reduce_smax, Add1ArgType), +  NEONMAP1(vmaxv_s8, vector_reduce_smax, Add1ArgType), +  NEONMAP1(vmaxv_u16, vector_reduce_umax, Add1ArgType), +  NEONMAP1(vmaxv_u32, vector_reduce_umax, Add1ArgType), +  NEONMAP1(vmaxv_u8, vector_reduce_umax, Add1ArgType),    NEONMAP1(vmaxvq_f32, aarch64_neon_fmaxv, AddRetType | Add1ArgType),    NEONMAP1(vmaxvq_f64, aarch64_neon_fmaxv, AddRetType | Add1ArgType), -  NEONMAP1(vmaxvq_s32, aarch64_neon_smaxv, AddRetType | Add1ArgType), -  NEONMAP1(vmaxvq_u32, aarch64_neon_umaxv, AddRetType | Add1ArgType), +  NEONMAP1(vmaxvq_s16, vector_reduce_smax, Add1ArgType), +  NEONMAP1(vmaxvq_s32, vector_reduce_smax, Add1ArgType), +  NEONMAP1(vmaxvq_s8, vector_reduce_smax, Add1ArgType), +  NEONMAP1(vmaxvq_u16, vector_reduce_umax, Add1ArgType), +  NEONMAP1(vmaxvq_u32, vector_reduce_umax, Add1ArgType), +  NEONMAP1(vmaxvq_u8, vector_reduce_umax, Add1ArgType),    NEONMAP1(vminnmv_f32, aarch64_neon_fminnmv, AddRetType | Add1ArgType),    NEONMAP1(vminnmvq_f32, aarch64_neon_fminnmv, AddRetType | Add1ArgType),    NEONMAP1(vminnmvq_f64, aarch64_neon_fminnmv, AddRetType | Add1ArgType),    NEONMAP1(vminv_f32, aarch64_neon_fminv, AddRetType | Add1ArgType), -  NEONMAP1(vminv_s32, aarch64_neon_sminv, AddRetType | Add1ArgType), -  NEONMAP1(vminv_u32, aarch64_neon_uminv, AddRetType | Add1ArgType), +  NEONMAP1(vminv_s16, vector_reduce_smin, Add1ArgType), +  NEONMAP1(vminv_s32, vector_reduce_smin, Add1ArgType), +  NEONMAP1(vminv_s8, vector_reduce_smin, Add1ArgType), +  NEONMAP1(vminv_u16, vector_reduce_umin, Add1ArgType), +  NEONMAP1(vminv_u32, vector_reduce_umin, Add1ArgType), +  NEONMAP1(vminv_u8, vector_reduce_umin, Add1ArgType),    NEONMAP1(vminvq_f32, aarch64_neon_fminv, AddRetType | Add1ArgType),    NEONMAP1(vminvq_f64, aarch64_neon_fminv, AddRetType | Add1ArgType), -  NEONMAP1(vminvq_s32, aarch64_neon_sminv, AddRetType | Add1ArgType), -  NEONMAP1(vminvq_u32, aarch64_neon_uminv, AddRetType | Add1ArgType), +  NEONMAP1(vminvq_s16, vector_reduce_smin, Add1ArgType), +  NEONMAP1(vminvq_s32, vector_reduce_smin, Add1ArgType), +  NEONMAP1(vminvq_s8, vector_reduce_smin, Add1ArgType), +  NEONMAP1(vminvq_u16, vector_reduce_umin, Add1ArgType), +  NEONMAP1(vminvq_u32, vector_reduce_umin, Add1ArgType), +  NEONMAP1(vminvq_u8, vector_reduce_umin, Add1ArgType),    NEONMAP1(vmull_p64, aarch64_neon_pmull64, 0),    NEONMAP1(vmulxd_f64, aarch64_neon_fmulx, Add1ArgType),    NEONMAP1(vmulxs_f32, aarch64_neon_fmulx, Add1ArgType), -  NEONMAP1(vpaddd_s64, aarch64_neon_uaddv, AddRetType | Add1ArgType), -  NEONMAP1(vpaddd_u64, aarch64_neon_uaddv, AddRetType | Add1ArgType), +  NEONMAP1(vpaddd_s64, vector_reduce_add, Add1ArgType), +  NEONMAP1(vpaddd_u64, vector_reduce_add, Add1ArgType),    NEONMAP1(vpmaxnmqd_f64, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType),    NEONMAP1(vpmaxnms_f32, aarch64_neon_fmaxnmv, AddRetType | Add1ArgType),    NEONMAP1(vpmaxqd_f64, aarch64_neon_fmaxv, AddRetType | Add1ArgType), @@ -7067,127 +7091,6 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,      Int = Intrinsic::bitreverse;      return EmitNeonCall(CGM.getIntrinsic(Int, Ty), Ops, "vrbit");    } -  case NEON::BI__builtin_neon_vaddv_u8: -    // FIXME: These are handled by the AArch64 scalar code. -    usgn = true; -    [[fallthrough]]; -  case NEON::BI__builtin_neon_vaddv_s8: { -    Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vaddv_u16: -    usgn = true; -    [[fallthrough]]; -  case NEON::BI__builtin_neon_vaddv_s16: { -    Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 4); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vaddvq_u8: -    usgn = true; -    [[fallthrough]]; -  case NEON::BI__builtin_neon_vaddvq_s8: { -    Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 16); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vaddvq_u16: -    usgn = true; -    [[fallthrough]]; -  case NEON::BI__builtin_neon_vaddvq_s16: { -    Int = usgn ? Intrinsic::aarch64_neon_uaddv : Intrinsic::aarch64_neon_saddv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vaddv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vmaxv_u8: { -    Int = Intrinsic::aarch64_neon_umaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vmaxv_u16: { -    Int = Intrinsic::aarch64_neon_umaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 4); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vmaxvq_u8: { -    Int = Intrinsic::aarch64_neon_umaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 16); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vmaxvq_u16: { -    Int = Intrinsic::aarch64_neon_umaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vmaxv_s8: { -    Int = Intrinsic::aarch64_neon_smaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vmaxv_s16: { -    Int = Intrinsic::aarch64_neon_smaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 4); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vmaxvq_s8: { -    Int = Intrinsic::aarch64_neon_smaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 16); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vmaxvq_s16: { -    Int = Intrinsic::aarch64_neon_smaxv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  }    case NEON::BI__builtin_neon_vmaxv_f16: {      Int = Intrinsic::aarch64_neon_fmaxv;      Ty = HalfTy; @@ -7206,78 +7109,6 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,      Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vmaxv");      return Builder.CreateTrunc(Ops[0], HalfTy);    } -  case NEON::BI__builtin_neon_vminv_u8: { -    Int = Intrinsic::aarch64_neon_uminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vminv_u16: { -    Int = Intrinsic::aarch64_neon_uminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 4); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vminvq_u8: { -    Int = Intrinsic::aarch64_neon_uminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 16); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vminvq_u16: { -    Int = Intrinsic::aarch64_neon_uminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vminv_s8: { -    Int = Intrinsic::aarch64_neon_sminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vminv_s16: { -    Int = Intrinsic::aarch64_neon_sminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 4); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  } -  case NEON::BI__builtin_neon_vminvq_s8: { -    Int = Intrinsic::aarch64_neon_sminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int8Ty, 16); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int8Ty); -  } -  case NEON::BI__builtin_neon_vminvq_s16: { -    Int = Intrinsic::aarch64_neon_sminv; -    Ty = Int32Ty; -    VTy = llvm::FixedVectorType::get(Int16Ty, 8); -    llvm::Type *Tys[2] = { Ty, VTy }; -    Ops.push_back(EmitScalarExpr(E->getArg(0))); -    Ops[0] = EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, "vminv"); -    return Builder.CreateTrunc(Ops[0], Int16Ty); -  }    case NEON::BI__builtin_neon_vminv_f16: {      Int = Intrinsic::aarch64_neon_fminv;      Ty = HalfTy; diff --git a/clang/lib/Driver/ToolChains/ZOS.cpp b/clang/lib/Driver/ToolChains/ZOS.cpp index 57bcb3c..9a3c453 100644 --- a/clang/lib/Driver/ToolChains/ZOS.cpp +++ b/clang/lib/Driver/ToolChains/ZOS.cpp @@ -75,7 +75,7 @@ void zos::Assembler::ConstructJob(Compilation &C, const JobAction &JA,    const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));    C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(), -                                         Exec, CmdArgs, Inputs)); +                                         Exec, CmdArgs, Inputs, Output));  }  static std::string getLEHLQ(const ArgList &Args) { @@ -213,7 +213,7 @@ void zos::Linker::ConstructJob(Compilation &C, const JobAction &JA,    const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());    C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(), -                                         Exec, CmdArgs, Inputs)); +                                         Exec, CmdArgs, Inputs, Output));  }  ToolChain::RuntimeLibType ZOS::GetDefaultRuntimeLibType() const { diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index e5abf83..9ab024a 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -356,9 +356,11 @@ bool ContinuationIndenter::canBreak(const LineState &State) {      return CurrentState.BreakBeforeClosingBrace;    } -  // Allow breaking before the right parens with block indentation if there was -  // a break after the left parens, which is tracked by BreakBeforeClosingParen. -  if (Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent && +  // Check need to break before the right parens if there was a break after +  // the left parens, which is tracked by BreakBeforeClosingParen. +  if ((Style.BreakBeforeCloseBracketFunction || +       Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop || +       Style.BreakBeforeCloseBracketSwitch) &&        Current.is(tok::r_paren)) {      return CurrentState.BreakBeforeClosingParen;    } @@ -837,32 +839,38 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,        return Tok.is(tok::l_brace) && Tok.isNot(BK_Block) &&               Style.Cpp11BracedListStyle != FormatStyle::BLS_Block;      }; -    if (Tok.isNoneOf(tok::l_paren, TT_TemplateOpener, tok::l_square) && -        !IsStartOfBracedList()) { +    if (IsStartOfBracedList()) +      return Style.BreakAfterOpenBracketBracedList; +    if (Tok.isNoneOf(tok::l_paren, TT_TemplateOpener, tok::l_square))        return false; -    }      if (!Tok.Previous)        return true;      if (Tok.Previous->isIf()) -      return Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak; -    return Tok.Previous->isNoneOf(TT_CastRParen, tok::kw_for, tok::kw_while, -                                  tok::kw_switch) && -           !(Style.isJavaScript() && Tok.Previous->is(Keywords.kw_await)); +      return Style.BreakAfterOpenBracketIf; +    if (Tok.Previous->isLoop(Style)) +      return Style.BreakAfterOpenBracketLoop; +    if (Tok.Previous->is(tok::kw_switch)) +      return Style.BreakAfterOpenBracketSwitch; +    if (Style.BreakAfterOpenBracketFunction) { +      return !Tok.Previous->is(TT_CastRParen) && +             !(Style.isJavaScript() && Tok.is(Keywords.kw_await)); +    } +    return false;    };    auto IsFunctionCallParen = [](const FormatToken &Tok) {      return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&             Tok.Previous->is(tok::identifier);    }; -  auto IsInTemplateString = [this](const FormatToken &Tok) { +  auto IsInTemplateString = [this](const FormatToken &Tok, bool NestBlocks) {      if (!Style.isJavaScript())        return false;      for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) {        if (Prev->is(TT_TemplateString) && Prev->opensScope())          return true; -      if (Prev->opensScope() || -          (Prev->is(TT_TemplateString) && Prev->closesScope())) { -        break; -      } +      if (Prev->opensScope() && !NestBlocks) +        return false; +      if (Prev->is(TT_TemplateString) && Prev->closesScope()) +        return false;      }      return false;    }; @@ -884,21 +892,25 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,           Tok.isOneOf(tok::ellipsis, Keywords.kw_await))) {        return true;      } -    if (const auto *Previous = Tok.Previous; -        !Previous || (Previous->isNoneOf(TT_FunctionDeclarationLParen, -                                         TT_LambdaDefinitionLParen) && -                      !IsFunctionCallParen(*Previous))) { +    const auto *Previous = TokAfterLParen.Previous; +    assert(Previous); // IsOpeningBracket(Previous) +    if (Previous->Previous && +        (Previous->Previous->isIf() || Previous->Previous->isLoop(Style) || +         Previous->Previous->is(tok::kw_switch))) { +      return false; +    } +    if (Previous->isNoneOf(TT_FunctionDeclarationLParen, +                           TT_LambdaDefinitionLParen) && +        !IsFunctionCallParen(*Previous)) {        return true;      } -    if (IsOpeningBracket(Tok) || IsInTemplateString(Tok)) +    if (IsOpeningBracket(Tok) || IsInTemplateString(Tok, true))        return true;      const auto *Next = Tok.Next;      return !Next || Next->isMemberAccess() ||             Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next);    }; -  if ((Style.AlignAfterOpenBracket == FormatStyle::BAS_AlwaysBreak || -       Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) && -      IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) && +  if (IsOpeningBracket(Previous) && State.Column > getNewLineColumn(State) &&        // Don't do this for simple (no expressions) one-argument function calls        // as that feels like needlessly wasting whitespace, e.g.:        // @@ -920,7 +932,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,    // Note: This doesn't apply to macro expansion lines, which are MACRO( , , )    // with args as children of the '(' and ',' tokens. It does not make sense to    // align the commas with the opening paren. -  if (Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign && +  if (Style.AlignAfterOpenBracket &&        !CurrentState.IsCSharpGenericTypeConstraint && Previous.opensScope() &&        Previous.isNoneOf(TT_ObjCMethodExpr, TT_RequiresClause,                          TT_TableGenDAGArgOpener, @@ -933,7 +945,7 @@ void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,           Previous.Previous->isNoneOf(tok::identifier, tok::l_paren,                                       BK_BracedInit))) ||         Previous.is(TT_VerilogMultiLineListLParen)) && -      !IsInTemplateString(Current)) { +      !IsInTemplateString(Current, false)) {      CurrentState.Indent = State.Column + Spaces;      CurrentState.IsAligned = true;    } @@ -1271,8 +1283,20 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,    }    if (PreviousNonComment && PreviousNonComment->is(tok::l_paren)) { -    CurrentState.BreakBeforeClosingParen = -        Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent; +    if (auto Previous = PreviousNonComment->Previous) { +      if (Previous->isIf()) { +        CurrentState.BreakBeforeClosingParen = Style.BreakBeforeCloseBracketIf; +      } else if (Previous->isLoop(Style)) { +        CurrentState.BreakBeforeClosingParen = +            Style.BreakBeforeCloseBracketLoop; +      } else if (Previous->is(tok::kw_switch)) { +        CurrentState.BreakBeforeClosingParen = +            Style.BreakBeforeCloseBracketSwitch; +      } else { +        CurrentState.BreakBeforeClosingParen = +            Style.BreakBeforeCloseBracketFunction; +      } +    }    }    if (PreviousNonComment && PreviousNonComment->is(TT_TemplateOpener)) @@ -1416,13 +1440,17 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {        State.Stack.size() > 1) {      return State.Stack[State.Stack.size() - 2].LastSpace;    } -  if (Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent && -      (Current.is(tok::r_paren) || -       (Current.is(tok::r_brace) && Current.MatchingParen && -        Current.MatchingParen->is(BK_BracedInit))) && +  if (Style.BreakBeforeCloseBracketBracedList && Current.is(tok::r_brace) && +      Current.MatchingParen && Current.MatchingParen->is(BK_BracedInit) &&        State.Stack.size() > 1) {      return State.Stack[State.Stack.size() - 2].LastSpace;    } +  if ((Style.BreakBeforeCloseBracketFunction || +       Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop || +       Style.BreakBeforeCloseBracketSwitch) && +      Current.is(tok::r_paren) && State.Stack.size() > 1) { +    return State.Stack[State.Stack.size() - 2].LastSpace; +  }    if (Style.BreakBeforeTemplateCloser && Current.is(TT_TemplateCloser) &&        State.Stack.size() > 1) {      return State.Stack[State.Stack.size() - 2].LastSpace; @@ -1844,8 +1872,8 @@ void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,           PrecedenceLevel < prec::Assignment) &&          (!Previous || Previous->isNot(tok::kw_return) ||           (!Style.isJava() && PrecedenceLevel > 0)) && -        (Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign || -         PrecedenceLevel > prec::Comma || Current.NestingLevel == 0) && +        (Style.AlignAfterOpenBracket || PrecedenceLevel > prec::Comma || +         Current.NestingLevel == 0) &&          (!Style.isTableGen() ||           (Previous && Previous->isOneOf(TT_TableGenDAGArgListComma,                                          TT_TableGenDAGArgListCommaToBreak)))) { @@ -1885,8 +1913,7 @@ void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,      if (PrecedenceLevel > prec::Unknown)        NewParenState.LastSpace = std::max(NewParenState.LastSpace, State.Column);      if (PrecedenceLevel != prec::Conditional && -        Current.isNot(TT_UnaryOperator) && -        Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign) { +        Current.isNot(TT_UnaryOperator) && Style.AlignAfterOpenBracket) {        NewParenState.StartOfFunctionCall = State.Column;      } diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index edd126c..dd14fcd 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -32,6 +32,13 @@ using clang::format::FormatStyle;  LLVM_YAML_IS_SEQUENCE_VECTOR(FormatStyle::RawStringFormat) +enum BracketAlignmentStyle : int8_t { +  BAS_Align, +  BAS_DontAlign, +  BAS_AlwaysBreak, +  BAS_BlockIndent +}; +  namespace llvm {  namespace yaml {  template <> @@ -204,16 +211,16 @@ template <> struct MappingTraits<FormatStyle::BraceWrappingFlags> {    }  }; -template <> struct ScalarEnumerationTraits<FormatStyle::BracketAlignmentStyle> { -  static void enumeration(IO &IO, FormatStyle::BracketAlignmentStyle &Value) { -    IO.enumCase(Value, "Align", FormatStyle::BAS_Align); -    IO.enumCase(Value, "DontAlign", FormatStyle::BAS_DontAlign); -    IO.enumCase(Value, "AlwaysBreak", FormatStyle::BAS_AlwaysBreak); -    IO.enumCase(Value, "BlockIndent", FormatStyle::BAS_BlockIndent); +template <> struct ScalarEnumerationTraits<BracketAlignmentStyle> { +  static void enumeration(IO &IO, BracketAlignmentStyle &Value) { +    IO.enumCase(Value, "Align", BAS_Align); +    IO.enumCase(Value, "DontAlign", BAS_DontAlign);      // For backward compatibility. -    IO.enumCase(Value, "true", FormatStyle::BAS_Align); -    IO.enumCase(Value, "false", FormatStyle::BAS_DontAlign); +    IO.enumCase(Value, "true", BAS_Align); +    IO.enumCase(Value, "false", BAS_DontAlign); +    IO.enumCase(Value, "AlwaysBreak", BAS_AlwaysBreak); +    IO.enumCase(Value, "BlockIndent", BAS_BlockIndent);    }  }; @@ -979,6 +986,54 @@ template <> struct MappingTraits<FormatStyle> {      bool SpacesInCStyleCastParentheses = false;      bool SpacesInParentheses = false; +    if (IO.outputting()) { +      IO.mapOptional("AlignAfterOpenBracket", Style.AlignAfterOpenBracket); +    } else { +      // For backward compatibility. +      BracketAlignmentStyle LocalBAS = BAS_Align; +      if (IsGoogleOrChromium) { +        FormatStyle::LanguageKind Language = Style.Language; +        if (Language == FormatStyle::LK_None) +          Language = ((FormatStyle *)IO.getContext())->Language; +        if (Language == FormatStyle::LK_JavaScript) +          LocalBAS = BAS_AlwaysBreak; +        else if (Language == FormatStyle::LK_Java) +          LocalBAS = BAS_DontAlign; +      } else if (BasedOnStyle.equals_insensitive("webkit")) { +        LocalBAS = BAS_DontAlign; +      } +      IO.mapOptional("AlignAfterOpenBracket", LocalBAS); +      Style.BreakAfterOpenBracketBracedList = false; +      Style.BreakAfterOpenBracketFunction = false; +      Style.BreakAfterOpenBracketIf = false; +      Style.BreakAfterOpenBracketLoop = false; +      Style.BreakAfterOpenBracketSwitch = false; +      Style.BreakBeforeCloseBracketBracedList = false; +      Style.BreakBeforeCloseBracketFunction = false; +      Style.BreakBeforeCloseBracketIf = false; +      Style.BreakBeforeCloseBracketLoop = false; +      Style.BreakBeforeCloseBracketSwitch = false; + +      switch (LocalBAS) { +      case BAS_DontAlign: +        Style.AlignAfterOpenBracket = false; +        break; +      case BAS_BlockIndent: +        Style.BreakBeforeCloseBracketBracedList = true; +        Style.BreakBeforeCloseBracketFunction = true; +        Style.BreakBeforeCloseBracketIf = true; +        [[fallthrough]]; +      case BAS_AlwaysBreak: +        Style.BreakAfterOpenBracketBracedList = true; +        Style.BreakAfterOpenBracketFunction = true; +        Style.BreakAfterOpenBracketIf = true; +        [[fallthrough]]; +      case BAS_Align: +        Style.AlignAfterOpenBracket = true; +        break; +      } +    } +      // For backward compatibility.      if (!IO.outputting()) {        IO.mapOptional("AlignEscapedNewlinesLeft", Style.AlignEscapedNewlines); @@ -1014,7 +1069,6 @@ template <> struct MappingTraits<FormatStyle> {      }      IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset); -    IO.mapOptional("AlignAfterOpenBracket", Style.AlignAfterOpenBracket);      IO.mapOptional("AlignArrayOfStructures", Style.AlignArrayOfStructures);      IO.mapOptional("AlignConsecutiveAssignments",                     Style.AlignConsecutiveAssignments); @@ -1079,10 +1133,29 @@ template <> struct MappingTraits<FormatStyle> {      IO.mapOptional("BreakAfterAttributes", Style.BreakAfterAttributes);      IO.mapOptional("BreakAfterJavaFieldAnnotations",                     Style.BreakAfterJavaFieldAnnotations); +    IO.mapOptional("BreakAfterOpenBracketBracedList", +                   Style.BreakAfterOpenBracketBracedList); +    IO.mapOptional("BreakAfterOpenBracketFunction", +                   Style.BreakAfterOpenBracketFunction); +    IO.mapOptional("BreakAfterOpenBracketIf", Style.BreakAfterOpenBracketIf); +    IO.mapOptional("BreakAfterOpenBracketLoop", +                   Style.BreakAfterOpenBracketLoop); +    IO.mapOptional("BreakAfterOpenBracketSwitch", +                   Style.BreakAfterOpenBracketSwitch);      IO.mapOptional("BreakAfterReturnType", Style.BreakAfterReturnType);      IO.mapOptional("BreakArrays", Style.BreakArrays);      IO.mapOptional("BreakBeforeBinaryOperators",                     Style.BreakBeforeBinaryOperators); +    IO.mapOptional("BreakBeforeCloseBracketBracedList", +                   Style.BreakBeforeCloseBracketBracedList); +    IO.mapOptional("BreakBeforeCloseBracketFunction", +                   Style.BreakBeforeCloseBracketFunction); +    IO.mapOptional("BreakBeforeCloseBracketIf", +                   Style.BreakBeforeCloseBracketIf); +    IO.mapOptional("BreakBeforeCloseBracketLoop", +                   Style.BreakBeforeCloseBracketLoop); +    IO.mapOptional("BreakBeforeCloseBracketSwitch", +                   Style.BreakBeforeCloseBracketSwitch);      IO.mapOptional("BreakBeforeConceptDeclarations",                     Style.BreakBeforeConceptDeclarations);      IO.mapOptional("BreakBeforeBraces", Style.BreakBeforeBraces); @@ -1561,7 +1634,7 @@ static void expandPresetsSpacesInParens(FormatStyle &Expanded) {  FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {    FormatStyle LLVMStyle;    LLVMStyle.AccessModifierOffset = -2; -  LLVMStyle.AlignAfterOpenBracket = FormatStyle::BAS_Align; +  LLVMStyle.AlignAfterOpenBracket = true;    LLVMStyle.AlignArrayOfStructures = FormatStyle::AIAS_None;    LLVMStyle.AlignConsecutiveAssignments = {};    LLVMStyle.AlignConsecutiveAssignments.PadOperators = true; @@ -1621,10 +1694,20 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {    LLVMStyle.BreakAdjacentStringLiterals = true;    LLVMStyle.BreakAfterAttributes = FormatStyle::ABS_Leave;    LLVMStyle.BreakAfterJavaFieldAnnotations = false; +  LLVMStyle.BreakAfterOpenBracketBracedList = false; +  LLVMStyle.BreakAfterOpenBracketFunction = false; +  LLVMStyle.BreakAfterOpenBracketIf = false; +  LLVMStyle.BreakAfterOpenBracketLoop = false; +  LLVMStyle.BreakAfterOpenBracketSwitch = false;    LLVMStyle.BreakAfterReturnType = FormatStyle::RTBS_None;    LLVMStyle.BreakArrays = true;    LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;    LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach; +  LLVMStyle.BreakBeforeCloseBracketBracedList = false; +  LLVMStyle.BreakBeforeCloseBracketFunction = false; +  LLVMStyle.BreakBeforeCloseBracketIf = false; +  LLVMStyle.BreakBeforeCloseBracketLoop = false; +  LLVMStyle.BreakBeforeCloseBracketSwitch = false;    LLVMStyle.BreakBeforeConceptDeclarations = FormatStyle::BBCDS_Always;    LLVMStyle.BreakBeforeInlineASMColon = FormatStyle::BBIAS_OnlyMultiline;    LLVMStyle.BreakBeforeTemplateCloser = false; @@ -1877,7 +1960,7 @@ FormatStyle getGoogleStyle(FormatStyle::LanguageKind Language) {    GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200;    if (Language == FormatStyle::LK_Java) { -    GoogleStyle.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +    GoogleStyle.AlignAfterOpenBracket = false;      GoogleStyle.AlignOperands = FormatStyle::OAS_DontAlign;      GoogleStyle.AlignTrailingComments = {};      GoogleStyle.AlignTrailingComments.Kind = FormatStyle::TCAS_Never; @@ -1889,7 +1972,9 @@ FormatStyle getGoogleStyle(FormatStyle::LanguageKind Language) {      GoogleStyle.SpaceAfterCStyleCast = true;      GoogleStyle.SpacesBeforeTrailingComments = 1;    } else if (Language == FormatStyle::LK_JavaScript) { -    GoogleStyle.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +    GoogleStyle.BreakAfterOpenBracketBracedList = true; +    GoogleStyle.BreakAfterOpenBracketFunction = true; +    GoogleStyle.BreakAfterOpenBracketIf = true;      GoogleStyle.AlignOperands = FormatStyle::OAS_DontAlign;      GoogleStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;      // TODO: still under discussion whether to switch to SLS_All. @@ -2026,7 +2111,7 @@ FormatStyle getMozillaStyle() {  FormatStyle getWebKitStyle() {    FormatStyle Style = getLLVMStyle();    Style.AccessModifierOffset = -4; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    Style.AlignOperands = FormatStyle::OAS_DontAlign;    Style.AlignTrailingComments = {};    Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Never; diff --git a/clang/lib/Format/FormatToken.cpp b/clang/lib/Format/FormatToken.cpp index d1c6264..28fdbcb 100644 --- a/clang/lib/Format/FormatToken.cpp +++ b/clang/lib/Format/FormatToken.cpp @@ -68,7 +68,7 @@ bool FormatToken::isBlockIndentedInitRBrace(const FormatStyle &Style) const {    assert(MatchingParen);    assert(MatchingParen->is(tok::l_brace));    if (Style.Cpp11BracedListStyle == FormatStyle::BLS_Block || -      Style.AlignAfterOpenBracket != FormatStyle::BAS_BlockIndent) { +      !Style.BreakBeforeCloseBracketBracedList) {      return false;    }    const auto *LBrace = MatchingParen; @@ -198,7 +198,7 @@ void CommaSeparatedList::precomputeFormattingInfos(const FormatToken *Token) {      return;    // Column format doesn't really make sense if we don't align after brackets. -  if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign) +  if (!Style.AlignAfterOpenBracket)      return;    FormatToken *ItemBegin = Token->Next; diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 6f3d24a..d833130 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -666,6 +666,12 @@ public:             (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);    } +  bool isLoop(const FormatStyle &Style) const { +    return isOneOf(tok::kw_for, tok::kw_while) || +           (Style.isJavaScript() && isNot(tok::l_paren) && Previous && +            Previous->is(tok::kw_for)); +  } +    bool closesScopeAfterBlock() const {      if (getBlockKind() == BK_Block)        return true; diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 021d8c6..8e227da 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -4427,10 +4427,8 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,    if (Left.is(tok::l_paren) && Style.PenaltyBreakOpenParenthesis != 0)      return Style.PenaltyBreakOpenParenthesis; -  if (Left.is(tok::l_paren) && InFunctionDecl && -      Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign) { +  if (Left.is(tok::l_paren) && InFunctionDecl && Style.AlignAfterOpenBracket)      return 100; -  }    if (Left.is(tok::l_paren) && Left.Previous &&        (Left.Previous->isOneOf(tok::kw_for, tok::kw__Generic) ||         Left.Previous->isIf())) { @@ -4446,7 +4444,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,      // If we aren't aligning after opening parens/braces we can always break      // here unless the style does not want us to place all arguments on the      // next line. -    if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign && +    if (!Style.AlignAfterOpenBracket &&          (Left.ParameterCount <= 1 || Style.AllowAllArgumentsOnNextLine)) {        return 0;      } @@ -6226,24 +6224,31 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,                                     (Right.isBlockIndentedInitRBrace(Style)));    } -  // We only break before r_paren if we're in a block indented context. +  // We can break before r_paren if we're in a block indented context or +  // a control statement with an explicit style option.    if (Right.is(tok::r_paren)) { -    if (Style.AlignAfterOpenBracket != FormatStyle::BAS_BlockIndent || -        !Right.MatchingParen) { +    if (!Right.MatchingParen)        return false; -    }      auto Next = Right.Next;      if (Next && Next->is(tok::r_paren))        Next = Next->Next;      if (Next && Next->is(tok::l_paren))        return false;      const FormatToken *Previous = Right.MatchingParen->Previous; -    return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf())); +    if (!Previous) +      return false; +    if (Previous->isIf()) +      return Style.BreakBeforeCloseBracketIf; +    if (Previous->isLoop(Style)) +      return Style.BreakBeforeCloseBracketLoop; +    if (Previous->is(tok::kw_switch)) +      return Style.BreakBeforeCloseBracketSwitch; +    return Style.BreakBeforeCloseBracketFunction;    }    if (Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) &&        Right.is(TT_TrailingAnnotation) && -      Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) { +      Style.BreakBeforeCloseBracketFunction) {      return false;    } diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index f5add2a..aea3e72 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -22,22 +22,16 @@  using namespace clang; -static const enum raw_ostream::Colors noteColor = raw_ostream::CYAN; -static const enum raw_ostream::Colors remarkColor = -  raw_ostream::BLUE; -static const enum raw_ostream::Colors fixitColor = -  raw_ostream::GREEN; -static const enum raw_ostream::Colors caretColor = -  raw_ostream::GREEN; -static const enum raw_ostream::Colors warningColor = -  raw_ostream::MAGENTA; -static const enum raw_ostream::Colors templateColor = -  raw_ostream::CYAN; -static const enum raw_ostream::Colors errorColor = raw_ostream::RED; -static const enum raw_ostream::Colors fatalColor = raw_ostream::RED; +static constexpr raw_ostream::Colors NoteColor = raw_ostream::CYAN; +static constexpr raw_ostream::Colors RemarkColor = raw_ostream::BLUE; +static constexpr raw_ostream::Colors FixitColor = raw_ostream::GREEN; +static constexpr raw_ostream::Colors CaretColor = raw_ostream::GREEN; +static constexpr raw_ostream::Colors WarningColor = raw_ostream::MAGENTA; +static constexpr raw_ostream::Colors TemplateColor = raw_ostream::CYAN; +static constexpr raw_ostream::Colors ErrorColor = raw_ostream::RED; +static constexpr raw_ostream::Colors FatalColor = raw_ostream::RED;  // Used for changing only the bold attribute. -static const enum raw_ostream::Colors savedColor = -  raw_ostream::SAVEDCOLOR; +static constexpr raw_ostream::Colors SavedColor = raw_ostream::SAVEDCOLOR;  // Magenta is taken for 'warning'. Red is already 'error' and 'cyan'  // is already taken for 'note'. Green is already used to underline @@ -47,6 +41,43 @@ static constexpr raw_ostream::Colors CommentColor = raw_ostream::YELLOW;  static constexpr raw_ostream::Colors LiteralColor = raw_ostream::GREEN;  static constexpr raw_ostream::Colors KeywordColor = raw_ostream::BLUE; +namespace { +template <typename Sub> class ColumnsOrBytes { +public: +  int V = 0; +  ColumnsOrBytes(int V) : V(V) {} +  bool isValid() const { return V != -1; } +  Sub next() const { return Sub(V + 1); } +  Sub prev() const { return Sub(V - 1); } + +  bool operator>(Sub O) const { return V > O.V; } +  bool operator<(Sub O) const { return V < O.V; } +  bool operator<=(Sub B) const { return V <= B.V; } +  bool operator!=(Sub C) const { return C.V != V; } + +  Sub operator+(Sub B) const { return Sub(V + B.V); } +  Sub &operator+=(Sub B) { +    V += B.V; +    return *static_cast<Sub *>(this); +  } +  Sub operator-(Sub B) const { return Sub(V - B.V); } +  Sub &operator-=(Sub B) { +    V -= B.V; +    return *static_cast<Sub *>(this); +  } +}; + +class Bytes final : public ColumnsOrBytes<Bytes> { +public: +  Bytes(int V) : ColumnsOrBytes(V) {} +}; + +class Columns final : public ColumnsOrBytes<Columns> { +public: +  Columns(int V) : ColumnsOrBytes(V) {} +}; +} // namespace +  /// Add highlights to differences in template strings.  static void applyTemplateHighlighting(raw_ostream &OS, StringRef Str,                                        bool &Normal, bool Bold) { @@ -58,11 +89,11 @@ static void applyTemplateHighlighting(raw_ostream &OS, StringRef Str,      Str = Str.substr(Pos + 1);      if (Normal) -      OS.changeColor(templateColor, true); +      OS.changeColor(TemplateColor, true);      else {        OS.resetColor();        if (Bold) -        OS.changeColor(savedColor, true); +        OS.changeColor(SavedColor, true);      }      Normal = !Normal;    } @@ -109,8 +140,8 @@ printableTextForNextCharacter(StringRef SourceLine, size_t *I,    if (SourceLine[*I] == '\t') {      assert(0 < TabStop && TabStop <= DiagnosticOptions::MaxTabStop &&             "Invalid -ftabstop value"); -    unsigned Col = bytesSincePreviousTabOrLineBegin(SourceLine, *I); -    unsigned NumSpaces = TabStop - (Col % TabStop); +    unsigned LineBytes = bytesSincePreviousTabOrLineBegin(SourceLine, *I); +    unsigned NumSpaces = TabStop - (LineBytes % TabStop);      assert(0 < NumSpaces && NumSpaces <= TabStop             && "Invalid computation of space amt");      ++(*I); @@ -220,97 +251,99 @@ static void expandTabs(std::string &SourceLine, unsigned TabStop) {  ///  (\\u3042 is represented in UTF-8 by three bytes and takes two columns to  ///   display)  static void genColumnByteMapping(StringRef SourceLine, unsigned TabStop, -                                 SmallVectorImpl<int> &BytesOut, -                                 SmallVectorImpl<int> &ColumnsOut) { +                                 SmallVectorImpl<Bytes> &BytesOut, +                                 SmallVectorImpl<Columns> &ColumnsOut) {    assert(BytesOut.empty());    assert(ColumnsOut.empty());    if (SourceLine.empty()) { -    BytesOut.resize(1u, 0); -    ColumnsOut.resize(1u, 0); +    BytesOut.resize(1u, Bytes(0)); +    ColumnsOut.resize(1u, Columns(0));      return;    }    ColumnsOut.resize(SourceLine.size() + 1, -1); -  int Columns = 0; +  Columns NumColumns = 0;    size_t I = 0;    while (I < SourceLine.size()) { -    ColumnsOut[I] = Columns; -    BytesOut.resize(Columns + 1, -1); -    BytesOut.back() = I; +    ColumnsOut[I] = NumColumns; +    BytesOut.resize(NumColumns.V + 1, -1); +    BytesOut.back() = Bytes(I);      auto [Str, Printable] =          printableTextForNextCharacter(SourceLine, &I, TabStop); -    Columns += llvm::sys::locale::columnWidth(Str); +    NumColumns += Columns(llvm::sys::locale::columnWidth(Str));    } -  ColumnsOut.back() = Columns; -  BytesOut.resize(Columns + 1, -1); -  BytesOut.back() = I; +  ColumnsOut.back() = NumColumns; +  BytesOut.resize(NumColumns.V + 1, -1); +  BytesOut.back() = Bytes(I);  }  namespace {  struct SourceColumnMap {    SourceColumnMap(StringRef SourceLine, unsigned TabStop) -  : m_SourceLine(SourceLine) { +      : SourceLine(SourceLine) { -    genColumnByteMapping(SourceLine, TabStop, m_columnToByte, m_byteToColumn); +    genColumnByteMapping(SourceLine, TabStop, ColumnToByte, ByteToColumn); -    assert(m_byteToColumn.size()==SourceLine.size()+1); -    assert(0 < m_byteToColumn.size() && 0 < m_columnToByte.size()); -    assert(m_byteToColumn.size() -           == static_cast<unsigned>(m_columnToByte.back()+1)); -    assert(static_cast<unsigned>(m_byteToColumn.back()+1) -           == m_columnToByte.size()); +    assert(ByteToColumn.size() == SourceLine.size() + 1); +    assert(0 < ByteToColumn.size() && 0 < ColumnToByte.size()); +    assert(ByteToColumn.size() == +           static_cast<unsigned>(ColumnToByte.back().V + 1)); +    assert(static_cast<unsigned>(ByteToColumn.back().V + 1) == +           ColumnToByte.size());    } -  int columns() const { return m_byteToColumn.back(); } -  int bytes() const { return m_columnToByte.back(); } +  Columns columns() const { return ByteToColumn.back(); } +  Bytes bytes() const { return ColumnToByte.back(); }    /// Map a byte to the column which it is at the start of, or return -1    /// if it is not at the start of a column (for a UTF-8 trailing byte). -  int byteToColumn(int n) const { -    assert(0<=n && n<static_cast<int>(m_byteToColumn.size())); -    return m_byteToColumn[n]; +  Columns byteToColumn(Bytes N) const { +    assert(0 <= N.V && N.V < static_cast<int>(ByteToColumn.size())); +    return ByteToColumn[N.V];    }    /// Map a byte to the first column which contains it. -  int byteToContainingColumn(int N) const { -    assert(0 <= N && N < static_cast<int>(m_byteToColumn.size())); -    while (m_byteToColumn[N] == -1) -      --N; -    return m_byteToColumn[N]; +  Columns byteToContainingColumn(Bytes N) const { +    assert(0 <= N.V && N.V < static_cast<int>(ByteToColumn.size())); +    while (!ByteToColumn[N.V].isValid()) +      --N.V; +    return ByteToColumn[N.V];    }    /// Map a column to the byte which starts the column, or return -1 if    /// the column the second or subsequent column of an expanded tab or similar    /// multi-column entity. -  int columnToByte(int n) const { -    assert(0<=n && n<static_cast<int>(m_columnToByte.size())); -    return m_columnToByte[n]; +  Bytes columnToByte(Columns N) const { +    assert(0 <= N.V && N.V < static_cast<int>(ColumnToByte.size())); +    return ColumnToByte[N.V];    }    /// Map from a byte index to the next byte which starts a column. -  int startOfNextColumn(int N) const { -    assert(0 <= N && N < static_cast<int>(m_byteToColumn.size() - 1)); -    while (byteToColumn(++N) == -1) {} +  Bytes startOfNextColumn(Bytes N) const { +    assert(0 <= N.V && N.V < static_cast<int>(ByteToColumn.size() - 1)); +    N = N.next(); +    while (!byteToColumn(N).isValid()) +      N = N.next();      return N;    }    /// Map from a byte index to the previous byte which starts a column. -  int startOfPreviousColumn(int N) const { -    assert(0 < N && N < static_cast<int>(m_byteToColumn.size())); -    while (byteToColumn(--N) == -1) {} +  Bytes startOfPreviousColumn(Bytes N) const { +    assert(0 < N.V && N.V < static_cast<int>(ByteToColumn.size())); +    N = N.prev(); +    while (!byteToColumn(N).isValid()) +      N = N.prev();      return N;    } -  StringRef getSourceLine() const { -    return m_SourceLine; -  } +  StringRef getSourceLine() const { return SourceLine; }  private: -  const std::string m_SourceLine; -  SmallVector<int,200> m_byteToColumn; -  SmallVector<int,200> m_columnToByte; +  StringRef SourceLine; +  SmallVector<Columns, 200> ByteToColumn; +  SmallVector<Bytes, 200> ColumnToByte;  };  } // end anonymous namespace @@ -319,14 +352,15 @@ private:  static void selectInterestingSourceRegion(std::string &SourceLine,                                            std::string &CaretLine,                                            std::string &FixItInsertionLine, -                                          unsigned Columns, -                                          const SourceColumnMap &map) { -  unsigned CaretColumns = CaretLine.size(); -  unsigned FixItColumns = llvm::sys::locale::columnWidth(FixItInsertionLine); -  unsigned MaxColumns = std::max(static_cast<unsigned>(map.columns()), -                                 std::max(CaretColumns, FixItColumns)); +                                          Columns NonGutterColumns, +                                          const SourceColumnMap &Map) { +  Columns CaretColumns = Columns(CaretLine.size()); +  Columns FixItColumns = +      Columns(llvm::sys::locale::columnWidth(FixItInsertionLine)); +  Columns MaxColumns = +      std::max({Map.columns().V, CaretColumns.V, FixItColumns.V});    // if the number of columns is less than the desired number we're done -  if (MaxColumns <= Columns) +  if (MaxColumns <= NonGutterColumns)      return;    // No special characters are allowed in CaretLine. @@ -334,13 +368,13 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    // Find the slice that we need to display the full caret line    // correctly. -  unsigned CaretStart = 0, CaretEnd = CaretLine.size(); -  for (; CaretStart != CaretEnd; ++CaretStart) -    if (!isWhitespace(CaretLine[CaretStart])) +  Columns CaretStart = 0, CaretEnd = CaretLine.size(); +  for (; CaretStart != CaretEnd; CaretStart = CaretStart.next()) +    if (!isWhitespace(CaretLine[CaretStart.V]))        break; -  for (; CaretEnd != CaretStart; --CaretEnd) -    if (!isWhitespace(CaretLine[CaretEnd - 1])) +  for (; CaretEnd != CaretStart; CaretEnd = CaretEnd.prev()) +    if (!isWhitespace(CaretLine[CaretEnd.V - 1]))        break;    // caret has already been inserted into CaretLine so the above whitespace @@ -349,39 +383,38 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    // If we have a fix-it line, make sure the slice includes all of the    // fix-it information.    if (!FixItInsertionLine.empty()) { -    unsigned FixItStart = 0, FixItEnd = FixItInsertionLine.size(); -    for (; FixItStart != FixItEnd; ++FixItStart) -      if (!isWhitespace(FixItInsertionLine[FixItStart])) -        break; - -    for (; FixItEnd != FixItStart; --FixItEnd) -      if (!isWhitespace(FixItInsertionLine[FixItEnd - 1])) -        break; -      // We can safely use the byte offset FixItStart as the column offset      // because the characters up until FixItStart are all ASCII whitespace      // characters. -    unsigned FixItStartCol = FixItStart; -    unsigned FixItEndCol -      = llvm::sys::locale::columnWidth(FixItInsertionLine.substr(0, FixItEnd)); - -    CaretStart = std::min(FixItStartCol, CaretStart); -    CaretEnd = std::max(FixItEndCol, CaretEnd); +    Bytes FixItStart = 0; +    Bytes FixItEnd = Bytes(FixItInsertionLine.size()); +    while (FixItStart != FixItEnd && +           isWhitespace(FixItInsertionLine[FixItStart.V])) +      FixItStart = FixItStart.next(); + +    while (FixItEnd != FixItStart && +           isWhitespace(FixItInsertionLine[FixItEnd.V - 1])) +      FixItEnd = FixItEnd.prev(); + +    Columns FixItStartCol = Columns(FixItStart.V); +    Columns FixItEndCol = Columns(llvm::sys::locale::columnWidth( +        FixItInsertionLine.substr(0, FixItEnd.V))); + +    CaretStart = std::min(FixItStartCol.V, CaretStart.V); +    CaretEnd = std::max(FixItEndCol.V, CaretEnd.V);    }    // CaretEnd may have been set at the middle of a character    // If it's not at a character's first column then advance it past the current    //   character. -  while (static_cast<int>(CaretEnd) < map.columns() && -         -1 == map.columnToByte(CaretEnd)) -    ++CaretEnd; - -  assert((static_cast<int>(CaretStart) > map.columns() || -          -1!=map.columnToByte(CaretStart)) && -         "CaretStart must not point to a column in the middle of a source" -         " line character"); -  assert((static_cast<int>(CaretEnd) > map.columns() || -          -1!=map.columnToByte(CaretEnd)) && +  while (CaretEnd < Map.columns() && !Map.columnToByte(CaretEnd).isValid()) +    CaretEnd = CaretEnd.next(); + +  assert( +      (CaretStart > Map.columns() || Map.columnToByte(CaretStart).isValid()) && +      "CaretStart must not point to a column in the middle of a source" +      " line character"); +  assert((CaretEnd > Map.columns() || Map.columnToByte(CaretEnd).isValid()) &&           "CaretEnd must not point to a column in the middle of a source line"           " character"); @@ -390,70 +423,69 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    // number of columns we have, try to grow the slice to encompass    // more context. -  unsigned SourceStart = map.columnToByte(std::min<unsigned>(CaretStart, -                                                             map.columns())); -  unsigned SourceEnd = map.columnToByte(std::min<unsigned>(CaretEnd, -                                                           map.columns())); +  Bytes SourceStart = Map.columnToByte(std::min(CaretStart.V, Map.columns().V)); +  Bytes SourceEnd = Map.columnToByte(std::min(CaretEnd.V, Map.columns().V)); -  unsigned CaretColumnsOutsideSource = CaretEnd-CaretStart -    - (map.byteToColumn(SourceEnd)-map.byteToColumn(SourceStart)); +  Columns CaretColumnsOutsideSource = +      CaretEnd - CaretStart - +      (Map.byteToColumn(SourceEnd) - Map.byteToColumn(SourceStart)); -  char const *front_ellipse = "  ..."; -  char const *front_space   = "     "; -  char const *back_ellipse = "..."; -  unsigned ellipses_space = strlen(front_ellipse) + strlen(back_ellipse); +  constexpr StringRef FrontEllipse = "  ..."; +  constexpr StringRef FrontSpace = "     "; +  constexpr StringRef BackEllipse = "..."; +  Columns EllipsesColumns = Columns(FrontEllipse.size() + BackEllipse.size()); -  unsigned TargetColumns = Columns; +  Columns TargetColumns = NonGutterColumns;    // Give us extra room for the ellipses    //  and any of the caret line that extends past the source -  if (TargetColumns > ellipses_space+CaretColumnsOutsideSource) -    TargetColumns -= ellipses_space+CaretColumnsOutsideSource; +  if (TargetColumns > EllipsesColumns + CaretColumnsOutsideSource) +    TargetColumns -= EllipsesColumns + CaretColumnsOutsideSource; -  while (SourceStart>0 || SourceEnd<SourceLine.size()) { +  while (SourceStart > 0 || SourceEnd < SourceLine.size()) {      bool ExpandedRegion = false; -    if (SourceStart>0) { -      unsigned NewStart = map.startOfPreviousColumn(SourceStart); +    if (SourceStart > 0) { +      Bytes NewStart = Map.startOfPreviousColumn(SourceStart);        // Skip over any whitespace we see here; we're looking for        // another bit of interesting text.        // FIXME: Detect non-ASCII whitespace characters too. -      while (NewStart && isWhitespace(SourceLine[NewStart])) -        NewStart = map.startOfPreviousColumn(NewStart); +      while (NewStart > 0 && isWhitespace(SourceLine[NewStart.V])) +        NewStart = Map.startOfPreviousColumn(NewStart);        // Skip over this bit of "interesting" text. -      while (NewStart) { -        unsigned Prev = map.startOfPreviousColumn(NewStart); -        if (isWhitespace(SourceLine[Prev])) +      while (NewStart > 0) { +        Bytes Prev = Map.startOfPreviousColumn(NewStart); +        if (isWhitespace(SourceLine[Prev.V]))            break;          NewStart = Prev;        } -      assert(map.byteToColumn(NewStart) != -1); -      unsigned NewColumns = map.byteToColumn(SourceEnd) - -                              map.byteToColumn(NewStart); +      assert(Map.byteToColumn(NewStart).isValid()); +      Columns NewColumns = +          Map.byteToColumn(SourceEnd) - Map.byteToColumn(NewStart);        if (NewColumns <= TargetColumns) {          SourceStart = NewStart;          ExpandedRegion = true;        }      } -    if (SourceEnd<SourceLine.size()) { -      unsigned NewEnd = map.startOfNextColumn(SourceEnd); +    if (SourceEnd < SourceLine.size()) { +      Bytes NewEnd = Map.startOfNextColumn(SourceEnd);        // Skip over any whitespace we see here; we're looking for        // another bit of interesting text.        // FIXME: Detect non-ASCII whitespace characters too. -      while (NewEnd < SourceLine.size() && isWhitespace(SourceLine[NewEnd])) -        NewEnd = map.startOfNextColumn(NewEnd); +      while (NewEnd < SourceLine.size() && isWhitespace(SourceLine[NewEnd.V])) +        NewEnd = Map.startOfNextColumn(NewEnd);        // Skip over this bit of "interesting" text. -      while (NewEnd < SourceLine.size() && isWhitespace(SourceLine[NewEnd])) -        NewEnd = map.startOfNextColumn(NewEnd); +      while (NewEnd < SourceLine.size() && isWhitespace(SourceLine[NewEnd.V])) +        NewEnd = Map.startOfNextColumn(NewEnd); -      assert(map.byteToColumn(NewEnd) != -1); -      unsigned NewColumns = map.byteToColumn(NewEnd) - -                              map.byteToColumn(SourceStart); +      assert(Map.byteToColumn(NewEnd).isValid()); +      Columns NewColumns = +          Map.byteToColumn(NewEnd) - Map.byteToColumn(SourceStart);        if (NewColumns <= TargetColumns) {          SourceEnd = NewEnd;          ExpandedRegion = true; @@ -464,39 +496,41 @@ static void selectInterestingSourceRegion(std::string &SourceLine,        break;    } -  CaretStart = map.byteToColumn(SourceStart); -  CaretEnd = map.byteToColumn(SourceEnd) + CaretColumnsOutsideSource; +  CaretStart = Map.byteToColumn(SourceStart); +  CaretEnd = Map.byteToColumn(SourceEnd) + CaretColumnsOutsideSource;    // [CaretStart, CaretEnd) is the slice we want. Update the various    // output lines to show only this slice. -  assert(CaretStart!=(unsigned)-1 && CaretEnd!=(unsigned)-1 && -         SourceStart!=(unsigned)-1 && SourceEnd!=(unsigned)-1); +  assert(CaretStart.isValid() && CaretEnd.isValid() && SourceStart.isValid() && +         SourceEnd.isValid());    assert(SourceStart <= SourceEnd);    assert(CaretStart <= CaretEnd); -  unsigned BackColumnsRemoved -    = map.byteToColumn(SourceLine.size())-map.byteToColumn(SourceEnd); -  unsigned FrontColumnsRemoved = CaretStart; -  unsigned ColumnsKept = CaretEnd-CaretStart; +  Columns BackColumnsRemoved = +      Map.byteToColumn(Bytes{static_cast<int>(SourceLine.size())}) - +      Map.byteToColumn(SourceEnd); +  Columns FrontColumnsRemoved = CaretStart; +  Columns ColumnsKept = CaretEnd - CaretStart;    // We checked up front that the line needed truncation -  assert(FrontColumnsRemoved+ColumnsKept+BackColumnsRemoved > Columns); +  assert(FrontColumnsRemoved + ColumnsKept + BackColumnsRemoved > +         NonGutterColumns);    // The line needs some truncation, and we'd prefer to keep the front    //  if possible, so remove the back -  if (BackColumnsRemoved > strlen(back_ellipse)) -    SourceLine.replace(SourceEnd, std::string::npos, back_ellipse); +  if (BackColumnsRemoved > Columns(BackEllipse.size())) +    SourceLine.replace(SourceEnd.V, std::string::npos, BackEllipse);    // If that's enough then we're done -  if (FrontColumnsRemoved+ColumnsKept <= Columns) +  if (FrontColumnsRemoved + ColumnsKept <= Columns(NonGutterColumns))      return;    // Otherwise remove the front as well -  if (FrontColumnsRemoved > strlen(front_ellipse)) { -    SourceLine.replace(0, SourceStart, front_ellipse); -    CaretLine.replace(0, CaretStart, front_space); +  if (FrontColumnsRemoved > Columns(FrontEllipse.size())) { +    SourceLine.replace(0, SourceStart.V, FrontEllipse); +    CaretLine.replace(0, CaretStart.V, FrontSpace);      if (!FixItInsertionLine.empty()) -      FixItInsertionLine.replace(0, CaretStart, front_space); +      FixItInsertionLine.replace(0, CaretStart.V, FrontSpace);    }  } @@ -690,11 +724,21 @@ TextDiagnostic::printDiagnosticLevel(raw_ostream &OS,      switch (Level) {      case DiagnosticsEngine::Ignored:        llvm_unreachable("Invalid diagnostic type"); -    case DiagnosticsEngine::Note:    OS.changeColor(noteColor, true); break; -    case DiagnosticsEngine::Remark:  OS.changeColor(remarkColor, true); break; -    case DiagnosticsEngine::Warning: OS.changeColor(warningColor, true); break; -    case DiagnosticsEngine::Error:   OS.changeColor(errorColor, true); break; -    case DiagnosticsEngine::Fatal:   OS.changeColor(fatalColor, true); break; +    case DiagnosticsEngine::Note: +      OS.changeColor(NoteColor, true); +      break; +    case DiagnosticsEngine::Remark: +      OS.changeColor(RemarkColor, true); +      break; +    case DiagnosticsEngine::Warning: +      OS.changeColor(WarningColor, true); +      break; +    case DiagnosticsEngine::Error: +      OS.changeColor(ErrorColor, true); +      break; +    case DiagnosticsEngine::Fatal: +      OS.changeColor(FatalColor, true); +      break;      }    } @@ -722,7 +766,7 @@ void TextDiagnostic::printDiagnosticMessage(raw_ostream &OS,    if (ShowColors && !IsSupplemental) {      // Print primary diagnostic messages in bold and without color, to visually      // indicate the transition from continuation notes and other output. -    OS.changeColor(savedColor, true); +    OS.changeColor(SavedColor, true);      Bold = true;    } @@ -800,7 +844,7 @@ void TextDiagnostic::emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc,      return;    if (DiagOpts.ShowColors) -    OS.changeColor(savedColor, true); +    OS.changeColor(SavedColor, true);    emitFilename(PLoc.getFilename(), Loc.getManager());    switch (DiagOpts.getFormat()) { @@ -961,41 +1005,40 @@ maybeAddRange(std::pair<unsigned, unsigned> A, std::pair<unsigned, unsigned> B,  struct LineRange {    unsigned LineNo; -  unsigned StartCol; -  unsigned EndCol; +  Bytes StartByte; +  Bytes EndByte;  };  /// Highlight \p R (with ~'s) on the current source line.  static void highlightRange(const LineRange &R, const SourceColumnMap &Map,                             std::string &CaretLine) {    // Pick the first non-whitespace column. -  unsigned StartColNo = R.StartCol; -  while (StartColNo < Map.getSourceLine().size() && -         (Map.getSourceLine()[StartColNo] == ' ' || -          Map.getSourceLine()[StartColNo] == '\t')) -    StartColNo = Map.startOfNextColumn(StartColNo); +  Bytes StartByte = R.StartByte; +  while (StartByte < Map.bytes() && (Map.getSourceLine()[StartByte.V] == ' ' || +                                     Map.getSourceLine()[StartByte.V] == '\t')) +    StartByte = Map.startOfNextColumn(StartByte);    // Pick the last non-whitespace column. -  unsigned EndColNo = -      std::min(static_cast<size_t>(R.EndCol), Map.getSourceLine().size()); -  while (EndColNo && (Map.getSourceLine()[EndColNo - 1] == ' ' || -                      Map.getSourceLine()[EndColNo - 1] == '\t')) -    EndColNo = Map.startOfPreviousColumn(EndColNo); +  Bytes EndByte = std::min(R.EndByte.V, Map.bytes().V); +  while (EndByte.V != 0 && (Map.getSourceLine()[EndByte.V - 1] == ' ' || +                            Map.getSourceLine()[EndByte.V - 1] == '\t')) +    EndByte = Map.startOfPreviousColumn(EndByte);    // If the start/end passed each other, then we are trying to highlight a    // range that just exists in whitespace. That most likely means we have    // a multi-line highlighting range that covers a blank line. -  if (StartColNo > EndColNo) +  if (StartByte > EndByte)      return; +  assert(StartByte <= EndByte && "Invalid range!");    // Fill the range with ~'s. -  StartColNo = Map.byteToContainingColumn(StartColNo); -  EndColNo = Map.byteToContainingColumn(EndColNo); +  Columns StartCol = Map.byteToContainingColumn(StartByte); +  Columns EndCol = Map.byteToContainingColumn(EndByte); + +  if (CaretLine.size() < static_cast<size_t>(EndCol.V)) +    CaretLine.resize(EndCol.V, ' '); -  assert(StartColNo <= EndColNo && "Invalid range!"); -  if (CaretLine.size() < EndColNo) -    CaretLine.resize(EndColNo, ' '); -  std::fill(CaretLine.begin() + StartColNo, CaretLine.begin() + EndColNo, '~'); +  std::fill(CaretLine.begin() + StartCol.V, CaretLine.begin() + EndCol.V, '~');  }  static std::string buildFixItInsertionLine(FileID FID, unsigned LineNo, @@ -1006,7 +1049,7 @@ static std::string buildFixItInsertionLine(FileID FID, unsigned LineNo,    std::string FixItInsertionLine;    if (Hints.empty() || !DiagOpts.ShowFixits)      return FixItInsertionLine; -  unsigned PrevHintEndCol = 0; +  Columns PrevHintEndCol = 0;    for (const auto &H : Hints) {      if (H.CodeToInsert.empty()) @@ -1024,12 +1067,13 @@ static std::string buildFixItInsertionLine(FileID FID, unsigned LineNo,        // Note: When modifying this function, be very careful about what is a        // "column" (printed width, platform-dependent) and what is a        // "byte offset" (SourceManager "column"). -      unsigned HintByteOffset = -          SM.getColumnNumber(HintLocInfo.first, HintLocInfo.second) - 1; +      Bytes HintByteOffset = +          Bytes(SM.getColumnNumber(HintLocInfo.first, HintLocInfo.second)) +              .prev();        // The hint must start inside the source or right at the end -      assert(HintByteOffset < static_cast<unsigned>(map.bytes()) + 1); -      unsigned HintCol = map.byteToContainingColumn(HintByteOffset); +      assert(HintByteOffset < map.bytes().next()); +      Columns HintCol = map.byteToContainingColumn(HintByteOffset);        // If we inserted a long previous hint, push this one forwards, and add        // an extra space to show that this is not part of the previous @@ -1043,11 +1087,11 @@ static std::string buildFixItInsertionLine(FileID FID, unsigned LineNo,        // This should NOT use HintByteOffset, because the source might have        // Unicode characters in earlier columns. -      unsigned NewFixItLineSize = FixItInsertionLine.size() + -                                  (HintCol - PrevHintEndCol) + -                                  H.CodeToInsert.size(); +      Columns NewFixItLineSize = Columns(FixItInsertionLine.size()) + +                                 (HintCol - PrevHintEndCol) + +                                 Columns(H.CodeToInsert.size());        if (NewFixItLineSize > FixItInsertionLine.size()) -        FixItInsertionLine.resize(NewFixItLineSize, ' '); +        FixItInsertionLine.resize(NewFixItLineSize.V, ' ');        std::copy(H.CodeToInsert.begin(), H.CodeToInsert.end(),                  FixItInsertionLine.end() - H.CodeToInsert.size()); @@ -1095,28 +1139,29 @@ prepareAndFilterRanges(const SmallVectorImpl<CharSourceRange> &Ranges,      if (EndLineNo < Lines.first || SM.getFileID(End) != FID)        continue; -    unsigned StartColumn = SM.getExpansionColumnNumber(Begin); -    unsigned EndColumn = SM.getExpansionColumnNumber(End); -    assert(StartColumn && "StartColumn must be valid, 0 is invalid"); -    assert(EndColumn && "EndColumn must be valid, 0 is invalid"); +    Bytes StartByte = SM.getExpansionColumnNumber(Begin); +    Bytes EndByte = SM.getExpansionColumnNumber(End); +    assert(StartByte.V != 0 && "StartByte must be valid, 0 is invalid"); +    assert(EndByte.V != 0 && "EndByte must be valid, 0 is invalid");      if (R.isTokenRange()) -      EndColumn += Lexer::MeasureTokenLength(End, SM, LangOpts); +      EndByte += Bytes(Lexer::MeasureTokenLength(End, SM, LangOpts));      // Only a single line.      if (StartLineNo == EndLineNo) { -      LineRanges.push_back({StartLineNo, StartColumn - 1, EndColumn - 1}); +      LineRanges.push_back({StartLineNo, StartByte.prev(), EndByte.prev()});        continue;      }      // Start line. -    LineRanges.push_back({StartLineNo, StartColumn - 1, ~0u}); +    LineRanges.push_back( +        {StartLineNo, StartByte.prev(), std::numeric_limits<int>::max()});      // Middle lines.      for (unsigned S = StartLineNo + 1; S != EndLineNo; ++S) -      LineRanges.push_back({S, 0, ~0u}); +      LineRanges.push_back({S, 0, std::numeric_limits<int>::max()});      // End line. -    LineRanges.push_back({EndLineNo, 0, EndColumn - 1}); +    LineRanges.push_back({EndLineNo, 0, EndByte.prev()});    }    return LineRanges; @@ -1226,8 +1271,7 @@ highlightLines(StringRef FileData, unsigned StartLineNumber,      if (TokenStartLine > EndLineNumber)        break; -    unsigned StartCol = -        SM.getSpellingColumnNumber(T.getLocation(), &Invalid) - 1; +    Bytes StartCol = SM.getSpellingColumnNumber(T.getLocation(), &Invalid) - 1;      if (Invalid)        continue; @@ -1235,14 +1279,14 @@ highlightLines(StringRef FileData, unsigned StartLineNumber,      if (TokenStartLine == TokenEndLine) {        SmallVector<TextDiagnostic::StyleRange> &LineRanges =            SnippetRanges[TokenStartLine - StartLineNumber]; -      appendStyle(LineRanges, T, StartCol, T.getLength()); +      appendStyle(LineRanges, T, StartCol.V, T.getLength());        continue;      }      assert((TokenEndLine - TokenStartLine) >= 1);      // For tokens that span multiple lines (think multiline comments), we      // divide them into multiple StyleRanges. -    unsigned EndCol = SM.getSpellingColumnNumber(T.getEndLoc(), &Invalid) - 1; +    Bytes EndCol = SM.getSpellingColumnNumber(T.getEndLoc(), &Invalid) - 1;      if (Invalid)        continue; @@ -1258,9 +1302,9 @@ highlightLines(StringRef FileData, unsigned StartLineNumber,                SnippetRanges[L - StartLineNumber];            if (L == TokenStartLine) // First line -            appendStyle(LineRanges, T, StartCol, LineLength); +            appendStyle(LineRanges, T, StartCol.V, LineLength);            else if (L == TokenEndLine) // Last line -            appendStyle(LineRanges, T, 0, EndCol); +            appendStyle(LineRanges, T, 0, EndCol.V);            else              appendStyle(LineRanges, T, 0, LineLength);          } @@ -1315,11 +1359,11 @@ void TextDiagnostic::emitSnippetAndCaret(    const char *BufEnd = BufStart + BufData.size();    unsigned CaretLineNo = Loc.getLineNumber(); -  unsigned CaretColNo = Loc.getColumnNumber(); +  Bytes CaretByte = Loc.getColumnNumber();    // Arbitrarily stop showing snippets when the line is too long.    static const size_t MaxLineLengthToPrint = 4096; -  if (CaretColNo > MaxLineLengthToPrint) +  if (CaretByte > MaxLineLengthToPrint)      return;    // Find the set of lines to include. @@ -1379,35 +1423,37 @@ void TextDiagnostic::emitSnippetAndCaret(      std::string SourceLine(LineStart, LineEnd);      // Remove trailing null bytes.      while (!SourceLine.empty() && SourceLine.back() == '\0' && -           (LineNo != CaretLineNo || SourceLine.size() > CaretColNo)) +           (LineNo != CaretLineNo || +            SourceLine.size() > static_cast<size_t>(CaretByte.V)))        SourceLine.pop_back();      // Build the byte to column map. -    const SourceColumnMap sourceColMap(SourceLine, DiagOpts.TabStop); +    const SourceColumnMap SourceColMap(SourceLine, DiagOpts.TabStop);      std::string CaretLine;      // Highlight all of the characters covered by Ranges with ~ characters.      for (const auto &LR : LineRanges) {        if (LR.LineNo == LineNo) -        highlightRange(LR, sourceColMap, CaretLine); +        highlightRange(LR, SourceColMap, CaretLine);      }      // Next, insert the caret itself.      if (CaretLineNo == LineNo) { -      size_t Col = sourceColMap.byteToContainingColumn(CaretColNo - 1); -      CaretLine.resize(std::max(Col + 1, CaretLine.size()), ' '); -      CaretLine[Col] = '^'; +      Columns Col = SourceColMap.byteToContainingColumn(CaretByte.prev()); +      CaretLine.resize( +          std::max(static_cast<size_t>(Col.V) + 1, CaretLine.size()), ' '); +      CaretLine[Col.V] = '^';      }      std::string FixItInsertionLine = -        buildFixItInsertionLine(FID, LineNo, sourceColMap, Hints, SM, DiagOpts); +        buildFixItInsertionLine(FID, LineNo, SourceColMap, Hints, SM, DiagOpts);      // If the source line is too long for our terminal, select only the      // "interesting" source region within that line. -    unsigned Columns = DiagOpts.MessageLength; -    if (Columns) +    Columns MessageLength = DiagOpts.MessageLength; +    if (MessageLength.V != 0)        selectInterestingSourceRegion(SourceLine, CaretLine, FixItInsertionLine, -                                    Columns, sourceColMap); +                                    MessageLength, SourceColMap);      // If we are in -fdiagnostics-print-source-range-info mode, we are trying      // to produce easily machine parsable output.  Add a space before the @@ -1425,7 +1471,7 @@ void TextDiagnostic::emitSnippetAndCaret(      if (!CaretLine.empty()) {        indentForLineNumbers();        if (DiagOpts.ShowColors) -        OS.changeColor(caretColor, true); +        OS.changeColor(CaretColor, true);        OS << CaretLine << '\n';        if (DiagOpts.ShowColors)          OS.resetColor(); @@ -1435,7 +1481,7 @@ void TextDiagnostic::emitSnippetAndCaret(        indentForLineNumbers();        if (DiagOpts.ShowColors)          // Print fixit line in color -        OS.changeColor(fixitColor, false); +        OS.changeColor(FixitColor, false);        if (DiagOpts.ShowSourceRanges)          OS << ' ';        OS << FixItInsertionLine << '\n'; diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 65c324c..f05c28fd 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -221,7 +221,7 @@ std::string HeaderSearch::getPrebuiltModuleFileName(StringRef ModuleName,    // file.    for (const std::string &Dir : HSOpts.PrebuiltModulePaths) {      SmallString<256> Result(Dir); -    llvm::sys::fs::make_absolute(Result); +    FileMgr.makeAbsolutePath(Result);      if (ModuleName.contains(':'))        // The separator of C++20 modules partitions (':') is not good for file        // systems, here clang and gcc choose '-' by default since it is not a @@ -246,7 +246,7 @@ std::string HeaderSearch::getPrebuiltImplicitModuleFileName(Module *Module) {    StringRef ModuleCacheHash = HSOpts.DisableModuleHash ? "" : getModuleHash();    for (const std::string &Dir : HSOpts.PrebuiltModulePaths) {      SmallString<256> CachePath(Dir); -    llvm::sys::fs::make_absolute(CachePath); +    FileMgr.makeAbsolutePath(CachePath);      llvm::sys::path::append(CachePath, ModuleCacheHash);      std::string FileName =          getCachedModuleFileNameImpl(ModuleName, ModuleMapPath, CachePath); diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 25199c7..31bc941 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -3221,6 +3221,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,      else        Clause = ParseOpenMPSingleExprClause(CKind, WrongDirective);      break; +  case OMPC_threadset:    case OMPC_fail:    case OMPC_proc_bind:    case OMPC_atomic_default_mem_order: diff --git a/clang/lib/Sema/SemaAMDGPU.cpp b/clang/lib/Sema/SemaAMDGPU.cpp index e32f437..139c4ab 100644 --- a/clang/lib/Sema/SemaAMDGPU.cpp +++ b/clang/lib/Sema/SemaAMDGPU.cpp @@ -153,7 +153,48 @@ bool SemaAMDGPU::CheckAMDGCNBuiltinFunctionCall(unsigned BuiltinID,    case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:    case AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:    case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32: -  case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32: { +  case AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_3d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_lz_cube_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_1d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_1darray_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_2d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_2darray_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_3d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_l_cube_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_1d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_1darray_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_2d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_2darray_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f32_f32: +  case AMDGPU::BI__builtin_amdgcn_image_sample_d_3d_v4f16_f32: +  case AMDGPU::BI__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32: {      StringRef FeatureList(          getASTContext().BuiltinInfo.getRequiredFeatures(BuiltinID));      if (!Builtin::evaluateRequiredTargetFeatures(FeatureList, diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 6d5cb0f..256f952 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -17216,6 +17216,10 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(          static_cast<OpenMPSeverityClauseKind>(Argument), ArgumentLoc, StartLoc,          LParenLoc, EndLoc);      break; +  case OMPC_threadset: +    Res = ActOnOpenMPThreadsetClause(static_cast<OpenMPThreadsetKind>(Argument), +                                     ArgumentLoc, StartLoc, LParenLoc, EndLoc); +    break;    case OMPC_if:    case OMPC_final:    case OMPC_num_threads: @@ -17355,6 +17359,23 @@ OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(        OMPDefaultClause(M, MLoc, VCKind, VCKindLoc, StartLoc, LParenLoc, EndLoc);  } +OMPClause *SemaOpenMP::ActOnOpenMPThreadsetClause(OpenMPThreadsetKind Kind, +                                                  SourceLocation KindLoc, +                                                  SourceLocation StartLoc, +                                                  SourceLocation LParenLoc, +                                                  SourceLocation EndLoc) { +  if (Kind == OMPC_THREADSET_unknown) { +    Diag(KindLoc, diag::err_omp_unexpected_clause_value) +        << getListOfPossibleValues(OMPC_threadset, /*First=*/0, +                                   /*Last=*/unsigned(OMPC_THREADSET_unknown)) +        << getOpenMPClauseName(OMPC_threadset); +    return nullptr; +  } + +  return new (getASTContext()) +      OMPThreadsetClause(Kind, KindLoc, StartLoc, LParenLoc, EndLoc); +} +  OMPClause *SemaOpenMP::ActOnOpenMPProcBindClause(ProcBindKind Kind,                                                   SourceLocation KindKwLoc,                                                   SourceLocation StartLoc, diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 0c8c1d1..8c20078 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -10624,6 +10624,13 @@ TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {  template <typename Derived>  OMPClause * +TreeTransform<Derived>::TransformOMPThreadsetClause(OMPThreadsetClause *C) { +  // No need to rebuild this clause, no template-dependent parameters. +  return C; +} + +template <typename Derived> +OMPClause *  TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {    return getDerived().RebuildOMPProcBindClause(        C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index c1b5cb7..e3106f8d 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -11255,6 +11255,9 @@ OMPClause *OMPClauseReader::readClause() {    case llvm::omp::OMPC_mergeable:      C = new (Context) OMPMergeableClause();      break; +  case llvm::omp::OMPC_threadset: +    C = new (Context) OMPThreadsetClause(); +    break;    case llvm::omp::OMPC_read:      C = new (Context) OMPReadClause();      break; @@ -11658,6 +11661,17 @@ void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {    C->setDefaultVariableCategoryLocation(Record.readSourceLocation());  } +// Read the parameter of threadset clause. This will have been saved when +// OMPClauseWriter is called. +void OMPClauseReader::VisitOMPThreadsetClause(OMPThreadsetClause *C) { +  C->setLParenLoc(Record.readSourceLocation()); +  SourceLocation ThreadsetKindLoc = Record.readSourceLocation(); +  C->setThreadsetKindLoc(ThreadsetKindLoc); +  OpenMPThreadsetKind TKind = +      static_cast<OpenMPThreadsetKind>(Record.readInt()); +  C->setThreadsetKind(TKind); +} +  void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {    C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt()));    C->setLParenLoc(Record.readSourceLocation()); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 377e396..3ac338e 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -7913,6 +7913,12 @@ void OMPClauseWriter::VisitOMPDefaultClause(OMPDefaultClause *C) {    Record.AddSourceLocation(C->getDefaultVCLoc());  } +void OMPClauseWriter::VisitOMPThreadsetClause(OMPThreadsetClause *C) { +  Record.AddSourceLocation(C->getLParenLoc()); +  Record.AddSourceLocation(C->getThreadsetKindLoc()); +  Record.writeEnum(C->getThreadsetKind()); +} +  void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *C) {    Record.push_back(unsigned(C->getProcBindKind()));    Record.AddSourceLocation(C->getLParenLoc()); diff --git a/clang/test/CIR/CodeGen/builtin_prefetech.c b/clang/test/CIR/CodeGen/builtin_prefetch.c index cfe85b9..cfe85b9 100644 --- a/clang/test/CIR/CodeGen/builtin_prefetech.c +++ b/clang/test/CIR/CodeGen/builtin_prefetch.c diff --git a/clang/test/CXX/drs/cwg0xx.cpp b/clang/test/CXX/drs/cwg0xx.cpp index 805be67..10a4f1d 100644 --- a/clang/test/CXX/drs/cwg0xx.cpp +++ b/clang/test/CXX/drs/cwg0xx.cpp @@ -90,6 +90,8 @@ namespace cwg5 { // cwg5: 3.1    const C c = e;  } // namespace cwg5 +// cwg6 is in cwg6.cpp +  namespace cwg7 { // cwg7: 3.4    class A { public: ~A(); };    class B : virtual private A {}; // #cwg7-B diff --git a/clang/test/CXX/drs/cwg28xx.cpp b/clang/test/CXX/drs/cwg28xx.cpp index a6b2b99..d0ee191 100644 --- a/clang/test/CXX/drs/cwg28xx.cpp +++ b/clang/test/CXX/drs/cwg28xx.cpp @@ -61,6 +61,24 @@ namespace cwg2819 { // cwg2819: 19 c++26  #endif  } // namespace cwg2819 +namespace cwg2823 { // cwg2823: no +#if __cplusplus >= 201103L +  constexpr int *p = 0; +  constexpr int *q1 = &*p; +  // expected-error@-1 {{constexpr variable 'q1' must be initialized by a constant expression}} +  //   expected-note@-2 {{dereferencing a null pointer is not allowed in a constant expression}} +  // FIXME: invalid: dereferencing a null pointer. +  constexpr int *q2 = &p[0]; + +  int arr[32]; +  constexpr int *r = arr; +  // FIXME: invalid: dereferencing a past-the-end pointer. +  constexpr int *s1 = &*(r + 32); +  // FIXME: invalid: dereferencing a past-the-end pointer. +  constexpr int *s2 = &r[32]; +#endif +} +  namespace cwg2847 { // cwg2847: 19 review 2024-03-01  #if __cplusplus >= 202002L diff --git a/clang/test/CXX/drs/cwg2xx.cpp b/clang/test/CXX/drs/cwg2xx.cpp index 37186e3..a4995dd 100644 --- a/clang/test/CXX/drs/cwg2xx.cpp +++ b/clang/test/CXX/drs/cwg2xx.cpp @@ -230,6 +230,38 @@ namespace cwg211 { // cwg211: 2.7    };  } // namespace cwg211 +namespace cwg212 { // cwg212: 2.7 +  template<typename T> struct Base; +  template<typename T> struct Derived; + +  int *overload(void*); +  float *overload(Base<int>*); +  double *overload(Base<long>*); + +  void f(Derived<int> *p) { +    // OK, calls void* overload. +    int *a = overload(p); + +    Base<int> *q = p; +    // expected-error@-1 {{cannot initialize a variable of type 'Base<int> *' with an lvalue of type 'Derived<int> *'}} +  } + +  template<typename T> struct Base {}; +  template<typename T> struct Derived : Base<T> {}; + +  void g(Derived<long> *p) { +    // OK, instantiates and calls Base<long>* overlod. +    double *b = overload(p); +    (void)b; +  } + +  void h(Derived<float> *p) { +    // OK, instantiates and converts. +    Base<float> *q = p; +    (void)q; +  } +} +  namespace cwg213 { // cwg213: 2.7    template <class T> struct A : T {      void h(T t) { @@ -593,6 +625,9 @@ namespace cwg231 { // cwg231: 2.7    }  } // namespace cwg231 +// 232 is NAD; the desired behavior is described in 2823. +// cwg232: dup 2823 +  // cwg234: na  // cwg235: na diff --git a/clang/test/CXX/drs/cwg6.cpp b/clang/test/CXX/drs/cwg6.cpp new file mode 100644 index 0000000..4752e72 --- /dev/null +++ b/clang/test/CXX/drs/cwg6.cpp @@ -0,0 +1,51 @@ +// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK +// RUN: %clang_cc1 -std=c++11 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK +// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK +// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK +// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK +// RUN: %clang_cc1 -std=c++23 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK +// RUN: %clang_cc1 -std=c++2c %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | FileCheck %s --check-prefixes CHECK + +#if __cplusplus == 199711L +#define static_assert(expr) __extension__ _Static_assert(expr) +#define noexcept throw() +#endif + +namespace cwg6 { // cwg6: 2.7 +#if __cplusplus >= 201103L +struct Counter { +  int copies; +  constexpr Counter(int copies) : copies(copies) {} +  constexpr Counter(const Counter& other) : copies(other.copies + 1) {} +}; + +// Passing an lvalue by value makes a non-elidable copy. +constexpr int PassByValue(Counter c) { return c.copies; } +constexpr int PassByValue2(Counter c) { return PassByValue(c); } +constexpr int PassByValue3(Counter c) { return PassByValue2(c); } +static_assert(PassByValue(Counter(0)) == 0, "expect no copies"); +static_assert(PassByValue2(Counter(0)) == 1, "expect 1 copy"); +static_assert(PassByValue3(Counter(0)) == 2, "expect 2 copies"); +#endif + +struct A { +  A() noexcept; +  A(const A&) noexcept; +  ~A() noexcept; +}; + +inline void f(A a) noexcept {} + +// CHECK-LABEL: define {{.*}} @_ZN4cwg64callEv +void call() { +  A a; +  // We copy the parameter here, even though object is not mutated by f and +  // otherwise satisfies the criteria for the proposed CWG6 optimization. +  // CHECK: call {{.*}} @_ZN4cwg61AC1ERKS0_( +  // CHECK: call {{.*}} @_ZN4cwg61fENS_1AE( +  f(a); +  // CHECK: call {{.*}} @_ZN4cwg61AD1Ev( +  // CHECK: call {{.*}} @_ZN4cwg61AD1Ev( +} + +} // namespace cwg6 diff --git a/clang/test/CodeGen/AArch64/neon-across.c b/clang/test/CodeGen/AArch64/neon-across.c index aa0387d..aae5097 100644 --- a/clang/test/CodeGen/AArch64/neon-across.c +++ b/clang/test/CodeGen/AArch64/neon-across.c @@ -113,9 +113,8 @@ uint64_t test_vaddlvq_u32(uint32x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxv_s8  // CHECK-SAME: (<8 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v8i8(<8 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMAXV_S8_I:%.*]] = call i8 @llvm.vector.reduce.smax.v8i8(<8 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMAXV_S8_I]]  //  int8_t test_vmaxv_s8(int8x8_t a) {    return vmaxv_s8(a); @@ -124,9 +123,8 @@ int8_t test_vmaxv_s8(int8x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxv_s16  // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v4i16(<4 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMAXV_S16_I:%.*]] = call i16 @llvm.vector.reduce.smax.v4i16(<4 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMAXV_S16_I]]  //  int16_t test_vmaxv_s16(int16x4_t a) {    return vmaxv_s16(a); @@ -135,9 +133,8 @@ int16_t test_vmaxv_s16(int16x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxv_u8  // CHECK-SAME: (<8 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v8i8(<8 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMAXV_U8_I:%.*]] = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMAXV_U8_I]]  //  uint8_t test_vmaxv_u8(uint8x8_t a) {    return vmaxv_u8(a); @@ -146,9 +143,8 @@ uint8_t test_vmaxv_u8(uint8x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxv_u16  // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v4i16(<4 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMAXV_U16_I:%.*]] = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMAXV_U16_I]]  //  uint16_t test_vmaxv_u16(uint16x4_t a) {    return vmaxv_u16(a); @@ -157,9 +153,8 @@ uint16_t test_vmaxv_u16(uint16x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_s8  // CHECK-SAME: (<16 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v16i8(<16 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMAXVQ_S8_I:%.*]] = call i8 @llvm.vector.reduce.smax.v16i8(<16 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMAXVQ_S8_I]]  //  int8_t test_vmaxvq_s8(int8x16_t a) {    return vmaxvq_s8(a); @@ -168,9 +163,8 @@ int8_t test_vmaxvq_s8(int8x16_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_s16  // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v8i16(<8 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMAXVQ_S16_I:%.*]] = call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMAXVQ_S16_I]]  //  int16_t test_vmaxvq_s16(int16x8_t a) {    return vmaxvq_s16(a); @@ -179,7 +173,7 @@ int16_t test_vmaxvq_s16(int16x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_s32  // CHECK-SAME: (<4 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v4i32(<4 x i32> [[A]]) +// CHECK-NEXT:    [[VMAXVQ_S32_I:%.*]] = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMAXVQ_S32_I]]  //  int32_t test_vmaxvq_s32(int32x4_t a) { @@ -189,9 +183,8 @@ int32_t test_vmaxvq_s32(int32x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_u8  // CHECK-SAME: (<16 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v16i8(<16 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMAXVQ_U8_I:%.*]] = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMAXVQ_U8_I]]  //  uint8_t test_vmaxvq_u8(uint8x16_t a) {    return vmaxvq_u8(a); @@ -200,9 +193,8 @@ uint8_t test_vmaxvq_u8(uint8x16_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_u16  // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXV_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v8i16(<8 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMAXV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMAXVQ_U16_I:%.*]] = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMAXVQ_U16_I]]  //  uint16_t test_vmaxvq_u16(uint16x8_t a) {    return vmaxvq_u16(a); @@ -211,7 +203,7 @@ uint16_t test_vmaxvq_u16(uint16x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vmaxvq_u32  // CHECK-SAME: (<4 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMAXVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v4i32(<4 x i32> [[A]]) +// CHECK-NEXT:    [[VMAXVQ_U32_I:%.*]] = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMAXVQ_U32_I]]  //  uint32_t test_vmaxvq_u32(uint32x4_t a) { @@ -221,9 +213,8 @@ uint32_t test_vmaxvq_u32(uint32x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminv_s8  // CHECK-SAME: (<8 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v8i8(<8 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMINV_S8_I:%.*]] = call i8 @llvm.vector.reduce.smin.v8i8(<8 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMINV_S8_I]]  //  int8_t test_vminv_s8(int8x8_t a) {    return vminv_s8(a); @@ -232,9 +223,8 @@ int8_t test_vminv_s8(int8x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminv_s16  // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v4i16(<4 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMINV_S16_I:%.*]] = call i16 @llvm.vector.reduce.smin.v4i16(<4 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMINV_S16_I]]  //  int16_t test_vminv_s16(int16x4_t a) {    return vminv_s16(a); @@ -243,9 +233,8 @@ int16_t test_vminv_s16(int16x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminv_u8  // CHECK-SAME: (<8 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMINV_U8_I:%.*]] = call i8 @llvm.vector.reduce.umin.v8i8(<8 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMINV_U8_I]]  //  uint8_t test_vminv_u8(uint8x8_t a) {    return vminv_u8(a); @@ -254,9 +243,8 @@ uint8_t test_vminv_u8(uint8x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminv_u16  // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMINV_U16_I:%.*]] = call i16 @llvm.vector.reduce.umin.v4i16(<4 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMINV_U16_I]]  //  uint16_t test_vminv_u16(uint16x4_t a) {    return vminv_u16(a); @@ -265,9 +253,8 @@ uint16_t test_vminv_u16(uint16x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminvq_s8  // CHECK-SAME: (<16 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v16i8(<16 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMINVQ_S8_I:%.*]] = call i8 @llvm.vector.reduce.smin.v16i8(<16 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMINVQ_S8_I]]  //  int8_t test_vminvq_s8(int8x16_t a) {    return vminvq_s8(a); @@ -276,9 +263,8 @@ int8_t test_vminvq_s8(int8x16_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminvq_s16  // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v8i16(<8 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMINVQ_S16_I:%.*]] = call i16 @llvm.vector.reduce.smin.v8i16(<8 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMINVQ_S16_I]]  //  int16_t test_vminvq_s16(int16x8_t a) {    return vminvq_s16(a); @@ -287,7 +273,7 @@ int16_t test_vminvq_s16(int16x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminvq_s32  // CHECK-SAME: (<4 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32> [[A]]) +// CHECK-NEXT:    [[VMINVQ_S32_I:%.*]] = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMINVQ_S32_I]]  //  int32_t test_vminvq_s32(int32x4_t a) { @@ -297,9 +283,8 @@ int32_t test_vminvq_s32(int32x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminvq_u8  // CHECK-SAME: (<16 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VMINVQ_U8_I:%.*]] = call i8 @llvm.vector.reduce.umin.v16i8(<16 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VMINVQ_U8_I]]  //  uint8_t test_vminvq_u8(uint8x16_t a) {    return vminvq_u8(a); @@ -308,9 +293,8 @@ uint8_t test_vminvq_u8(uint8x16_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminvq_u16  // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINV_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VMINV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VMINVQ_U16_I:%.*]] = call i16 @llvm.vector.reduce.umin.v8i16(<8 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VMINVQ_U16_I]]  //  uint16_t test_vminvq_u16(uint16x8_t a) {    return vminvq_u16(a); @@ -319,7 +303,7 @@ uint16_t test_vminvq_u16(uint16x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vminvq_u32  // CHECK-SAME: (<4 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VMINVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v4i32(<4 x i32> [[A]]) +// CHECK-NEXT:    [[VMINVQ_U32_I:%.*]] = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMINVQ_U32_I]]  //  uint32_t test_vminvq_u32(uint32x4_t a) { @@ -329,9 +313,8 @@ uint32_t test_vminvq_u32(uint32x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddv_s8  // CHECK-SAME: (<8 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v8i8(<8 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VADDV_S8_I:%.*]] = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VADDV_S8_I]]  //  int8_t test_vaddv_s8(int8x8_t a) {    return vaddv_s8(a); @@ -340,9 +323,8 @@ int8_t test_vaddv_s8(int8x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddv_s16  // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v4i16(<4 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VADDV_S16_I:%.*]] = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VADDV_S16_I]]  //  int16_t test_vaddv_s16(int16x4_t a) {    return vaddv_s16(a); @@ -351,9 +333,8 @@ int16_t test_vaddv_s16(int16x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddv_u8  // CHECK-SAME: (<8 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v8i8(<8 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VADDV_U8_I:%.*]] = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VADDV_U8_I]]  //  uint8_t test_vaddv_u8(uint8x8_t a) {    return vaddv_u8(a); @@ -362,9 +343,8 @@ uint8_t test_vaddv_u8(uint8x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddv_u16  // CHECK-SAME: (<4 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v4i16(<4 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VADDV_U16_I:%.*]] = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VADDV_U16_I]]  //  uint16_t test_vaddv_u16(uint16x4_t a) {    return vaddv_u16(a); @@ -373,9 +353,8 @@ uint16_t test_vaddv_u16(uint16x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddvq_s8  // CHECK-SAME: (<16 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v16i8(<16 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VADDVQ_S8_I:%.*]] = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VADDVQ_S8_I]]  //  int8_t test_vaddvq_s8(int8x16_t a) {    return vaddvq_s8(a); @@ -384,9 +363,8 @@ int8_t test_vaddvq_s8(int8x16_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddvq_s16  // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v8i16(<8 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VADDVQ_S16_I:%.*]] = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VADDVQ_S16_I]]  //  int16_t test_vaddvq_s16(int16x8_t a) {    return vaddvq_s16(a); @@ -395,7 +373,7 @@ int16_t test_vaddvq_s16(int16x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddvq_s32  // CHECK-SAME: (<4 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> [[A]]) +// CHECK-NEXT:    [[VADDVQ_S32_I:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VADDVQ_S32_I]]  //  int32_t test_vaddvq_s32(int32x4_t a) { @@ -405,9 +383,8 @@ int32_t test_vaddvq_s32(int32x4_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddvq_u8  // CHECK-SAME: (<16 x i8> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v16i8(<16 x i8> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i8 -// CHECK-NEXT:    ret i8 [[TMP0]] +// CHECK-NEXT:    [[VADDVQ_U8_I:%.*]] = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> [[A]]) +// CHECK-NEXT:    ret i8 [[VADDVQ_U8_I]]  //  uint8_t test_vaddvq_u8(uint8x16_t a) {    return vaddvq_u8(a); @@ -416,9 +393,8 @@ uint8_t test_vaddvq_u8(uint8x16_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddvq_u16  // CHECK-SAME: (<8 x i16> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v8i16(<8 x i16> [[A]]) -// CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i16 -// CHECK-NEXT:    ret i16 [[TMP0]] +// CHECK-NEXT:    [[VADDVQ_U16_I:%.*]] = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> [[A]]) +// CHECK-NEXT:    ret i16 [[VADDVQ_U16_I]]  //  uint16_t test_vaddvq_u16(uint16x8_t a) {    return vaddvq_u16(a); @@ -427,7 +403,7 @@ uint16_t test_vaddvq_u16(uint16x8_t a) {  // CHECK-LABEL: define {{[^@]+}}@test_vaddvq_u32  // CHECK-SAME: (<4 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  entry: -// CHECK-NEXT:    [[VADDVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> [[A]]) +// CHECK-NEXT:    [[VADDVQ_U32_I:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VADDVQ_U32_I]]  //  uint32_t test_vaddvq_u32(uint32x4_t a) { diff --git a/clang/test/CodeGen/AArch64/neon-intrinsics.c b/clang/test/CodeGen/AArch64/neon-intrinsics.c index 035e1ca..1c628bb 100644 --- a/clang/test/CodeGen/AArch64/neon-intrinsics.c +++ b/clang/test/CodeGen/AArch64/neon-intrinsics.c @@ -12643,7 +12643,7 @@ uint64_t test_vqrshld_u64(uint64_t a, int64_t b) {  // CHECK-LABEL: define dso_local i64 @test_vpaddd_s64(  // CHECK-SAME: <2 x i64> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VPADDD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> [[A]]) +// CHECK-NEXT:    [[VPADDD_S64_I:%.*]] = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> [[A]])  // CHECK-NEXT:    ret i64 [[VPADDD_S64_I]]  //  int64_t test_vpaddd_s64(int64x2_t a) { @@ -23227,7 +23227,7 @@ uint64x2_t test_vpaddq_u64(uint64x2_t a, uint64x2_t b) {  // CHECK-LABEL: define dso_local i64 @test_vpaddd_u64(  // CHECK-SAME: <2 x i64> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VPADDD_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> [[A]]) +// CHECK-NEXT:    [[VPADDD_U64_I:%.*]] = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> [[A]])  // CHECK-NEXT:    ret i64 [[VPADDD_U64_I]]  //  uint64_t test_vpaddd_u64(uint64x2_t a) { @@ -23237,7 +23237,7 @@ uint64_t test_vpaddd_u64(uint64x2_t a) {  // CHECK-LABEL: define dso_local i64 @test_vaddvq_s64(  // CHECK-SAME: <2 x i64> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VADDVQ_S64_I:%.*]] = call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> [[A]]) +// CHECK-NEXT:    [[VADDVQ_S64_I:%.*]] = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> [[A]])  // CHECK-NEXT:    ret i64 [[VADDVQ_S64_I]]  //  int64_t test_vaddvq_s64(int64x2_t a) { @@ -23247,7 +23247,7 @@ int64_t test_vaddvq_s64(int64x2_t a) {  // CHECK-LABEL: define dso_local i64 @test_vaddvq_u64(  // CHECK-SAME: <2 x i64> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VADDVQ_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> [[A]]) +// CHECK-NEXT:    [[VADDVQ_U64_I:%.*]] = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> [[A]])  // CHECK-NEXT:    ret i64 [[VADDVQ_U64_I]]  //  uint64_t test_vaddvq_u64(uint64x2_t a) { @@ -23878,7 +23878,7 @@ float64x1_t test_vrsqrts_f64(float64x1_t a, float64x1_t b) {  // CHECK-LABEL: define dso_local i32 @test_vminv_s32(  // CHECK-SAME: <2 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VMINV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.sminv.i32.v2i32(<2 x i32> [[A]]) +// CHECK-NEXT:    [[VMINV_S32_I:%.*]] = call i32 @llvm.vector.reduce.smin.v2i32(<2 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMINV_S32_I]]  //  int32_t test_vminv_s32(int32x2_t a) { @@ -23888,7 +23888,7 @@ int32_t test_vminv_s32(int32x2_t a) {  // CHECK-LABEL: define dso_local i32 @test_vminv_u32(  // CHECK-SAME: <2 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VMINV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uminv.i32.v2i32(<2 x i32> [[A]]) +// CHECK-NEXT:    [[VMINV_U32_I:%.*]] = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMINV_U32_I]]  //  uint32_t test_vminv_u32(uint32x2_t a) { @@ -23898,7 +23898,7 @@ uint32_t test_vminv_u32(uint32x2_t a) {  // CHECK-LABEL: define dso_local i32 @test_vmaxv_s32(  // CHECK-SAME: <2 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VMAXV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.smaxv.i32.v2i32(<2 x i32> [[A]]) +// CHECK-NEXT:    [[VMAXV_S32_I:%.*]] = call i32 @llvm.vector.reduce.smax.v2i32(<2 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMAXV_S32_I]]  //  int32_t test_vmaxv_s32(int32x2_t a) { @@ -23908,7 +23908,7 @@ int32_t test_vmaxv_s32(int32x2_t a) {  // CHECK-LABEL: define dso_local i32 @test_vmaxv_u32(  // CHECK-SAME: <2 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VMAXV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.umaxv.i32.v2i32(<2 x i32> [[A]]) +// CHECK-NEXT:    [[VMAXV_U32_I:%.*]] = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VMAXV_U32_I]]  //  uint32_t test_vmaxv_u32(uint32x2_t a) { @@ -23918,7 +23918,7 @@ uint32_t test_vmaxv_u32(uint32x2_t a) {  // CHECK-LABEL: define dso_local i32 @test_vaddv_s32(  // CHECK-SAME: <2 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VADDV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> [[A]]) +// CHECK-NEXT:    [[VADDV_S32_I:%.*]] = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VADDV_S32_I]]  //  int32_t test_vaddv_s32(int32x2_t a) { @@ -23928,7 +23928,7 @@ int32_t test_vaddv_s32(int32x2_t a) {  // CHECK-LABEL: define dso_local i32 @test_vaddv_u32(  // CHECK-SAME: <2 x i32> noundef [[A:%.*]]) #[[ATTR0]] {  // CHECK-NEXT:  [[ENTRY:.*:]] -// CHECK-NEXT:    [[VADDV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> [[A]]) +// CHECK-NEXT:    [[VADDV_U32_I:%.*]] = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> [[A]])  // CHECK-NEXT:    ret i32 [[VADDV_U32_I]]  //  uint32_t test_vaddv_u32(uint32x2_t a) { diff --git a/clang/test/CodeGen/X86/sse41-builtins.c b/clang/test/CodeGen/X86/sse41-builtins.c index 62cd392..35fa65a 100644 --- a/clang/test/CodeGen/X86/sse41-builtins.c +++ b/clang/test/CodeGen/X86/sse41-builtins.c @@ -307,6 +307,16 @@ __m128 test_mm_insert_ps(__m128 x, __m128 y) {    return _mm_insert_ps(x, y, 4);  } +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x10), 1.0f, 10.0f, 3.0f, 4.0f))); // Insert Y[0] into X[1] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x00), 10.0f, 2.0f, 3.0f, 4.0f))); // Insert Y[0] into X[0] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x20), 1.0f, 2.0f, 10.0f, 4.0f))); // Insert Y[0] into X[2] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x30), 1.0f, 2.0f, 3.0f, 10.0f))); // Insert Y[0] into X[3] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x80), 30.0f, 2.0f, 3.0f, 4.0f))); // Insert Y[2] into X[0] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x01), 0.0f, 2.0f, 3.0f, 4.0f))); // Insert Y[0] into X[0], zero X[0] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x0A), 10.0f, 0.0f, 3.0f, 0.0f))); // Insert Y[0] into X[0], zero X[1] and X[3] +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0x0F), 0.0f, 0.0f, 0.0f, 0.0f))); // Insert Y[0] into X[0], zero all +TEST_CONSTEXPR((match_m128(_mm_insert_ps(((__m128)(__v4sf){1.0f, 2.0f, 3.0f, 4.0f}), ((__m128)(__v4sf){10.0f, 20.0f, 30.0f, 40.0f}), 0xCF), 0.0f, 0.0f, 0.0f, 0.0f))); // Insert Y[3] into X[0], zero all +  __m128i test_mm_max_epi8(__m128i x, __m128i y) {    // CHECK-LABEL: test_mm_max_epi8    // CHECK: call <16 x i8> @llvm.smax.v16i8(<16 x i8> %{{.*}}, <16 x i8> %{{.*}}) diff --git a/clang/test/CodeGen/builtins-extended-image.c b/clang/test/CodeGen/builtins-extended-image.c new file mode 100644 index 0000000..0dbf81d --- /dev/null +++ b/clang/test/CodeGen/builtins-extended-image.c @@ -0,0 +1,1528 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// RUN: %clang_cc1 -triple amdgcn-- -target-cpu gfx1100 -target-feature +extended-image-insts %s -emit-llvm -o - | FileCheck %s + +typedef int int4 __attribute__((ext_vector_type(4))); +typedef float float4 __attribute__((ext_vector_type(4))); +typedef _Float16 half4 __attribute__((ext_vector_type(4))); + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_gather4_lz_2d_v4f32_f32_r( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_r(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(1, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_gather4_lz_2d_v4f32_f32_g( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f32.v8i32.v4i32(i32 2, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_g(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(2, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_gather4_lz_2d_v4f32_f32_b( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f32.v8i32.v4i32(i32 4, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_b(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(4, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_gather4_lz_2d_v4f32_f32_a( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.gather4.lz.2d.v4f32.f32.v8i32.v4i32(i32 8, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_a(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(8, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_lz_1d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP1]], align 32 +// CHECK-NEXT:    [[TMP2:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP3:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.1d.v4f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP2]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP3]] +// +float4 test_amdgcn_image_sample_lz_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1d_v4f32_f32(100, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_l_1d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.1d.v4f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_sample_l_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_d_1d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.1d.v4f32.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP5]] +// +float4 test_amdgcn_image_sample_d_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1d_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_lz_2d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.2d.v4f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_sample_lz_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_l_2d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.2d.v4f32.f32.v8i32.v4i32(i32 10, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP5]] +// +float4 test_amdgcn_image_sample_l_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_v4f32_f32(10, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_d_2d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP6]], align 32 +// CHECK-NEXT:    [[TMP7:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP8:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.2d.v4f32.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP7]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP8]] +// +float4 test_amdgcn_image_sample_d_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_v4f32_f32(100, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_lz_3d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.3d.v4f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP5]] +// +float4 test_amdgcn_image_sample_lz_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_3d_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_l_3d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.3d.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP6]] +// +float4 test_amdgcn_image_sample_l_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_3d_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_d_3d_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP7:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP8:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP9]], align 32 +// CHECK-NEXT:    [[TMP10:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP11:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.3d.v4f32.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], float [[TMP6]], float [[TMP7]], float [[TMP8]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP10]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP11]] +// +float4 test_amdgcn_image_sample_d_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_3d_v4f32_f32(1, f32, f32, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_lz_cube_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.cube.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP5]] +// +float4 test_amdgcn_image_sample_lz_cube_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_cube_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_l_cube_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.cube.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP6]] +// +float4 test_amdgcn_image_sample_l_cube_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_cube_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_lz_1darray_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.1darray.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP4]] +// +float4 test_amdgcn_image_sample_lz_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1darray_v4f32_f32(1, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_l_1darray_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.1darray.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP5]] +// +float4 test_amdgcn_image_sample_l_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1darray_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_d_1darray_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.1darray.v4f32.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP6]] +// +float4 test_amdgcn_image_sample_d_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1darray_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_lz_2darray_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.lz.2darray.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP5]] +// +float4 test_amdgcn_image_sample_lz_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_l_2darray_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.l.2darray.v4f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP6]] +// +float4 test_amdgcn_image_sample_l_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x float> @test_amdgcn_image_sample_d_2darray_v4f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP7]], align 32 +// CHECK-NEXT:    [[TMP8:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP9:%.*]] = call <4 x float> @llvm.amdgcn.image.sample.d.2darray.v4f32.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], float [[TMP6]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP8]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x float> [[TMP9]] +// +float4 test_amdgcn_image_sample_d_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_v4f32_f32(1, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_lz_1d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP1]], align 32 +// CHECK-NEXT:    [[TMP2:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP3:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.lz.1d.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP2]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP3]] +// +half4 test_amdgcn_image_sample_lz_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1d_v4f16_f32(100, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_l_1d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.l.1d.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP4]] +// +half4 test_amdgcn_image_sample_l_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1d_v4f16_f32(100, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_d_1d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.d.1d.v4f16.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP5]] +// +half4 test_amdgcn_image_sample_d_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_lz_2d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.lz.2d.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP4]] +// +half4 test_amdgcn_image_sample_lz_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_v4f16_f32(100, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_l_2d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.l.2d.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP5]] +// +half4 test_amdgcn_image_sample_l_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_d_2d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP6]], align 32 +// CHECK-NEXT:    [[TMP7:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP8:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.d.2d.v4f16.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP7]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP8]] +// +half4 test_amdgcn_image_sample_d_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_v4f16_f32(100, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_lz_3d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.lz.3d.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP5]] +// +half4 test_amdgcn_image_sample_lz_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_3d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_l_3d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.l.3d.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP6]] +// +half4 test_amdgcn_image_sample_l_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_3d_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_d_3d_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP7:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP8:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP9]], align 32 +// CHECK-NEXT:    [[TMP10:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP11:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.d.3d.v4f16.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], float [[TMP6]], float [[TMP7]], float [[TMP8]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP10]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP11]] +// +half4 test_amdgcn_image_sample_d_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_3d_v4f16_f32(100, f32, f32, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_lz_cube_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.lz.cube.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP5]] +// +half4 test_amdgcn_image_sample_lz_cube_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_cube_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_l_cube_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.l.cube.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP6]] +// +half4 test_amdgcn_image_sample_l_cube_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_cube_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_lz_1darray_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.lz.1darray.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP4]] +// +half4 test_amdgcn_image_sample_lz_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1darray_v4f16_f32(100, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_l_1darray_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.l.1darray.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP5]] +// +half4 test_amdgcn_image_sample_l_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1darray_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_d_1darray_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.d.1darray.v4f16.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP6]] +// +half4 test_amdgcn_image_sample_d_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1darray_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_lz_2darray_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.lz.2darray.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP5]] +// +half4 test_amdgcn_image_sample_lz_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_l_2darray_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.l.2darray.v4f16.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP6]] +// +half4 test_amdgcn_image_sample_l_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local <4 x half> @test_amdgcn_image_sample_d_2darray_v4f16_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca <4 x half>, align 8, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP7]], align 32 +// CHECK-NEXT:    [[TMP8:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP9:%.*]] = call <4 x half> @llvm.amdgcn.image.sample.d.2darray.v4f16.f32.f32.v8i32.v4i32(i32 100, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], float [[TMP6]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP8]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret <4 x half> [[TMP9]] +// +half4 test_amdgcn_image_sample_d_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_v4f16_f32(100, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local float @test_amdgcn_image_sample_lz_2d_f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP2]], align 32 +// CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP4:%.*]] = call float @llvm.amdgcn.image.sample.lz.2d.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP3]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret float [[TMP4]] +// +float test_amdgcn_image_sample_lz_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_f32_f32(1, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local float @test_amdgcn_image_sample_l_2d_f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call float @llvm.amdgcn.image.sample.l.2d.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret float [[TMP5]] +// +float test_amdgcn_image_sample_l_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local float @test_amdgcn_image_sample_d_2d_f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP6]], align 32 +// CHECK-NEXT:    [[TMP7:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP8:%.*]] = call float @llvm.amdgcn.image.sample.d.2d.f32.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP7]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret float [[TMP8]] +// +float test_amdgcn_image_sample_d_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_f32_f32(1, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local float @test_amdgcn_image_sample_lz_2darray_f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP3]], align 32 +// CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP5:%.*]] = call float @llvm.amdgcn.image.sample.lz.2darray.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP4]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret float [[TMP5]] +// +float test_amdgcn_image_sample_lz_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local float @test_amdgcn_image_sample_l_2darray_f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP4]], align 32 +// CHECK-NEXT:    [[TMP5:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP6:%.*]] = call float @llvm.amdgcn.image.sample.l.2darray.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP5]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret float [[TMP6]] +// +float test_amdgcn_image_sample_l_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} + +// CHECK-LABEL: define dso_local float @test_amdgcn_image_sample_d_2darray_f32_f32( +// CHECK-SAME: <4 x float> noundef [[V4F32:%.*]], float noundef [[F32:%.*]], i32 noundef [[I32:%.*]], ptr [[TEX:%.*]], <4 x i32> noundef [[VEC4I32:%.*]]) #[[ATTR0]] { +// CHECK-NEXT:  [[ENTRY:.*:]] +// CHECK-NEXT:    [[RETVAL:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[V4F32_ADDR:%.*]] = alloca <4 x float>, align 16, addrspace(5) +// CHECK-NEXT:    [[F32_ADDR:%.*]] = alloca float, align 4, addrspace(5) +// CHECK-NEXT:    [[I32_ADDR:%.*]] = alloca i32, align 4, addrspace(5) +// CHECK-NEXT:    [[TEX_ADDR:%.*]] = alloca ptr, align 32, addrspace(5) +// CHECK-NEXT:    [[VEC4I32_ADDR:%.*]] = alloca <4 x i32>, align 16, addrspace(5) +// CHECK-NEXT:    [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr +// CHECK-NEXT:    [[V4F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[V4F32_ADDR]] to ptr +// CHECK-NEXT:    [[F32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[F32_ADDR]] to ptr +// CHECK-NEXT:    [[I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[I32_ADDR]] to ptr +// CHECK-NEXT:    [[TEX_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[TEX_ADDR]] to ptr +// CHECK-NEXT:    [[VEC4I32_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VEC4I32_ADDR]] to ptr +// CHECK-NEXT:    store <4 x float> [[V4F32]], ptr [[V4F32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    store float [[F32]], ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store i32 [[I32]], ptr [[I32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    store ptr [[TEX]], ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    store <4 x i32> [[VEC4I32]], ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP1:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP2:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP5:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP6:%.*]] = load float, ptr [[F32_ADDR_ASCAST]], align 4 +// CHECK-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TEX_ADDR_ASCAST]], align 32 +// CHECK-NEXT:    [[TEX_RSRC_VAL:%.*]] = load <8 x i32>, ptr [[TMP7]], align 32 +// CHECK-NEXT:    [[TMP8:%.*]] = load <4 x i32>, ptr [[VEC4I32_ADDR_ASCAST]], align 16 +// CHECK-NEXT:    [[TMP9:%.*]] = call float @llvm.amdgcn.image.sample.d.2darray.f32.f32.f32.v8i32.v4i32(i32 1, float [[TMP0]], float [[TMP1]], float [[TMP2]], float [[TMP3]], float [[TMP4]], float [[TMP5]], float [[TMP6]], <8 x i32> [[TEX_RSRC_VAL]], <4 x i32> [[TMP8]], i1 false, i32 120, i32 110) +// CHECK-NEXT:    ret float [[TMP9]] +// +float test_amdgcn_image_sample_d_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_f32_f32(1, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 120, 110); +} diff --git a/clang/test/CodeGenCXX/ubsan-coroutines.cpp b/clang/test/CodeGenCXX/ubsan-coroutines.cpp index 04ab050..60c89a4 100644 --- a/clang/test/CodeGenCXX/ubsan-coroutines.cpp +++ b/clang/test/CodeGenCXX/ubsan-coroutines.cpp @@ -1,6 +1,7 @@  // This test merely verifies that emitting the object file does not cause a  // crash when the LLVM coroutines passes are run.  // RUN: %clang_cc1 -emit-obj -std=c++2a -fsanitize=null %s -o %t.o +// UNSUPPORTED: target={{.*}}-zos{{.*}}  namespace std {  template <typename R, typename... T> struct coroutine_traits { diff --git a/clang/test/CodeGenHIP/maybe_undef-attr-verify.hip b/clang/test/CodeGenHIP/maybe_undef-attr-verify.hip index 571fba1..6dc57c4 100644 --- a/clang/test/CodeGenHIP/maybe_undef-attr-verify.hip +++ b/clang/test/CodeGenHIP/maybe_undef-attr-verify.hip @@ -20,7 +20,7 @@  #define __maybe_undef __attribute__((maybe_undef))  #define WARP_SIZE 64 -static constexpr int warpSize = __AMDGCN_WAVEFRONT_SIZE__; +static constexpr int warpSize = WARP_SIZE;  __device__ static inline unsigned int __lane_id() {      return  __builtin_amdgcn_mbcnt_hi( diff --git a/clang/test/CodeGenOpenCL/builtins-amdgcn-wave32.cl b/clang/test/CodeGenOpenCL/builtins-amdgcn-wave32.cl index d390418..31fd0e7 100644 --- a/clang/test/CodeGenOpenCL/builtins-amdgcn-wave32.cl +++ b/clang/test/CodeGenOpenCL/builtins-amdgcn-wave32.cl @@ -1,5 +1,5 @@  // REQUIRES: amdgpu-registered-target -// RUN: %clang_cc1 -cl-std=CL2.0 -triple amdgcn-unknown-unknown -D__AMDGCN_WAVEFRONT_SIZE=32 -target-feature +wavefrontsize32 -emit-llvm -o - %s | FileCheck -enable-var-scope %s +// RUN: %clang_cc1 -cl-std=CL2.0 -triple amdgcn-unknown-unknown -target-feature +wavefrontsize32 -emit-llvm -o - %s | FileCheck -enable-var-scope %s  // RUN: %clang_cc1 -cl-std=CL2.0 -triple amdgcn-unknown-unknown -target-cpu gfx1010 -emit-llvm -o - %s | FileCheck -enable-var-scope %s  // RUN: %clang_cc1 -cl-std=CL2.0 -triple amdgcn-unknown-unknown -target-cpu gfx1010 -target-feature +wavefrontsize32 -emit-llvm -o - %s | FileCheck -enable-var-scope %s  // RUN: %clang_cc1 -cl-std=CL2.0 -triple amdgcn-unknown-unknown -target-cpu gfx1100 -target-feature +wavefrontsize32 -emit-llvm -o - %s | FileCheck -enable-var-scope %s @@ -48,7 +48,3 @@ void test_read_exec_lo(global uint* out) {  void test_read_exec_hi(global uint* out) {    *out = __builtin_amdgcn_read_exec_hi();  } - -#if __AMDGCN_WAVEFRONT_SIZE != 32 -#error Wrong wavesize detected -#endif diff --git a/clang/test/CodeGenOpenCL/builtins-amdgcn-wave64.cl b/clang/test/CodeGenOpenCL/builtins-amdgcn-wave64.cl index d851ec7..758b5aa 100644 --- a/clang/test/CodeGenOpenCL/builtins-amdgcn-wave64.cl +++ b/clang/test/CodeGenOpenCL/builtins-amdgcn-wave64.cl @@ -50,7 +50,3 @@ void test_read_exec_lo(global ulong* out) {  void test_read_exec_hi(global ulong* out) {    *out = __builtin_amdgcn_read_exec_hi();  } - -#if defined(__AMDGCN_WAVEFRONT_SIZE__) && __AMDGCN_WAVEFRONT_SIZE__ != 64 -#error Wrong wavesize detected -#endif diff --git a/clang/test/DebugInfo/Generic/bit-int.c b/clang/test/DebugInfo/Generic/bit-int.c index 94b9301..88ecc13 100644 --- a/clang/test/DebugInfo/Generic/bit-int.c +++ b/clang/test/DebugInfo/Generic/bit-int.c @@ -4,5 +4,5 @@  unsigned _BitInt(17) a;  _BitInt(2) b; -// CHECK: !DIBasicType(name: "_BitInt", size: 8, dataSize: 2, encoding: DW_ATE_signed) -// CHECK: !DIBasicType(name: "unsigned _BitInt", size: 32,  dataSize: 17, encoding: DW_ATE_unsigned) +// CHECK: !DIBasicType(name: "_BitInt(2)", size: 8, dataSize: 2, encoding: DW_ATE_signed) +// CHECK: !DIBasicType(name: "unsigned _BitInt(17)", size: 32,  dataSize: 17, encoding: DW_ATE_unsigned) diff --git a/clang/test/DebugInfo/Generic/macro-info.c b/clang/test/DebugInfo/Generic/macro-info.c new file mode 100644 index 0000000..ec49eb5 --- /dev/null +++ b/clang/test/DebugInfo/Generic/macro-info.c @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 %s -debug-info-kind=standalone -emit-llvm -o - | FileCheck %s + +#define GLOBAL(num) global## num +#define DECL_GLOBAL(x) int x +#define SAME_ORDER(x, y) x; y +#define SWAP_ORDER(x,y) y; x + + + +SAME_ORDER( +  int +// CHECK: DIGlobalVariable(name: "global",{{.*}} line: [[@LINE+1]] +    GLOBAL  // <- global +      () = 42, +  const char* s() { +// CHECK: DIGlobalVariable({{.*}}line: [[@LINE+1]],{{.*}} type: [[TYPEID:![0-9]+]] +    return "1234567890"; +  } +) + +SWAP_ORDER( +  int GLOBAL(  // <- global2 +    2) = 43, +// CHECK: DIGlobalVariable(name: "global3",{{.*}} line: [[@LINE+3]] +// CHECK: DIGlobalVariable(name: "global2",{{.*}} line: [[@LINE-3]] +  DECL_GLOBAL( +    GLOBAL(  // <- global3 +      3)) = 44 +); + + +DECL_GLOBAL( +// CHECK: DIGlobalVariable(name: "global4",{{.*}} line: [[@LINE+1]] +  GLOBAL(  // <- global4 +    4)); diff --git a/clang/test/Driver/amdgpu-macros.cl b/clang/test/Driver/amdgpu-macros.cl index 9fda2f3..6d049e7 100644 --- a/clang/test/Driver/amdgpu-macros.cl +++ b/clang/test/Driver/amdgpu-macros.cl @@ -154,26 +154,10 @@  // ARCH-GCN-DAG: #define __[[CPU]]__ 1  // ARCH-GCN-DAG: #define __[[FAMILY]]__ 1  // ARCH-GCN-DAG: #define __amdgcn_processor__ "[[CPU]]" -// ARCH-GCN-DAG: #define __AMDGCN_WAVEFRONT_SIZE [[WAVEFRONT_SIZE]]  // ARCH-GCN-DAG: #define __GCC_DESTRUCTIVE_SIZE 128  // ARCH-GCN-DAG: #define __GCC_CONSTRUCTIVE_SIZE 128  // UNSAFEFPATOMIC-DAG: #define __AMDGCN_UNSAFE_FP_ATOMICS__ 1 -// RUN: %clang -E -dM -target amdgcn -mcpu=gfx906 -mwavefrontsize64 \ -// RUN:   %s 2>&1 | FileCheck --check-prefix=WAVE64 %s -// RUN: %clang -E -dM -target amdgcn -mcpu=gfx1010 -mwavefrontsize64 \ -// RUN:   %s 2>&1 | FileCheck --check-prefix=WAVE64 %s -// RUN: %clang -E -dM -target amdgcn -mcpu=gfx906 -mwavefrontsize64 \ -// RUN:   -mno-wavefrontsize64 %s 2>&1 | FileCheck --check-prefix=WAVE64 %s -// RUN: %clang -E -dM -target amdgcn -mcpu=gfx1010 -mwavefrontsize64 \ -// RUN:   -mno-wavefrontsize64 %s 2>&1 | FileCheck --check-prefix=WAVE32 %s -// RUN: %clang -E -dM -target amdgcn -mcpu=gfx906 -mno-wavefrontsize64 \ -// RUN:   -mwavefrontsize64 %s 2>&1 | FileCheck --check-prefix=WAVE64 %s -// RUN: %clang -E -dM -target amdgcn -mcpu=gfx1010 -mno-wavefrontsize64 \ -// RUN:   -mwavefrontsize64 %s 2>&1 | FileCheck --check-prefix=WAVE64 %s -// WAVE64-DAG: #define __AMDGCN_WAVEFRONT_SIZE 64 -// WAVE32-DAG: #define __AMDGCN_WAVEFRONT_SIZE 32 -  // RUN: %clang -E -dM -target amdgcn -mcpu=gfx906 \  // RUN:   %s 2>&1 | FileCheck --check-prefix=CUMODE-ON %s  // RUN: %clang -E -dM -target amdgcn -mcpu=gfx906 -mcumode \ diff --git a/clang/test/Driver/fat-archive-unbundle-ext.c b/clang/test/Driver/fat-archive-unbundle-ext.c index e797acc..d658ad05 100644 --- a/clang/test/Driver/fat-archive-unbundle-ext.c +++ b/clang/test/Driver/fat-archive-unbundle-ext.c @@ -1,5 +1,5 @@  // REQUIRES: x86-registered-target -// UNSUPPORTED: target={{.*-windows.*}}, target={{.*}}-macosx{{.*}}, target={{.*-darwin.*}}, target={{.*}}-aix{{.*}} +// UNSUPPORTED: target={{.*-windows.*}}, target={{.*}}-macosx{{.*}}, target={{.*-darwin.*}}, target={{.*}}-aix{{.*}}, target={{.*}}-zos{{.*}}  // Generate dummy fat object  // RUN: %clang -O0 --target=%itanium_abi_triple %s -c -o %t.host.o diff --git a/clang/test/Driver/hip-macros.hip b/clang/test/Driver/hip-macros.hip index 516e01a..4c460d5 100644 --- a/clang/test/Driver/hip-macros.hip +++ b/clang/test/Driver/hip-macros.hip @@ -1,27 +1,4 @@  // REQUIRES: amdgpu-registered-target -// RUN: %clang -E -dM --offload-arch=gfx906 -mwavefrontsize64 \ -// RUN:   --cuda-device-only -nogpuinc -nogpulib \ -// RUN:   %s 2>&1 | FileCheck --check-prefixes=WAVE64 %s -// RUN: %clang -E -dM --offload-arch=gfx1010 -mwavefrontsize64 \ -// RUN:   --cuda-device-only -nogpuinc -nogpulib \ -// RUN:   %s 2>&1 | FileCheck --check-prefixes=WAVE64 %s -// RUN: %clang -E -dM --offload-arch=gfx906 -mwavefrontsize64 \ -// RUN:   --cuda-device-only -nogpuinc -nogpulib \ -// RUN:   -mno-wavefrontsize64 %s 2>&1 | FileCheck --check-prefixes=WAVE64 %s -// RUN: %clang -E -dM --offload-arch=gfx1010 -mwavefrontsize64 \ -// RUN:   --cuda-device-only -nogpuinc -nogpulib \ -// RUN:   -mno-wavefrontsize64 %s 2>&1 | FileCheck --check-prefixes=WAVE32 %s -// RUN: %clang -E -dM --offload-arch=gfx906 -mno-wavefrontsize64 \ -// RUN:   --cuda-device-only -nogpuinc -nogpulib \ -// RUN:   -mwavefrontsize64 %s 2>&1 | FileCheck --check-prefixes=WAVE64 %s -// RUN: %clang -E -dM --offload-arch=gfx1010 -mno-wavefrontsize64 \ -// RUN:   --cuda-device-only -nogpuinc -nogpulib \ -// RUN:   -mwavefrontsize64 %s 2>&1 | FileCheck --check-prefixes=WAVE64 %s -// WAVE64-DAG: #define __AMDGCN_WAVEFRONT_SIZE__ 64 -// WAVE32-DAG: #define __AMDGCN_WAVEFRONT_SIZE__ 32 -// WAVE64-DAG: #define __AMDGCN_WAVEFRONT_SIZE 64 -// WAVE32-DAG: #define __AMDGCN_WAVEFRONT_SIZE 32 -  // RUN: %clang -E -dM --offload-arch=gfx906 --cuda-device-only -nogpuinc -nogpulib \  // RUN:   %s 2>&1 | FileCheck --check-prefix=CUMODE-ON %s  // RUN: %clang -E -dM --offload-arch=gfx906 --cuda-device-only -nogpuinc -nogpulib -mcumode \ diff --git a/clang/test/Driver/hip-wavefront-size-deprecation-diagnostics.hip b/clang/test/Driver/hip-wavefront-size-deprecation-diagnostics.hip deleted file mode 100644 index 8a60f5a..0000000 --- a/clang/test/Driver/hip-wavefront-size-deprecation-diagnostics.hip +++ /dev/null @@ -1,115 +0,0 @@ -// REQUIRES: amdgpu-registered-target -// RUN: %clang -xhip --offload-arch=gfx1030 --offload-host-only -pedantic -nogpuinc -nogpulib -nobuiltininc -fsyntax-only -Xclang -verify %s -// RUN: %clang -xhip --offload-arch=gfx1030 --offload-device-only -pedantic -nogpuinc -nogpulib -nobuiltininc -fsyntax-only -Xclang -verify %s - -// Test that deprecation warnings for the wavefront size macro are emitted properly. - -#define WRAPPED __AMDGCN_WAVEFRONT_SIZE__ - -#define DOUBLE_WRAPPED (WRAPPED) - -template <bool C, class T = void> struct my_enable_if {}; - -template <class T> struct my_enable_if<true, T> { -  typedef T type; -}; - -__attribute__((host, device)) void use(int, const char*); - -template<int N> __attribute__((host, device)) int templatify(int x) { -    return x + N; -} - -__attribute__((device)) const int GlobalConst = __AMDGCN_WAVEFRONT_SIZE__; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -constexpr int GlobalConstExpr = __AMDGCN_WAVEFRONT_SIZE__; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} - -#if defined(__HIP_DEVICE_COMPILE__) && (__AMDGCN_WAVEFRONT_SIZE__ == 64) // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -int foo(void); -#endif - -__attribute__((device)) int device_var = __AMDGCN_WAVEFRONT_SIZE__; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} - -__attribute__((device)) -void device_fun() { -    use(__AMDGCN_WAVEFRONT_SIZE, "device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE' has been marked as deprecated}} -    use(__AMDGCN_WAVEFRONT_SIZE__, "device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(WRAPPED, "device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(DOUBLE_WRAPPED, "device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(templatify<__AMDGCN_WAVEFRONT_SIZE__>(42), "device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(GlobalConst, "device function"); -    use(GlobalConstExpr, "device function"); -} - -__attribute__((global)) -void global_fun() { -    // no warnings expected -    use(__AMDGCN_WAVEFRONT_SIZE, "global function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE' has been marked as deprecated}} -    use(__AMDGCN_WAVEFRONT_SIZE__, "global function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(WRAPPED, "global function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(DOUBLE_WRAPPED, "global function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(templatify<__AMDGCN_WAVEFRONT_SIZE__>(42), "global function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -} - -int host_var = __AMDGCN_WAVEFRONT_SIZE__; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -int host_var_alt = __AMDGCN_WAVEFRONT_SIZE; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE' has been marked as deprecated}} -int host_var_wrapped = WRAPPED; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -int host_var_double_wrapped = DOUBLE_WRAPPED; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} - -__attribute__((host)) -void host_fun() { -    use(__AMDGCN_WAVEFRONT_SIZE, "host function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE' has been marked as deprecated}} -    use(__AMDGCN_WAVEFRONT_SIZE__, "host function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(WRAPPED, "host function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(DOUBLE_WRAPPED, "host function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(templatify<__AMDGCN_WAVEFRONT_SIZE__>(42), "host function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(GlobalConst, "host function"); -    use(GlobalConstExpr, "host function"); -} - -__attribute((host, device)) -void host_device_fun() { -    use(__AMDGCN_WAVEFRONT_SIZE__, "host device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(WRAPPED, "host device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(DOUBLE_WRAPPED, "host device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    use(templatify<__AMDGCN_WAVEFRONT_SIZE__>(42), "host device function"); // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -} - -template <unsigned int OuterWarpSize = __AMDGCN_WAVEFRONT_SIZE__> // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -class FunSelector { -public: -    template<unsigned int FunWarpSize = OuterWarpSize> -    __attribute__((device)) -    auto fun(void) -        -> typename my_enable_if<(FunWarpSize <= __AMDGCN_WAVEFRONT_SIZE__), void>::type // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    { -        use(1, "yay!"); -    } - -    template<unsigned int FunWarpSize = OuterWarpSize> -    __attribute__((device)) -    auto fun(void) -        -> typename my_enable_if<(FunWarpSize > __AMDGCN_WAVEFRONT_SIZE__), void>::type // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    { -        use(0, "nay!"); -    } -}; - -__attribute__((device)) -void device_fun_selector_user() { -    FunSelector<> f; -    f.fun<>(); -    f.fun<1>(); -    f.fun<1000>(); - -    my_enable_if<(1 <= __AMDGCN_WAVEFRONT_SIZE__), int>::type x = 42; // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -} - -__attribute__((device)) my_enable_if<(1 <= __AMDGCN_WAVEFRONT_SIZE__), int>::type DeviceFunTemplateRet(void) { // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    return 42; -} - -__attribute__((device)) int DeviceFunTemplateArg(my_enable_if<(1 <= __AMDGCN_WAVEFRONT_SIZE__), int>::type x) { // expected-warning {{macro '__AMDGCN_WAVEFRONT_SIZE__' has been marked as deprecated}} -    return x; -} - -// expected-note@* 0+ {{macro marked 'deprecated' here}} diff --git a/clang/test/Headers/cuda_with_openmp.cu b/clang/test/Headers/cuda_with_openmp.cu index efde4ec..8ea0de5 100644 --- a/clang/test/Headers/cuda_with_openmp.cu +++ b/clang/test/Headers/cuda_with_openmp.cu @@ -2,7 +2,7 @@  // Reported in https://bugs.llvm.org/show_bug.cgi?id=48014  ///==========================================================================/// -// REQUIRES: nvptx-registered-target +// REQUIRES: nvptx-registered-target, host-supports-cuda  // RUN: %clang -x cuda -fopenmp -c %s -o - --cuda-path=%S/../Driver/Inputs/CUDA/usr/local/cuda -nocudalib -isystem %S/Inputs/include -isystem %S/../../lib/Headers -fsyntax-only diff --git a/clang/test/OpenMP/task_ast_print.cpp b/clang/test/OpenMP/task_ast_print.cpp index 30fb7ab..b059f18 100644 --- a/clang/test/OpenMP/task_ast_print.cpp +++ b/clang/test/OpenMP/task_ast_print.cpp @@ -1,8 +1,10 @@  // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=60 -DOMP60 -ast-print %s | FileCheck %s --check-prefix=CHECK60  // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s  // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s  // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=60 -DOMP60 -ast-print %s | FileCheck %s --check-prefix=CHECK60  // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s  // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s  // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-dump  %s | FileCheck %s --check-prefix=DUMP @@ -101,8 +103,8 @@ T tmain(T argc, T *argv) {    a = 2;  #pragma omp task default(none), private(argc, b) firstprivate(argv) shared(d) if (argc > 0) final(S<T>::TS > 0) priority(argc) affinity(argc, argv[b:argc], arr[:], ([argc][sizeof(T)])argv)    foo(); -#pragma omp taskgroup task_reduction(-: argc) -#pragma omp task if (C) mergeable priority(C) in_reduction(-: argc) +#pragma omp taskgroup task_reduction(+: argc) +#pragma omp task if (C) mergeable priority(C) in_reduction(+: argc)    foo();    return 0;  } @@ -119,8 +121,8 @@ T tmain(T argc, T *argv) {  // CHECK-NEXT: a = 2;  // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<T>::TS > 0) priority(argc) affinity(argc,argv[b:argc],arr[:],([argc][sizeof(T)])argv)  // CHECK-NEXT: foo() -// CHECK-NEXT: #pragma omp taskgroup task_reduction(-: argc) -// CHECK-NEXT: #pragma omp task if(C) mergeable priority(C) in_reduction(-: argc) +// CHECK-NEXT: #pragma omp taskgroup task_reduction(+: argc) +// CHECK-NEXT: #pragma omp task if(C) mergeable priority(C) in_reduction(+: argc)  // CHECK-NEXT: foo()  // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {  // CHECK-NEXT: int b = argc, c, d, e, f, g; @@ -134,8 +136,8 @@ T tmain(T argc, T *argv) {  // CHECK-NEXT: a = 2;  // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<int>::TS > 0) priority(argc) affinity(argc,argv[b:argc],arr[:],([argc][sizeof(int)])argv)  // CHECK-NEXT: foo() -// CHECK-NEXT: #pragma omp taskgroup task_reduction(-: argc) -// CHECK-NEXT: #pragma omp task if(5) mergeable priority(5) in_reduction(-: argc) +// CHECK-NEXT: #pragma omp taskgroup task_reduction(+: argc) +// CHECK-NEXT: #pragma omp task if(5) mergeable priority(5) in_reduction(+: argc)  // CHECK-NEXT: foo()  // CHECK: template<> long tmain<long, 1>(long argc, long *argv) {  // CHECK-NEXT: long b = argc, c, d, e, f, g; @@ -149,8 +151,8 @@ T tmain(T argc, T *argv) {  // CHECK-NEXT: a = 2;  // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<long>::TS > 0) priority(argc) affinity(argc,argv[b:argc],arr[:],([argc][sizeof(long)])argv)  // CHECK-NEXT: foo() -// CHECK-NEXT: #pragma omp taskgroup task_reduction(-: argc) -// CHECK-NEXT: #pragma omp task if(1) mergeable priority(1) in_reduction(-: argc) +// CHECK-NEXT: #pragma omp taskgroup task_reduction(+: argc) +// CHECK-NEXT: #pragma omp task if(1) mergeable priority(1) in_reduction(+: argc)  // CHECK-NEXT: foo()  enum Enum {}; @@ -199,6 +201,14 @@ int main(int argc, char **argv) {  #pragma omp task depend(inout: omp_all_memory)    foo();    // CHECK-NEXT: foo(); +#ifdef OMP60 +#pragma omp task threadset(omp_pool) +#pragma omp task threadset(omp_team) +  foo(); +#endif +  // CHECK60: #pragma omp task threadset(omp_pool) +  // CHECK60: #pragma omp task threadset(omp_team) +  // CHECK60-NEXT: foo();    return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);  } diff --git a/clang/test/OpenMP/task_codegen.cpp b/clang/test/OpenMP/task_codegen.cpp index c3e6d9e6b..ba8e694 100644 --- a/clang/test/OpenMP/task_codegen.cpp +++ b/clang/test/OpenMP/task_codegen.cpp @@ -41,6 +41,9 @@  // RUN: -emit-llvm -o - -DOMP51 | FileCheck %s \  // RUN: --implicit-check-not="{{__kmpc|__tgt}}" +// RUN: %clang_cc1 -verify -Wno-vla -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=60 -DOMP60 -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK6 +// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -DOMP60 -fopenmp-enable-irbuilder -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -DOMP60 -fopenmp-enable-irbuilder -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK6  // expected-no-diagnostics  #ifndef HEADER @@ -65,6 +68,7 @@ struct S {    S(const S &s) : a(s.a) {}    ~S() {}  }; +  int a;  int main() {    char b; @@ -147,6 +151,7 @@ int main() { +  // s1 = S(); @@ -215,6 +220,19 @@ void test_omp_all_memory()    }  }  #endif // OMP51 + +#ifdef OMP60 +void test_threadset() +{ +#pragma omp task threadset(omp_team) +  { +  } +#pragma omp task threadset(omp_pool) +  { +  } +} +#endif // OMP60 +  #endif  // CHECK1-LABEL: define {{[^@]+}}@main  // CHECK1-SAME: () #[[ATTR0:[0-9]+]] { @@ -10243,3 +10261,18 @@ void test_omp_all_memory()  // CHECK4-51-NEXT:    call void @__cxx_global_var_init()  // CHECK4-51-NEXT:    ret void  // +// CHECK6-LABEL: define void @_Z14test_threadsetv() +// CHECK6-NEXT:  entry: +// CHECK6-NEXT:       [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_23:%.*]], align 1 +// CHECK6-NEXT:       [[AGG_CAPTURED2:%.*]] = alloca [[STRUCT_ANON_25:%.*]], align 1 +// CHECK6-NEXT:       call i32 @__kmpc_global_thread_num(ptr @[[GLOB_PTR:[0-9]+]]) +// CHECK6-NEXT:       [[TMP0:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %omp_global_thread_num, i32 1, i64 40, i64 1, ptr @.omp_task_entry..[[ENTRY1:[0-9]+]]) +// CHECK6-NEXT:       getelementptr inbounds nuw %struct.kmp_task_t_with_privates{{.*}}, ptr %0, i32 0, i32 0 +// CHECK6-NEXT:       call i32 @__kmpc_global_thread_num(ptr @[[GLOB_PTR:[0-9]+]]) +// CHECK6-NEXT:       call i32 @__kmpc_omp_task(ptr @1, i32 %omp_global_thread_num1, ptr %0) +// CHECK6-NEXT:       call i32 @__kmpc_global_thread_num(ptr @[[GLOB_PTR2:[0-9]+]]) +// CHECK6-NEXT:       [[TMP3:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %omp_global_thread_num3, i32 129, i64 40, i64 1, ptr @.omp_task_entry..[[ENTRY2:[0-9]+]]) +// CHECK6-NEXT:       getelementptr inbounds nuw %struct.kmp_task_t_with_privates{{.*}}, ptr %3, i32 0, i32 0 +// CHECK6-NEXT:       call i32 @__kmpc_global_thread_num(ptr @[[GLOB_PTR2:[0-9]+]]) +// CHECK6-NEXT:       call i32 @__kmpc_omp_task(ptr @1, i32 %omp_global_thread_num4, ptr %3) +// CHECK6-NEXT:       ret void diff --git a/clang/test/OpenMP/task_threadset_messages.cpp b/clang/test/OpenMP/task_threadset_messages.cpp new file mode 100755 index 0000000..f553a2d --- /dev/null +++ b/clang/test/OpenMP/task_threadset_messages.cpp @@ -0,0 +1,99 @@ +// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 -ferror-limit 200 -o - %s +// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 -std=c++11 -ferror-limit 200 -o - %s +// RUN: %clang_cc1 -verify=expected,omp51 -fopenmp -fopenmp-version=51 -std=c++11 -ferror-limit 200 -o - %s +// RUN: %clang_cc1 -verify=expected -DOMP60 -fopenmp -fopenmp-version=60 -std=c++11 -ferror-limit 200 -o - %s + +// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 -ferror-limit 200 -o - %s +// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 -std=c++11 -ferror-limit 200 -o - %s +// RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -ferror-limit 200 -o - %s +// RUN: %clang_cc1 -verify=expected -DOMP60 -fopenmp-simd -fopenmp-version=60 -std=c++11 -ferror-limit 200 -o - %s + +#ifdef OMP60 +struct ComplexStruct { +  int data[10]; +  struct InnerStruct { +    float value; +  } inner; +}; + +// Template class with member functions using 'threadset'. +template <typename T> +class TemplateClass { +public: +  void foo() { +    #pragma omp task threadset(omp_pool) +    { +      T temp; +    } +  } +  void bar() { +    #pragma omp taskloop threadset(omp_team) +    for (int i = 0; i < 10; ++i) {} +  } +}; + +// Valid uses of 'threadset' with 'omp_pool' and 'omp_team' in task directive. +void test_task_threadset_valid() { +  int a; +  #pragma omp task threadset(omp_pool) +  #pragma omp task threadset(omp_team) +  #pragma omp task threadset(omp_pool) if(1) +  #pragma omp task threadset(omp_team) priority(5) +  #pragma omp task threadset(omp_pool) depend(out: a) +  #pragma omp parallel +  { +    #pragma omp task threadset(omp_pool) +    { +      #pragma omp taskloop threadset(omp_team) +      for (int i = 0; i < 5; ++i) {} +    } +  } + +  TemplateClass<int> obj; +  obj.foo(); +  obj.bar(); +} + +// Invalid uses of 'threadset' with incorrect arguments in task directive. +void test_task_threadset_invalid_args() { +  #pragma omp task threadset(invalid_arg) // expected-error {{expected 'omp_pool' or 'omp_team' in OpenMP clause 'threadset'}} +  #pragma omp task threadset(123) // expected-error {{expected 'omp_pool' or 'omp_team' in OpenMP clause 'threadset'}} +  #pragma omp task threadset(omp_pool, omp_team) // expected-error {{expected ')'}} expected-note {{to match this '('}} +  #pragma omp task threadset() // expected-error {{expected 'omp_pool' or 'omp_team' in OpenMP clause 'threadset'}} +  {} +} + +// Valid uses of 'threadset' with 'omp_pool' and 'omp_team' in taskloop directive. +void test_taskloop_threadset_valid() { +  #pragma omp taskloop threadset(omp_pool) +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset(omp_team) +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset(omp_pool) grainsize(5) +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset(omp_team) num_tasks(2) +  for (int i = 0; i < 10; ++i) {} +} + +// Invalid uses of 'threadset' with incorrect arguments in taskloop directive. +void test_taskloop_threadset_invalid_args() { +  #pragma omp taskloop threadset(invalid_arg) // expected-error {{expected 'omp_pool' or 'omp_team' in OpenMP clause 'threadset'}} +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset(123) // expected-error {{expected 'omp_pool' or 'omp_team' in OpenMP clause 'threadset'}} +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset(omp_pool, omp_team) // expected-error {{expected ')'}} expected-note {{to match this '('}} +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset() // expected-error {{expected 'omp_pool' or 'omp_team' in OpenMP clause 'threadset'}} +  for (int i = 0; i < 10; ++i) {} +} + +#else +void test_threadset_not_supported() { +  #pragma omp task threadset(omp_pool) // omp45-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp task'}} omp50-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp task'}} omp51-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp task'}} +  #pragma omp task threadset(omp_team) // omp45-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp task'}} omp50-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp task'}} omp51-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp task'}} +  #pragma omp taskloop threadset(omp_team) // omp45-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp taskloop'}} omp50-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp taskloop'}} omp51-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp taskloop'}} +  for (int i = 0; i < 10; ++i) {} +  #pragma omp taskloop threadset(omp_pool) // omp45-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp taskloop'}} omp50-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp taskloop'}} omp51-error {{unexpected OpenMP clause 'threadset' in directive '#pragma omp taskloop'}} +  for (int i = 0; i < 10; ++i) {} +} +#endif diff --git a/clang/test/OpenMP/taskloop_ast_print.cpp b/clang/test/OpenMP/taskloop_ast_print.cpp index 1b6d724..e4bf20a 100644 --- a/clang/test/OpenMP/taskloop_ast_print.cpp +++ b/clang/test/OpenMP/taskloop_ast_print.cpp @@ -1,8 +1,10 @@  // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -DOMP60 -ast-print %s | FileCheck %s --check-prefix=CHECK60  // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s  // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s  // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=60 -DOMP60 -ast-print %s | FileCheck %s --check-prefix=CHECK60  // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s  // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s  // expected-no-diagnostics @@ -87,6 +89,20 @@ int main(int argc, char **argv) {    // CHECK-NEXT: #pragma omp cancel taskgroup    // CHECK-NEXT: #pragma omp cancellation point taskgroup    // CHECK-NEXT: foo(); +#ifdef OMP60 +#pragma omp taskloop threadset(omp_team) +  for (int i = 0; i < 10; ++i) { +#pragma omp taskloop threadset(omp_pool) +  for (int j = 0; j < 10; ++j) { +    foo(); +  } +} +#endif + // CHECK60: #pragma omp taskloop threadset(omp_team) + // CHECK60-NEXT: for (int i = 0; i < 10; ++i) { + // CHECK60: #pragma omp taskloop threadset(omp_pool) + // CHECK60-NEXT: for (int j = 0; j < 10; ++j) { + // CHECK60-NEXT: foo();    return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0]));  } diff --git a/clang/test/OpenMP/taskloop_codegen.cpp b/clang/test/OpenMP/taskloop_codegen.cpp index 69f8d3b..d119760 100644 --- a/clang/test/OpenMP/taskloop_codegen.cpp +++ b/clang/test/OpenMP/taskloop_codegen.cpp @@ -5,7 +5,12 @@  // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -x c++ -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s  // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s  // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s +  // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} + +// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=60 -DOMP60 -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK6 +// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -DOMP60 -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -fopenmp-version=60 -DOMP60 -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK6  // expected-no-diagnostics  #ifndef HEADER  #define HEADER @@ -241,4 +246,52 @@ void taskloop_with_class() {    }  } +#ifdef OMP60 +void test_threadset() +{ +#pragma omp taskloop threadset(omp_team) +  for (int i = 0; i < 10; ++i) { +  } +#pragma omp taskloop threadset(omp_pool) +  for (int i = 0; i < 10; ++i) { +  } +} +#endif // OMP60 +// CHECK6-LABEL: define void @_Z14test_threadsetv() +// CHECK6-NEXT:  entry: +// CHECK6-NEXT:       [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_14:%.*]], align 1 +// CHECK6-NEXT:       %[[TMP:.*]] = alloca i32, align 4 +// CHECK6-NEXT:       [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_16:%.*]], align 1 +// CHECK6-NEXT:       %[[TMP2:.*]] = alloca i32, align 4 +// CHECK6-NEXT:       %[[TID0:.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB_PTR:[0-9]+]]) +// CHECK6-NEXT:       call void @__kmpc_taskgroup(ptr @1, i32 %[[TID0:.*]]) +// CHECK6-NEXT:       %[[TID1:.*]] = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %[[TID0:.*]], i32 1, i64 80, i64 1, ptr @.omp_task_entry..[[ENTRY1:[0-9]+]]) +// CHECK6-NEXT:       %[[TID2:.*]] = getelementptr inbounds nuw %struct.kmp_task_t_with_privates{{.*}}, ptr %[[TID1:.*]], i32 0, i32 0 +// CHECK6-NEXT:       %[[TID3:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID2:.*]], i32 0, i32 5 +// CHECK6-NEXT:       store i64 0, ptr %[[TID3:.*]], align 8 +// CHECK6-NEXT:       %[[TID4:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID2:.*]], i32 0, i32 6 +// CHECK6-NEXT:       store i64 9, ptr %[[TID4:.*]], align 8 +// CHECK6-NEXT:       %[[TID5:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID2:.*]], i32 0, i32 7 +// CHECK6-NEXT:       store i64 1, ptr %[[TID5:.*]], align 8 +// CHECK6-NEXT:       %[[TID6:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID2:.*]], i32 0, i32 9 +// CHECK6-NEXT:       call void @llvm.memset.p0.i64(ptr align 8 %[[TID6:.*]], i8 0, i64 8, i1 false) +// CHECK6-NEXT:       %[[TID7:.*]] = load i64, ptr %[[TID5:.*]], align 8 +// CHECK6-NEXT:       call void @__kmpc_taskloop(ptr @1, i32 %[[TID0:.*]], ptr %[[TID1:.*]], i32 1, ptr %[[TID3:.*]], ptr %4, i64 %[[TID7:.*]], i32 1, i32 0, i64 0, ptr null) +// CHECK6-NEXT:       call void @__kmpc_end_taskgroup(ptr @1, i32 %[[TID0:.*]]) +// CHECK6-NEXT:       call void @__kmpc_taskgroup(ptr @1, i32 %[[TID0:.*]]) +// CHECK6-NEXT:       %[[TID8:.*]] = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %[[TID0:.*]], i32 129, i64 80, i64 1, ptr @.omp_task_entry..[[ENTRY1:[0-9]+]]) +// CHECK6-NEXT:       %[[TID9:.*]] = getelementptr inbounds nuw %struct.kmp_task_t_with_privates{{.*}}, ptr %[[TID8:.*]], i32 0, i32 0 +// CHECK6-NEXT:       %[[TID10:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID9:.*]], i32 0, i32 5 +// CHECK6-NEXT:       store i64 0, ptr %[[TID10:.*]], align 8 +// CHECK6-NEXT:       %[[TID11:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID9:.*]], i32 0, i32 6 +// CHECK6-NEXT:       store i64 9, ptr %[[TID11:.*]], align 8 +// CHECK6-NEXT:       %[[TID12:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID9:.*]], i32 0, i32 7 +// CHECK6-NEXT:       store i64 1, ptr %[[TID12:.*]], align 8 +// CHECK6-NEXT:       %[[TID13:.*]] = getelementptr inbounds nuw %struct.kmp_task_t{{.*}}, ptr %[[TID9:.*]], i32 0, i32 9 +// CHECK6-NEXT:       call void @llvm.memset.p0.i64(ptr align 8 [[TID13:.*]], i8 0, i64 8, i1 false) +// CHECK6-NEXT:       %[[TID14:.*]] = load i64, ptr [[TID12:.*]], align 8 +// CHECK6-NEXT:       call void @__kmpc_taskloop(ptr @1, i32 %[[TID0:.*]], ptr %[[TID8:.*]], i32 1, ptr %[[TID10:.*]], ptr %[[TID11:.*]], i64 %[[TID14:.*]], i32 1, i32 0, i64 0, ptr null) +// CHECK6-NEXT:       call void @__kmpc_end_taskgroup(ptr @1, i32 %[[TID0:.*]]) +// CHECK6-NEXT:       ret void +  #endif diff --git a/clang/test/Preprocessor/predefined-arch-macros.c b/clang/test/Preprocessor/predefined-arch-macros.c index a3c3697..cdb4632 100644 --- a/clang/test/Preprocessor/predefined-arch-macros.c +++ b/clang/test/Preprocessor/predefined-arch-macros.c @@ -4418,7 +4418,6 @@  // CHECK_AMDGCN_NONE-NOT: #define __HAS_FMAF__  // CHECK_AMDGCN_NONE-NOT: #define __HAS_FP64__  // CHECK_AMDGCN_NONE-NOT: #define __HAS_LDEXPF__ -// CHECK_AMDGCN_NONE-NOT: #define __AMDGCN_WAVEFRONT_SIZE__  // Begin r600 tests ---------------- @@ -4439,7 +4438,6 @@  // RUN: %clang -x hip -E -dM %s -o - 2>&1 --offload-host-only -nogpulib \  // RUN:     -nogpuinc --offload-arch=gfx803 -target x86_64-unknown-linux \  // RUN:   | FileCheck -match-full-lines %s -check-prefixes=CHECK_HIP_HOST -// CHECK_HIP_HOST: #define __AMDGCN_WAVEFRONT_SIZE__ 64  // CHECK_HIP_HOST: #define __AMDGPU__ 1  // CHECK_HIP_HOST: #define __AMD__ 1 diff --git a/clang/test/SemaOpenCL/builtins-extended-image-param-gfx1100-err.cl b/clang/test/SemaOpenCL/builtins-extended-image-param-gfx1100-err.cl new file mode 100644 index 0000000..47dbdd4 --- /dev/null +++ b/clang/test/SemaOpenCL/builtins-extended-image-param-gfx1100-err.cl @@ -0,0 +1,227 @@ +// RUN: %clang_cc1 -triple amdgcn-- -target-cpu gfx1100 -target-feature +extended-image-insts -S -verify=expected -o - %s +// REQUIRES: amdgpu-registered-target + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +typedef int int4 __attribute__((ext_vector_type(4))); +typedef float float4 __attribute__((ext_vector_type(4))); +typedef half half4 __attribute__((ext_vector_type(4))); + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_r(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(1, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_g(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(2, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_b(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(4, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_a(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(8, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_gather4_lz_2d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_lz_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1d_v4f32_f32(i32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_1d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_l_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_1d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_d_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1d_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_1d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_lz_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_2d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_l_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, f32, 103); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_2d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_d_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_v4f32_f32(i32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_2d_v4f32_f32' must be a constant integer}} +} +float4 test_amdgcn_image_sample_lz_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_3d_v4f32_f32(i32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_3d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_l_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_3d_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_3d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_d_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_3d_v4f32_f32(1, f32, f32, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_3d_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_lz_cube_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_cube_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_cube_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_l_cube_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_cube_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_cube_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_lz_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1darray_v4f32_f32(1, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_1darray_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_l_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1darray_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_1darray_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_d_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1darray_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_1darray_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_lz_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_2darray_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_l_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_2darray_v4f32_f32' must be a constant integer}} +} + +float4 test_amdgcn_image_sample_d_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_v4f32_f32(1, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_2darray_v4f32_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_lz_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1d_v4f16_f32(23, f32, tex, vec4i32, 0, i32, 11); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_1d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_l_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1d_v4f16_f32(i32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_1d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_d_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1d_v4f16_f32(i32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_1d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_lz_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_v4f16_f32(100, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_2d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_l_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_2d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_d_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_v4f16_f32(100, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_2d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_lz_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_3d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_3d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_l_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_3d_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_3d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_d_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_3d_v4f16_f32(100, f32, f32, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_3d_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_lz_cube_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_cube_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_cube_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_l_cube_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_cube_v4f16_f32(i32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_cube_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_lz_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1darray_v4f16_f32(i32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_1darray_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_l_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1darray_v4f16_f32(i32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_1darray_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_d_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1darray_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_1darray_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_lz_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_2darray_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_l_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_2darray_v4f16_f32' must be a constant integer}} +} + +half4 test_amdgcn_image_sample_d_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_v4f16_f32(100, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_2darray_v4f16_f32' must be a constant integer}} +} + +float test_amdgcn_image_sample_lz_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_f32_f32(1, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_2d_f32_f32' must be a constant integer}} +} + +float test_amdgcn_image_sample_l_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_f32_f32(1, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_2d_f32_f32' must be a constant integer}} +} + +float test_amdgcn_image_sample_d_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_f32_f32(1, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_2d_f32_f32' must be a constant integer}} +} + +float test_amdgcn_image_sample_lz_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_f32_f32(1, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_lz_2darray_f32_f32' must be a constant integer}} +} + +float test_amdgcn_image_sample_l_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_l_2darray_f32_f32' must be a constant integer}} +} + +float test_amdgcn_image_sample_d_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_f32_f32(1, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, f32, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_d_2darray_f32_f32' must be a constant integer}} +} diff --git a/clang/test/SemaOpenCL/builtins-extended-image-param-gfx942-err.cl b/clang/test/SemaOpenCL/builtins-extended-image-param-gfx942-err.cl new file mode 100644 index 0000000..e60f8c7 --- /dev/null +++ b/clang/test/SemaOpenCL/builtins-extended-image-param-gfx942-err.cl @@ -0,0 +1,227 @@ +// RUN: %clang_cc1 -triple amdgcn-- -target-cpu gfx942 -verify=GFX94 -S -o - %s +// REQUIRES: amdgpu-registered-target + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +typedef int int4 __attribute__((ext_vector_type(4))); +typedef float float4 __attribute__((ext_vector_type(4))); +typedef half half4 __attribute__((ext_vector_type(4))); + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_r(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(1, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_gather4_lz_2d_v4f32_f32_r' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_g(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(2, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_gather4_lz_2d_v4f32_f32_g' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_b(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(4, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_gather4_lz_2d_v4f32_f32_b' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_gather4_lz_2d_v4f32_f32_a(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_gather4_lz_2d_v4f32_f32(8, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_gather4_lz_2d_v4f32_f32_a' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_lz_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1d_v4f32_f32(105, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_1d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_l_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_1d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_d_1d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1d_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_1d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_lz_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_2d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_l_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_v4f32_f32(10, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_2d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_d_2d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_v4f32_f32(105, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_2d_v4f32_f32' needs target feature extended-image-insts}} +} +float4 test_amdgcn_image_sample_lz_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_3d_v4f32_f32(105, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_3d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_l_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_3d_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_3d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_d_3d_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_3d_v4f32_f32(1, f32, f32, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_3d_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_lz_cube_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_cube_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_cube_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_l_cube_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_cube_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_cube_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_lz_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1darray_v4f32_f32(1, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_1darray_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_l_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1darray_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_1darray_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_d_1darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1darray_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_1darray_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_lz_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_v4f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_2darray_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_l_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_v4f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_2darray_v4f32_f32' needs target feature extended-image-insts}} +} + +float4 test_amdgcn_image_sample_d_2darray_v4f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_v4f32_f32(1, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_2darray_v4f32_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_lz_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1d_v4f16_f32(105, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_1d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_l_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1d_v4f16_f32(105, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_1d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_d_1d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1d_v4f16_f32(105, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_1d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_lz_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_v4f16_f32(100, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_2d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_l_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_2d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_d_2d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_v4f16_f32(100, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_2d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_lz_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_3d_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_3d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_l_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_3d_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_3d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_d_3d_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_3d_v4f16_f32(100, f32, f32, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_3d_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_lz_cube_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_cube_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_cube_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_l_cube_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_cube_v4f16_f32(105, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_cube_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_lz_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_1darray_v4f16_f32(105, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_1darray_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_l_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_1darray_v4f16_f32(105, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_1darray_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_d_1darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_1darray_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_1darray_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_lz_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_2darray_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_l_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_v4f16_f32(100, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_2darray_v4f16_f32' needs target feature extended-image-insts}} +} + +half4 test_amdgcn_image_sample_d_2darray_v4f16_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_v4f16_f32(100, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_2darray_v4f16_f32' needs target feature extended-image-insts}} +} + +float test_amdgcn_image_sample_lz_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2d_f32_f32(1, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_2d_f32_f32' needs target feature extended-image-insts}} +} + +float test_amdgcn_image_sample_l_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2d_f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_2d_f32_f32' needs target feature extended-image-insts}} +} + +float test_amdgcn_image_sample_d_2d_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2d_f32_f32(1, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_2d_f32_f32' needs target feature extended-image-insts}} +} + +float test_amdgcn_image_sample_lz_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_lz_2darray_f32_f32(1, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_lz_2darray_f32_f32' needs target feature extended-image-insts}} +} + +float test_amdgcn_image_sample_l_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_l_2darray_f32_f32(1, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_l_2darray_f32_f32' needs target feature extended-image-insts}} +} + +float test_amdgcn_image_sample_d_2darray_f32_f32(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) { + +  return __builtin_amdgcn_image_sample_d_2darray_f32_f32(1, f32, f32, f32, f32, f32, f32, f32, tex, vec4i32, 0, 101, 121); //GFX94-error{{'test_amdgcn_image_sample_d_2darray_f32_f32' needs target feature extended-image-insts}} +} diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index fc27fd2..08776d9 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2406,6 +2406,8 @@ void OMPClauseEnqueue::VisitOMPCompareClause(const OMPCompareClause *) {}  void OMPClauseEnqueue::VisitOMPFailClause(const OMPFailClause *) {} +void OMPClauseEnqueue::VisitOMPThreadsetClause(const OMPThreadsetClause *) {} +  void OMPClauseEnqueue::VisitOMPAbsentClause(const OMPAbsentClause *) {}  void OMPClauseEnqueue::VisitOMPHoldsClause(const OMPHoldsClause *) {} diff --git a/clang/unittests/Format/AlignBracketsTest.cpp b/clang/unittests/Format/AlignBracketsTest.cpp index ea8db51..10ca5fb 100644 --- a/clang/unittests/Format/AlignBracketsTest.cpp +++ b/clang/unittests/Format/AlignBracketsTest.cpp @@ -28,7 +28,7 @@ TEST_F(AlignBracketsTest, AlignsAfterOpenBracket) {        "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"        "                                             aaaaaaaaaaaaaaaaaaaaa));");    FormatStyle Style = getLLVMStyle(); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"                 "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",                 Style); @@ -64,7 +64,7 @@ TEST_F(AlignBracketsTest, AlignsAfterOpenBracket) {                 Style);    Style.ColumnLimit = 80; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    Style.BinPackArguments = false;    Style.BinPackParameters = FormatStyle::BPPS_OnePerLine;    verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" @@ -115,7 +115,9 @@ TEST_F(AlignBracketsTest, AlignsAfterOpenBracket) {        "    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZZZZZZZZZZZZZZZZZZZZZZZZZ()));",        Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakBeforeCloseBracketFunction = true; +  Style.BreakBeforeCloseBracketBracedList = true;    Style.BinPackArguments = false;    Style.BinPackParameters = FormatStyle::BPPS_OnePerLine;    verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" @@ -254,7 +256,8 @@ TEST_F(AlignBracketsTest, AlignAfterOpenBracketBlockIndent) {                 "argument5));",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakBeforeCloseBracketFunction = true;    verifyFormat(Short, Style);    verifyFormat( @@ -378,7 +381,8 @@ TEST_F(AlignBracketsTest, AlignAfterOpenBracketBlockIndentIfStatement) {                 "}",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakBeforeCloseBracketFunction = true;    verifyFormat("if (foo()) {\n"                 "  return;\n" @@ -440,7 +444,8 @@ TEST_F(AlignBracketsTest, AlignAfterOpenBracketBlockIndentForStatement) {                 "}",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakBeforeCloseBracketFunction = true;    verifyFormat("for (int i = 0; i < 5; ++i) {\n"                 "  doSomething();\n" @@ -457,7 +462,8 @@ TEST_F(AlignBracketsTest, AlignAfterOpenBracketBlockIndentForStatement) {  TEST_F(AlignBracketsTest, AlignAfterOpenBracketBlockIndentInitializers) {    auto Style = getLLVMStyleWithColumns(60); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketBracedList = true; +  Style.BreakBeforeCloseBracketBracedList = true;    // Aggregate initialization.    verifyFormat("int LooooooooooooooooooooooooongVariable[2] = {\n"                 "    10000000, 20000000\n" @@ -611,13 +617,13 @@ TEST_F(AlignBracketsTest, AllowAllArgumentsOnNextLineDontAlign) {    StringRef Input = "functionCall(paramA, paramB, paramC);\n"                      "void functionDecl(int A, int B, int C);";    Style.AllowAllArgumentsOnNextLine = false; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    verifyFormat(StringRef("functionCall(paramA, paramB,\n"                           "    paramC);\n"                           "void functionDecl(int A, int B,\n"                           "    int C);"),                 Input, Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; +  Style.AlignAfterOpenBracket = true;    verifyFormat(StringRef("functionCall(paramA, paramB,\n"                           "             paramC);\n"                           "void functionDecl(int A, int B,\n" @@ -625,13 +631,14 @@ TEST_F(AlignBracketsTest, AllowAllArgumentsOnNextLineDontAlign) {                 Input, Style);    // However, BAS_AlwaysBreak and BAS_BlockIndent should take precedence over    // AllowAllArgumentsOnNextLine. -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    verifyFormat(StringRef("functionCall(\n"                           "    paramA, paramB, paramC);\n"                           "void functionDecl(\n"                           "    int A, int B, int C);"),                 Input, Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakBeforeCloseBracketFunction = true;    verifyFormat("functionCall(\n"                 "    paramA, paramB, paramC\n"                 ");\n" @@ -639,11 +646,12 @@ TEST_F(AlignBracketsTest, AllowAllArgumentsOnNextLineDontAlign) {                 "    int A, int B, int C\n"                 ");",                 Input, Style); +  Style.BreakBeforeCloseBracketFunction = false;    // When AllowAllArgumentsOnNextLine is set, we prefer breaking before the    // first argument.    Style.AllowAllArgumentsOnNextLine = true; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    verifyFormat(StringRef("functionCall(\n"                           "    paramA, paramB, paramC);\n"                           "void functionDecl(\n" @@ -651,13 +659,14 @@ TEST_F(AlignBracketsTest, AllowAllArgumentsOnNextLineDontAlign) {                 Input, Style);    // It wouldn't fit on one line with aligned parameters so this setting    // doesn't change anything for BAS_Align. -  Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; +  Style.AlignAfterOpenBracket = true; +  Style.BreakAfterOpenBracketFunction = false;    verifyFormat(StringRef("functionCall(paramA, paramB,\n"                           "             paramC);\n"                           "void functionDecl(int A, int B,\n"                           "                  int C);"),                 Input, Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.BreakAfterOpenBracketFunction = true;    verifyFormat(StringRef("functionCall(\n"                           "    paramA, paramB, paramC);\n"                           "void functionDecl(\n" @@ -678,13 +687,14 @@ TEST_F(AlignBracketsTest, FormatsDeclarationBreakAlways) {    // Ensure AlignAfterOpenBracket interacts correctly with BinPackParameters set    // to BPPS_AlwaysOnePerLine. -  BreakAlways.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  BreakAlways.BreakAfterOpenBracketFunction = true;    verifyFormat(        "void someLongFunctionName(\n"        "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"        "    int b);",        BreakAlways); -  BreakAlways.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  BreakAlways.BreakAfterOpenBracketFunction = true; +  BreakAlways.BreakBeforeCloseBracketFunction = true;    verifyFormat(        "void someLongFunctionName(\n"        "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" @@ -734,7 +744,7 @@ TEST_F(AlignBracketsTest, FormatsDefinitionBreakAlways) {    // Ensure AlignAfterOpenBracket interacts correctly with BinPackParameters set    // to BPPS_AlwaysOnePerLine. -  BreakAlways.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  BreakAlways.BreakAfterOpenBracketFunction = true;    verifyFormat(        "void someLongFunctionName(\n"        "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" @@ -743,7 +753,8 @@ TEST_F(AlignBracketsTest, FormatsDefinitionBreakAlways) {        "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, b);\n"        "}",        BreakAlways); -  BreakAlways.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  BreakAlways.BreakAfterOpenBracketFunction = true; +  BreakAlways.BreakBeforeCloseBracketFunction = true;    verifyFormat(        "void someLongFunctionName(\n"        "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" @@ -761,17 +772,17 @@ TEST_F(AlignBracketsTest, ParenthesesAndOperandAlignment) {    verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"                 "          bbbbbbbbbbbbbbbbbbbbbb);",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; +  Style.AlignAfterOpenBracket = true;    Style.AlignOperands = FormatStyle::OAS_DontAlign;    verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"                 "          bbbbbbbbbbbbbbbbbbbbbb);",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    Style.AlignOperands = FormatStyle::OAS_Align;    verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"                 "          bbbbbbbbbbbbbbbbbbbbbb);",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    Style.AlignOperands = FormatStyle::OAS_DontAlign;    verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"                 "    bbbbbbbbbbbbbbbbbbbbbb);", @@ -781,7 +792,10 @@ TEST_F(AlignBracketsTest, ParenthesesAndOperandAlignment) {  TEST_F(AlignBracketsTest, BlockIndentAndNamespace) {    auto Style = getLLVMStyleWithColumns(120);    Style.AllowShortNamespacesOnASingleLine = true; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakAfterOpenBracketBracedList = true; +  Style.BreakBeforeCloseBracketFunction = true; +  Style.BreakBeforeCloseBracketBracedList = true;    verifyNoCrash(        "namespace {\n" diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp index 6488e38..43b2117 100644 --- a/clang/unittests/Format/ConfigParseTest.cpp +++ b/clang/unittests/Format/ConfigParseTest.cpp @@ -172,6 +172,16 @@ TEST(ConfigParseTest, ParsesConfigurationBools) {    CHECK_PARSE_BOOL(BinPackLongBracedList);    CHECK_PARSE_BOOL(BreakAdjacentStringLiterals);    CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations); +  CHECK_PARSE_BOOL(BreakAfterOpenBracketBracedList); +  CHECK_PARSE_BOOL(BreakAfterOpenBracketFunction); +  CHECK_PARSE_BOOL(BreakAfterOpenBracketIf); +  CHECK_PARSE_BOOL(BreakAfterOpenBracketLoop); +  CHECK_PARSE_BOOL(BreakAfterOpenBracketSwitch); +  CHECK_PARSE_BOOL(BreakBeforeCloseBracketBracedList); +  CHECK_PARSE_BOOL(BreakBeforeCloseBracketFunction); +  CHECK_PARSE_BOOL(BreakBeforeCloseBracketIf); +  CHECK_PARSE_BOOL(BreakBeforeCloseBracketLoop); +  CHECK_PARSE_BOOL(BreakBeforeCloseBracketSwitch);    CHECK_PARSE_BOOL(BreakBeforeTemplateCloser);    CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);    CHECK_PARSE_BOOL(BreakStringLiterals); @@ -533,20 +543,23 @@ TEST(ConfigParseTest, ParsesConfiguration) {    CHECK_PARSE("EnumTrailingComma: Remove", EnumTrailingComma,                FormatStyle::ETC_Remove); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; -  CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, -              FormatStyle::BAS_Align); -  CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, -              FormatStyle::BAS_DontAlign); +  Style.AlignAfterOpenBracket = false; +  CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket, true); +  CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket, false); +  // For backward compatibility:    CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket, -              FormatStyle::BAS_AlwaysBreak); +              true); +  CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak\n" +              "BreakAfterOpenBracketIf: false", +              BreakAfterOpenBracketIf, false); +  CHECK_PARSE("BreakAfterOpenBracketLoop: true\n" +              "AlignAfterOpenBracket: AlwaysBreak", +              BreakAfterOpenBracketLoop, true); +  CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, false);    CHECK_PARSE("AlignAfterOpenBracket: BlockIndent", AlignAfterOpenBracket, -              FormatStyle::BAS_BlockIndent); -  // For backward compatibility: -  CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket, -              FormatStyle::BAS_DontAlign); -  CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, -              FormatStyle::BAS_Align); +              true); +  Style.AlignAfterOpenBracket = false; +  CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket, true);    Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;    CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines, diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d45babe..ca9e792 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -5126,7 +5126,8 @@ TEST_F(FormatTest, DesignatedInitializers) {  TEST_F(FormatTest, BracedInitializerIndentWidth) {    auto Style = getLLVMStyleWithColumns(60);    Style.BinPackArguments = true; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakAfterOpenBracketBracedList = true;    Style.BracedInitializerIndentWidth = 6;    // Non-initializing braces are unaffected by BracedInitializerIndentWidth. @@ -5302,7 +5303,8 @@ TEST_F(FormatTest, BracedInitializerIndentWidth) {                 Style);    // Aligning after open braces unaffected by BracedInitializerIndentWidth. -  Style.AlignAfterOpenBracket = FormatStyle::BAS_Align; +  Style.AlignAfterOpenBracket = true; +  Style.BreakAfterOpenBracketBracedList = false;    verifyFormat("SomeStruct s{\"xxxxxxxxxxxxx\", \"yyyyyyyyyyyyy\",\n"                 "             \"zzzzzzzzzzzzz\"};",                 Style); @@ -7459,7 +7461,7 @@ TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {    Style.IndentWidth = 4;    Style.TabWidth = 4;    Style.UseTab = FormatStyle::UT_Always; -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    Style.AlignOperands = FormatStyle::OAS_DontAlign;    verifyFormat("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"                 "\t&& (someOtherLongishConditionPart1\n" @@ -7470,7 +7472,7 @@ TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {                 Style);    Style = getLLVMStyleWithColumns(20); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    Style.BinPackParameters = FormatStyle::BPPS_OnePerLine;    Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;    Style.ContinuationIndentWidth = 2; @@ -7632,7 +7634,7 @@ TEST_F(FormatTest, NoOperandAlignment) {                 "        * cccccccccccccccccccccccccccccccccccc;",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    verifyFormat("return (a > b\n"                 "    // comment1\n"                 "    // comment2\n" @@ -11248,7 +11250,7 @@ TEST_F(FormatTest, BreakBeforeTemplateCloser) {  TEST_F(FormatTest, WrapsTemplateParameters) {    FormatStyle Style = getLLVMStyle(); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;    verifyFormat(        "template <typename... a> struct q {};\n" @@ -11256,7 +11258,7 @@ TEST_F(FormatTest, WrapsTemplateParameters) {        "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"        "    y;",        Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign; +  Style.AlignAfterOpenBracket = false;    Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;    verifyFormat(        "template <typename... a> struct r {};\n" @@ -11264,7 +11266,7 @@ TEST_F(FormatTest, WrapsTemplateParameters) {        "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"        "    y;",        Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;    verifyFormat("template <typename... a> struct s {};\n"                 "extern s<\n" @@ -11274,7 +11276,7 @@ TEST_F(FormatTest, WrapsTemplateParameters) {                 "aaaaaaaaaaaaaaaaaaaaaa>\n"                 "    y;",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;    verifyFormat("template <typename... a> struct t {};\n"                 "extern t<\n" @@ -14302,7 +14304,7 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) {                 "};",                 NoBinPacking); -  NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  NoBinPacking.BreakAfterOpenBracketBracedList = true;    verifyFormat("static uint8 CddDp83848Reg[] = {\n"                 "    CDDDP83848_BMCR_REGISTER,\n"                 "    CDDDP83848_BMSR_REGISTER,\n" @@ -15972,13 +15974,14 @@ TEST_F(FormatTest, BreaksStringLiteralOperands) {    // In a function call with two operands, with AlignAfterOpenBracket enabled,    // the first must be broken with a line break before it.    FormatStyle Style = getLLVMStyleWithColumns(25); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    verifyFormat("someFunction(\n"                 "    \"long long long \"\n"                 "    \"long\",\n"                 "    a);",                 "someFunction(\"long long long long\", a);", Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Style.BreakAfterOpenBracketFunction = true; +  Style.BreakBeforeCloseBracketFunction = true;    verifyFormat("someFunction(\n"                 "    \"long long long \"\n"                 "    \"long\",\n" @@ -17773,7 +17776,7 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {    Spaces.ColumnLimit = 80;    Spaces.IndentWidth = 4; -  Spaces.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Spaces.BreakAfterOpenBracketFunction = true;    verifyFormat("void foo( ) {\n"                 "    size_t foo = (*(function))(\n"                 "        Foooo, Barrrrr, Foooo, Barrrr, FoooooooooLooooong, " @@ -17798,7 +17801,8 @@ TEST_F(FormatTest, ConfigurableSpacesInParens) {                 "}",                 Spaces); -  Spaces.AlignAfterOpenBracket = FormatStyle::BAS_BlockIndent; +  Spaces.BreakAfterOpenBracketFunction = true; +  Spaces.BreakBeforeCloseBracketFunction = true;    verifyFormat("void foo( ) {\n"                 "    size_t foo = (*(function))(\n"                 "        Foooo, Barrrrr, Foooo, Barrrr, FoooooooooLooooong, " @@ -22827,7 +22831,7 @@ TEST_F(FormatTest, ConstructorInitializerIndentWidth) {        ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"        "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",        Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    verifyFormat(        "SomeLongTemplateVariableName<\n"        "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>", @@ -24082,7 +24086,7 @@ TEST_F(FormatTest, FormatsLambdas) {                 "      return aFunkyFunctionCall(qux);\n"                 "    }} {}",                 Style); -  Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak; +  Style.BreakAfterOpenBracketFunction = true;    // FIXME: The following test should pass, but fails at the time of writing.  #if 0    // As long as all the non-lambda arguments fit on a single line, AlwaysBreak diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index 91577b9a..4847151 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -2883,7 +2883,7 @@ TEST_F(FormatTestJS, DontBreakFieldsAsGoToLabels) {  TEST_F(FormatTestJS, BreakAfterOpenBracket) {    auto Style = getGoogleStyle(FormatStyle::LK_JavaScript); -  EXPECT_EQ(Style.AlignAfterOpenBracket, FormatStyle::BAS_AlwaysBreak); +  EXPECT_EQ(Style.BreakAfterOpenBracketFunction, true);    verifyFormat("ctrl.onCopy(/** @type {!WizEvent}*/ (\n"                 "    {event, targetElement: {el: () => selectedElement}}));",                 Style); diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index b7da22c..0312c9d 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -81,7 +81,7 @@      <td><a href="https://cplusplus.github.io/CWG/issues/6.html">6</a></td>      <td>NAD</td>      <td>Should the optimization that allows a class object to alias another object also allow the case of a parameter in an inline function to alias its argument?</td> -    <td class="unknown" align="center">Unknown</td> +    <td class="full" align="center">Yes</td>    </tr>    <tr id="7">      <td><a href="https://cplusplus.github.io/CWG/issues/7.html">7</a></td> @@ -1318,7 +1318,7 @@ accessible?</td>      <td><a href="https://cplusplus.github.io/CWG/issues/212.html">212</a></td>      <td>CD4</td>      <td>Implicit instantiation is not described clearly enough</td> -    <td class="unknown" align="center">Unknown</td> +    <td class="full" align="center">Yes</td>    </tr>    <tr id="213">      <td><a href="https://cplusplus.github.io/CWG/issues/213.html">213</a></td> @@ -1438,7 +1438,7 @@ accessible?</td>      <td><a href="https://cplusplus.github.io/CWG/issues/232.html">232</a></td>      <td>NAD</td>      <td>Is indirection through a null pointer undefined behavior?</td> -    <td class="unknown" align="center">Unknown</td> +    <td class="none" align="center">Duplicate of <a href="#2823">2823</a></td>    </tr>    <tr id="233">      <td><a href="https://cplusplus.github.io/CWG/issues/233.html">233</a></td> @@ -3113,11 +3113,11 @@ of class templates</td>      <td>Default initialization of POD classes?</td>      <td class="na" align="center">N/A</td>    </tr> -  <tr class="open" id="511"> +  <tr id="511">      <td><a href="https://cplusplus.github.io/CWG/issues/511.html">511</a></td> -    <td>open</td> +    <td>NAD</td>      <td>POD-structs with template assignment operators</td> -    <td align="center">Not resolved</td> +    <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="512">      <td><a href="https://cplusplus.github.io/CWG/issues/512.html">512</a></td> @@ -10895,7 +10895,7 @@ and <I>POD class</I></td>    </tr>    <tr class="open" id="1845">      <td><a href="https://cplusplus.github.io/CWG/issues/1845.html">1845</a></td> -    <td>drafting</td> +    <td>review</td>      <td>Point of instantiation of a variable template specialization</td>      <td align="center">Not resolved</td>    </tr> @@ -12081,7 +12081,7 @@ and <I>POD class</I></td>    </tr>    <tr class="open" id="2042">      <td><a href="https://cplusplus.github.io/CWG/issues/2042.html">2042</a></td> -    <td>drafting</td> +    <td>review</td>      <td>Exceptions and deallocation functions</td>      <td align="center">Not resolved</td>    </tr> @@ -12335,7 +12335,7 @@ and <I>POD class</I></td>      <td><a href="https://cplusplus.github.io/CWG/issues/2084.html">2084</a></td>      <td>CD4</td>      <td>NSDMIs and deleted union default constructors</td> -    <td class="unknown" align="center">Unknown</td> +    <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="2085">      <td><a href="https://cplusplus.github.io/CWG/issues/2085.html">2085</a></td> @@ -12837,7 +12837,7 @@ and <I>POD class</I></td>    </tr>    <tr class="open" id="2168">      <td><a href="https://cplusplus.github.io/CWG/issues/2168.html">2168</a></td> -    <td>open</td> +    <td>review</td>      <td>Narrowing conversions and +/- infinity</td>      <td align="center">Not resolved</td>    </tr> @@ -14237,11 +14237,11 @@ and <I>POD class</I></td>      <td>Constexpr virtual functions and temporary objects</td>      <td class="unknown" align="center">Unknown</td>    </tr> -  <tr class="open" id="2401"> +  <tr id="2401">      <td><a href="https://cplusplus.github.io/CWG/issues/2401.html">2401</a></td> -    <td>drafting</td> +    <td>C++20</td>      <td>Array decay vs prohibition of subobject non-type arguments</td> -    <td align="center">Not resolved</td> +    <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2402">      <td><a href="https://cplusplus.github.io/CWG/issues/2402.html">2402</a></td> @@ -15171,7 +15171,7 @@ and <I>POD class</I></td>    </tr>    <tr class="open" id="2555">      <td><a href="https://cplusplus.github.io/CWG/issues/2555.html">2555</a></td> -    <td>drafting</td> +    <td>tentatively ready</td>      <td>Ineffective redeclaration prevention for <I>using-declarator</I>s</td>      <td align="center">Not resolved</td>    </tr> @@ -15311,23 +15311,23 @@ and <I>POD class</I></td>      <td>Undefined behavior for preprocessing directives in macro arguments</td>      <td align="center">Not resolved</td>    </tr> -  <tr class="open" id="2578"> +  <tr id="2578">      <td><a href="https://cplusplus.github.io/CWG/issues/2578.html">2578</a></td> -    <td>open</td> +    <td>CD7</td>      <td>Undefined behavior when creating an invalid string literal via stringizing</td> -    <td align="center">Not resolved</td> +    <td class="unknown" align="center">Unknown</td>    </tr> -  <tr class="open" id="2579"> +  <tr id="2579">      <td><a href="https://cplusplus.github.io/CWG/issues/2579.html">2579</a></td> -    <td>open</td> +    <td>CD7</td>      <td>Undefined behavior when token pasting does not create a preprocessing token</td> -    <td align="center">Not resolved</td> +    <td class="unknown" align="center">Unknown</td>    </tr> -  <tr class="open" id="2580"> +  <tr id="2580">      <td><a href="https://cplusplus.github.io/CWG/issues/2580.html">2580</a></td> -    <td>open</td> +    <td>CD7</td>      <td>Undefined behavior with <TT>#line</TT></td> -    <td align="center">Not resolved</td> +    <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2581">      <td><a href="https://cplusplus.github.io/CWG/issues/2581.html">2581</a></td> @@ -16790,7 +16790,7 @@ objects</td>      <td><a href="https://cplusplus.github.io/CWG/issues/2823.html">2823</a></td>      <td>CD7</td>      <td>Implicit undefined behavior when dereferencing pointers</td> -    <td class="unknown" align="center">Unknown</td> +    <td class="none" align="center">No</td>    </tr>    <tr id="2824">      <td><a href="https://cplusplus.github.io/CWG/issues/2824.html">2824</a></td> @@ -17104,7 +17104,7 @@ objects</td>    </tr>    <tr class="open" id="2875">      <td><a href="https://cplusplus.github.io/CWG/issues/2875.html">2875</a></td> -    <td>review</td> +    <td>tentatively ready</td>      <td>Missing support for round-tripping null pointer values through indirection/address operators</td>      <td align="center">Not resolved</td>    </tr> @@ -17400,7 +17400,7 @@ objects</td>    </tr>    <tr class="open" id="2923">      <td><a href="https://cplusplus.github.io/CWG/issues/2923.html">2923</a></td> -    <td>review</td> +    <td>tentatively ready</td>      <td>Note about infinite loops and execution steps</td>      <td align="center">Not resolved</td>    </tr> @@ -17760,7 +17760,7 @@ objects</td>    </tr>    <tr class="open" id="2983">      <td><a href="https://cplusplus.github.io/CWG/issues/2983.html">2983</a></td> -    <td>open</td> +    <td>review</td>      <td>Non-type template parameters are not variables</td>      <td align="center">Not resolved</td>    </tr> @@ -17868,7 +17868,7 @@ objects</td>    </tr>    <tr class="open" id="3001">      <td><a href="https://cplusplus.github.io/CWG/issues/3001.html">3001</a></td> -    <td>review</td> +    <td>tentatively ready</td>      <td>Inconsistent restrictions for <TT>static_cast</TT> on pointers to out-of-lifetime objects</td>      <td align="center">Not resolved</td>    </tr> @@ -17932,7 +17932,7 @@ objects</td>    </tr>    <tr class="open" id="3011">      <td><a href="https://cplusplus.github.io/CWG/issues/3011.html">3011</a></td> -    <td>open</td> +    <td>tentatively ready</td>      <td>Parenthesized aggregate initialization for <I>new-expression</I>s</td>      <td align="center">Not resolved</td>    </tr> @@ -17992,7 +17992,7 @@ objects</td>    </tr>    <tr class="open" id="3021">      <td><a href="https://cplusplus.github.io/CWG/issues/3021.html">3021</a></td> -    <td>open</td> +    <td>drafting</td>      <td>Subsumption rules for fold expanded constraints</td>      <td align="center">Not resolved</td>    </tr> @@ -18058,7 +18058,7 @@ objects</td>    </tr>    <tr class="open" id="3032">      <td><a href="https://cplusplus.github.io/CWG/issues/3032.html">3032</a></td> -    <td>open</td> +    <td>tentatively ready</td>      <td>Template argument disambiguation</td>      <td align="center">Not resolved</td>    </tr> @@ -18184,7 +18184,7 @@ objects</td>    </tr>    <tr class="open" id="3053">      <td><a href="https://cplusplus.github.io/CWG/issues/3053.html">3053</a></td> -    <td>open</td> +    <td>tentatively ready</td>      <td>Allowing <TT>#undef likely</TT></td>      <td align="center">Not resolved</td>    </tr> @@ -18265,6 +18265,210 @@ objects</td>      <td>tentatively ready</td>      <td>Declarative <I>nested-name-specifier</I> in explicit instantiation</td>      <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3067"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3067.html">3067</a></td> +    <td>open</td> +    <td>Array-to-pointer conversion with object type mismatch</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3068"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3068.html">3068</a></td> +    <td>open</td> +    <td>Access checking in friends involving <I>qualified-id</I>s</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3069"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3069.html">3069</a></td> +    <td>open</td> +    <td>Reference to wrong placeholder</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3070"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3070.html">3070</a></td> +    <td>open</td> +    <td>Trivial assignment can skip member subobjects</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3071"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3071.html">3071</a></td> +    <td>open</td> +    <td>Negative <TT>tuple_size</TT> in structured bindings</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3072"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3072.html">3072</a></td> +    <td>open</td> +    <td>Incorrect examples for lambda SFINAE</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3073"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3073.html">3073</a></td> +    <td>open</td> +    <td>Dependence of <I>R</I> on <TT>T2</TT> is unclear</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3074"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3074.html">3074</a></td> +    <td>tentatively ready</td> +    <td>Redundant ill-formedness for module macros</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3075"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3075.html">3075</a></td> +    <td>tentatively ready</td> +    <td>Unclear matching of import directive</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3076"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3076.html">3076</a></td> +    <td>tentatively ready</td> +    <td>Remove unnecessary IFNDR for malformed <I>header-name-token</I>s</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3077"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3077.html">3077</a></td> +    <td>tentatively ready</td> +    <td>Undesirable formation of <TT>import</TT> directive with <I>string-literal</I></td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3078"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3078.html">3078</a></td> +    <td>review</td> +    <td>Different treatment of <TT>#include</TT> <I>pp-tokens</I> and <I>header-name-tokens</I></td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3079"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3079.html">3079</a></td> +    <td>open</td> +    <td>Allow <I>empty-declaration</I>s in anonymous unions</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3080"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3080.html">3080</a></td> +    <td>tentatively ready</td> +    <td>Clarify kinds of permitted template template arguments</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3081"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3081.html">3081</a></td> +    <td>review</td> +    <td>Require glvalue when splicing direct base class relationship</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3082"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3082.html">3082</a></td> +    <td>tentatively ready</td> +    <td>Allow for call-compatible function types in <TT>reinterpret_cast</TT></td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3083"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3083.html">3083</a></td> +    <td>tentatively ready</td> +    <td>Remove redundant restrictions on class and enum definitions</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3084"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3084.html">3084</a></td> +    <td>tentatively ready</td> +    <td><I>compound-statement</I>s inside <I>iteration-statement</I>s</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3085"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3085.html">3085</a></td> +    <td>tentatively ready</td> +    <td>Apply restriction inside for-range-declaration</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3086"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3086.html">3086</a></td> +    <td>tentatively ready</td> +    <td>Destringizing should consider all sorts of encoding-prefixes</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3087"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3087.html">3087</a></td> +    <td>open</td> +    <td>Destringizing for raw string literals</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3088"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3088.html">3088</a></td> +    <td>open</td> +    <td>Clarify macro treatment of identifiers with special meaning</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3089"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3089.html">3089</a></td> +    <td>tentatively ready</td> +    <td>const-default-constructible improperly handles std::meta::info</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3090"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3090.html">3090</a></td> +    <td>tentatively ready</td> +    <td>Internal linkage from header units</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3091"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3091.html">3091</a></td> +    <td>review</td> +    <td>Linking of translation units as sequences of tokens</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3092"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3092.html">3092</a></td> +    <td>tentatively ready</td> +    <td><I>base-specifier</I>s are not "declared"</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3093"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3093.html">3093</a></td> +    <td>open</td> +    <td>Missing integration of direct base class relationships</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3094"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3094.html">3094</a></td> +    <td>review</td> +    <td>Rework phases for string literal concatenation and token formation</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3095"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3095.html">3095</a></td> +    <td>open</td> +    <td>Type-dependent packs that are not structured binding packs</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3096"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3096.html">3096</a></td> +    <td>open</td> +    <td>Value-dependence of size of structured binding pack with non-dependent initializer</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3097"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3097.html">3097</a></td> +    <td>tentatively ready</td> +    <td>Lambda expression introduces a scope</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3098"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3098.html">3098</a></td> +    <td>tentatively ready</td> +    <td>Remove redundancy "names or designates"</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3099"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3099.html">3099</a></td> +    <td>open</td> +    <td>Instantiation of type aliases from alias templates is unspecified</td> +    <td align="center">Not resolved</td> +  </tr> +  <tr class="open" id="3100"> +    <td><a href="https://cplusplus.github.io/CWG/issues/3100.html">3100</a></td> +    <td>open</td> +    <td>Destruction order for objects with static storage duration</td> +    <td align="center">Not resolved</td>    </tr></table>  </div> | 
