diff options
1690 files changed, 19259 insertions, 13869 deletions
diff --git a/.ci/generate_test_report_lib.py b/.ci/generate_test_report_lib.py index 36c9585..7820fbd 100644 --- a/.ci/generate_test_report_lib.py +++ b/.ci/generate_test_report_lib.py @@ -41,10 +41,12 @@ def _parse_ninja_log(ninja_log: list[str]) -> list[tuple[str, str]]:          # touch test/4.stamp          #          # index will point to the line that starts with Failed:. The progress -        # indicator is the line before this ([4/5] test/4.stamp) and contains a pretty -        # printed version of the target being built (test/4.stamp). We use this line -        # and remove the progress information to get a succinct name for the target. -        failing_action = ninja_log[index - 1].split("] ")[1] +        # indicator is sometimes the line before this ([4/5] test/4.stamp) and +        # will contain a pretty printed version of the target being built +        # (test/4.stamp) when accurate. We instead parse the failed line rather +        # than the progress indicator as the progress indicator may not be +        # aligned with the failure. +        failing_action = ninja_log[index].split("FAILED: ")[1]          failure_log = []          while (              index < len(ninja_log) diff --git a/.ci/generate_test_report_lib_test.py b/.ci/generate_test_report_lib_test.py index 431e10d..4068a3b7 100644 --- a/.ci/generate_test_report_lib_test.py +++ b/.ci/generate_test_report_lib_test.py @@ -39,7 +39,7 @@ class TestReports(unittest.TestCase):          self.assertEqual(              failures[0],              ( -                "test/4.stamp", +                "touch test/4.stamp",                  dedent(                      """\                      FAILED: touch test/4.stamp @@ -77,7 +77,7 @@ class TestReports(unittest.TestCase):          self.assertEqual(              failures[0],              ( -                "test/3.stamp", +                "touch test/3.stamp",                  dedent(                      """\                      FAILED: touch test/3.stamp @@ -106,7 +106,7 @@ class TestReports(unittest.TestCase):          self.assertEqual(              failures[0],              ( -                "test/2.stamp", +                "touch test/2.stamp",                  dedent(                      """\                      FAILED: touch test/2.stamp @@ -117,7 +117,7 @@ class TestReports(unittest.TestCase):          self.assertEqual(              failures[1],              ( -                "test/4.stamp", +                "touch test/4.stamp",                  dedent(                      """\                      FAILED: touch test/4.stamp @@ -150,7 +150,7 @@ class TestReports(unittest.TestCase):          self.assertEqual(              failures[0],              ( -                "test/2.stamp", +                "touch test/2.stamp",                  dedent(                      """\                      FAILED: touch test/2.stamp @@ -159,6 +159,34 @@ class TestReports(unittest.TestCase):              ),          ) +    # Test that we correctly handle cases where the FAILED: line does not +    # match up with the progress indicator. +    def test_ninja_log_mismatched_failed(self): +        failures = generate_test_report_lib.find_failure_in_ninja_logs( +            [ +                [ +                    "[1/5] test/1.stamp", +                    "[2/5] test/2.stamp", +                    "ModuleNotFoundError: No module named 'mount_langley'", +                    "FAILED: tools/check-langley", +                    "Wow! This system is really broken!", +                    "[5/5] test/5.stamp", +                ] +            ] +        ) +        self.assertEqual(len(failures), 1) +        self.assertEqual( +            failures[0], +            ( +                "tools/check-langley", +                dedent( +                    """\ +                    FAILED: tools/check-langley +                    Wow! This system is really broken!""" +                ), +            ), +        ) +      def test_title_only(self):          self.assertEqual(              generate_test_report_lib.generate_report("Foo", 0, [], []), @@ -448,7 +476,7 @@ class TestReports(unittest.TestCase):                      All tests passed but another part of the build **failed**. Click on a failure below to see the details.                      <details> -                    <summary>test/2.stamp</summary> +                    <summary>touch test/2.stamp</summary>                      ```                      FAILED: touch test/2.stamp @@ -456,7 +484,7 @@ class TestReports(unittest.TestCase):                      ```                      </details>                      <details> -                    <summary>test/4.stamp</summary> +                    <summary>touch test/4.stamp</summary>                      ```                      FAILED: touch test/4.stamp diff --git a/.ci/premerge_advisor_explain.py b/.ci/premerge_advisor_explain.py index 06c6cb9..94f7949 100644 --- a/.ci/premerge_advisor_explain.py +++ b/.ci/premerge_advisor_explain.py @@ -40,7 +40,9 @@ def main(commit_sha: str, build_log_files: list[str]):              explanation_request["failures"].append(                  {"name": name, "message": failure_message}              ) -    advisor_response = requests.get(PREMERGE_ADVISOR_URL, json=explanation_request) +    advisor_response = requests.get( +        PREMERGE_ADVISOR_URL, json=explanation_request, timeout=5 +    )      if advisor_response.status_code == 200:          print(advisor_response.json())      else: diff --git a/.ci/premerge_advisor_upload.py b/.ci/premerge_advisor_upload.py index cb379b0..9e14743 100644 --- a/.ci/premerge_advisor_upload.py +++ b/.ci/premerge_advisor_upload.py @@ -45,7 +45,7 @@ def main(commit_sha, workflow_run_number, build_log_files):          for name, failure_message in ninja_failures:              failure_info["failures"].append({"name": name, "message": failure_message})      for premerge_advisor_url in PREMERGE_ADVISOR_URLS: -        requests.post(premerge_advisor_url, json=failure_info) +        requests.post(premerge_advisor_url, json=failure_info, timeout=5)  if __name__ == "__main__": diff --git a/.github/workflows/build-ci-container-tooling.yml b/.github/workflows/build-ci-container-tooling.yml index c77c7861..992947e 100644 --- a/.github/workflows/build-ci-container-tooling.yml +++ b/.github/workflows/build-ci-container-tooling.yml @@ -63,7 +63,7 @@ jobs:            podman save ${{ steps.vars.outputs.container-name-lint-tag }}  >  ${{ steps.vars.outputs.container-lint-filename }}        - name: Upload container image -        uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 +        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2          with:            name: container-amd64            path: "*.tar" diff --git a/.github/workflows/check-ci.yml b/.github/workflows/check-ci.yml index f18a69c..6ecad55 100644 --- a/.github/workflows/check-ci.yml +++ b/.github/workflows/check-ci.yml @@ -28,7 +28,7 @@ jobs:        - name: Setup Python          uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0          with: -          python-version: 3.13 +          python-version: 3.14            cache: 'pip'        - name: Install Python Dependencies          run: | diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index b5f3413..7374777c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -97,7 +97,7 @@ jobs:        - name: Setup Python env          uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0          with: -          python-version: '3.13' +          python-version: '3.14'            cache: 'pip'            cache-dependency-path: 'llvm/docs/requirements-hashed.txt'        - name: Install python dependencies diff --git a/.github/workflows/gha-codeql.yml b/.github/workflows/gha-codeql.yml index 63388eb..6d490ca 100644 --- a/.github/workflows/gha-codeql.yml +++ b/.github/workflows/gha-codeql.yml @@ -29,9 +29,9 @@ jobs:            sparse-checkout: |              .github/        - name: Initialize CodeQL -        uses: github/codeql-action/init@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.30.4 +        uses: github/codeql-action/init@5d5cd550d3e189c569da8f16ea8de2d821c9bf7a # v3.31.2          with:            languages: actions            queries: security-extended        - name: Perform CodeQL Analysis -        uses: github/codeql-action/analyze@303c0aef88fc2fe5ff6d63d3b1596bfd83dfa1f9 # v3.30.4 +        uses: github/codeql-action/analyze@5d5cd550d3e189c569da8f16ea8de2d821c9bf7a # v3.31.2 diff --git a/.github/workflows/hlsl-test-all.yaml b/.github/workflows/hlsl-test-all.yaml index dcb8523..ce6ccfa 100644 --- a/.github/workflows/hlsl-test-all.yaml +++ b/.github/workflows/hlsl-test-all.yaml @@ -54,7 +54,7 @@ jobs:            path: golden-images        - name: Setup Windows          if: runner.os == 'Windows' -        uses: llvm/actions/setup-windows@main +        uses: llvm/actions/setup-windows@42d80571b13f4599bbefbc7189728b64723c7f78 # main          with:            arch: amd64        - name: Build DXC @@ -80,7 +80,7 @@ jobs:              ninja check-hlsl-unit              ninja ${{ inputs.TestTarget }}        - name: Publish Test Results -        uses: EnricoMi/publish-unit-test-result-action/macos@3a74b2957438d0b6e2e61d67b05318aa25c9e6c6 # v2.20.0 +        uses: EnricoMi/publish-unit-test-result-action/macos@34d7c956a59aed1bfebf31df77b8de55db9bbaaf # v2.21.0          if: always() && runner.os == 'macOS'          with:            comment_mode: off diff --git a/.github/workflows/libclang-abi-tests.yml b/.github/workflows/libclang-abi-tests.yml index 5ccf976..432c457 100644 --- a/.github/workflows/libclang-abi-tests.yml +++ b/.github/workflows/libclang-abi-tests.yml @@ -100,7 +100,7 @@ jobs:              repo: ${{ github.repository }}      steps:        - name: Install Ninja -        uses: llvm/actions/install-ninja@main +        uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main        - name: Install abi-compliance-checker          run: |            sudo apt-get update diff --git a/.github/workflows/libcxx-build-containers.yml b/.github/workflows/libcxx-build-containers.yml index 312cb47..4bce861 100644 --- a/.github/workflows/libcxx-build-containers.yml +++ b/.github/workflows/libcxx-build-containers.yml @@ -55,7 +55,7 @@ jobs:          TAG: ${{ github.sha }}      - name: Log in to GitHub Container Registry -      uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 +      uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0        with:          registry: ghcr.io          username: ${{ github.actor }} diff --git a/.github/workflows/libcxx-run-benchmarks.yml b/.github/workflows/libcxx-run-benchmarks.yml index 9e8f558..e2ca940 100644 --- a/.github/workflows/libcxx-run-benchmarks.yml +++ b/.github/workflows/libcxx-run-benchmarks.yml @@ -35,7 +35,7 @@ jobs:      steps:        - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0          with: -          python-version: '3.13' +          python-version: '3.14'        - name: Extract information from the PR          id: vars diff --git a/.github/workflows/llvm-abi-tests.yml b/.github/workflows/llvm-abi-tests.yml index f73d180..961f1cc 100644 --- a/.github/workflows/llvm-abi-tests.yml +++ b/.github/workflows/llvm-abi-tests.yml @@ -88,7 +88,7 @@ jobs:              repo: ${{ github.repository }}      steps:        - name: Install Ninja -        uses: llvm/actions/install-ninja@main +        uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main        - name: Install abi-compliance-checker          run: |            sudo apt-get update diff --git a/.github/workflows/llvm-bugs.yml b/.github/workflows/llvm-bugs.yml index 7d42abf..3274f1a 100644 --- a/.github/workflows/llvm-bugs.yml +++ b/.github/workflows/llvm-bugs.yml @@ -39,6 +39,12 @@ jobs:                repo: context.repo.repo              })              .then((issue) => { +              var maybeTruncatedBody = issue.data.body; +              if (maybeTruncatedBody.length > 15000) { +                maybeTruncatedBody = maybeTruncatedBody.substring(0, +                    15000) + +                  "<truncated>Please see the issue for the entire body." +              }                const payload = {                  author : issue.data.user.login,                  issue  : issue.data.number, @@ -46,7 +52,7 @@ jobs:                  url    : issue.data.html_url,                  labels : issue.data.labels.map((label) => label.name),                  assignee : issue.data.assignees.map((assignee) => assignee.login), -                body   : issue.data.body +                body   : maybeTruncatedBody                };                const data = { diff --git a/.github/workflows/new-issues.yml b/.github/workflows/new-issues.yml index 8480a65..a5dcad2 100644 --- a/.github/workflows/new-issues.yml +++ b/.github/workflows/new-issues.yml @@ -13,7 +13,7 @@ jobs:      runs-on: ubuntu-24.04      if: github.repository == 'llvm/llvm-project'      steps: -      - uses: llvm/actions/issue-labeler@main +      - uses: llvm/actions/issue-labeler@42d80571b13f4599bbefbc7189728b64723c7f78 # main          with:            repo-token: ${{ secrets.ISSUE_SUBSCRIBER_TOKEN }}            configuration-path: .github/new-issues-labeler.yml diff --git a/.github/workflows/premerge.yaml b/.github/workflows/premerge.yaml index 6303a11..973d3ab 100644 --- a/.github/workflows/premerge.yaml +++ b/.github/workflows/premerge.yaml @@ -190,7 +190,7 @@ jobs:          with:            max-size: "2000M"        - name: Install Ninja -        uses: llvm/actions/install-ninja@main +        uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main        - name: Build and Test          run: |            source <(git diff --name-only HEAD~1...HEAD | python3 .ci/compute_projects.py) diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index fa73b9d..25f426b 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -68,7 +68,7 @@ jobs:      # due to https://github.com/actions/runner-images/issues/10385      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0        with: -        python-version: '3.13' +        python-version: '3.14'      - name: Checkout LLVM        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -138,7 +138,6 @@ jobs:            target_cmake_flags="$target_cmake_flags -DLLVM_RELEASE_ENABLE_LTO=OFF"          fi -        echo "target-cmake-flags=$target_cmake_flags" >> $GITHUB_OUTPUT          case "${{ inputs.runs-on }}" in            ubuntu-22.04*)              build_runs_on="depot-${{ inputs.runs-on }}-16" @@ -157,6 +156,23 @@ jobs:              build_runs_on=$test_runs_on              ;;          esac + +        case "$build_runs_on" in +          # These runners cannot build the full release package faster than +          # the 6 hours timeout limit, so we need to use a configuration +          # that builds more quickly. +          macos-14) +            bootstrap_prefix="BOOTSTRAP" +            target_cmake_flags="$target_cmake_flags -DLLVM_RELEASE_ENABLE_LTO=OFF -DLLVM_RELEASE_ENABLE_PGO=OFF" +            ;; +          *) +            bootstrap_prefix="BOOTSTRAP_BOOTSTRAP" +            ;; +        esac + +        target_cmake_flags="$target_cmake_flags -D${bootstrap_prefix}_CPACK_PACKAGE_FILE_NAME=$release_binary_basename" + +        echo "target-cmake-flags=$target_cmake_flags" >> $GITHUB_OUTPUT          echo "build-runs-on=$build_runs_on" >> $GITHUB_OUTPUT          echo "test-runs-on=$test_runs_on" >> $GITHUB_OUTPUT @@ -173,11 +189,11 @@ jobs:          ref: ${{ needs.prepare.outputs.ref }}      - name: Install Ninja -      uses: llvm/actions/install-ninja@a1ea791b03c8e61f53a0e66f2f73db283aa0f01e # main +      uses: llvm/actions/install-ninja@42d80571b13f4599bbefbc7189728b64723c7f78 # main      - name: Setup Windows        if: startsWith(runner.os, 'Windows') -      uses: llvm/actions/setup-windows@main +      uses: llvm/actions/setup-windows@42d80571b13f4599bbefbc7189728b64723c7f78 # main        with:          arch: amd64 @@ -200,8 +216,7 @@ jobs:          # so we need to set some extra cmake flags to disable this.          cmake -G Ninja -S llvm -B ${{ steps.setup-stage.outputs.build-prefix }}/build \              ${{ needs.prepare.outputs.target-cmake-flags }} \ -            -C clang/cmake/caches/Release.cmake \ -            -DBOOTSTRAP_BOOTSTRAP_CPACK_PACKAGE_FILE_NAME="${{ needs.prepare.outputs.release-binary-basename }}" +            -C clang/cmake/caches/Release.cmake      - name: Build        shell: bash diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index c07df33..bd3277a 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -36,7 +36,7 @@ jobs:            persist-credentials: false        - name: "Run analysis" -        uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 +        uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3          with:            results_file: results.sarif            results_format: sarif diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp index a383ced..c7cd034a 100644 --- a/bolt/lib/Core/BinaryContext.cpp +++ b/bolt/lib/Core/BinaryContext.cpp @@ -778,13 +778,17 @@ void BinaryContext::populateJumpTables() {    }    if (opts::StrictMode && DataPCRelocations.size()) { -    LLVM_DEBUG({ -      dbgs() << DataPCRelocations.size() -             << " unclaimed PC-relative relocations left in data:\n"; -      for (uint64_t Reloc : DataPCRelocations) -        dbgs() << Twine::utohexstr(Reloc) << '\n'; -    }); -    assert(0 && "unclaimed PC-relative relocations left in data\n"); +    this->errs() << "BOLT-ERROR: " << DataPCRelocations.size() +                 << " unclaimed PC-relative relocation(s) left in data"; +    if (opts::Verbosity) { +      this->errs() << ":\n"; +      for (uint64_t RelocOffset : DataPCRelocations) +        this->errs() << "  @0x" << Twine::utohexstr(RelocOffset) << '\n'; +    } else { +      this->errs() << ". Re-run with -v=1 to see the list\n"; +    } +    this->errs() << "BOLT-ERROR: unable to proceed with --strict\n"; +    exit(1);    }    clearList(DataPCRelocations);  } diff --git a/bolt/test/X86/unclaimed-pc-rel.s b/bolt/test/X86/unclaimed-pc-rel.s new file mode 100644 index 0000000..5292ccc --- /dev/null +++ b/bolt/test/X86/unclaimed-pc-rel.s @@ -0,0 +1,24 @@ +## Check that unclaimed PC-relative relocation from data to code is detected +## and reported to the user. + +# REQUIRES: system-linux + +# RUN: %clang %cflags -no-pie %s -o %t.exe -Wl,-q -nostartfiles +# RUN: not llvm-bolt %t.exe -o %t.bolt --strict 2>&1 | FileCheck %s + +# CHECK: BOLT-ERROR: 1 unclaimed PC-relative relocation(s) left in data + +  .text +  .globl _start +  .type _start, %function +_start: +  movl $42, %eax +.L0: +  ret +  .size _start, .-_start + +## Force relocation mode. +  .reloc 0, R_X86_64_NONE + +  .section .rodata +  .long .L0-. diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index 7adff8a..2e21a4c4 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -24,6 +24,7 @@  #include "CopyConstructorInitCheck.h"  #include "CrtpConstructorAccessibilityCheck.h"  #include "DanglingHandleCheck.h" +#include "DefaultOperatorNewOnOveralignedTypeCheck.h"  #include "DerivedMethodShadowingBaseMethodCheck.h"  #include "DynamicStaticInitializersCheck.h"  #include "EasilySwappableParametersCheck.h" @@ -140,6 +141,8 @@ public:          "bugprone-copy-constructor-init");      CheckFactories.registerCheck<DanglingHandleCheck>(          "bugprone-dangling-handle"); +    CheckFactories.registerCheck<DefaultOperatorNewOnOveralignedTypeCheck>( +        "bugprone-default-operator-new-on-overaligned-type");      CheckFactories.registerCheck<DerivedMethodShadowingBaseMethodCheck>(          "bugprone-derived-method-shadowing-base-method");      CheckFactories.registerCheck<DynamicStaticInitializersCheck>( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index c0fdb4d..31a0e69 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -20,6 +20,7 @@ add_clang_library(clangTidyBugproneModule STATIC    CopyConstructorInitCheck.cpp    CrtpConstructorAccessibilityCheck.cpp    DanglingHandleCheck.cpp +  DefaultOperatorNewOnOveralignedTypeCheck.cpp    DerivedMethodShadowingBaseMethodCheck.cpp    DynamicStaticInitializersCheck.cpp    EasilySwappableParametersCheck.cpp diff --git a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.cpp index 45c170e..0aafdfd 100644 --- a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.cpp @@ -6,21 +6,22 @@  //  //===----------------------------------------------------------------------===// -#include "DefaultOperatorNewAlignmentCheck.h" +#include "DefaultOperatorNewOnOveralignedTypeCheck.h"  #include "clang/AST/ASTContext.h"  #include "clang/ASTMatchers/ASTMatchFinder.h"  #include "clang/Basic/TargetInfo.h"  using namespace clang::ast_matchers; -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { -void DefaultOperatorNewAlignmentCheck::registerMatchers(MatchFinder *Finder) { +void DefaultOperatorNewOnOveralignedTypeCheck::registerMatchers( +    MatchFinder *Finder) {    Finder->addMatcher(        cxxNewExpr(unless(hasAnyPlacementArg(anything()))).bind("new"), this);  } -void DefaultOperatorNewAlignmentCheck::check( +void DefaultOperatorNewOnOveralignedTypeCheck::check(      const MatchFinder::MatchResult &Result) {    // Get the found 'new' expression.    const auto *NewExpr = Result.Nodes.getNodeAs<CXXNewExpr>("new"); @@ -61,4 +62,4 @@ void DefaultOperatorNewAlignmentCheck::check(          << (SpecifiedAlignment / CharWidth);  } -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.h b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h index 8f9d0e4..b5b365b 100644 --- a/clang-tools-extra/clang-tidy/cert/DefaultOperatorNewAlignmentCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h @@ -6,21 +6,22 @@  //  //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DEFAULTOPERATORNEWALIGNMENTCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DEFAULTOPERATORNEWALIGNMENTCHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DEFAULTOPERATORNEWONOVERALIGNEDTYPECHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DEFAULTOPERATORNEWONOVERALIGNEDTYPECHECK_H  #include "../ClangTidyCheck.h" -namespace clang::tidy::cert { +namespace clang::tidy::bugprone {  /// Checks if an object of type with extended alignment is allocated by using  /// the default operator new.  ///  /// For the user-facing documentation see: -/// https://clang.llvm.org/extra/clang-tidy/checks/cert/mem57-cpp.html -class DefaultOperatorNewAlignmentCheck : public ClangTidyCheck { +/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/bugprone-default-operator-new-on-overaligned-type.html +class DefaultOperatorNewOnOveralignedTypeCheck : public ClangTidyCheck {  public: -  DefaultOperatorNewAlignmentCheck(StringRef Name, ClangTidyContext *Context) +  DefaultOperatorNewOnOveralignedTypeCheck(StringRef Name, +                                           ClangTidyContext *Context)        : ClangTidyCheck(Name, Context) {}    bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {      return !LangOpts.CPlusPlus17; @@ -29,6 +30,6 @@ public:    void check(const ast_matchers::MatchFinder::MatchResult &Result) override;  }; -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DEFAULTOPERATORNEWALIGNMENTCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DEFAULTOPERATORNEWONOVERALIGNEDTYPECHECK_H diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index fa1eb4a..d517977 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -11,6 +11,7 @@  #include "../ClangTidyModuleRegistry.h"  #include "../bugprone/BadSignalToKillThreadCheck.h"  #include "../bugprone/CommandProcessorCheck.h" +#include "../bugprone/DefaultOperatorNewOnOveralignedTypeCheck.h"  #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h"  #include "../bugprone/RawMemoryCallOnNonTrivialTypeCheck.h"  #include "../bugprone/ReservedIdentifierCheck.h" @@ -35,7 +36,6 @@  #include "../performance/MoveConstructorInitCheck.h"  #include "../readability/EnumInitialValueCheck.h"  #include "../readability/UppercaseLiteralSuffixCheck.h" -#include "DefaultOperatorNewAlignmentCheck.h"  #include "DontModifyStdNamespaceCheck.h"  #include "FloatLoopCounter.h"  #include "LimitedRandomnessCheck.h" @@ -265,8 +265,9 @@ public:      CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(          "cert-err61-cpp");      // MEM -    CheckFactories.registerCheck<DefaultOperatorNewAlignmentCheck>( -        "cert-mem57-cpp"); +    CheckFactories +        .registerCheck<bugprone::DefaultOperatorNewOnOveralignedTypeCheck>( +            "cert-mem57-cpp");      // MSC      CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc50-cpp");      CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>( diff --git a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt index ce57faa..db3b2f5 100644 --- a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt @@ -5,7 +5,6 @@ set(LLVM_LINK_COMPONENTS  add_clang_library(clangTidyCERTModule STATIC    CERTTidyModule.cpp -  DefaultOperatorNewAlignmentCheck.cpp    DontModifyStdNamespaceCheck.cpp    FloatLoopCounter.cpp    LimitedRandomnessCheck.cpp diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp index 06165df..faa00d2 100644 --- a/clang-tools-extra/clangd/Selection.cpp +++ b/clang-tools-extra/clangd/Selection.cpp @@ -958,6 +958,18 @@ private:          claimRange(SourceRange(FTL.getLParenLoc(), FTL.getEndLoc()), Result);          return;        } +      if (auto ATL = TL->getAs<AttributedTypeLoc>()) { +        // For attributed function types like `int foo() [[attr]]`, the +        // AttributedTypeLoc's range includes the function name. We want to +        // allow the function name to be associated with the FunctionDecl +        // rather than the AttributedTypeLoc, so we only claim the attribute +        // range itself. +        if (ATL.getModifiedLoc().getAs<FunctionTypeLoc>()) { +          // Only claim the attribute's source range, not the whole type. +          claimRange(ATL.getLocalSourceRange(), Result); +          return; +        } +      }      }      claimRange(getSourceRange(N), Result);    } diff --git a/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp b/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp index 16febec..b557066 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/OverridePureVirtuals.cpp @@ -79,7 +79,7 @@  #include "clang/AST/ASTContext.h"  #include "clang/AST/DeclCXX.h" -#include "clang/AST/Type.h" +#include "clang/AST/TypeBase.h"  #include "clang/AST/TypeLoc.h"  #include "clang/Basic/LLVM.h"  #include "clang/Basic/SourceLocation.h" @@ -116,7 +116,8 @@ std::string removePureVirtualSyntax(const std::string &MethodDecl,      DeclString += Tk.text();      if (Tk.Kind != tok::l_paren && Next.Kind != tok::comma && -        Next.Kind != tok::r_paren && Next.Kind != tok::l_paren) +        Next.Kind != tok::r_paren && Next.Kind != tok::l_paren && +        Tk.Kind != tok::coloncolon && Next.Kind != tok::coloncolon)        DeclString += ' ';    }    // Trim the last whitespace. diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 3df19d8..63c0403 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -311,6 +311,19 @@ TEST(SelectionTest, CommonAncestor) {        {"[[void foo^()]];", "FunctionProtoTypeLoc"},        {"[[^void foo^()]];", "FunctionDecl"},        {"[[void ^foo()]];", "FunctionDecl"}, +      // Tricky case: with function attributes, the AttributedTypeLoc's range +      // includes the function name, but we want the name to be associated with +      // the CXXMethodDecl. +      {"struct X { [[const int* ^Get() const <:[clang::lifetimebound]:> " +       "{return nullptr;}]]; };", +       "CXXMethodDecl"}, +      // When the cursor is on the attribute itself, we should select the +      // AttributedTypeLoc. Note: Due to a bug or deliberate quirk in the AST +      // modeling of AttributedTypeLoc, its range ends at the attribute name +      // token, not including the closing brackets ":>:>". +      {"struct X { const [[int* Foo() const <:<:clang::life^timebound]]:>:> " +       "{return nullptr;}; };", +       "AttributedTypeLoc"},        // Tricky case: two VarDecls share a specifier.        {"[[int ^a]], b;", "VarDecl"},        {"[[int a, ^b]];", "VarDecl"}, diff --git a/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp index b7dcbee..72095ab 100644 --- a/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/OverridePureVirtualsTests.cpp @@ -715,6 +715,45 @@ public:    EXPECT_EQ(Expected, Applied) << "Applied result:\n" << Applied;  } +TEST_F(OverridePureVirtualsTests, QualifiedNames) { +  constexpr auto Before = R"cpp( +namespace foo { struct S{}; namespace bar { struct S2{}; } } + +class B { +public: +  virtual foo::S foo(int var = 0) = 0; +  virtual foo::bar::S2 bar(int var = 0) = 0; +}; + +class ^D : public B {}; +)cpp"; + +  constexpr auto Expected = R"cpp( +namespace foo { struct S{}; namespace bar { struct S2{}; } } + +class B { +public: +  virtual foo::S foo(int var = 0) = 0; +  virtual foo::bar::S2 bar(int var = 0) = 0; +}; + +class D : public B { +public: +  foo::S foo(int var = 0) override { +    // TODO: Implement this pure virtual method. +    static_assert(false, "Method `foo` is not implemented."); +  } + +  foo::bar::S2 bar(int var = 0) override { +    // TODO: Implement this pure virtual method. +    static_assert(false, "Method `bar` is not implemented."); +  } +}; +)cpp"; +  auto Applied = apply(Before); +  EXPECT_EQ(Expected, Applied) << "Applied result:\n" << Applied; +} +  } // namespace  } // namespace clangd  } // namespace clang diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index f4eeb3e..26f00e9 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -264,6 +264,11 @@ New check aliases    <clang-tidy/checks/bugprone/throwing-static-initialization>`    keeping initial check as an alias to the new one. +- Renamed :doc:`cert-mem57-cpp <clang-tidy/checks/cert/mem57-cpp>` to +  :doc:`bugprone-default-operator-new-on-overaligned-type +  <clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type>` +  keeping initial check as an alias to the new one. +  - Renamed :doc:`cert-oop57-cpp <clang-tidy/checks/cert/oop57-cpp>` to    :doc:`bugprone-raw-memory-call-on-non-trivial-type    <clang-tidy/checks/bugprone/raw-memory-call-on-non-trivial-type>` @@ -374,7 +379,8 @@ Changes in existing checks    <clang-tidy/checks/misc/const-correctness>` check to avoid false    positives when pointers is transferred to non-const references    and avoid false positives of function pointer and fix false -  positives on return of non-const pointer. +  positives on return of non-const pointer and fix false positives on +  pointer-to-member operator.  - Improved :doc:`misc-header-include-cycle    <clang-tidy/checks/misc/header-include-cycle>` check performance. diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst new file mode 100644 index 0000000..c991812 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/default-operator-new-on-overaligned-type.rst @@ -0,0 +1,20 @@ +.. title:: clang-tidy - bugprone-default-operator-new-on-overaligned-type + +bugprone-default-operator-new-on-overaligned-type +================================================= + +Flags uses of default ``operator new`` where the type has extended +alignment (an alignment greater than the fundamental alignment). + +The default ``operator new`` is guaranteed to provide the correct alignment +if the requested alignment is less or equal to the fundamental alignment. +Only cases are detected (by design) where the ``operator new`` is not +user-defined and is not a placement new (the reason is that in these cases we +assume that the user provided the correct memory allocation). + +References +---------- + +This check corresponds to the CERT C++ Coding Standard rule +`MEM57-CPP. Avoid using default operator new for over-aligned types +<https://wiki.sei.cmu.edu/confluence/display/cplusplus/MEM57-CPP.+Avoid+using+default+operator+new+for+over-aligned+types>`_. diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst index 135cfb8..cc0c729 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/mem57-cpp.rst @@ -3,13 +3,9 @@  cert-mem57-cpp  ============== -This check flags uses of default ``operator new`` where the type has extended -alignment (an alignment greater than the fundamental alignment). (The default -``operator new`` is guaranteed to provide the correct alignment if the -requested alignment is less or equal to the fundamental alignment). -Only cases are detected (by design) where the ``operator new`` is not -user-defined and is not a placement new (the reason is that in these cases we -assume that the user provided the correct memory allocation). +The `cert-mem57-cpp` is an aliaes, please see +`bugprone-default-operator-new-on-overaligned-type <../bugprone/default-operator-new-on-overaligned-type>`_ +for more information.  This check corresponds to the CERT C++ Coding Standard rule  `MEM57-CPP. Avoid using default operator new for over-aligned types diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index c7a922a..e14ac71 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -92,6 +92,7 @@ Clang-Tidy Checks     :doc:`bugprone-copy-constructor-init <bugprone/copy-constructor-init>`, "Yes"     :doc:`bugprone-crtp-constructor-accessibility <bugprone/crtp-constructor-accessibility>`, "Yes"     :doc:`bugprone-dangling-handle <bugprone/dangling-handle>`, +   :doc:`bugprone-default-operator-new-on-overaligned-type <bugprone/default-operator-new-on-overaligned-type>`,     :doc:`bugprone-derived-method-shadowing-base-method <bugprone/derived-method-shadowing-base-method>`,     :doc:`bugprone-dynamic-static-initializers <bugprone/dynamic-static-initializers>`,     :doc:`bugprone-easily-swappable-parameters <bugprone/easily-swappable-parameters>`, @@ -178,7 +179,6 @@ Clang-Tidy Checks     :doc:`cert-err33-c <cert/err33-c>`,     :doc:`cert-err60-cpp <cert/err60-cpp>`,     :doc:`cert-flp30-c <cert/flp30-c>`, -   :doc:`cert-mem57-cpp <cert/mem57-cpp>`,     :doc:`cert-msc50-cpp <cert/msc50-cpp>`,     :doc:`cert-msc51-cpp <cert/msc51-cpp>`,     :doc:`cert-oop58-cpp <cert/oop58-cpp>`, @@ -452,6 +452,7 @@ Check aliases     :doc:`cert-fio38-c <cert/fio38-c>`, :doc:`misc-non-copyable-objects <misc/non-copyable-objects>`,     :doc:`cert-flp37-c <cert/flp37-c>`, :doc:`bugprone-suspicious-memory-comparison <bugprone/suspicious-memory-comparison>`,     :doc:`cert-int09-c <cert/int09-c>`, :doc:`readability-enum-initial-value <readability/enum-initial-value>`, "Yes" +   :doc:`cert-mem57-cpp <cert/mem57-cpp>`, :doc:`bugprone-default-operator-new-on-overaligned-type <bugprone/default-operator-new-on-overaligned-type>`,     :doc:`cert-msc24-c <cert/msc24-c>`, :doc:`bugprone-unsafe-functions <bugprone/unsafe-functions>`,     :doc:`cert-msc30-c <cert/msc30-c>`, :doc:`cert-msc50-cpp <cert/msc50-cpp>`,     :doc:`cert-msc32-c <cert/msc32-c>`, :doc:`cert-msc51-cpp <cert/msc51-cpp>`, diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp new file mode 100644 index 0000000..b05108c --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type-cpp17.cpp @@ -0,0 +1,12 @@ +// RUN: %check_clang_tidy %s -std=c++14 bugprone-default-operator-new-on-overaligned-type %t +// RUN: clang-tidy -checks='-*,bugprone-default-operator-new-on-overaligned-type' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation +// RUN: clang-tidy -checks='-*,bugprone-default-operator-new-on-overaligned-type' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation + +struct alignas(128) Vector { +  char Elems[128]; +}; + +void f() { +  auto *V1 = new Vector;        // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type] +  auto *V1_Arr = new Vector[2]; // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type] +} diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type.cpp index e0300e3..379d8a2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/default-operator-new-on-overaligned-type.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s -std=c++14 cert-mem57-cpp %t +// RUN: %check_clang_tidy %s -std=c++14 bugprone-default-operator-new-on-overaligned-type %t  namespace std {  typedef __typeof(sizeof(int)) size_t; @@ -30,10 +30,10 @@ struct alignas(8) Vector4 {  void f() {    auto *V1 = new Vector1; -  // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp] +  // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type]    auto *V2 = new Vector2;    auto *V3 = new Vector3;    auto *V4 = new Vector4;    auto *V1_Arr = new Vector1[2]; -  // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp] +  // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [bugprone-default-operator-new-on-overaligned-type]  } diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp b/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp deleted file mode 100644 index 38ffcbd..0000000 --- a/clang-tools-extra/test/clang-tidy/checkers/cert/mem57-cpp-cpp17.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// RUN: %check_clang_tidy %s -std=c++14 cert-mem57-cpp %t -// RUN: clang-tidy -checks='-*,cert-mem57-cpp' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation -// RUN: clang-tidy -checks='-*,cert-mem57-cpp' --extra-arg=-Wno-unused-variable --warnings-as-errors='*' %s -- -std=c++17 -faligned-allocation - -struct alignas(128) Vector { -  char Elems[128]; -}; - -void f() { -  auto *V1 = new Vector;        // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp] -  auto *V1_Arr = new Vector[2]; // CHECK-MESSAGES: warning: allocation function returns a pointer with alignment {{[0-9]+}} but the over-aligned type being allocated requires alignment 128 [cert-mem57-cpp] -} diff --git a/clang-tools-extra/test/pp-trace/pp-trace-include.cpp b/clang-tools-extra/test/pp-trace/pp-trace-include.cpp index ea9896e..fccbd9b 100644 --- a/clang-tools-extra/test/pp-trace/pp-trace-include.cpp +++ b/clang-tools-extra/test/pp-trace/pp-trace-include.cpp @@ -39,7 +39,6 @@  // CHECK-NEXT:   Reason: EnterFile  // CHECK-NEXT:   FileType: C_User  // CHECK-NEXT:   PrevFID: (invalid) -// CHECK:      - Callback: MacroDefined  // CHECK:      - Callback: FileChanged  // CHECK-NEXT:   Loc: "<built-in>:1:1"  // CHECK-NEXT:   Reason: ExitFile diff --git a/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp b/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp index 7c2a231..5bd38e0 100644 --- a/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp +++ b/clang-tools-extra/test/pp-trace/pp-trace-macro.cpp @@ -40,7 +40,6 @@ X  // CHECK-NEXT:   MacroNameTok: __STDC_EMBED_EMPTY__  // CHECK-NEXT:   MacroDirective: MD_Define  // CHECK:      - Callback: MacroDefined -// CHECK:      - Callback: MacroDefined  // CHECK-NEXT:   MacroNameTok: MACRO  // CHECK-NEXT:   MacroDirective: MD_Define  // CHECK-NEXT: - Callback: MacroExpands diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index 495f2ab..baa0bbb 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -385,7 +385,9 @@ Builtin Macros  ``__COUNTER__``    Defined to an integer value that starts at zero and is incremented each time -  the ``__COUNTER__`` macro is expanded. +  the ``__COUNTER__`` macro is expanded. This is a standard feature in C2y but +  is an extension in earlier language modes and in C++. This macro can only be +  expanded 2147483647 times at most.  ``__INCLUDE_LEVEL__``    Defined to an integral value that is the include depth of the file currently @@ -1821,6 +1823,7 @@ Octal literals prefixed with ``0o`` or ``0O``                                  C  ``_Countof`` (N3369, N3469)                                                    C2y           C89  ``_Generic`` with a type operand (N3260)                                       C2y           C89, C++  ``++``/``--`` on ``_Complex`` value (N3259)                                    C2y           C89, C++ +``__COUNTER__`` (N3457)                                                        C2y           C89, C++  ============================================= ================================ ============= =============  Builtin type aliases diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 92fc938..db695d8 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -196,6 +196,11 @@ C2y Feature Support    function or variable within an extern inline function is no longer a    constraint per `WG14 N3622 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3622.txt>`_.  - Clang now supports `N3355 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3355.htm>`_ Named Loops. +- Clang's implementation of ``__COUNTER__`` was updated to conform to +  `WG14 N3457 <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3457.htm>`_. +  This includes adding pedantic warnings for the feature being an extension in +  other language modes as well as an error when the counter is expanded more +  than 2147483647 times.  C23 Feature Support  ^^^^^^^^^^^^^^^^^^^ @@ -350,7 +355,7 @@ Improvements to Clang's diagnostics    potential misaligned members get processed before they can get discarded.    (#GH144729) -- Clang now emits dignostic with correct message in case of assigning to const reference captured in lambda. (#GH105647) +- Clang now emits a diagnostic with the correct message in case of assigning to const reference captured in lambda. (#GH105647)  - Fixed false positive in ``-Wmissing-noreturn`` diagnostic when it was requiring the usage of    ``[[noreturn]]`` on lambdas before C++23 (#GH154493). @@ -390,6 +395,9 @@ Improvements to Clang's diagnostics    that were previously incorrectly accepted in case of other irrelevant    conditions are now consistently diagnosed, identical to C++ mode. +- Clang now emits a diagnostic in case `vector_size` or `ext_vector_type` +  attributes are used with a negative size (#GH165463). +  Improvements to Clang's time-trace  ---------------------------------- @@ -452,6 +460,7 @@ Bug Fixes to Attribute Support  - Fix a crash when the function name is empty in the `swift_name` attribute. (#GH157075)  - Fixes crashes or missing diagnostics with the `device_kernel` attribute. (#GH161905)  - Fix handling of parameter indexes when an attribute is applied to a C++23 explicit object member function. +- Fixed several false positives and false negatives in function effect (`nonblocking`) analysis. (#GH166078) (#GH166101) (#GH166110)  Bug Fixes to C++ Support  ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -466,7 +475,7 @@ Bug Fixes to C++ Support    casts that are guaranteed to fail (#GH137518).  - Fix bug rejecting partial specialization of variable templates with auto NTTPs (#GH118190).  - Fix a crash if errors "member of anonymous [...] redeclares" and -  "intializing multiple members of union" coincide (#GH149985). +  "initializing multiple members of union" coincide (#GH149985).  - Fix a crash when using ``explicit(bool)`` in pre-C++11 language modes. (#GH152729)  - Fix the parsing of variadic member functions when the ellipis immediately follows a default argument.(#GH153445)  - Fixed a bug that caused ``this`` captured by value in a lambda with a dependent explicit object parameter to not be diff --git a/clang/include/clang/AST/APNumericStorage.h b/clang/include/clang/AST/APNumericStorage.h index e1948a5..0442408 100644 --- a/clang/include/clang/AST/APNumericStorage.h +++ b/clang/include/clang/AST/APNumericStorage.h @@ -41,9 +41,8 @@ protected:    llvm::APInt getIntValue() const {      unsigned NumWords = llvm::APInt::getNumWords(BitWidth);      if (NumWords > 1) -      return llvm::APInt(BitWidth, NumWords, pVal); -    else -      return llvm::APInt(BitWidth, VAL); +      return llvm::APInt(BitWidth, llvm::ArrayRef(pVal, NumWords)); +    return llvm::APInt(BitWidth, VAL);    }    void setIntValue(const ASTContext &C, const llvm::APInt &Val);  }; diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 0d187eb4..064a342 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -173,7 +173,7 @@ public:      llvm::SmallVector<uint64_t, 4> data;      for (uint32_t i = 0; i != numWords; ++i)        data.push_back(asImpl().readUInt64()); -    return llvm::APInt(bitWidth, numWords, &data[0]); +    return llvm::APInt(bitWidth, data);    }    llvm::FixedPointSemantics readFixedPointSemantics() { diff --git a/clang/include/clang/Basic/DebugOptions.def b/clang/include/clang/Basic/DebugOptions.def index a768b12..ea3636f 100644 --- a/clang/include/clang/Basic/DebugOptions.def +++ b/clang/include/clang/Basic/DebugOptions.def @@ -46,6 +46,8 @@ ENUM_DEBUGOPT(EmitDwarfUnwind, EmitDwarfUnwindType, 2,  DEBUGOPT(NoDwarfDirectoryAsm , 1, 0, Benign) ///< Set when -fno-dwarf-directory-asm                                               ///< is enabled. +DEBUGOPT(Dwarf2CFIAsm, 1, 0, NotCompatible) ///< Set when -fdwarf2-cfi-asm is enabled. +  DEBUGOPT(NoInlineLineTables, 1, 0, Benign) ///< Whether debug info should contain                                             ///< inline line tables. diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index c7fe6e1d..4171872 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -90,6 +90,14 @@ def err_unterminated___pragma : Error<"missing terminating ')' character">;  def err_conflict_marker : Error<"version control conflict marker in file">; +def err_counter_overflow : Error< +  "'__COUNTER__' value cannot exceed 2'147'483'647">; +def ext_counter : Extension< +  "'__COUNTER__' is a C2y extension">, InGroup<C2y>; +def warn_counter : Warning< +  "'__COUNTER__' is incompatible with standards before C2y">, +  InGroup<CPre2yCompat>, DefaultIgnore; +  def err_raw_delim_too_long : Error<    "raw string delimiter longer than 16 characters"    "; use PREFIX( )PREFIX to delimit raw string">; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4e369be..fa50953 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3510,6 +3510,8 @@ def err_init_method_bad_return_type : Error<    "init methods must return an object pointer type, not %0">;  def err_attribute_invalid_size : Error<    "vector size not an integral multiple of component size">; +def err_attribute_vec_negative_size +    : Error<"vector must have non-negative size">;  def err_attribute_zero_size : Error<"zero %0 size">;  def err_attribute_size_too_large : Error<"%0 size too large">;  def err_typecheck_sve_rvv_ambiguous : Error< diff --git a/clang/include/clang/Basic/riscv_sifive_vector.td b/clang/include/clang/Basic/riscv_sifive_vector.td index 89e644a..0371279 100644 --- a/clang/include/clang/Basic/riscv_sifive_vector.td +++ b/clang/include/clang/Basic/riscv_sifive_vector.td @@ -121,6 +121,13 @@ multiclass RVVVQMACCQOQBuiltinSet<list<list<string>> suffixes_prototypes> {      defm NAME : RVVOutOp1Op2BuiltinSet<NAME, "s", suffixes_prototypes>;  } +multiclass RVVVFEXPBuiltinSet<list<list<string>> suffixes_prototypes, string type_range> { +  let UnMaskedPolicyScheme = HasPassthruOperand, +      OverloadedName = NAME, +      Log2LMUL = [-2, -1, 0, 1, 2, 3] in +    defm NAME : RVVOutBuiltinSet<NAME, type_range, suffixes_prototypes>; +} +  multiclass RVVVFNRCLIPBuiltinSet<string suffix, string prototype, string type_range> {    let Log2LMUL = [-3, -2, -1, 0, 1, 2],        Name = NAME, @@ -145,6 +152,26 @@ let UnMaskedPolicyScheme = HasPolicyOperand in      defm sf_vqmaccsu_4x8x4 : RVVVQMACCQOQBuiltinSet<[["", "w", "ww(FixedSEW:8)Sv(FixedSEW:8)Uv"]]>;    } +let RequiredFeatures = ["xsfvfbfexp16e"] in { +  defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "y">; +} + +let RequiredFeatures = ["xsfvfexp16e"] in { +  defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "x">; +} + +let RequiredFeatures = ["xsfvfexp32e"] in { +  defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "f">; +} + +let RequiredFeatures = ["xsfvfexpa"] in { +  defm sf_vfexpa : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "xf">; +} + +let RequiredFeatures = ["xsfvfexpa64e"] in { +  defm sf_vfexpa : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "d">; +} +  let UnMaskedPolicyScheme = HasPolicyOperand in    let RequiredFeatures = ["xsfvfwmaccqqq"] in      defm sf_vfwmacc_4x4x4 : RVVVFWMACCBuiltinSet<[["", "Fw", "FwFwSvv"]]>; diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 2b361ed..dc56db1 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4171,6 +4171,16 @@ def CIR_ATanOp : CIR_UnaryFPToFPBuiltinOp<"atan", "ATanOp"> {    }];  } +def CIR_CeilOp : CIR_UnaryFPToFPBuiltinOp<"ceil", "FCeilOp"> { +  let summary = "Computes the ceiling of the specified value"; +  let description = [{ +    `cir.ceil` computes the ceiling of a given value and returns a result +    of the same type. + +    Floating-point exceptions are ignored, and it does not set `errno`. +  }]; +} +  def CIR_CosOp : CIR_UnaryFPToFPBuiltinOp<"cos", "CosOp"> {    let summary = "Computes the floating-point cosine value";    let description = [{ diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6e1c942..11e81e0 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -741,6 +741,7 @@ def gcc_toolchain : Joined<["--"], "gcc-toolchain=">, Flags<[NoXarchOption]>,      "Specify a directory where Flang can find 'lib{,32,64}/gcc{,-cross}/$triple/$version'. "      "Flang will use the GCC installation with the largest version">;  def gcc_triple_EQ : Joined<["--"], "gcc-triple=">, +  Visibility<[ClangOption, FlangOption]>,    HelpText<"Search for the GCC installation with the specified triple.">;  def CC : Flag<["-"], "CC">, Visibility<[ClangOption, CC1Option]>,    Group<Preprocessor_Group>, @@ -950,9 +951,9 @@ def Xarch__    the host system, which can be used to suppress incompatible GPU arguments.}]>,        MetaVarName<"<arch> <arg>">;  def Xarch_host : Separate<["-"], "Xarch_host">, Flags<[NoXarchOption]>, -  HelpText<"Pass <arg> to the CUDA/HIP host compilation">, MetaVarName<"<arg>">; +  HelpText<"Pass <arg> to host compilation in the offloading toolchain">, MetaVarName<"<arg>">;  def Xarch_device : Separate<["-"], "Xarch_device">, Flags<[NoXarchOption]>, -  HelpText<"Pass <arg> to the CUDA/HIP device compilation">, MetaVarName<"<arg>">; +  HelpText<"Pass <arg> to device compilation in the offloading toolchain">, MetaVarName<"<arg>">;  def Xassembler : Separate<["-"], "Xassembler">,    HelpText<"Pass <arg> to the assembler">, MetaVarName<"<arg>">,    Group<CompileOnly_Group>; @@ -2154,8 +2155,12 @@ defm dollars_in_identifiers : BoolFOption<"dollars-in-identifiers",    PosFlag<SetTrue, [], [ClangOption], "Allow">,    NegFlag<SetFalse, [], [ClangOption], "Disallow">,    BothFlags<[], [ClangOption, CC1Option], " '$' in identifiers">>; -def fdwarf2_cfi_asm : Flag<["-"], "fdwarf2-cfi-asm">, Group<clang_ignored_f_Group>; -def fno_dwarf2_cfi_asm : Flag<["-"], "fno-dwarf2-cfi-asm">, Group<clang_ignored_f_Group>; + +defm dwarf2_cfi_asm +    : BoolFOption<"dwarf2-cfi-asm", CodeGenOpts<"Dwarf2CFIAsm">, DefaultFalse, +                  PosFlag<SetTrue, [], [ClangOption, CC1Option]>, +                  NegFlag<SetFalse>>; +  defm dwarf_directory_asm : BoolFOption<"dwarf-directory-asm",    CodeGenOpts<"NoDwarfDirectoryAsm">, DefaultFalse,    NegFlag<SetTrue, [], [ClangOption, CC1Option]>, @@ -8445,6 +8450,10 @@ def aligned_alloc_unavailable : Flag<["-"], "faligned-alloc-unavailable">,    MarshallingInfoFlag<LangOpts<"AlignedAllocationUnavailable">>,    ShouldParseIf<faligned_allocation.KeyPath>; +def finitial_counter_value_EQ : Joined<["-"], "finitial-counter-value=">, +  HelpText<"Sets the initial value for __COUNTER__, defaults to 0.">, +  MarshallingInfoInt<PreprocessorOpts<"InitialCounterValue">, "0">; +  } // let Visibility = [CC1Option]  //===----------------------------------------------------------------------===// diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 3975484..4120022 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -226,7 +226,7 @@ class Preprocessor {        LangOptions::FPEvalMethodKind::FEM_UnsetOnCommandLine;    // Next __COUNTER__ value, starts at 0. -  unsigned CounterValue = 0; +  uint32_t CounterValue = 0;    enum {      /// Maximum depth of \#includes. @@ -2421,8 +2421,8 @@ public:    bool SawDateOrTime() const {      return DATELoc != SourceLocation() || TIMELoc != SourceLocation();    } -  unsigned getCounterValue() const { return CounterValue; } -  void setCounterValue(unsigned V) { CounterValue = V; } +  uint32_t getCounterValue() const { return CounterValue; } +  void setCounterValue(uint32_t V) { CounterValue = V; }    LangOptions::FPEvalMethodKind getCurrentFPEvalMethod() const {      assert(CurrentFPEvalMethod != LangOptions::FEM_UnsetOnCommandLine && diff --git a/clang/include/clang/Lex/PreprocessorOptions.h b/clang/include/clang/Lex/PreprocessorOptions.h index d4c4e1c..1c2f6e7 100644 --- a/clang/include/clang/Lex/PreprocessorOptions.h +++ b/clang/include/clang/Lex/PreprocessorOptions.h @@ -198,6 +198,10 @@ public:    /// If set, the UNIX timestamp specified by SOURCE_DATE_EPOCH.    std::optional<uint64_t> SourceDateEpoch; +  /// The initial value for __COUNTER__; typically is zero but can be set via a +  /// -cc1 flag for testing purposes. +  uint32_t InitialCounterValue = 0; +  public:    PreprocessorOptions() : PrecompiledPreambleBytes(0, false) {} diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index af856a80..4ca45a1 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -220,8 +220,8 @@ public:    }    /// Receives __COUNTER__ value. -  virtual void ReadCounter(const serialization::ModuleFile &M, -                           unsigned Value) {} +  virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) { +  }    /// This is called for each AST file loaded.    virtual void visitModuleFile(StringRef Filename, @@ -312,7 +312,7 @@ public:                                 bool Complain,                                 std::string &SuggestedPredefines) override; -  void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override; +  void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;    bool needsInputFileVisitation() override;    bool needsSystemInputFileVisitation() override;    void visitModuleFile(StringRef Filename, @@ -352,7 +352,7 @@ public:                                 StringRef ModuleFilename,                                 StringRef SpecificModuleCachePath,                                 bool Complain) override; -  void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override; +  void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override;  };  /// ASTReaderListenter implementation to set SuggestedPredefines of diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h index 4aee165..66da799 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h @@ -372,12 +372,10 @@ public:    ProgramPoint getProgramPoint(bool IsPreVisit = false,                                 const ProgramPointTag *Tag = nullptr) const; -  /// Returns a new state with all argument regions invalidated. -  /// -  /// This accepts an alternate state in case some processing has already -  /// occurred. +  /// Invalidates the regions (arguments, globals, special regions like 'this') +  /// that may have been written by this call, returning the updated state.    ProgramStateRef invalidateRegions(unsigned BlockCount, -                                    ProgramStateRef Orig = nullptr) const; +                                    ProgramStateRef State) const;    using FrameBindingTy = std::pair<SVal, SVal>;    using BindingsTy = SmallVectorImpl<FrameBindingTy>; diff --git a/clang/lib/AST/ByteCode/Floating.h b/clang/lib/AST/ByteCode/Floating.h index 659892e..cc918dc 100644 --- a/clang/lib/AST/ByteCode/Floating.h +++ b/clang/lib/AST/ByteCode/Floating.h @@ -45,7 +45,8 @@ private:      if (singleWord())        return APFloat(getSemantics(), APInt(BitWidth, Val));      unsigned NumWords = numWords(); -    return APFloat(getSemantics(), APInt(BitWidth, NumWords, Memory)); +    return APFloat(getSemantics(), +                   APInt(BitWidth, llvm::ArrayRef(Memory, NumWords)));    }  public: diff --git a/clang/lib/AST/ByteCode/IntegralAP.h b/clang/lib/AST/ByteCode/IntegralAP.h index 6683db9..b11e6ee 100644 --- a/clang/lib/AST/ByteCode/IntegralAP.h +++ b/clang/lib/AST/ByteCode/IntegralAP.h @@ -63,7 +63,7 @@ public:      if (singleWord())        return APInt(BitWidth, Val, Signed);      unsigned NumWords = llvm::APInt::getNumWords(BitWidth); -    return llvm::APInt(BitWidth, NumWords, Memory); +    return llvm::APInt(BitWidth, llvm::ArrayRef(Memory, NumWords));    }  public: diff --git a/clang/lib/Analysis/ExprMutationAnalyzer.cpp b/clang/lib/Analysis/ExprMutationAnalyzer.cpp index 75b17c54..54c30c0 100644 --- a/clang/lib/Analysis/ExprMutationAnalyzer.cpp +++ b/clang/lib/Analysis/ExprMutationAnalyzer.cpp @@ -746,11 +746,14 @@ ExprMutationAnalyzer::Analyzer::findPointeeMemberMutation(const Expr *Exp) {                      Stm, Context));    if (MemberCallExpr)      return MemberCallExpr; -  const auto Matches = -      match(stmt(forEachDescendant( -                memberExpr(hasObjectExpression(canResolveToExprPointee(Exp))) -                    .bind(NodeID<Expr>::value))), -            Stm, Context); +  const auto Matches = match( +      stmt(forEachDescendant( +          expr(anyOf(memberExpr( +                         hasObjectExpression(canResolveToExprPointee(Exp))), +                     binaryOperator(hasOperatorName("->*"), +                                    hasLHS(canResolveToExprPointee(Exp))))) +              .bind(NodeID<Expr>::value))), +      Stm, Context);    return findExprMutation(Matches);  } diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 938c648..97aa0f2 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -907,19 +907,23 @@ getExpansionLocSlowCase(SourceLocation Loc) const {  SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {    do { -    FileIDAndOffset LocInfo = getDecomposedLoc(Loc); -    Loc = getSLocEntry(LocInfo.first).getExpansion().getSpellingLoc(); -    Loc = Loc.getLocWithOffset(LocInfo.second); +    const SLocEntry &Entry = getSLocEntry(getFileID(Loc)); +    Loc = Entry.getExpansion().getSpellingLoc().getLocWithOffset( +        Loc.getOffset() - Entry.getOffset());    } while (!Loc.isFileID());    return Loc;  }  SourceLocation SourceManager::getFileLocSlowCase(SourceLocation Loc) const {    do { -    if (isMacroArgExpansion(Loc)) -      Loc = getImmediateSpellingLoc(Loc); -    else -      Loc = getImmediateExpansionRange(Loc).getBegin(); +    const SLocEntry &Entry = getSLocEntry(getFileID(Loc)); +    const ExpansionInfo &ExpInfo = Entry.getExpansion(); +    if (ExpInfo.isMacroArgExpansion()) { +      Loc = ExpInfo.getSpellingLoc().getLocWithOffset(Loc.getOffset() - +                                                      Entry.getOffset()); +    } else { +      Loc = ExpInfo.getExpansionLocStart(); +    }    } while (!Loc.isFileID());    return Loc;  } diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index e35100f..d9b9e3b 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -211,6 +211,17 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,      assert(!cir::MissingFeatures::fastMathFlags());      return emitUnaryMaybeConstrainedFPBuiltin<cir::CosOp>(*this, *e); +  case Builtin::BIceil: +  case Builtin::BIceilf: +  case Builtin::BIceill: +  case Builtin::BI__builtin_ceil: +  case Builtin::BI__builtin_ceilf: +  case Builtin::BI__builtin_ceilf16: +  case Builtin::BI__builtin_ceill: +  case Builtin::BI__builtin_ceilf128: +    assert(!cir::MissingFeatures::fastMathFlags()); +    return emitUnaryMaybeConstrainedFPBuiltin<cir::CeilOp>(*this, *e); +    case Builtin::BIfabs:    case Builtin::BIfabsf:    case Builtin::BIfabsl: diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 5a6193f..d941082 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -1336,6 +1336,14 @@ mlir::LogicalResult CIRToLLVMATanOpLowering::matchAndRewrite(    return mlir::success();  } +mlir::LogicalResult CIRToLLVMCeilOpLowering::matchAndRewrite( +    cir::CeilOp op, OpAdaptor adaptor, +    mlir::ConversionPatternRewriter &rewriter) const { +  mlir::Type resTy = typeConverter->convertType(op.getType()); +  rewriter.replaceOpWithNewOp<mlir::LLVM::FCeilOp>(op, resTy, adaptor.getSrc()); +  return mlir::success(); +} +  mlir::LogicalResult CIRToLLVMAllocaOpLowering::matchAndRewrite(      cir::AllocaOp op, OpAdaptor adaptor,      mlir::ConversionPatternRewriter &rewriter) const { diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d3ab6f1..30d3e52 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7879,10 +7879,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,                         !TC.getTriple().isAndroid() && TC.useIntegratedAs()))      CmdArgs.push_back("-faddrsig"); -  if ((Triple.isOSBinFormatELF() || Triple.isOSBinFormatMachO()) && +  const bool HasDefaultDwarf2CFIASM = +      (Triple.isOSBinFormatELF() || Triple.isOSBinFormatMachO()) &&        (EH || UnwindTables || AsyncUnwindTables || -       DebugInfoKind != llvm::codegenoptions::NoDebugInfo)) -    CmdArgs.push_back("-D__GCC_HAVE_DWARF2_CFI_ASM=1"); +       DebugInfoKind != llvm::codegenoptions::NoDebugInfo); +  if (Args.hasFlag(options::OPT_fdwarf2_cfi_asm, +                   options::OPT_fno_dwarf2_cfi_asm, HasDefaultDwarf2CFIASM)) +    CmdArgs.push_back("-fdwarf2-cfi-asm");    if (Arg *A = Args.getLastArg(options::OPT_fsymbol_partition_EQ)) {      std::string Str = A->getAsString(Args); diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index ab32938..a9ea5ec 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -318,14 +318,21 @@ void FormatTokenLexer::tryMergePreviousTokens() {                             {tok::equal, tok::greater},                             {tok::star, tok::greater},                             {tok::pipeequal, tok::greater}, -                           {tok::pipe, tok::arrow}, -                           {tok::hash, tok::minus, tok::hash}, -                           {tok::hash, tok::equal, tok::hash}}, +                           {tok::pipe, tok::arrow}},                            TT_BinaryOperator) ||          Tokens.back()->is(tok::arrow)) {        Tokens.back()->ForcedPrecedence = prec::Comma;        return;      } +    if (Tokens.size() >= 3 && +        Tokens[Tokens.size() - 3]->is(Keywords.kw_verilogHash) && +        Tokens[Tokens.size() - 2]->isOneOf(tok::minus, tok::equal) && +        Tokens[Tokens.size() - 1]->is(Keywords.kw_verilogHash) && +        tryMergeTokens(3, TT_BinaryOperator)) { +      Tokens.back()->setFinalizedType(TT_BinaryOperator); +      Tokens.back()->ForcedPrecedence = prec::Comma; +      return; +    }    } else if (Style.isTableGen()) {      // TableGen's Multi line string starts with [{      if (tryMergeTokens({tok::l_square, tok::l_brace}, diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 8e227da..cb41756c 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -358,11 +358,11 @@ private:        Contexts.back().IsExpression = false;      } else if (OpeningParen.Previous &&                 (OpeningParen.Previous->isOneOf( -                    tok::kw_static_assert, tok::kw_noexcept, tok::kw_explicit, -                    tok::kw_while, tok::l_paren, tok::comma, TT_CastRParen, +                    tok::kw_noexcept, tok::kw_explicit, tok::kw_while, +                    tok::l_paren, tok::comma, TT_CastRParen,                      TT_BinaryOperator) ||                  OpeningParen.Previous->isIf())) { -      // static_assert, if and while usually contain expressions. +      // if and while usually contain expressions.        Contexts.back().IsExpression = true;      } else if (Style.isJavaScript() && OpeningParen.Previous &&                 (OpeningParen.Previous->is(Keywords.kw_function) || @@ -454,6 +454,11 @@ private:      if (StartsObjCSelector)        OpeningParen.setType(TT_ObjCSelector); +    const bool IsStaticAssert = +        PrevNonComment && PrevNonComment->is(tok::kw_static_assert); +    if (IsStaticAssert) +      Contexts.back().InStaticAssertFirstArgument = true; +      // MightBeFunctionType and ProbablyFunctionType are used for      // function pointer and reference types as well as Objective-C      // block types: @@ -583,8 +588,12 @@ private:        }        // When we discover a 'new', we set CanBeExpression to 'false' in order to        // parse the type correctly. Reset that after a comma. -      if (CurrentToken->is(tok::comma)) -        Contexts.back().CanBeExpression = true; +      if (CurrentToken->is(tok::comma)) { +        if (IsStaticAssert) +          Contexts.back().InStaticAssertFirstArgument = false; +        else +          Contexts.back().CanBeExpression = true; +      }        if (Style.isTableGen()) {          if (CurrentToken->is(tok::comma)) { @@ -2144,6 +2153,7 @@ private:      bool CaretFound = false;      bool InCpp11AttributeSpecifier = false;      bool InCSharpAttributeSpecifier = false; +    bool InStaticAssertFirstArgument = false;      bool VerilogAssignmentFound = false;      // Whether the braces may mean concatenation instead of structure or array      // literal. @@ -2440,7 +2450,8 @@ private:      } else if (Current.isPointerOrReference()) {        Current.setType(determineStarAmpUsage(            Current, -          Contexts.back().CanBeExpression && Contexts.back().IsExpression, +          (Contexts.back().CanBeExpression && Contexts.back().IsExpression) || +              Contexts.back().InStaticAssertFirstArgument,            Contexts.back().ContextType == Context::TemplateArgument));      } else if (Current.isOneOf(tok::minus, tok::plus, tok::caret) ||                 (Style.isVerilog() && Current.is(tok::pipe))) { diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp index f24b8ab..406c77c 100644 --- a/clang/lib/Format/WhitespaceManager.cpp +++ b/clang/lib/Format/WhitespaceManager.cpp @@ -591,7 +591,8 @@ static unsigned AlignTokens(const FormatStyle &Style, F &&Matches,        CurrentChangeWidthRight = CurrentChange.TokenLength;      const FormatToken *MatchingParenToEncounter = nullptr;      for (unsigned J = I + 1; -         J != E && (Changes[J].NewlinesBefore == 0 || MatchingParenToEncounter); +         J != E && (Changes[J].NewlinesBefore == 0 || +                    MatchingParenToEncounter || Changes[J].IsAligned);           ++J) {        const auto &Change = Changes[J];        const auto *Tok = Change.Tok; diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 6cc7094..1169acb 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -518,14 +518,14 @@ class ASTInfoCollector : public ASTReaderListener {    LangOptions &LangOpts;    CodeGenOptions &CodeGenOpts;    TargetOptions &TargetOpts; -  unsigned &Counter; +  uint32_t &Counter;  public:    ASTInfoCollector(HeaderSearchOptions &HSOpts,                     std::string &SpecificModuleCachePath,                     PreprocessorOptions &PPOpts, LangOptions &LangOpts,                     CodeGenOptions &CodeGenOpts, TargetOptions &TargetOpts, -                   unsigned &Counter) +                   uint32_t &Counter)        : HSOpts(HSOpts), SpecificModuleCachePath(SpecificModuleCachePath),          PPOpts(PPOpts), LangOpts(LangOpts), CodeGenOpts(CodeGenOpts),          TargetOpts(TargetOpts), Counter(Counter) {} @@ -577,7 +577,7 @@ public:    }    void ReadCounter(const serialization::ModuleFile &M, -                   unsigned NewCounter) override { +                   uint32_t NewCounter) override {      Counter = NewCounter;    }  }; diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 8602be1..b88d9f8 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1516,6 +1516,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    if (LangOpts.PointerAuthIntrinsics)      Builder.defineMacro("__PTRAUTH__"); +  if (CGOpts.Dwarf2CFIAsm) +    Builder.defineMacro("__GCC_HAVE_DWARF2_CFI_ASM"); +    // Get other target #defines.    TI.getTargetDefines(LangOpts, Builder);  } @@ -1542,6 +1545,9 @@ void clang::InitializePreprocessor(Preprocessor &PP,    llvm::raw_string_ostream Predefines(PredefineBuffer);    MacroBuilder Builder(Predefines); +  // Ensure that the initial value of __COUNTER__ is hooked up. +  PP.setCounterValue(InitOpts.InitialCounterValue); +    // Emit line markers for various builtin sections of the file. The 3 here    // marks <built-in> as being a system header, which suppresses warnings when    // the same macro is defined multiple times. diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index aea3e72..1003218 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -349,14 +349,13 @@ private:  /// When the source code line we want to print is too long for  /// the terminal, select the "interesting" region. -static void selectInterestingSourceRegion(std::string &SourceLine, -                                          std::string &CaretLine, -                                          std::string &FixItInsertionLine, -                                          Columns NonGutterColumns, -                                          const SourceColumnMap &Map) { -  Columns CaretColumns = Columns(CaretLine.size()); -  Columns FixItColumns = -      Columns(llvm::sys::locale::columnWidth(FixItInsertionLine)); +static void selectInterestingSourceRegion( +    std::string &SourceLine, std::string &CaretLine, +    std::string &FixItInsertionLine, Columns NonGutterColumns, +    const SourceColumnMap &Map, +    SmallVectorImpl<clang::TextDiagnostic::StyleRange> &Styles) { +  Columns CaretColumns = CaretLine.size(); +  Columns FixItColumns = 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 @@ -369,13 +368,11 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    // Find the slice that we need to display the full caret line    // correctly.    Columns CaretStart = 0, CaretEnd = CaretLine.size(); -  for (; CaretStart != CaretEnd; CaretStart = CaretStart.next()) -    if (!isWhitespace(CaretLine[CaretStart.V])) -      break; +  while (CaretStart != CaretEnd && isWhitespace(CaretLine[CaretStart.V])) +    CaretStart = CaretStart.next(); -  for (; CaretEnd != CaretStart; CaretEnd = CaretEnd.prev()) -    if (!isWhitespace(CaretLine[CaretEnd.V - 1])) -      break; +  while (CaretEnd != CaretStart && isWhitespace(CaretLine[CaretEnd.V])) +    CaretEnd = CaretEnd.prev();    // caret has already been inserted into CaretLine so the above whitespace    // check is guaranteed to include the caret @@ -516,13 +513,45 @@ static void selectInterestingSourceRegion(std::string &SourceLine,    assert(FrontColumnsRemoved + ColumnsKept + BackColumnsRemoved >           NonGutterColumns); +  // Since we've modified the SourceLine, we also need to adjust the line's +  // highlighting information. In particular, if we've removed +  // from the front of the line, we need to move the style ranges to the +  // left and remove unneeded ranges. +  // Note in particular that variables like CaretEnd are defined in the +  // CaretLine, which only contains ASCII, while the style ranges are defined in +  // the source line, where we have to care for the byte-index != column-index +  // case. +  Bytes BytesRemoved = +      FrontColumnsRemoved > FrontEllipse.size() +          ? (Map.columnToByte(FrontColumnsRemoved) - Bytes(FrontEllipse.size())) +          : 0; +  Bytes CodeEnd = +      CaretEnd < Map.columns() ? Map.columnToByte(CaretEnd.V) : CaretEnd.V; +  for (TextDiagnostic::StyleRange &R : Styles) { +    // Remove style ranges before and after the new truncated snippet. +    if (R.Start >= static_cast<unsigned>(CodeEnd.V) || +        R.End < static_cast<unsigned>(BytesRemoved.V)) { +      R.Start = R.End = std::numeric_limits<int>::max(); +      continue; +    } +    // Move them left. (Note that this can wrap R.Start, but that doesn't +    // matter). +    R.Start -= BytesRemoved.V; +    R.End -= BytesRemoved.V; + +    // Don't leak into the ellipse at the end. +    if (R.Start < static_cast<unsigned>(CodeEnd.V) && +        R.End > static_cast<unsigned>(CodeEnd.V)) +      R.End = CodeEnd.V + 1; // R.End is inclusive. +  } +    // The line needs some truncation, and we'd prefer to keep the front    //  if possible, so remove the back    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(NonGutterColumns)) +  if (FrontColumnsRemoved + ColumnsKept <= NonGutterColumns)      return;    // Otherwise remove the front as well @@ -1391,6 +1420,11 @@ void TextDiagnostic::emitSnippetAndCaret(        OS.indent(MaxLineNoDisplayWidth + 2) << "| ";    }; +  Columns MessageLength = DiagOpts.MessageLength; +  // If we don't have enough columns available, just abort now. +  if (MessageLength != 0 && MessageLength <= Columns(MaxLineNoDisplayWidth + 4)) +    return; +    // Prepare source highlighting information for the lines we're about to    // emit, starting from the first line.    std::unique_ptr<SmallVector<StyleRange>[]> SourceStyles = @@ -1450,10 +1484,14 @@ void TextDiagnostic::emitSnippetAndCaret(      // If the source line is too long for our terminal, select only the      // "interesting" source region within that line. -    Columns MessageLength = DiagOpts.MessageLength; -    if (MessageLength.V != 0) +    if (MessageLength != 0) { +      Columns NonGutterColumns = MessageLength; +      if (MaxLineNoDisplayWidth != 0) +        NonGutterColumns -= Columns(MaxLineNoDisplayWidth + 4);        selectInterestingSourceRegion(SourceLine, CaretLine, FixItInsertionLine, -                                    MessageLength, SourceColMap); +                                    NonGutterColumns, SourceColMap, +                                    SourceStyles[LineNo - Lines.first]); +    }      // If we are in -fdiagnostics-print-source-range-info mode, we are trying      // to produce easily machine parsable output.  Add a space before the @@ -1508,7 +1546,7 @@ void TextDiagnostic::emitSnippet(StringRef SourceLine,    // Print the source line one character at a time.    bool PrintReversed = false;    std::optional<llvm::raw_ostream::Colors> CurrentColor; -  size_t I = 0; +  size_t I = 0; // Bytes.    while (I < SourceLine.size()) {      auto [Str, WasPrintable] =          printableTextForNextCharacter(SourceLine, &I, DiagOpts.TabStop); diff --git a/clang/lib/Headers/module.modulemap b/clang/lib/Headers/module.modulemap index 2e4d533..c13dd3f 100644 --- a/clang/lib/Headers/module.modulemap +++ b/clang/lib/Headers/module.modulemap @@ -253,6 +253,11 @@ module _Builtin_stdbool [system] {    export *  } +module _Builtin_stdckdint [system] { +  header "stdckdint.h" +  export * +} +  module _Builtin_stdcountof [system] {    header "stdcountof.h"    export * diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 637a08f..b8202ea 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -258,6 +258,7 @@ static bool isBuiltinHeaderName(StringRef FileName) {             .Case("stdarg.h", true)             .Case("stdatomic.h", true)             .Case("stdbool.h", true) +           .Case("stdckdint.h", true)             .Case("stdcountof.h", true)             .Case("stddef.h", true)             .Case("stdint.h", true) diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index dd80ae5..5efa4b5 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -1735,7 +1735,19 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) {        Diag(getLastFPEvalPragmaLocation(), diag::note_pragma_entered_here);      }    } else if (II == Ident__COUNTER__) { -    // __COUNTER__ expands to a simple numeric value. +    Diag(Tok.getLocation(), +         getLangOpts().C2y ? diag::warn_counter : diag::ext_counter); +    // __COUNTER__ expands to a simple numeric value that must be less than +    // 2147483647. +    constexpr uint32_t MaxPosValue = std::numeric_limits<int32_t>::max(); +    if (CounterValue > MaxPosValue) { +      Diag(Tok.getLocation(), diag::err_counter_overflow); +      // Retain the maximal value so we don't issue conversion-related +      // diagnostics by overflowing into a long long. While this does produce +      // a duplicate value, there's no way to ignore this error so there's no +      // translation anyway. +      CounterValue = MaxPosValue; +    }      OS << CounterValue++;      Tok.setKind(tok::numeric_constant);    } else if (II == Ident__has_feature) { diff --git a/clang/lib/Sema/SemaFunctionEffects.cpp b/clang/lib/Sema/SemaFunctionEffects.cpp index 8590ee8..4b63eb7 100644 --- a/clang/lib/Sema/SemaFunctionEffects.cpp +++ b/clang/lib/Sema/SemaFunctionEffects.cpp @@ -1208,8 +1208,16 @@ private:          return true;        } -      // No Decl, just an Expr. Just check based on its type. -      checkIndirectCall(Call, CalleeExpr->getType()); +      // No Decl, just an Expr. Just check based on its type. Bound member +      // functions are a special expression type and need to be specially +      // unpacked. +      QualType CalleeExprQT = CalleeExpr->getType(); +      if (CalleeExpr->isBoundMemberFunction(Outer.S.getASTContext())) { +        QualType QT = Expr::findBoundMemberType(CalleeExpr); +        if (!QT.isNull()) +          CalleeExprQT = QT; +      } +      checkIndirectCall(Call, CalleeExprQT);        return true;      } @@ -1271,7 +1279,15 @@ private:        const CXXConstructorDecl *Ctor = Construct->getConstructor();        CallableInfo CI(*Ctor);        followCall(CI, Construct->getLocation()); +      return true; +    } +    bool VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *BTE) override { +      const CXXDestructorDecl *Dtor = BTE->getTemporary()->getDestructor(); +      if (Dtor != nullptr) { +        CallableInfo CI(*Dtor); +        followCall(CI, BTE->getBeginLoc()); +      }        return true;      } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 280b3c9..c483930 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2358,6 +2358,11 @@ QualType Sema::BuildVectorType(QualType CurType, Expr *SizeExpr,      return QualType();    } +  if (VecSize->isNegative()) { +    Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size); +    return QualType(); +  } +    if (CurType->isDependentType())      return Context.getDependentVectorType(CurType, SizeExpr, AttrLoc,                                            VectorKind::Generic); @@ -2394,7 +2399,7 @@ QualType Sema::BuildVectorType(QualType CurType, Expr *SizeExpr,                                 VectorKind::Generic);  } -QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize, +QualType Sema::BuildExtVectorType(QualType T, Expr *SizeExpr,                                    SourceLocation AttrLoc) {    // Unlike gcc's vector_size attribute, we do not allow vectors to be defined    // in conjunction with complex types (pointers, arrays, functions, etc.). @@ -2417,35 +2422,40 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,        BIT && CheckBitIntElementType(*this, AttrLoc, BIT))      return QualType(); -  if (!ArraySize->isTypeDependent() && !ArraySize->isValueDependent()) { -    std::optional<llvm::APSInt> vecSize = -        ArraySize->getIntegerConstantExpr(Context); -    if (!vecSize) { +  if (!SizeExpr->isTypeDependent() && !SizeExpr->isValueDependent()) { +    std::optional<llvm::APSInt> VecSize = +        SizeExpr->getIntegerConstantExpr(Context); +    if (!VecSize) {        Diag(AttrLoc, diag::err_attribute_argument_type) -        << "ext_vector_type" << AANT_ArgumentIntegerConstant -        << ArraySize->getSourceRange(); +          << "ext_vector_type" << AANT_ArgumentIntegerConstant +          << SizeExpr->getSourceRange(); +      return QualType(); +    } + +    if (VecSize->isNegative()) { +      Diag(SizeExpr->getExprLoc(), diag::err_attribute_vec_negative_size);        return QualType();      } -    if (!vecSize->isIntN(32)) { +    if (!VecSize->isIntN(32)) {        Diag(AttrLoc, diag::err_attribute_size_too_large) -          << ArraySize->getSourceRange() << "vector"; +          << SizeExpr->getSourceRange() << "vector";        return QualType();      }      // Unlike gcc's vector_size attribute, the size is specified as the      // number of elements, not the number of bytes. -    unsigned vectorSize = static_cast<unsigned>(vecSize->getZExtValue()); +    unsigned VectorSize = static_cast<unsigned>(VecSize->getZExtValue()); -    if (vectorSize == 0) { +    if (VectorSize == 0) {        Diag(AttrLoc, diag::err_attribute_zero_size) -          << ArraySize->getSourceRange() << "vector"; +          << SizeExpr->getSourceRange() << "vector";        return QualType();      } -    return Context.getExtVectorType(T, vectorSize); +    return Context.getExtVectorType(T, VectorSize);    } -  return Context.getDependentSizedExtVectorType(T, ArraySize, AttrLoc); +  return Context.getDependentSizedExtVectorType(T, SizeExpr, AttrLoc);  }  QualType Sema::BuildMatrixType(QualType ElementTy, Expr *NumRows, Expr *NumCols, diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index e3106f8d..d552821 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -225,7 +225,7 @@ bool ChainedASTReaderListener::ReadPreprocessorOptions(  }  void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, -                                           unsigned Value) { +                                           uint32_t Value) {    First->ReadCounter(M, Value);    Second->ReadCounter(M, Value);  } @@ -973,7 +973,7 @@ bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,        PP.getPreprocessorOpts());  } -void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { +void PCHValidator::ReadCounter(const ModuleFile &M, uint32_t Value) {    PP.setCounterValue(Value);  } diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 70baab5..ec7ef23 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -6,41 +6,45 @@  //  //===----------------------------------------------------------------------===//  // -// This file defines a variety of memory management related checkers, such as +// This file defines checkers that report memory management errors such as  // leak, double free, and use-after-free.  // -// The following checkers are defined here: +// The logic for modeling memory allocations is implemented in the checker +// family which is called 'MallocChecker' for historical reasons. (This name is +// inaccurate, something like 'DynamicMemory' would be more precise.)  // -//   * MallocChecker -//       Despite its name, it models all sorts of memory allocations and -//       de- or reallocation, including but not limited to malloc, free, -//       relloc, new, delete. It also reports on a variety of memory misuse -//       errors. -//       Many other checkers interact very closely with this checker, in fact, -//       most are merely options to this one. Other checkers may register -//       MallocChecker, but do not enable MallocChecker's reports (more details -//       to follow around its field, ChecksEnabled). -//       It also has a boolean "Optimistic" checker option, which if set to true -//       will cause the checker to model user defined memory management related -//       functions annotated via the attribute ownership_takes, ownership_holds -//       and ownership_returns. +// The reports produced by this backend are exposed through several frontends: +//  *   MallocChecker: reports all misuse of dynamic memory allocated by +//      malloc, related functions (like calloc, realloc etc.) and the functions +//      annotated by ownership_returns. (Here the name "MallocChecker" is +//      reasonably accurate; don't confuse this checker frontend with the whole +//      misnamed family.) +//  *   NewDeleteChecker: reports most misuse (anything but memory leaks) of +//      memory managed by the C++ operators new and new[]. +//  *   NewDeleteLeaksChecker: reports leaks of dynamic memory allocated by +//      the C++ operators new and new[]. +//  *   MismatchedDeallocatorChecker: reports situations where the allocation +//      and deallocation is mismatched, e.g. memory allocated via malloc is +//      passed to operator delete. +//  *   InnerPointerChecker: reports use of pointers to the internal buffer of +//      a std::string instance after operations that invalidate them. +//  *   TaintedAllocChecker: reports situations where the size argument of a +//      memory allocation function or array new operator is tainted (i.e. comes +//      from an untrusted source and can be controlled by an attacker).  // -//   * NewDeleteChecker -//       Enables the modeling of new, new[], delete, delete[] in MallocChecker, -//       and checks for related double-free and use-after-free errors. +// In addition to these frontends this file also defines the registration +// functions for "unix.DynamicMemoryModeling". This registers the callbacks of +// the checker family MallocChecker without enabling any of the frontends and +// and handle two checker options which are attached to this "modeling +// checker" because they affect multiple checker frontends.  // -//   * NewDeleteLeaksChecker -//       Checks for leaks related to new, new[], delete, delete[]. -//       Depends on NewDeleteChecker. -// -//   * MismatchedDeallocatorChecker -//       Enables checking whether memory is deallocated with the corresponding -//       allocation function in MallocChecker, such as malloc() allocated -//       regions are only freed by free(), new by delete, new[] by delete[]. -// -//  InnerPointerChecker interacts very closely with MallocChecker, but unlike -//  the above checkers, it has it's own file, hence the many InnerPointerChecker -//  related headers and non-static functions. +// Note that what the users see as the checker "cplusplus.InnerPointer" is a +// combination of the frontend InnerPointerChecker (within this family) which +// emits the bug reports and a separate checker class (also named +// InnerPointerChecker) which is defined in InnerPointerChecker.cpp and does a +// significant part of the modeling. This cooperation is enabled by several +// non-static helper functions that are defined within this translation unit +// and used in InnerPointerChecker.cpp.  //  //===----------------------------------------------------------------------===// diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index 62460cc..d04c827 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -230,13 +230,11 @@ static void findPtrToConstParams(llvm::SmallSet<unsigned, 4> &PreserveArgs,  }  ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount, -                                             ProgramStateRef Orig) const { -  ProgramStateRef Result = (Orig ? Orig : getState()); - +                                             ProgramStateRef State) const {    // Don't invalidate anything if the callee is marked pure/const. -  if (const Decl *callee = getDecl()) -    if (callee->hasAttr<PureAttr>() || callee->hasAttr<ConstAttr>()) -      return Result; +  if (const Decl *Callee = getDecl()) +    if (Callee->hasAttr<PureAttr>() || Callee->hasAttr<ConstAttr>()) +      return State;    SmallVector<SVal, 8> ValuesToInvalidate;    RegionAndSymbolInvalidationTraits ETraits; @@ -278,10 +276,10 @@ ProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,    // Invalidate designated regions using the batch invalidation API.    // NOTE: Even if RegionsToInvalidate is empty, we may still invalidate    //  global variables. -  return Result->invalidateRegions(ValuesToInvalidate, getCFGElementRef(), -                                   BlockCount, getLocationContext(), -                                   /*CausedByPointerEscape*/ true, -                                   /*Symbols=*/nullptr, this, &ETraits); +  return State->invalidateRegions(ValuesToInvalidate, getCFGElementRef(), +                                  BlockCount, getLocationContext(), +                                  /*CausedByPointerEscape*/ true, +                                  /*Symbols=*/nullptr, this, &ETraits);  }  ProgramPoint CallEvent::getProgramPoint(bool IsPreVisit, diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index 75d7e26..00e3ef8 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp @@ -1013,7 +1013,7 @@ void ExprEngine::VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred,      // FIXME: Once we figure out how we want allocators to work,      // we should be using the usual pre-/(default-)eval-/post-call checkers      // here. -    State = Call->invalidateRegions(blockCount); +    State = Call->invalidateRegions(blockCount, State);      if (!State)        return; diff --git a/clang/test/AST/ByteCode/cxx11.cpp b/clang/test/AST/ByteCode/cxx11.cpp index 427d3a1..e283a7b 100644 --- a/clang/test/AST/ByteCode/cxx11.cpp +++ b/clang/test/AST/ByteCode/cxx11.cpp @@ -374,7 +374,7 @@ namespace GH150709 {  namespace DiscardedAddrLabel {    void foo(void) {    L: -    *&&L; // both-error {{indirection not permitted}} \ +    *&&L; // both-error {{indirection not permitted on operand of type 'void *'}} \            // both-warning {{expression result unused}}    }  } diff --git a/clang/test/C/C2y/n3457.c b/clang/test/C/C2y/n3457.c new file mode 100644 index 0000000..d71a3f3 --- /dev/null +++ b/clang/test/C/C2y/n3457.c @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 -verify=ext -std=c23 -pedantic %s +// RUN: %clang_cc1 -verify=ext -pedantic -x c++ %s +// RUN: %clang_cc1 -verify=pre -std=c2y -pedantic -Wpre-c2y-compat %s + +/* WG14 N3457: Clang 22 + * The __COUNTER__ predefined macro + * + * This predefined macro was supported as an extension in earlier versions of + * Clang, but the required diagnostics for the limits were not added until 22. + */ + +// Ensure that __COUNTER__ starts from 0. +static_assert(__COUNTER__ == 0); /* ext-warning {{'__COUNTER__' is a C2y extension}} +                                    pre-warning {{'__COUNTER__' is incompatible with standards before C2y}} +                                  */ + +// Ensure that the produced value can be used with token concatenation. +#define CAT_IMPL(a, b) a ## b +#define CAT(a, b) CAT_IMPL(a, b) +#define NAME_WITH_COUNTER(a) CAT(a, __COUNTER__) +void test() { +  // Because this is the 2nd expansion, this defines test1. +  int NAME_WITH_COUNTER(test); /* ext-warning {{'__COUNTER__' is a C2y extension}} +                                  pre-warning {{'__COUNTER__' is incompatible with standards before C2y}} +                                */ +  int other_test = test1;      // Ok +} + +// Ensure that __COUNTER__ increments each time you mention it. +static_assert(__COUNTER__ == 2); /* ext-warning {{'__COUNTER__' is a C2y extension}} +                                    pre-warning {{'__COUNTER__' is incompatible with standards before C2y}} +                                 */ +static_assert(__COUNTER__ == 3); /* ext-warning {{'__COUNTER__' is a C2y extension}} +                                    pre-warning {{'__COUNTER__' is incompatible with standards before C2y}} +                                 */ +static_assert(__COUNTER__ == 4); /* ext-warning {{'__COUNTER__' is a C2y extension}} +                                    pre-warning {{'__COUNTER__' is incompatible with standards before C2y}} +                                 */ diff --git a/clang/test/C/C2y/n3457_1.c b/clang/test/C/C2y/n3457_1.c new file mode 100644 index 0000000..76c5a0b --- /dev/null +++ b/clang/test/C/C2y/n3457_1.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -verify -std=c2y -finitial-counter-value=2147483646 %s + +// The value produced needs to be a type that's representable with a signed +// long. However, the actual type it expands to does *not* need to be forced to +// be signed long because that would generally mean suffixing the value with L, +// which would be very surprising for folks using this to generate unique ids. +// We'll test this by ensuring the largest value can be expanded properly and +// an assertion that signed long is always at least four bytes wide (which is +// what's required to represent that maximal value). +// +// So we set the initial counter value to 2147483646, we'll validate that, +// increment it once to get to the maximal value and ensure there's no +// diagnostic, then increment again to ensure we get the constraint violation. + +static_assert(__COUNTER__ == 2147483646); // Test and increment +static_assert(__COUNTER__ == 2147483647); // Test and increment + +// This one should fail. +signed long i = __COUNTER__; // expected-error {{'__COUNTER__' value cannot exceed 2'147'483'647}} + diff --git a/clang/test/C/C2y/n3457_2.c b/clang/test/C/C2y/n3457_2.c new file mode 100644 index 0000000..018c8f4 --- /dev/null +++ b/clang/test/C/C2y/n3457_2.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -verify=good -std=c2y -finitial-counter-value=2147483648 %s +// RUN: %clang_cc1 -verify -std=c2y -finitial-counter-value=2147483648 -DEXPAND_IT %s +// good-no-diagnostics + +// This sets the intial __COUNTER__ value to something that's too big. Setting +// the value too large is fine. Expanding to a too-large value is not. +#ifdef EXPAND_IT +  // This one should fail. +  signed long i = __COUNTER__; // expected-error {{'__COUNTER__' value cannot exceed 2'147'483'647}} +#endif diff --git a/clang/test/CIR/CodeGen/builtins-floating-point.c b/clang/test/CIR/CodeGen/builtins-floating-point.c index 193cc172..8bdc43c 100644 --- a/clang/test/CIR/CodeGen/builtins-floating-point.c +++ b/clang/test/CIR/CodeGen/builtins-floating-point.c @@ -7,14 +7,21 @@  float cosf(float f) {    return __builtin_cosf(f); -  // CHECK: %{{.*}} = cir.cos {{.*}} : !cir.float +  // CIR: %{{.*}} = cir.cos %{{.*}} : !cir.float    // LLVM: %{{.*}} = call float @llvm.cos.f32(float %{{.*}})    // OGCG: %{{.*}} = call float @llvm.cos.f32(float %{{.*}})  }  double cos(double f) {    return __builtin_cos(f); -  // CIR: {{.+}} = cir.cos {{.+}} : !cir.double +  // CIR: %{{.*}} = cir.cos %{{.*}} : !cir.double    // LLVM: %{{.*}} = call double @llvm.cos.f64(double %{{.*}})    // OGCG: %{{.*}} = call double @llvm.cos.f64(double %{{.*}})  } + +float ceil(float f) { +  return __builtin_ceilf(f); +  // CIR: %{{.*}} = cir.ceil %{{.*}} : !cir.float +  // LLVM: %{{.*}} = call float @llvm.ceil.f32(float %{{.*}}) +  // OGCG: %{{.*}} = call float @llvm.ceil.f32(float %{{.*}}) +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c new file mode 100644 index 0000000..a0d5845 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_16.c @@ -0,0 +1,131 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4(vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2(vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1(vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m1(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2(vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4(vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8(vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m8(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_f16mf4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_f16mf2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2, +                                     size_t vl) { +  return __riscv_sf_vfexp_v_f16m1_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_m( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m8_m(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c new file mode 100644 index 0000000..25d0991 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_32.c @@ -0,0 +1,111 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +xsfvfexp32e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2(vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32mf2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1(vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m1(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2(vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4(vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8(vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m8(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_f32mf2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2, +                                     size_t vl) { +  return __riscv_sf_vfexp_v_f32m1_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2, +                                     size_t vl) { +  return __riscv_sf_vfexp_v_f32m2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m8_m(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c new file mode 100644 index 0000000..9fc332a --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexp_v_bf.c @@ -0,0 +1,135 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4( +// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4(vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2( +// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2(vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1( +// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1(vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m1(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2( +// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2(vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4( +// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4(vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8( +// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8(vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m8(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_m(vbool64_t vm, vbfloat16mf4_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_m(vbool32_t vm, vbfloat16mf2_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_m(vbool16_t vm, vbfloat16m1_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_bf16m1_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_m(vbool8_t vm, vbfloat16m2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_bf16m2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_m(vbool4_t vm, vbfloat16m4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_bf16m4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_m( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_m(vbool2_t vm, vbfloat16m8_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp_v_bf16m8_m(vm, vs2, vl); +} + diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c new file mode 100644 index 0000000..67a9220 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v.c @@ -0,0 +1,234 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexpa -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4(vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2(vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1(vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m1(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2(vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4(vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8(vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m8(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2(vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32mf2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1(vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m1(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2(vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4(vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8(vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m8(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa_v_f16m1_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_m( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m8_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexpa_v_f32mf2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa_v_f32m1_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa_v_f32m2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m8_m(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c new file mode 100644 index 0000000..fd6f82d --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/non-overloaded/sf_vfexpa_v_64.c @@ -0,0 +1,90 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \ +// RUN:   -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1( +// CHECK-RV64-SAME: <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1(vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m1(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2( +// CHECK-RV64-SAME: <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2(vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m2(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4( +// CHECK-RV64-SAME: <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4(vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m4(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8( +// CHECK-RV64-SAME: <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8(vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m8(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_m(vbool64_t vm, vfloat64m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa_v_f64m1_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_m(vbool32_t vm, vfloat64m2_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa_v_f64m2_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_m(vbool16_t vm, vfloat64m4_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa_v_f64m4_m(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_m(vbool8_t vm, vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m8_m(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c new file mode 100644 index 0000000..0e769ed --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_16.c @@ -0,0 +1,131 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4(vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2(vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1(vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2(vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4(vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8(vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2, +                                     size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_m( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c new file mode 100644 index 0000000..3df1eaa --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_32.c @@ -0,0 +1,111 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +xsfvfexp32e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2(vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1(vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2(vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4(vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8(vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2, +                                     size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2, +                                     size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c new file mode 100644 index 0000000..6179dbe --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexp_v_bf.c @@ -0,0 +1,134 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4( +// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4(vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2( +// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2(vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1( +// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1(vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2( +// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2(vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4( +// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4(vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8( +// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8(vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_m(vbool64_t vm, vbfloat16mf4_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_m(vbool32_t vm, vbfloat16mf2_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_m(vbool16_t vm, vbfloat16m1_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_m(vbool8_t vm, vbfloat16m2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_m(vbool4_t vm, vbfloat16m4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_m( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> poison, <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_m(vbool2_t vm, vbfloat16m8_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexp(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c new file mode 100644 index 0000000..1ddbb0b --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v.c @@ -0,0 +1,234 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexpa -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4(vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2(vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1(vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2(vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4(vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8(vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2(vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1(vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2(vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4(vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8(vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_m( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_m( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c new file mode 100644 index 0000000..165879a --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/non-policy/overloaded/sf_vfexpa_v_64.c @@ -0,0 +1,90 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \ +// RUN:   -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1( +// CHECK-RV64-SAME: <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1(vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2( +// CHECK-RV64-SAME: <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2(vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4( +// CHECK-RV64-SAME: <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4(vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8( +// CHECK-RV64-SAME: <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8(vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_m( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> poison, <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_m(vbool64_t vm, vfloat64m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_m( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> poison, <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_m(vbool32_t vm, vfloat64m2_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_m( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> poison, <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_m(vbool16_t vm, vfloat64m4_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_m( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> poison, <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_m(vbool8_t vm, vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa(vm, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c new file mode 100644 index 0000000..aed6d87 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_16.c @@ -0,0 +1,248 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tu( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_tu(vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tu( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tu( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m1_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tu( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tu( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tu( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m8_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m1_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tum( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m8_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m1_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tumu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m8_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16mf2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m1_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_mu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f16m8_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c new file mode 100644 index 0000000..374f324 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_32.c @@ -0,0 +1,208 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +xsfvfexp32e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tu( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32mf2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tu( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m1_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tu( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tu( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tu( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m8_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32mf2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m1_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m8_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32mf2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m1_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m8_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32mf2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m1_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_f32m8_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c new file mode 100644 index 0000000..aec0b9f --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexp_v_bf.c @@ -0,0 +1,248 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tu( +// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tu(vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tu( +// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tu(vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tu( +// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_tu(vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m1_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tu( +// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_tu(vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tu( +// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_tu(vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tu( +// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_tu(vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m8_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tum(vbool64_t vm, vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tum(vbool32_t vm, vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_tum(vbool16_t vm, vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m1_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_tum(vbool8_t vm, vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_tum(vbool4_t vm, vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tum( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_tum(vbool2_t vm, vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m8_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tumu(vbool64_t vm, vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tumu(vbool32_t vm, vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_tumu(vbool16_t vm, vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m1_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_tumu(vbool8_t vm, vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_tumu(vbool4_t vm, vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tumu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_tumu(vbool2_t vm, vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m8_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_mu(vbool64_t vm, vbfloat16mf4_t vd, vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_mu(vbool32_t vm, vbfloat16mf2_t vd, vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16mf2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_mu(vbool16_t vm, vbfloat16m1_t vd, vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m1_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_mu(vbool8_t vm, vbfloat16m2_t vd, vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_mu(vbool4_t vm, vbfloat16m4_t vd, vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_mu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_mu(vbool2_t vm, vbfloat16m8_t vd, vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_v_bf16m8_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c new file mode 100644 index 0000000..b687026 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v.c @@ -0,0 +1,448 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexpa -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tu( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tu(vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tu( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tu( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m1_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tu( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tu( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tu( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m8_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tu( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32mf2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tu( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m1_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tu( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tu( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tu( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m8_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m1_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tum( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m8_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32mf2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m1_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m8_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m1_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tumu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m8_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32mf2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m1_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m8_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd, vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd, vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16mf2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd, vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m1_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd, vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd, vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_mu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd, vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f16m8_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd, vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32mf2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd, vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m1_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd, vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd, vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd, vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f32m8_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c new file mode 100644 index 0000000..8638dc2 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/non-overloaded/sf_vfexpa_v_64.c @@ -0,0 +1,167 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \ +// RUN:   -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tu( +// CHECK-RV64-SAME: <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_tu(vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m1_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tu( +// CHECK-RV64-SAME: <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_tu(vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m2_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tu( +// CHECK-RV64-SAME: <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_tu(vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m4_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tu( +// CHECK-RV64-SAME: <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_tu(vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m8_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_tum(vbool64_t vm, vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m1_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_tum(vbool32_t vm, vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m2_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_tum(vbool16_t vm, vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m4_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_tum(vbool8_t vm, vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m8_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_tumu(vbool64_t vm, vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m1_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_tumu(vbool32_t vm, vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m2_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_tumu(vbool16_t vm, vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m4_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_tumu(vbool8_t vm, vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m8_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_mu(vbool64_t vm, vfloat64m1_t vd, vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m1_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_mu(vbool32_t vm, vfloat64m2_t vd, vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m2_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_mu(vbool16_t vm, vfloat64m4_t vd, vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m4_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_mu(vbool8_t vm, vfloat64m8_t vd, vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_v_f64m8_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c new file mode 100644 index 0000000..4ceeb7b --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_16.c @@ -0,0 +1,261 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tu( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tu( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tu( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tu( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tu( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd, +                                         vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd, +                                         vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd, +                                       vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd, +                                       vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd, +                                       vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tum( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd, +                                       vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd, +                                          vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd, +                                          vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd, +                                        vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd, +                                        vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd, +                                        vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_tumu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd, +                                        vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexp_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd, +                                        vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexp_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd, +                                        vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexp_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd, +                                      vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexp_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd, +                                      vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexp_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd, +                                      vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_mu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexp_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd, +                                      vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c new file mode 100644 index 0000000..e08d6c5b --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_32.c @@ -0,0 +1,228 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +xsfvfexp32e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tu( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tu( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tu( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tu( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tu( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2, +                                      size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd, +                                         vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd, +                                       vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd, +                                       vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd, +                                       vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd, +                                       vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd, +                                          vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd, +                                        vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd, +                                        vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd, +                                        vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd, +                                        vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexp_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd, +                                        vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexp_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd, +                                      vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexp_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd, +                                      vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexp_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd, +                                      vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexp_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd, +                                      vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c new file mode 100644 index 0000000..14570d4 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexp_v_bf.c @@ -0,0 +1,272 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \ +// RUN:   -target-feature +zvfbfmin -target-feature +xsfvfbfexp16e -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tu( +// CHECK-RV64-SAME: <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tu(vbfloat16mf4_t vd, vbfloat16mf4_t vs2, +                                          size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tu( +// CHECK-RV64-SAME: <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tu(vbfloat16mf2_t vd, vbfloat16mf2_t vs2, +                                          size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tu( +// CHECK-RV64-SAME: <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_tu(vbfloat16m1_t vd, vbfloat16m1_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tu( +// CHECK-RV64-SAME: <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_tu(vbfloat16m2_t vd, vbfloat16m2_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tu( +// CHECK-RV64-SAME: <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_tu(vbfloat16m4_t vd, vbfloat16m4_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tu( +// CHECK-RV64-SAME: <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_tu(vbfloat16m8_t vd, vbfloat16m8_t vs2, +                                        size_t vl) { +  return __riscv_sf_vfexp_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tum(vbool64_t vm, vbfloat16mf4_t vd, +                                           vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tum(vbool32_t vm, vbfloat16mf2_t vd, +                                           vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_tum(vbool16_t vm, vbfloat16m1_t vd, +                                         vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_tum(vbool8_t vm, vbfloat16m2_t vd, +                                         vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_tum(vbool4_t vm, vbfloat16m4_t vd, +                                         vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tum( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_tum(vbool2_t vm, vbfloat16m8_t vd, +                                         vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_tumu(vbool64_t vm, vbfloat16mf4_t vd, +                                            vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_tumu(vbool32_t vm, vbfloat16mf2_t vd, +                                            vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_tumu(vbool16_t vm, vbfloat16m1_t vd, +                                          vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_tumu(vbool8_t vm, vbfloat16m2_t vd, +                                          vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_tumu(vbool4_t vm, vbfloat16m4_t vd, +                                          vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_tumu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_tumu(vbool2_t vm, vbfloat16m8_t vd, +                                          vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_sf_vfexp_v_bf16mf4_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x bfloat> [[VD:%.*]], <vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv1bf16.i64(<vscale x 1 x bfloat> [[VD]], <vscale x 1 x bfloat> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x bfloat> [[TMP0]] +// +vbfloat16mf4_t test_sf_vfexp_v_bf16mf4_mu(vbool64_t vm, vbfloat16mf4_t vd, +                                          vbfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_sf_vfexp_v_bf16mf2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x bfloat> [[VD:%.*]], <vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv2bf16.i64(<vscale x 2 x bfloat> [[VD]], <vscale x 2 x bfloat> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x bfloat> [[TMP0]] +// +vbfloat16mf2_t test_sf_vfexp_v_bf16mf2_mu(vbool32_t vm, vbfloat16mf2_t vd, +                                          vbfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_sf_vfexp_v_bf16m1_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x bfloat> [[VD:%.*]], <vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv4bf16.i64(<vscale x 4 x bfloat> [[VD]], <vscale x 4 x bfloat> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x bfloat> [[TMP0]] +// +vbfloat16m1_t test_sf_vfexp_v_bf16m1_mu(vbool16_t vm, vbfloat16m1_t vd, +                                        vbfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_sf_vfexp_v_bf16m2_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x bfloat> [[VD:%.*]], <vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv8bf16.i64(<vscale x 8 x bfloat> [[VD]], <vscale x 8 x bfloat> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x bfloat> [[TMP0]] +// +vbfloat16m2_t test_sf_vfexp_v_bf16m2_mu(vbool8_t vm, vbfloat16m2_t vd, +                                        vbfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_sf_vfexp_v_bf16m4_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x bfloat> [[VD:%.*]], <vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv16bf16.i64(<vscale x 16 x bfloat> [[VD]], <vscale x 16 x bfloat> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x bfloat> [[TMP0]] +// +vbfloat16m4_t test_sf_vfexp_v_bf16m4_mu(vbool4_t vm, vbfloat16m4_t vd, +                                        vbfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x bfloat> @test_sf_vfexp_v_bf16m8_mu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x bfloat> [[VD:%.*]], <vscale x 32 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  [[ENTRY:.*:]] +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x bfloat> @llvm.riscv.sf.vfexp.mask.nxv32bf16.i64(<vscale x 32 x bfloat> [[VD]], <vscale x 32 x bfloat> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 32 x bfloat> [[TMP0]] +// +vbfloat16m8_t test_sf_vfexp_v_bf16m8_mu(vbool2_t vm, vbfloat16m8_t vd, +                                        vbfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexp_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c new file mode 100644 index 0000000..4ac5cfc --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v.c @@ -0,0 +1,492 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64f -target-feature +zvfh \ +// RUN:   -target-feature +xsfvfexpa -disable-O0-optnone  \ +// RUN:   -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tu( +// CHECK-RV64-SAME: <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tu(vfloat16mf4_t vd, vfloat16mf4_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tu( +// CHECK-RV64-SAME: <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tu(vfloat16mf2_t vd, vfloat16mf2_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tu( +// CHECK-RV64-SAME: <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_tu(vfloat16m1_t vd, vfloat16m1_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tu( +// CHECK-RV64-SAME: <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_tu(vfloat16m2_t vd, vfloat16m2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tu( +// CHECK-RV64-SAME: <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_tu(vfloat16m4_t vd, vfloat16m4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tu( +// CHECK-RV64-SAME: <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_tu(vfloat16m8_t vd, vfloat16m8_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tu( +// CHECK-RV64-SAME: <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tu(vfloat32mf2_t vd, vfloat32mf2_t vs2, +                                         size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tu( +// CHECK-RV64-SAME: <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_tu(vfloat32m1_t vd, vfloat32m1_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tu( +// CHECK-RV64-SAME: <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_tu(vfloat32m2_t vd, vfloat32m2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tu( +// CHECK-RV64-SAME: <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_tu(vfloat32m4_t vd, vfloat32m4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tu( +// CHECK-RV64-SAME: <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_tu(vfloat32m8_t vd, vfloat32m8_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tum(vbool64_t vm, vfloat16mf4_t vd, +                                          vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tum(vbool32_t vm, vfloat16mf2_t vd, +                                          vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_tum(vbool16_t vm, vfloat16m1_t vd, +                                        vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_tum(vbool8_t vm, vfloat16m2_t vd, +                                        vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_tum(vbool4_t vm, vfloat16m4_t vd, +                                        vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tum( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_tum(vbool2_t vm, vfloat16m8_t vd, +                                        vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tum(vbool64_t vm, vfloat32mf2_t vd, +                                          vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_tum(vbool32_t vm, vfloat32m1_t vd, +                                        vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_tum(vbool16_t vm, vfloat32m2_t vd, +                                        vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_tum(vbool8_t vm, vfloat32m4_t vd, +                                        vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tum( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_tum(vbool4_t vm, vfloat32m8_t vd, +                                        vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_tumu(vbool64_t vm, vfloat16mf4_t vd, +                                           vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_tumu(vbool32_t vm, vfloat16mf2_t vd, +                                           vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_tumu(vbool16_t vm, vfloat16m1_t vd, +                                         vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_tumu(vbool8_t vm, vfloat16m2_t vd, +                                         vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_tumu(vbool4_t vm, vfloat16m4_t vd, +                                         vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_tumu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_tumu(vbool2_t vm, vfloat16m8_t vd, +                                         vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_tumu(vbool64_t vm, vfloat32mf2_t vd, +                                           vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_tumu(vbool32_t vm, vfloat32m1_t vd, +                                         vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_tumu(vbool16_t vm, vfloat32m2_t vd, +                                         vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_tumu(vbool8_t vm, vfloat32m4_t vd, +                                         vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_tumu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_tumu(vbool4_t vm, vfloat32m8_t vd, +                                         vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexpa_v_f16mf4_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VD:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexpa.mask.nxv1f16.i64(<vscale x 1 x half> [[VD]], <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x half> [[TMP0]] +// +vfloat16mf4_t test_sf_vfexpa_v_f16mf4_mu(vbool64_t vm, vfloat16mf4_t vd, +                                         vfloat16mf4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexpa_v_f16mf2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VD:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexpa.mask.nxv2f16.i64(<vscale x 2 x half> [[VD]], <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x half> [[TMP0]] +// +vfloat16mf2_t test_sf_vfexpa_v_f16mf2_mu(vbool32_t vm, vfloat16mf2_t vd, +                                         vfloat16mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexpa_v_f16m1_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VD:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexpa.mask.nxv4f16.i64(<vscale x 4 x half> [[VD]], <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x half> [[TMP0]] +// +vfloat16m1_t test_sf_vfexpa_v_f16m1_mu(vbool16_t vm, vfloat16m1_t vd, +                                       vfloat16m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexpa_v_f16m2_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VD:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexpa.mask.nxv8f16.i64(<vscale x 8 x half> [[VD]], <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x half> [[TMP0]] +// +vfloat16m2_t test_sf_vfexpa_v_f16m2_mu(vbool8_t vm, vfloat16m2_t vd, +                                       vfloat16m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexpa_v_f16m4_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VD:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexpa.mask.nxv16f16.i64(<vscale x 16 x half> [[VD]], <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x half> [[TMP0]] +// +vfloat16m4_t test_sf_vfexpa_v_f16m4_mu(vbool4_t vm, vfloat16m4_t vd, +                                       vfloat16m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexpa_v_f16m8_mu( +// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VD:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexpa.mask.nxv32f16.i64(<vscale x 32 x half> [[VD]], <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 32 x half> [[TMP0]] +// +vfloat16m8_t test_sf_vfexpa_v_f16m8_mu(vbool2_t vm, vfloat16m8_t vd, +                                       vfloat16m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexpa_v_f32mf2_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x float> [[VD:%.*]], <vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.sf.vfexpa.mask.nxv1f32.i64(<vscale x 1 x float> [[VD]], <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x float> [[TMP0]] +// +vfloat32mf2_t test_sf_vfexpa_v_f32mf2_mu(vbool64_t vm, vfloat32mf2_t vd, +                                         vfloat32mf2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexpa_v_f32m1_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VD:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexpa.mask.nxv2f32.i64(<vscale x 2 x float> [[VD]], <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x float> [[TMP0]] +// +vfloat32m1_t test_sf_vfexpa_v_f32m1_mu(vbool32_t vm, vfloat32m1_t vd, +                                       vfloat32m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexpa_v_f32m2_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VD:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexpa.mask.nxv4f32.i64(<vscale x 4 x float> [[VD]], <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x float> [[TMP0]] +// +vfloat32m2_t test_sf_vfexpa_v_f32m2_mu(vbool16_t vm, vfloat32m2_t vd, +                                       vfloat32m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexpa_v_f32m4_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VD:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexpa.mask.nxv8f32.i64(<vscale x 8 x float> [[VD]], <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x float> [[TMP0]] +// +vfloat32m4_t test_sf_vfexpa_v_f32m4_mu(vbool8_t vm, vfloat32m4_t vd, +                                       vfloat32m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexpa_v_f32m8_mu( +// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VD:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexpa.mask.nxv16f32.i64(<vscale x 16 x float> [[VD]], <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 16 x float> [[TMP0]] +// +vfloat32m8_t test_sf_vfexpa_v_f32m8_mu(vbool4_t vm, vfloat32m8_t vd, +                                       vfloat32m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c new file mode 100644 index 0000000..d0faaee5 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-sifive/policy/overloaded/sf_vfexpa_v_64.c @@ -0,0 +1,183 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +xsfvfexpa64e \ +// RUN:   -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | \ +// RUN:   FileCheck --check-prefix=CHECK-RV64 %s + +#include <sifive_vector.h> + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tu( +// CHECK-RV64-SAME: <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_tu(vfloat64m1_t vd, vfloat64m1_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tu( +// CHECK-RV64-SAME: <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_tu(vfloat64m2_t vd, vfloat64m2_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tu( +// CHECK-RV64-SAME: <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_tu(vfloat64m4_t vd, vfloat64m4_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tu( +// CHECK-RV64-SAME: <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], i64 [[VL]]) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_tu(vfloat64m8_t vd, vfloat64m8_t vs2, +                                       size_t vl) { +  return __riscv_sf_vfexpa_tu(vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tum( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_tum(vbool64_t vm, vfloat64m1_t vd, +                                        vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tum( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_tum(vbool32_t vm, vfloat64m2_t vd, +                                        vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tum( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_tum(vbool16_t vm, vfloat64m4_t vd, +                                        vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tum( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 2) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_tum(vbool8_t vm, vfloat64m8_t vd, +                                        vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tum(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_tumu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_tumu(vbool64_t vm, vfloat64m1_t vd, +                                         vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_tumu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_tumu(vbool32_t vm, vfloat64m2_t vd, +                                         vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_tumu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_tumu(vbool16_t vm, vfloat64m4_t vd, +                                         vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_tumu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 0) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_tumu(vbool8_t vm, vfloat64m8_t vd, +                                         vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_tumu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 1 x double> @test_sf_vfexpa_v_f64m1_mu( +// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x double> [[VD:%.*]], <vscale x 1 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 1 x double> @llvm.riscv.sf.vfexpa.mask.nxv1f64.i64(<vscale x 1 x double> [[VD]], <vscale x 1 x double> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 1 x double> [[TMP0]] +// +vfloat64m1_t test_sf_vfexpa_v_f64m1_mu(vbool64_t vm, vfloat64m1_t vd, +                                       vfloat64m1_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 2 x double> @test_sf_vfexpa_v_f64m2_mu( +// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x double> [[VD:%.*]], <vscale x 2 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 2 x double> @llvm.riscv.sf.vfexpa.mask.nxv2f64.i64(<vscale x 2 x double> [[VD]], <vscale x 2 x double> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 2 x double> [[TMP0]] +// +vfloat64m2_t test_sf_vfexpa_v_f64m2_mu(vbool32_t vm, vfloat64m2_t vd, +                                       vfloat64m2_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 4 x double> @test_sf_vfexpa_v_f64m4_mu( +// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x double> [[VD:%.*]], <vscale x 4 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 4 x double> @llvm.riscv.sf.vfexpa.mask.nxv4f64.i64(<vscale x 4 x double> [[VD]], <vscale x 4 x double> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 4 x double> [[TMP0]] +// +vfloat64m4_t test_sf_vfexpa_v_f64m4_mu(vbool16_t vm, vfloat64m4_t vd, +                                       vfloat64m4_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} + +// CHECK-RV64-LABEL: define dso_local <vscale x 8 x double> @test_sf_vfexpa_v_f64m8_mu( +// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x double> [[VD:%.*]], <vscale x 8 x double> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] { +// CHECK-RV64-NEXT:  entry: +// CHECK-RV64-NEXT:    [[TMP0:%.*]] = call <vscale x 8 x double> @llvm.riscv.sf.vfexpa.mask.nxv8f64.i64(<vscale x 8 x double> [[VD]], <vscale x 8 x double> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 1) +// CHECK-RV64-NEXT:    ret <vscale x 8 x double> [[TMP0]] +// +vfloat64m8_t test_sf_vfexpa_v_f64m8_mu(vbool8_t vm, vfloat64m8_t vd, +                                       vfloat64m8_t vs2, size_t vl) { +  return __riscv_sf_vfexpa_mu(vm, vd, vs2, vl); +} diff --git a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c index d5d15b4d..35fde87 100644 --- a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c +++ b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector.c @@ -3584,13 +3584,13 @@ void test_integer(void) {    // CHECK-ASM: vsrlb    vsc = vec_abs(vsc); -  // CHECK-ASM: vlcb +  // CHECK-ASM: vlpb    vss = vec_abs(vss); -  // CHECK-ASM: vlch +  // CHECK-ASM: vlph    vsi = vec_abs(vsi); -  // CHECK-ASM: vlcf +  // CHECK-ASM: vlpf    vsl = vec_abs(vsl); -  // CHECK-ASM: vlcg +  // CHECK-ASM: vlpg    vsc = vec_max(vsc, vsc);    // CHECK-ASM: vmxb diff --git a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c index 6ee9e1e..cd0fafd 100644 --- a/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c +++ b/clang/test/CodeGen/SystemZ/builtins-systemz-zvector5.c @@ -246,7 +246,7 @@ void test_integer(void) {    // CHECK-ASM: vctzq    vslll = vec_abs(vslll); -  // CHECK-ASM: vlcq +  // CHECK-ASM: vlpq    vslll = vec_avg(vslll, vslll);    // CHECK: call i128 @llvm.s390.vavgq(i128 %{{.*}}, i128 %{{.*}}) diff --git a/clang/test/DebugInfo/KeyInstructions/flag.cpp b/clang/test/DebugInfo/KeyInstructions/flag.cpp index 6aeeed6..4a4a5c4 100644 --- a/clang/test/DebugInfo/KeyInstructions/flag.cpp +++ b/clang/test/DebugInfo/KeyInstructions/flag.cpp @@ -8,6 +8,9 @@  // KEY-INSTRUCTIONS: "-gkey-instructions"  // NO-KEY-INSTRUCTIONS-NOT: key-instructions + +// Only expect one dwarf related flag. +// NO-DEBUG: -fdwarf2-cfi-asm  // NO-DEBUG-NOT: debug-info-kind  // NO-DEBUG-NOT: dwarf diff --git a/clang/test/Frontend/diags-interesting-source-region-colors.cpp b/clang/test/Frontend/diags-interesting-source-region-colors.cpp new file mode 100644 index 0000000..80db087 --- /dev/null +++ b/clang/test/Frontend/diags-interesting-source-region-colors.cpp @@ -0,0 +1,30 @@ +// RUN: not %clang_cc1 %s -fmessage-length=40 -fcolor-diagnostics -fno-show-source-location -Wunused-value -o - 2>&1 | FileCheck %s + +// REQUIRES: ansi-escape-sequences + +int main() { +          1 +                                                        + if; +  // CHECK: expected expression +  // CHECK-NEXT: ...+ [[MAGENTA:.\[0;34m]]if[[RESET:.\[0m]]; + +    /*😂*/1 +                                                        + if; +  // CHECK: expected expression +  // CHECK-NEXT: ...+ [[MAGENTA:.\[0;34m]]if[[RESET:.\[0m]]; + +  a + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1; +  // CHECK: use of undeclared identifier +  // CHECK-NEXT: a + [[GREEN:.\[0;32m]]1[[RESET]] + [[GREEN]]1[[RESET]] + [[GREEN]]1[[RESET]] + [[GREEN]]1[[RESET]] + [[GREEN]]1[[RESET]] ... + + +  /*😂😂😂*/ a + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1; +  // CHECK: use of undeclared identifier +  // CHECK-NEXT: [[YELLOW:.\[0;33m]]/*😂😂😂*/[[RESET]] a + [[GREEN:.\[0;32m]]1[[RESET]] + [[GREEN]]1[[RESET]] ... + +  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +  // CHECK: [[GREEN:.\[0;32m]]"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"[[RESET]]; + +  "😂xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +  // CHECK: [[GREEN:.\[0;32m]]"😂xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"[[RESET]]; +} + + diff --git a/clang/test/Modules/Inputs/builtin-headers/system-modules.modulemap b/clang/test/Modules/Inputs/builtin-headers/system-modules.modulemap index 1869651..8ab6ae47 100644 --- a/clang/test/Modules/Inputs/builtin-headers/system-modules.modulemap +++ b/clang/test/Modules/Inputs/builtin-headers/system-modules.modulemap @@ -49,6 +49,11 @@ module cstd [system] [no_undeclared_includes] {      export *    } +  module stdckdint { +    header "stdckdint.h" +    export * +  } +    module stdcountof {      header "stdcountof.h"      export * diff --git a/clang/test/Modules/builtin-headers.mm b/clang/test/Modules/builtin-headers.mm index ad2d66a..6cd3662 100644 --- a/clang/test/Modules/builtin-headers.mm +++ b/clang/test/Modules/builtin-headers.mm @@ -17,6 +17,7 @@  @import _Builtin_stdarg;  @import _Builtin_stdatomic;  @import _Builtin_stdbool; +@import _Builtin_stdckdint;  @import _Builtin_stdcountof;  @import _Builtin_stddef;  @import _Builtin_stdint; diff --git a/clang/test/Preprocessor/unwind-tables.c b/clang/test/Preprocessor/unwind-tables.c index 0a863d7..5ff990d 100644 --- a/clang/test/Preprocessor/unwind-tables.c +++ b/clang/test/Preprocessor/unwind-tables.c @@ -1,11 +1,13 @@  // RUN: %clang %s -dM -E -target x86_64-windows | FileCheck %s --check-prefix=NO  // RUN: %clang %s -dM -E -target x86_64 -fno-asynchronous-unwind-tables | FileCheck %s --check-prefix=NO +// RUN: %clang %s -dM -E -target x86_64 -fno-dwarf2-cfi-asm | FileCheck %s --check-prefix=NO  // RUN: %clang %s -dM -E -target x86_64 | FileCheck %s  // RUN: %clang %s -dM -E -target x86_64 -funwind-tables -fno-asynchronous-unwind-tables -g | FileCheck %s  // RUN: %clang %s -dM -E -target aarch64-apple-darwin | FileCheck %s  // RUN: %clang %s -dM -E -target x86_64 -fno-asynchronous-unwind-tables -g | FileCheck %s  // RUN: %clang %s -dM -E -target x86_64 -fno-asynchronous-unwind-tables -fexceptions | FileCheck %s +// RUN: %clang %s -dM -E -target x86_64-windows -fdwarf2-cfi-asm | FileCheck %s  // NO-NOT: #define __GCC_HAVE_DWARF2_CFI_ASM  // CHECK: #define __GCC_HAVE_DWARF2_CFI_ASM 1 diff --git a/clang/test/Sema/attr-nonblocking-constraints.cpp b/clang/test/Sema/attr-nonblocking-constraints.cpp index b26a945..881e816 100644 --- a/clang/test/Sema/attr-nonblocking-constraints.cpp +++ b/clang/test/Sema/attr-nonblocking-constraints.cpp @@ -235,16 +235,35 @@ void nb13() [[clang::nonblocking]] { nb12(); }  // C++ member function pointers  struct PTMFTester {  	typedef void (PTMFTester::*ConvertFunction)() [[clang::nonblocking]]; - -	void convert() [[clang::nonblocking]]; +	typedef void (PTMFTester::*BlockingFunction)();  	ConvertFunction mConvertFunc; -}; -void PTMFTester::convert() [[clang::nonblocking]] -{ -	(this->*mConvertFunc)(); -} +	void convert() [[clang::nonblocking]] +	{ +		(this->*mConvertFunc)(); // This should not generate a warning. +	} + +	template <typename T> +	struct Holder { +		T value; +		 +		T& operator*() { return value; } +	}; + + +	void ptmfInExpr(Holder<ConvertFunction>& holder) [[clang::nonblocking]] +	{ +		(this->*(*holder))();   // Should not generate a warning. +		((*this).*(*holder))(); // Should not generate a warning. +	} + +	void ptmfInExpr(Holder<BlockingFunction>& holder) [[clang::nonblocking]] +	{ +		(this->*(*holder))(); // expected-warning {{function with 'nonblocking' attribute must not call non-'nonblocking' expression}} +		((*this).*(*holder))(); // expected-warning {{function with 'nonblocking' attribute must not call non-'nonblocking' expression}} +	} +};  // Allow implicit conversion from array to pointer.  void nb14(unsigned idx) [[clang::nonblocking]] @@ -354,6 +373,33 @@ struct Unsafe {    Unsafe(float y) [[clang::nonblocking]] : Unsafe(int(y)) {} // expected-warning {{constructor with 'nonblocking' attribute must not call non-'nonblocking' constructor 'Unsafe::Unsafe'}}  }; +// Exercise cases of a temporary with a safe constructor and unsafe destructor. +void nb23() +{ +	struct X { +		int *ptr = nullptr; +		X() {} +		~X() { delete ptr; } // expected-note 2 {{destructor cannot be inferred 'nonblocking' because it allocates or deallocates memory}} +	}; + +	auto inner = []() [[clang::nonblocking]] { +		X(); // expected-warning {{lambda with 'nonblocking' attribute must not call non-'nonblocking' destructor 'nb23()::X::~X'}} +	}; + +	auto inner2 = [](X x) [[clang::nonblocking]] { // expected-warning {{lambda with 'nonblocking' attribute must not call non-'nonblocking' destructor 'nb23()::X::~X'}} +	}; + +} + +struct S2 { ~S2(); }; // expected-note 2 {{declaration cannot be inferred 'nonblocking' because it has no definition in this translation unit}} +void nb24() { +    S2 s; +    [&]() [[clang::nonblocking]] { +        [s]{ auto x = &s; }(); // expected-warning {{lambda with 'nonblocking' attribute must not call non-'nonblocking' destructor}} expected-note {{destructor cannot be inferred 'nonblocking' because it calls non-'nonblocking' destructor 'S2::~S2'}} +        [=]{ auto x = &s; }(); // expected-warning {{lambda with 'nonblocking' attribute must not call non-'nonblocking' destructor}} expected-note {{destructor cannot be inferred 'nonblocking' because it calls non-'nonblocking' destructor 'S2::~S2'}} +    }(); +} +  struct DerivedFromUnsafe : public Unsafe {    DerivedFromUnsafe() [[clang::nonblocking]] {} // expected-warning {{constructor with 'nonblocking' attribute must not call non-'nonblocking' constructor 'Unsafe::Unsafe'}}    DerivedFromUnsafe(int x) [[clang::nonblocking]] : Unsafe(x) {} // expected-warning {{constructor with 'nonblocking' attribute must not call non-'nonblocking' constructor 'Unsafe::Unsafe'}} diff --git a/clang/test/SemaCXX/vector.cpp b/clang/test/SemaCXX/vector.cpp index 808bdb6..06195f0 100644 --- a/clang/test/SemaCXX/vector.cpp +++ b/clang/test/SemaCXX/vector.cpp @@ -786,3 +786,16 @@ const long long e = *0; // expected-error {{indirection requires pointer operand  double f = a - e;       // expected-error {{cannot initialize a variable of type 'double' with an rvalue of type '__attribute__((__vector_size__(1 * sizeof(double)))) double' (vector of 1 'double' value)}}  int h = c - e;          // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type '__attribute__((__vector_size__(1 * sizeof(long)))) long' (vector of 1 'long' value)}}  } + +typedef int v_neg_size __attribute__((vector_size(-8))); // expected-error{{vector must have non-negative size}} +typedef int v_neg_size_2 __attribute__((vector_size(-1 * 8))); // expected-error{{vector must have non-negative size}} +typedef int v_ext_neg_size __attribute__((ext_vector_type(-8))); // expected-error{{vector must have non-negative size}} +typedef int v_ext_neg_size2 __attribute__((ext_vector_type(-1 * 8))); // expected-error{{vector must have non-negative size}} + + +#if __cplusplus >= 201103L + +template <int N> using templated_v_size = int  __attribute__((vector_size(N))); // expected-error{{vector must have non-negative size}} +templated_v_size<-8> templated_v_neg_size; //expected-note{{in instantiation of template type alias 'templated_v_size' requested here}} + +#endif diff --git a/clang/tools/scan-build/bin/set-xcode-analyzer b/clang/tools/scan-build/bin/set-xcode-analyzer index 8e4a579..5d98c0c 100755 --- a/clang/tools/scan-build/bin/set-xcode-analyzer +++ b/clang/tools/scan-build/bin/set-xcode-analyzer @@ -5,10 +5,6 @@  # This one has the scripting bridge enabled.  import sys -if sys.version_info < (3, 6): -    print "set-xcode-analyzer requires Python 3.6 or later" -    sys.exit(1) -  import os  import subprocess  import re @@ -18,7 +14,7 @@ import stat  from AppKit import *  def FindClangSpecs(path): -  print "(+) Searching for xcspec file in: ", path +  print("(+) Searching for xcspec file in: ", path)    for root, dirs, files in os.walk(path):      for f in files:        if f.endswith(".xcspec") and f.startswith("Clang LLVM"): @@ -49,14 +45,14 @@ def ModifySpec(path, isBuiltinAnalyzer, pathToChecker):            foundAnalyzer = False        t.write(line)    t.close() -  print "(+) processing:", path +  print("(+) processing:", path)    try:      shutil.copy(t.name, path)      os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH) -  except IOError, why: -    print "    (-) Cannot update file:", why, "\n" -  except OSError, why: -    print "    (-) Cannot update file:", why, "\n" +  except IOError as why: +    print("    (-) Cannot update file:", why, "\n") +  except OSError as why: +    print("    (-) Cannot update file:", why, "\n")    os.unlink(t.name)  def main(): @@ -75,7 +71,7 @@ def main():    # determine if Xcode is running    for x in NSWorkspace.sharedWorkspace().runningApplications():      if x.localizedName().find("Xcode") >= 0: -      print "(-) You must quit Xcode first before modifying its configuration files." +      print("(-) You must quit Xcode first before modifying its configuration files.")        sys.exit(1)    isBuiltinAnalyzer = False @@ -83,12 +79,12 @@ def main():      # Expand tildes.      path = os.path.expanduser(options.path)      if not path.endswith("clang"): -      print "(+) Using Clang bundled with checker build:", path +      print("(+) Using Clang bundled with checker build:", path)        path = os.path.join(path, "bin", "clang");      else: -      print "(+) Using Clang located at:", path +      print("(+) Using Clang located at:", path)    else: -    print "(+) Using the Clang bundled with Xcode" +    print("(+) Using the Clang bundled with Xcode")      path = options.default      isBuiltinAnalyzer = True @@ -108,7 +104,7 @@ def main():      ModifySpec(x, isBuiltinAnalyzer, path)    if not foundSpec: -      print "(-) No compiler configuration file was found.  Xcode's analyzer has not been updated." +      print("(-) No compiler configuration file was found.  Xcode's analyzer has not been updated.")  if __name__ == '__main__':    main() diff --git a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp index ef22960..8fc9a66d 100644 --- a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp +++ b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp @@ -2076,4 +2076,19 @@ TEST(ExprMutationAnalyzerTest, PointeeMutatedByReturn) {    }  } +TEST(ExprMutationAnalyzerTest, PointeeMutatedByPointerToMemberOperator) { +  // GH161913 +  const std::string Code = R"( +    struct S { int i; }; +    void f(S s) { +      S *x = &s; +      (x->*(&S::i))++; +    } +  )"; +  auto AST = buildASTFromCodeWithArgs(Code, {"-Wno-everything"}); +  auto Results = +      match(withEnclosingCompound(declRefTo("x")), AST->getASTContext()); +  EXPECT_TRUE(isPointeeMutated(Results, AST.get())); +} +  } // namespace clang diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index ca9e792..24235b9 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -20824,6 +20824,13 @@ TEST_F(FormatTest, AlignWithLineBreaks) {                 "    argument1,\n"                 "    argument2);",                 Style); + +  Style.ColumnLimit = 45; +  verifyFormat("auto xxxxxxxx = foo;\n" +               "auto x = whatever ? some / long -\n" +               "                        computition / stuff\n" +               "                  : random;", +               Style);  }  TEST_F(FormatTest, AlignWithInitializerPeriods) { diff --git a/clang/unittests/Format/FormatTestComments.cpp b/clang/unittests/Format/FormatTestComments.cpp index 399f835..d7b2257 100644 --- a/clang/unittests/Format/FormatTestComments.cpp +++ b/clang/unittests/Format/FormatTestComments.cpp @@ -106,24 +106,12 @@ TEST_F(FormatTestComments, UnderstandsSingleLineComments) {                 "  // line c\n"                 "  c\n"                 "};", -               "enum A {\n" -               "  // line a\n" -               "  a,\n" -               "  b, // line b\n" -               "\n" -               "  // line c\n" -               "  c\n" -               "};", -               Style20); -  verifyFormat("enum A {\n" -               "  a, // line 1\n" -               "  // line 2\n" -               "};", -               "enum A {\n" -               "  a, // line 1\n" -               "  // line 2\n" -               "};",                 Style20); +  verifyNoChange("enum A {\n" +                 "  a, // line 1\n" +                 "  // line 2\n" +                 "};", +                 Style20);    verifyFormat("enum A {\n"                 "  a, // line 1\n"                 "     // line 2\n" @@ -133,17 +121,12 @@ TEST_F(FormatTestComments, UnderstandsSingleLineComments) {                 "   // line 2\n"                 "};",                 Style20); -  verifyFormat("enum A {\n" -               "  a, // line 1\n" -               "  // line 2\n" -               "  b\n" -               "};", -               "enum A {\n" -               "  a, // line 1\n" -               "  // line 2\n" -               "  b\n" -               "};", -               Style20); +  verifyNoChange("enum A {\n" +                 "  a, // line 1\n" +                 "  // line 2\n" +                 "  b\n" +                 "};", +                 Style20);    verifyFormat("enum A {\n"                 "  a, // line 1\n"                 "     // line 2\n" @@ -487,12 +470,9 @@ TEST_F(FormatTestComments, AlignsBlockComments) {                 " Don't try to outdent if there's not enough indentation.\n"                 " */"); -  verifyFormat("int i; /* Comment with empty...\n" -               "        *\n" -               "        * line. */", -               "int i; /* Comment with empty...\n" -               "        *\n" -               "        * line. */"); +  verifyNoChange("int i; /* Comment with empty...\n" +                 "        *\n" +                 "        * line. */");    verifyFormat("int foobar = 0; /* comment */\n"                 "int bar = 0;    /* multiline\n"                 "                   comment 1 */\n" @@ -555,8 +535,6 @@ TEST_F(FormatTestComments, CommentReflowingCanApplyOnlyToIndents) {  TEST_F(FormatTestComments, CorrectlyHandlesLengthOfBlockComments) {    verifyFormat("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" -               "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */", -               "double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"                 "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */");    verifyFormat(        "void ffffffffffff(\n" @@ -680,17 +658,12 @@ TEST_F(FormatTestComments, SplitsLongCxxComments) {    verifyFormat("#define XXX // q w e r\n"                 "            // t y u i",                 "#define XXX //q w e r t y u i", Style22); -  verifyFormat("{\n" -               "  //\n" -               "  //\\\n" -               "  // long 1 2 3 4 5\n" -               "}", -               "{\n" -               "  //\n" -               "  //\\\n" -               "  // long 1 2 3 4 5\n" -               "}", -               Style20); +  verifyNoChange("{\n" +                 "  //\n" +                 "  //\\\n" +                 "  // long 1 2 3 4 5\n" +                 "}", +                 Style20);    verifyFormat("{\n"                 "  //\n"                 "  //\\\n" @@ -730,19 +703,13 @@ TEST_F(FormatTestComments, PreservesHangingIndentInCxxComments) {  }  TEST_F(FormatTestComments, DontSplitLineCommentsWithEscapedNewlines) { -  verifyFormat("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" -               "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" -               "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -               "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" -               "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" -               "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); -  verifyFormat("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" -               "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" -               "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", -               "int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" -               "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" -               "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", -               getLLVMStyleWithColumns(50)); +  verifyNoChange("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" +                 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n" +                 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); +  verifyNoChange("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" +                 "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" +                 "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", +                 getLLVMStyleWithColumns(50));    verifyFormat("double\n"                 "    a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"                 "       // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n" @@ -773,10 +740,8 @@ TEST_F(FormatTestComments, DontIntroduceMultilineComments) {  TEST_F(FormatTestComments, DontSplitLineCommentsWithPragmas) {    FormatStyle Pragmas = getLLVMStyleWithColumns(30);    Pragmas.CommentPragmas = "^ IWYU pragma:"; -  verifyFormat("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", -               "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas); -  verifyFormat("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", -               "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas); +  verifyFormat("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas); +  verifyFormat("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas);  }  TEST_F(FormatTestComments, PriorityOfCommentBreaking) { @@ -812,26 +777,17 @@ TEST_F(FormatTestComments, PriorityOfCommentBreaking) {  TEST_F(FormatTestComments, MultiLineCommentsInDefines) {    const auto Style17 = getLLVMStyleWithColumns(17); -  verifyFormat("#define A(x) /* \\\n" -               "  a comment     \\\n" -               "  inside */     \\\n" -               "  f();", -               "#define A(x) /* \\\n" -               "  a comment     \\\n" -               "  inside */     \\\n" -               "  f();", -               Style17); -  verifyFormat("#define A(      \\\n" -               "    x) /*       \\\n" -               "  a comment     \\\n" -               "  inside */     \\\n" -               "  f();", -               "#define A(      \\\n" -               "    x) /*       \\\n" -               "  a comment     \\\n" -               "  inside */     \\\n" -               "  f();", -               Style17); +  verifyNoChange("#define A(x) /* \\\n" +                 "  a comment     \\\n" +                 "  inside */     \\\n" +                 "  f();", +                 Style17); +  verifyNoChange("#define A(      \\\n" +                 "    x) /*       \\\n" +                 "  a comment     \\\n" +                 "  inside */     \\\n" +                 "  f();", +                 Style17);  }  TEST_F(FormatTestComments, LineCommentsInMacrosDoNotGetEscapedNewlines) { @@ -865,33 +821,20 @@ TEST_F(FormatTestComments, ParsesCommentsAdjacentToPPDirectives) {  TEST_F(FormatTestComments, KeepsLevelOfCommentBeforePPDirective) {    // Keep the current level if the comment was originally not aligned with    // the preprocessor directive. -  verifyFormat("void f() {\n" -               "  int i;\n" -               "  /* comment */\n" -               "#ifdef A\n" -               "  int j;\n" -               "}", -               "void f() {\n" -               "  int i;\n" -               "  /* comment */\n" -               "#ifdef A\n" -               "  int j;\n" -               "}"); +  verifyNoChange("void f() {\n" +                 "  int i;\n" +                 "  /* comment */\n" +                 "#ifdef A\n" +                 "  int j;\n" +                 "}"); -  verifyFormat("void f() {\n" -               "  int i;\n" -               "  /* comment */\n" -               "\n" -               "#ifdef A\n" -               "  int j;\n" -               "}", -               "void f() {\n" -               "  int i;\n" -               "  /* comment */\n" -               "\n" -               "#ifdef A\n" -               "  int j;\n" -               "}"); +  verifyNoChange("void f() {\n" +                 "  int i;\n" +                 "  /* comment */\n" +                 "\n" +                 "#ifdef A\n" +                 "  int j;\n" +                 "}");    verifyFormat("int f(int i) {\n"                 "  if (true) {\n" @@ -1060,18 +1003,12 @@ TEST_F(FormatTestComments, KeepsLevelOfCommentBeforePPDirective) {    // Align with the preprocessor directive if the comment was originally aligned    // with the preprocessor directive and there is no newline between the comment    // and the preprocessor directive. -  verifyFormat("void f() {\n" -               "  int i;\n" -               "/* comment */\n" -               "#ifdef A\n" -               "  int j;\n" -               "}", -               "void f() {\n" -               "  int i;\n" -               "/* comment */\n" -               "#ifdef A\n" -               "  int j;\n" -               "}"); +  verifyNoChange("void f() {\n" +                 "  int i;\n" +                 "/* comment */\n" +                 "#ifdef A\n" +                 "  int j;\n" +                 "}");    verifyFormat("int f(int i) {\n"                 "  if (true) {\n" @@ -1245,13 +1182,10 @@ TEST_F(FormatTestComments, SplitsLongLinesInComments) {                 "   wherever_a_space_occurs                             \n"                 " */",                 Style20); -  verifyFormat("/*\n" -               " *    This_comment_can_not_be_broken_into_lines\n" -               " */", -               "/*\n" -               " *    This_comment_can_not_be_broken_into_lines\n" -               " */", -               Style20); +  verifyNoChange("/*\n" +                 " *    This_comment_can_not_be_broken_into_lines\n" +                 " */", +                 Style20);    verifyFormat("{\n"                 "  /*\n"                 "  This is another\n" @@ -1445,17 +1379,12 @@ TEST_F(FormatTestComments, AlignsPPElseEndifComments) {                 "int iiii; // CC\n"                 "#endif // B",                 Style20); -  verifyFormat("#if A\n" -               "#else  // A1\n" -               "       // A2\n" -               "int ii;\n" -               "#endif // B", -               "#if A\n" -               "#else  // A1\n" -               "       // A2\n" -               "int ii;\n" -               "#endif // B", -               Style20); +  verifyNoChange("#if A\n" +                 "#else  // A1\n" +                 "       // A2\n" +                 "int ii;\n" +                 "#endif // B", +                 Style20);  }  TEST_F(FormatTestComments, CommentsInStaticInitializers) { @@ -1528,10 +1457,6 @@ TEST_F(FormatTestComments, LineCommentsAfterRightBrace) {    verifyFormat("if (true) { // comment about branch\n"                 "  // comment about f\n"                 "  f();\n" -               "}", -               "if (true) { // comment about branch\n" -               "  // comment about f\n" -               "  f();\n"                 "}");    verifyFormat("if (1) { // if line 1\n"                 "         // if line 2\n" @@ -1582,6 +1507,7 @@ TEST_F(FormatTestComments, LineCommentsAfterRightBrace) {  TEST_F(FormatTestComments, ReflowsComments) {    const auto Style20 = getLLVMStyleWithColumns(20);    const auto Style22 = getLLVMStyleWithColumns(22); +    // Break a long line and reflow with the full next line.    verifyFormat("// long long long\n"                 "// long long", @@ -2149,11 +2075,9 @@ TEST_F(FormatTestComments, ReflowsComments) {                 Style20);    // Don't break or reflow comments on import lines. -  verifyFormat("#include \"t\" /* l l l\n" -               "                * l */", -               "#include \"t\" /* l l l\n" -               "                * l */", -               Style20); +  verifyNoChange("#include \"t\" /* l l l\n" +                 "                * l */", +                 Style20);    // Don't reflow between different trailing comment sections.    verifyFormat("int i; // long long\n" @@ -2209,7 +2133,9 @@ TEST_F(FormatTestComments, ReflowsCommentsPrecise) {                 "// some text that reflows\n"                 "// into   foo",                 Style); +    Style.ColumnLimit = 21; +    // Given one more column, "// reflows into   foo" does fit the limit, so we    // do not compress the whitespace.    verifyFormat("// some text that\n" @@ -2228,6 +2154,7 @@ TEST_F(FormatTestComments, ReflowsCommentsPrecise) {                 "// some text that reflows\n"                 "// into1234567",                 Style); +    // Secondly, when the next line ends later, but the first word in that line    // is precisely one column over the limit, do not reflow.    verifyFormat("// some text that\n" @@ -2240,6 +2167,7 @@ TEST_F(FormatTestComments, ReflowsCommentsPrecise) {  TEST_F(FormatTestComments, ReflowsCommentsWithExtraWhitespace) {    const auto Style16 = getLLVMStyleWithColumns(16); +    // Baseline.    verifyFormat("// some text\n"                 "// that re flows", @@ -2546,37 +2474,23 @@ TEST_F(FormatTestComments, BlockComments) {    verifyFormat("void f(int * /* unused */) {}"); -  verifyFormat("/*\n" -               " **\n" -               " */", -               "/*\n" -               " **\n" -               " */"); -  verifyFormat("/*\n" -               " *q\n" -               " */", -               "/*\n" -               " *q\n" -               " */"); -  verifyFormat("/*\n" -               " * q\n" -               " */", -               "/*\n" -               " * q\n" -               " */"); -  verifyFormat("/*\n" -               " **/", -               "/*\n" -               " **/"); -  verifyFormat("/*\n" -               " ***/", -               "/*\n" -               " ***/"); +  verifyNoChange("/*\n" +                 " **\n" +                 " */"); +  verifyNoChange("/*\n" +                 " *q\n" +                 " */"); +  verifyNoChange("/*\n" +                 " * q\n" +                 " */"); +  verifyNoChange("/*\n" +                 " **/"); +  verifyNoChange("/*\n" +                 " ***/");  }  TEST_F(FormatTestComments, BlockCommentsInMacros) {    const auto Style20 = getLLVMStyleWithColumns(20); -    verifyFormat("#define A          \\\n"                 "  {                \\\n"                 "    /* one line */ \\\n" @@ -2599,7 +2513,6 @@ TEST_F(FormatTestComments, BlockCommentsInMacros) {  TEST_F(FormatTestComments, BlockCommentsAtEndOfLine) {    const auto Style15 = getLLVMStyleWithColumns(15); -    verifyFormat("a = {\n"                 "    1111 /*    */\n"                 "};", @@ -2774,11 +2687,6 @@ TEST_F(FormatTestComments, AlignTrailingComments) {                 "  // comment about a\n"                 "  int a;\n"                 "};", -               "class A {\n" -               "public: // public comment\n" -               "  // comment about a\n" -               "  int a;\n" -               "};",                 Style40);    verifyFormat("class A {\n"                 "public: // public comment 1\n" @@ -3106,41 +3014,26 @@ TEST_F(FormatTestComments, AlignTrailingCommentsLeave) {    FormatStyle Style = getLLVMStyle();    Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Leave; -  verifyFormat("int a;// do not touch\n" -               "int b; // any comments\n" -               "int c;  // comment\n" -               "int d;   // comment", -               "int a;// do not touch\n" -               "int b; // any comments\n" -               "int c;  // comment\n" -               "int d;   // comment", -               Style); +  verifyNoChange("int a;// do not touch\n" +                 "int b; // any comments\n" +                 "int c;  // comment\n" +                 "int d;   // comment", +                 Style); -  verifyFormat("int a;   // do not touch\n" -               "int b;  // any comments\n" -               "int c; // comment\n" -               "int d;// comment", -               "int a;   // do not touch\n" -               "int b;  // any comments\n" -               "int c; // comment\n" -               "int d;// comment", -               Style); +  verifyNoChange("int a;   // do not touch\n" +                 "int b;  // any comments\n" +                 "int c; // comment\n" +                 "int d;// comment", +                 Style); -  verifyFormat("// do not touch\n" -               "int a;  // any comments\n" -               "\n" -               "   // comment\n" -               "// comment\n" -               "\n" -               "// comment", -               "// do not touch\n" -               "int a;  // any comments\n" -               "\n" -               "   // comment\n" -               "// comment\n" -               "\n" -               "// comment", -               Style); +  verifyNoChange("// do not touch\n" +                 "int a;  // any comments\n" +                 "\n" +                 "   // comment\n" +                 "// comment\n" +                 "\n" +                 "// comment", +                 Style);    verifyFormat("// do not touch\n"                 "int a;  // any comments\n" @@ -3178,23 +3071,15 @@ TEST_F(FormatTestComments, AlignTrailingCommentsLeave) {    // Allow to keep 2 empty lines    Style.MaxEmptyLinesToKeep = 2; -  verifyFormat("// do not touch\n" -               "int a;  // any comments\n" -               "\n" -               "\n" -               "   // comment\n" -               "// comment\n" -               "\n" -               "// comment", -               "// do not touch\n" -               "int a;  // any comments\n" -               "\n" -               "\n" -               "   // comment\n" -               "// comment\n" -               "\n" -               "// comment", -               Style); +  verifyNoChange("// do not touch\n" +                 "int a;  // any comments\n" +                 "\n" +                 "\n" +                 "   // comment\n" +                 "// comment\n" +                 "\n" +                 "// comment", +                 Style);    Style.MaxEmptyLinesToKeep = 1;    // Just format comments normally when leaving exceeds the column limit @@ -3233,16 +3118,16 @@ TEST_F(FormatTestComments, DontAlignNamespaceComments) {    Style.NamespaceMacros.push_back("TESTSUITE");    Style.ShortNamespaceLines = 0; -  StringRef Input = "namespace A {\n" -                    "  TESTSUITE(B) {\n" -                    "    namespace C {\n" -                    "      namespace D { //\n" -                    "      } // namespace D\n" -                    "      std::string Foo = Bar; // Comment\n" -                    "      std::string BazString = Baz;   // C2\n" -                    "    }          // namespace C\n" -                    "  }\n" -                    "} // NaMeSpAcE A"; +  constexpr StringRef Input("namespace A {\n" +                            "  TESTSUITE(B) {\n" +                            "    namespace C {\n" +                            "      namespace D { //\n" +                            "      } // namespace D\n" +                            "      std::string Foo = Bar; // Comment\n" +                            "      std::string BazString = Baz;   // C2\n" +                            "    }          // namespace C\n" +                            "  }\n" +                            "} // NaMeSpAcE A");    EXPECT_TRUE(Style.FixNamespaceComments);    EXPECT_EQ(Style.AlignTrailingComments.Kind, FormatStyle::TCAS_Always); @@ -3326,21 +3211,21 @@ TEST_F(FormatTestComments, DontAlignNamespaceComments) {    Style.AlignTrailingComments.Kind = FormatStyle::TCAS_Always;    Style.FixNamespaceComments = true; -  Input = "namespace A {\n" -          "  int Foo;\n" -          "  int Bar;\n" -          "}\n" -          "// Comment"; +  constexpr StringRef Code("namespace A {\n" +                           "  int Foo;\n" +                           "  int Bar;\n" +                           "}\n" +                           "// Comment");    verifyFormat("namespace A {\n"                 "  int Foo;\n"                 "  int Bar;\n"                 "} // namespace A\n"                 "// Comment", -               Input, Style); +               Code, Style);    Style.FixNamespaceComments = false; -  verifyFormat(Input, Style); +  verifyFormat(Code, Style);  }  TEST_F(FormatTestComments, DontAlignOverScope) { @@ -3498,10 +3383,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {                 " */",                 "/*\n"                 "*/"); -  verifyFormat("/*\n" -               " */", -               "/*\n" -               " */"); +  verifyNoChange("/*\n" +                 " */");    verifyFormat("/*\n"                 " */",                 "/*\n" @@ -3512,10 +3395,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {                 " * line */",                 "/*\n"                 "* line */"); -  verifyFormat("/*\n" -               " * line */", -               "/*\n" -               " * line */"); +  verifyNoChange("/*\n" +                 " * line */");    verifyFormat("/*\n"                 " * line */",                 "/*\n" @@ -3528,10 +3409,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {                 " * line */",                 "/**\n"                 "* line */"); -  verifyFormat("/**\n" -               " * line */", -               "/**\n" -               " * line */"); +  verifyNoChange("/**\n" +                 " * line */");    verifyFormat("/**\n"                 " * line */",                 "/**\n" @@ -3566,10 +3445,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {                 "  */");    // Align two lines. -  verifyFormat("/* line 1\n" -               " * line 2 */", -               "/* line 1\n" -               " * line 2 */"); +  verifyNoChange("/* line 1\n" +                 " * line 2 */");    verifyFormat("/* line 1\n"                 " * line 2 */",                 "/* line 1\n" @@ -3590,10 +3467,8 @@ TEST_F(FormatTestComments, AlignsBlockCommentDecorations) {                 "        * line 2 */",                 "int i; /* line 1\n"                 "* line 2 */"); -  verifyFormat("int i; /* line 1\n" -               "        * line 2 */", -               "int i; /* line 1\n" -               "        * line 2 */"); +  verifyNoChange("int i; /* line 1\n" +                 "        * line 2 */");    verifyFormat("int i; /* line 1\n"                 "        * line 2 */",                 "int i; /* line 1\n" @@ -3695,6 +3570,7 @@ TEST_F(FormatTestComments, NonTrailingBlockComments) {  TEST_F(FormatTestComments, PythonStyleComments) {    const auto ProtoStyle20 = getTextProtoStyleWithColumns(20); +    // Keeps a space after '#'.    verifyFormat("# comment\n"                 "key: value", @@ -3798,8 +3674,6 @@ TEST_F(FormatTestComments, ReflowBackslashCrash) {  TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) {    FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java);    Style.ColumnLimit = 60; -  FormatStyle Style20 = getGoogleStyle(FormatStyle::LK_Java); -  Style20.ColumnLimit = 20;    verifyFormat("/**\n"                 " * @param x long long long long long long long long long\n"                 " *     long\n" @@ -3827,6 +3701,10 @@ TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) {                 "long long long long long long long long long long long\n"                 " */",                 Style); + +  FormatStyle Style20 = getGoogleStyle(FormatStyle::LK_Java); +  Style20.ColumnLimit = 20; +    verifyFormat("/**\n"                 " * Sentence that\n"                 " * should be broken.\n" @@ -3895,7 +3773,6 @@ TEST_F(FormatTestComments, IndentsLongJavadocAnnotatedLines) {  }  TEST_F(FormatTestComments, SpaceAtLineCommentBegin) { -  FormatStyle Style = getLLVMStyle();    constexpr StringRef NoTextInComment(" //       \n"                                        "\n"                                        "void foo() {// \n" @@ -3907,8 +3784,9 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {                 "void foo() { //\n"                 "  //\n"                 "}", -               NoTextInComment, Style); +               NoTextInComment); +  auto Style = getLLVMStyle();    Style.SpacesInLineCommentPrefix.Minimum = 0;    verifyFormat("//#comment", Style);    verifyFormat("//\n" @@ -3927,7 +3805,6 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {                 "}",                 NoTextInComment, Style); -  Style = getLLVMStyle();    constexpr StringRef Code(        "//Free comment without space\n"        "\n" @@ -4216,8 +4093,9 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {        "//  vv will only move\n"        "//  } if the line above does"); -  verifyFormat(Code2, Code, Style); +  verifyFormat(Code2, Code); +  Style = getLLVMStyle();    Style.SpacesInLineCommentPrefix = {0, 0};    verifyFormat("//#comment", "//   #comment", Style);    verifyFormat(Code3, Code, Style); @@ -4226,12 +4104,12 @@ TEST_F(FormatTestComments, SpaceAtLineCommentBegin) {    verifyFormat(Code4, Code, Style);    Style = getLLVMStyleWithColumns(20); -  StringRef WrapCode = "//Lorem ipsum dolor sit amet\n" -                       "\n" -                       "//  Lorem   ipsum   dolor   sit   amet\n" -                       "\n" -                       "void f() {//Hello World\n" -                       "}"; +  constexpr StringRef WrapCode("//Lorem ipsum dolor sit amet\n" +                               "\n" +                               "//  Lorem   ipsum   dolor   sit   amet\n" +                               "\n" +                               "void f() {//Hello World\n" +                               "}");    verifyFormat("// Lorem ipsum dolor\n"                 "// sit amet\n" @@ -4506,20 +4384,20 @@ TEST_F(FormatTestComments, SplitCommentIntroducers) {  }  TEST_F(FormatTestComments, LineCommentsOnStartOfFunctionCall) { -  auto Style = getLLVMStyle(); - -  EXPECT_EQ(Style.Cpp11BracedListStyle, FormatStyle::BLS_AlignFirstComment);    verifyFormat("Type name{// Comment\n" -               "          value};", -               Style); +               "          value};"); +  auto Style = getLLVMStyle(); +  EXPECT_EQ(Style.Cpp11BracedListStyle, FormatStyle::BLS_AlignFirstComment);    Style.Cpp11BracedListStyle = FormatStyle::BLS_Block; +    verifyFormat("Type name{ // Comment\n"                 "           value\n"                 "};",                 Style);    Style.Cpp11BracedListStyle = FormatStyle::BLS_FunctionCall; +    verifyFormat("Type name{ // Comment\n"                 "    value};",                 Style); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index c046142..815c79e 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -799,6 +799,30 @@ TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {    EXPECT_TOKEN(Tokens[23], tok::identifier, TT_ClassHeadName);  } +TEST_F(TokenAnnotatorTest, UnderstandsCommonCppTemplates) { +  auto Tokens = +      annotate("static_assert(std::conditional_t<A || B, C, D>::value);"); +  ASSERT_EQ(Tokens.size(), 19u) << Tokens; +  EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener); +  EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser); + +  Tokens = +      annotate("static_assert(std::conditional<A || B, C, D>::type::value);"); +  ASSERT_EQ(Tokens.size(), 21u) << Tokens; +  EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener); +  EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser); + +  Tokens = annotate("static_assert(fancy_v<A || B>);"); +  ASSERT_EQ(Tokens.size(), 11u) << Tokens; +  EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener); +  EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser); + +  Tokens = annotate("static_assert(fancy<A || B>::value);"); +  ASSERT_EQ(Tokens.size(), 13u) << Tokens; +  EXPECT_TOKEN(Tokens[3], tok::less, TT_TemplateOpener); +  EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser); +} +  TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {    FormatStyle Style = getLLVMStyle();    Style.WhitespaceSensitiveMacros.push_back("FOO"); @@ -2686,6 +2710,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsVerilogOperators) {    // precedence.    std::pair<prec::Level, std::string> JoinedBinary[] = {        {prec::Comma, "->"},        {prec::Comma, "<->"}, +      {prec::Comma, "#-#"},       {prec::Comma, "#=#"},        {prec::Assignment, "+="},   {prec::Assignment, "-="},        {prec::Assignment, "*="},   {prec::Assignment, "/="},        {prec::Assignment, "%="},   {prec::Assignment, "&="}, diff --git a/clang/www/c_status.html b/clang/www/c_status.html index b803962..80a52f7 100644 --- a/clang/www/c_status.html +++ b/clang/www/c_status.html @@ -329,7 +329,7 @@ conformance.</p>      <tr>        <td>The __COUNTER__ predefined macro</td>        <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3457.htm">N3457</a></td> -      <td class="unknown" align="center">Unknown</td> +      <td class="unreleased" align="center">Clang 22</td>  	</tr>      <tr>        <td>Chasing Ghosts I: constant expressions v2</td> diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index 0312c9d..e9fadb2 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -40,2843 +40,3314 @@  <p>This page tracks which C++ defect reports are implemented within Clang.</p> -<table width="689" border="1" cellspacing="0"> +<table width="892" border="1" cellspacing="0">    <tr>      <th>Number</th> +    <th>Section</th>      <th>Status</th>      <th>Issue title</th>      <th>Available in Clang?</th>    </tr>    <tr id="1">      <td><a href="https://cplusplus.github.io/CWG/issues/1.html">1</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>TC1</td>      <td>What if two using-declarations refer to the same function but the declarations introduce different default-arguments?</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="2">      <td><a href="https://cplusplus.github.io/CWG/issues/2.html">2</a></td> +    <td>[<a href="https://wg21.link/temp.dep.res">temp.dep.res</a>]</td>      <td>drafting</td>      <td>How can dependent names be used in member declarations that appear outside of the class template definition?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="3">      <td><a href="https://cplusplus.github.io/CWG/issues/3.html">3</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>The template compilation model rules render some explicit specialization declarations not visible during instantiation</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="4">      <td><a href="https://cplusplus.github.io/CWG/issues/4.html">4</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD1</td>      <td>Does extern "C" affect the linkage of function names with internal linkage?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="5">      <td><a href="https://cplusplus.github.io/CWG/issues/5.html">5</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>CV-qualifiers and type conversions</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="6">      <td><a href="https://cplusplus.github.io/CWG/issues/6.html">6</a></td> +    <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</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="full" align="center">Yes</td>    </tr>    <tr id="7">      <td><a href="https://cplusplus.github.io/CWG/issues/7.html">7</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>NAD</td>      <td>Can a class with a private virtual base class be derived from?</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="8">      <td><a href="https://cplusplus.github.io/CWG/issues/8.html">8</a></td> +    <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>      <td>CD1</td>      <td>Access to template arguments used in a function return type and in the nested name specifier</td>      <td class="full" align="center">Duplicate of <a href="#45">45</a></td>    </tr>    <tr id="9">      <td><a href="https://cplusplus.github.io/CWG/issues/9.html">9</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>CD1</td>      <td>Clarification of access to base class members</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="10">      <td><a href="https://cplusplus.github.io/CWG/issues/10.html">10</a></td> +    <td>[<a href="https://wg21.link/class.access.nest">class.access.nest</a>]</td>      <td>CD1</td>      <td>Can a nested class access its own class name as a qualified name if it is a private member of the enclosing class?</td>      <td class="full" align="center">Duplicate of <a href="#45">45</a></td>    </tr>    <tr id="11">      <td><a href="https://cplusplus.github.io/CWG/issues/11.html">11</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD1</td>      <td>How do the keywords typename/template interact with using-declarations?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="12">      <td><a href="https://cplusplus.github.io/CWG/issues/12.html">12</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>dup</td>      <td>Default arguments on different declarations for the same function and the Koenig lookup</td>      <td class="full-superseded" align="center">Superseded by <a href="#239">239</a></td>    </tr>    <tr id="13">      <td><a href="https://cplusplus.github.io/CWG/issues/13.html">13</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td>extern "C" for Parameters of Function Templates</td>      <td class="none" align="center">No</td>    </tr>    <tr id="14">      <td><a href="https://cplusplus.github.io/CWG/issues/14.html">14</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td>extern "C" functions and declarations in different namespaces</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="15">      <td><a href="https://cplusplus.github.io/CWG/issues/15.html">15</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>dup</td>      <td>Default arguments for parameters of function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="16">      <td><a href="https://cplusplus.github.io/CWG/issues/16.html">16</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>CD1</td>      <td>Access to members of indirect private base classes</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="17">      <td><a href="https://cplusplus.github.io/CWG/issues/17.html">17</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>NAD</td>      <td>Footnote 99 should discuss the naming class when describing members that can be accessed from friends</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="18">      <td><a href="https://cplusplus.github.io/CWG/issues/18.html">18</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>NAD</td>      <td>f(TYPE) where TYPE is void should be allowed</td>      <td class="full-superseded" align="center">Superseded by <a href="#577">577</a></td>    </tr>    <tr id="19">      <td><a href="https://cplusplus.github.io/CWG/issues/19.html">19</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>NAD</td>      <td>Clarify protected member access</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="20">      <td><a href="https://cplusplus.github.io/CWG/issues/20.html">20</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>TC1</td>      <td>Some clarifications needed for 12.8 para 15</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="21">      <td><a href="https://cplusplus.github.io/CWG/issues/21.html">21</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>TC1</td>      <td>Can a default argument for a template parameter appear in a friend declaration?</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="22">      <td><a href="https://cplusplus.github.io/CWG/issues/22.html">22</a></td> +    <td>[<a href="https://wg21.link/temp.dep.res">temp.dep.res</a>]</td>      <td>TC1</td>      <td>Template parameter with a default argument that refers to itself</td>      <td class="full-superseded" align="center">Superseded by <a href="#481">481</a></td>    </tr>    <tr id="23">      <td><a href="https://cplusplus.github.io/CWG/issues/23.html">23</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>NAD</td>      <td>Some questions regarding partial ordering of function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="24">      <td><a href="https://cplusplus.github.io/CWG/issues/24.html">24</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>TC1</td>      <td>Errors in examples in 14.7.3</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="25">      <td><a href="https://cplusplus.github.io/CWG/issues/25.html">25</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>TC1</td>      <td>Exception specifications and pointers to members</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="26">      <td><a href="https://cplusplus.github.io/CWG/issues/26.html">26</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Copy constructors and default arguments</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="27">      <td><a href="https://cplusplus.github.io/CWG/issues/27.html">27</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>NAD</td>      <td>Overload ambiguities for builtin ?: prototypes</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="28">      <td><a href="https://cplusplus.github.io/CWG/issues/28.html">28</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>CD1</td>      <td>'exit', 'signal' and static object destruction</td>      <td class="na" align="center">N/A (Library DR)</td>    </tr>    <tr id="29">      <td><a href="https://cplusplus.github.io/CWG/issues/29.html">29</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD1</td>      <td>Linkage of locally declared functions</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="30">      <td><a href="https://cplusplus.github.io/CWG/issues/30.html">30</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>TC1</td>      <td>Valid uses of "<TT>::template</TT>"</td>      <td class="full-superseded" align="center">Superseded by <a href="#468">468</a> (C++11 onwards)</td>    </tr>    <tr id="31">      <td><a href="https://cplusplus.github.io/CWG/issues/31.html">31</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>NAD</td>      <td>Looking up new/delete</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="32">      <td><a href="https://cplusplus.github.io/CWG/issues/32.html">32</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>TC1</td>      <td>Clarification of explicit instantiation of non-exported templates</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="33">      <td><a href="https://cplusplus.github.io/CWG/issues/33.html">33</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>TC1</td>      <td>Argument dependent lookup and overloaded functions</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="34">      <td><a href="https://cplusplus.github.io/CWG/issues/34.html">34</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>NAD</td>      <td>Argument dependent lookup and points of instantiation</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="35">      <td><a href="https://cplusplus.github.io/CWG/issues/35.html">35</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>TC1</td>      <td>Definition of default-initialization</td>      <td class="full" align="center">Duplicate of <a href="#178">178</a></td>    </tr>    <tr id="36">      <td><a href="https://cplusplus.github.io/CWG/issues/36.html">36</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD6</td>      <td><I>using-declaration</I>s in multiple-declaration contexts</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="37">      <td><a href="https://cplusplus.github.io/CWG/issues/37.html">37</a></td> +    <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>      <td>NAD</td>      <td>When is uncaught_exception() true?</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#475">475</a></td>    </tr>    <tr id="38">      <td><a href="https://cplusplus.github.io/CWG/issues/38.html">38</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>TC1</td>      <td>Explicit template arguments and operator functions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="39">      <td><a href="https://cplusplus.github.io/CWG/issues/39.html">39</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>CD1</td>      <td>Conflicting ambiguity rules</td>      <td class="none" align="center">No</td>    </tr>    <tr id="40">      <td><a href="https://cplusplus.github.io/CWG/issues/40.html">40</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>TC1</td>      <td>Syntax of <I>declarator-id</I></td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="41">      <td><a href="https://cplusplus.github.io/CWG/issues/41.html">41</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>TC1</td>      <td>Clarification of lookup of names after declarator-id</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="42">      <td><a href="https://cplusplus.github.io/CWG/issues/42.html">42</a></td> +    <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>      <td>NAD</td>      <td>Redefining names from base classes</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="43">      <td><a href="https://cplusplus.github.io/CWG/issues/43.html">43</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>TC1</td>      <td>Copying base classes (PODs) using memcpy</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="44">      <td><a href="https://cplusplus.github.io/CWG/issues/44.html">44</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD1</td>      <td>Member specializations</td>      <td class="partial-superseded" align="center">Superseded by <a href="#727">727</a></td>    </tr>    <tr id="45">      <td><a href="https://cplusplus.github.io/CWG/issues/45.html">45</a></td> +    <td>[<a href="https://wg21.link/class.access.nest">class.access.nest</a>]</td>      <td>CD1</td>      <td>Access to nested classes</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="46">      <td><a href="https://cplusplus.github.io/CWG/issues/46.html">46</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>NAD</td>      <td>Explicit instantiation of member templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="47">      <td><a href="https://cplusplus.github.io/CWG/issues/47.html">47</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>NAD</td>      <td>Template friend issues</td>      <td class="full-superseded" align="center">Superseded by <a href="#329">329</a></td>    </tr>    <tr id="48">      <td><a href="https://cplusplus.github.io/CWG/issues/48.html">48</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>TC1</td>      <td>Definitions of unused static members</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="49">      <td><a href="https://cplusplus.github.io/CWG/issues/49.html">49</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>TC1</td>      <td>Restriction on non-type, non-value template arguments</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="50">      <td><a href="https://cplusplus.github.io/CWG/issues/50.html">50</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>NAD</td>      <td>Converting pointer to incomplete type to same type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="51">      <td><a href="https://cplusplus.github.io/CWG/issues/51.html">51</a></td> +    <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>      <td>TC1</td>      <td>Overloading and user-defined conversions</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="52">      <td><a href="https://cplusplus.github.io/CWG/issues/52.html">52</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>TC1</td>      <td>Non-static members, member selection and access checking</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="53">      <td><a href="https://cplusplus.github.io/CWG/issues/53.html">53</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>TC1</td>      <td>Lvalue-to-rvalue conversion before certain static_casts</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="54">      <td><a href="https://cplusplus.github.io/CWG/issues/54.html">54</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD1</td>      <td>Static_cast from private base to derived class</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="55">      <td><a href="https://cplusplus.github.io/CWG/issues/55.html">55</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>NAD</td>      <td>Adding/subtracting pointer and enumeration value</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="56">      <td><a href="https://cplusplus.github.io/CWG/issues/56.html">56</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>TC1</td>      <td>Redeclaring typedefs within classes</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="57">      <td><a href="https://cplusplus.github.io/CWG/issues/57.html">57</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>open</td>      <td>Empty unions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="58">      <td><a href="https://cplusplus.github.io/CWG/issues/58.html">58</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD1</td>      <td>Signedness of bit fields of enum type</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="59">      <td><a href="https://cplusplus.github.io/CWG/issues/59.html">59</a></td> +    <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>      <td>TC1</td>      <td>Clarification of overloading and UDC to reference type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="60">      <td><a href="https://cplusplus.github.io/CWG/issues/60.html">60</a></td> +    <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>      <td>CD1</td>      <td>Reference binding and valid conversion sequences</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="61">      <td><a href="https://cplusplus.github.io/CWG/issues/61.html">61</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>NAD</td>      <td>Address of static member function "<TT>&p->f</TT>"</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="62">      <td><a href="https://cplusplus.github.io/CWG/issues/62.html">62</a></td> +    <td>[<a href="https://wg21.link/temp.arg.type">temp.arg.type</a>]</td>      <td>CD1</td>      <td>Unnamed members of classes used as type parameters</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="63">      <td><a href="https://cplusplus.github.io/CWG/issues/63.html">63</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>CD1</td>      <td>Class instantiation from pointer conversion to void*, null and self</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="64">      <td><a href="https://cplusplus.github.io/CWG/issues/64.html">64</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>TC1</td>      <td>Partial ordering to disambiguate explicit specialization</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="65">      <td><a href="https://cplusplus.github.io/CWG/issues/65.html">65</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>TC1</td>      <td>Typo in default argument example</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="66">      <td><a href="https://cplusplus.github.io/CWG/issues/66.html">66</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>NAD</td>      <td>Visibility of default args vs overloads added after using-declaration</td>      <td class="none" align="center">No</td>    </tr>    <tr id="67">      <td><a href="https://cplusplus.github.io/CWG/issues/67.html">67</a></td> +    <td>[<a href="https://wg21.link/class.static">class.static</a>]</td>      <td>TC1</td>      <td>Evaluation of left side of object-expression</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="68">      <td><a href="https://cplusplus.github.io/CWG/issues/68.html">68</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>TC1</td>      <td>Grammar does not allow "friend class A<int>;"</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="69">      <td><a href="https://cplusplus.github.io/CWG/issues/69.html">69</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>TC1</td>      <td>Storage class specifiers on template declarations</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="70">      <td><a href="https://cplusplus.github.io/CWG/issues/70.html">70</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD1</td>      <td>Is an array bound a nondeduced context?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="71">      <td><a href="https://cplusplus.github.io/CWG/issues/71.html">71</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>NAD</td>      <td>Incorrect cross reference</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="72">      <td><a href="https://cplusplus.github.io/CWG/issues/72.html">72</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>dup</td>      <td>Linkage and storage class specifiers for templates</td>      <td class="full" align="center">Duplicate of <a href="#69">69</a></td>    </tr>    <tr id="73">      <td><a href="https://cplusplus.github.io/CWG/issues/73.html">73</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>TC1</td>      <td>Pointer equality</td>      <td class="full-superseded" align="center">Superseded by <a href="#1652">1652</a></td>    </tr>    <tr id="74">      <td><a href="https://cplusplus.github.io/CWG/issues/74.html">74</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>TC1</td>      <td>Enumeration value in direct-new-declarator</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="75">      <td><a href="https://cplusplus.github.io/CWG/issues/75.html">75</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>TC1</td>      <td>In-class initialized members must be const</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="76">      <td><a href="https://cplusplus.github.io/CWG/issues/76.html">76</a></td> +    <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>      <td>TC1</td>      <td>Are const volatile variables considered "constant expressions"?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="77">      <td><a href="https://cplusplus.github.io/CWG/issues/77.html">77</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>CD1</td>      <td>The definition of friend does not allow nested classes to be friends</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="78">      <td><a href="https://cplusplus.github.io/CWG/issues/78.html">78</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>Section 8.5 paragraph 9 should state it only applies to non-static objects</td>      <td class="none" align="center">Superseded by <a href="#????">????</a></td>    </tr>    <tr id="79">      <td><a href="https://cplusplus.github.io/CWG/issues/79.html">79</a></td> +    <td>[<a href="https://wg21.link/new.delete.placement">new.delete.placement</a>]</td>      <td>dup</td>      <td>Alignment and placement new</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="80">      <td><a href="https://cplusplus.github.io/CWG/issues/80.html">80</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>TC1</td>      <td>Class members with same name as class</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="81">      <td><a href="https://cplusplus.github.io/CWG/issues/81.html">81</a></td> +    <td>[<a href="https://wg21.link/diff">diff</a>]</td>      <td>NAD</td>      <td>Null pointers and C compatibility</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="82">      <td><a href="https://cplusplus.github.io/CWG/issues/82.html">82</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>dup</td>      <td>Definition of "using" a constant expression</td>      <td class="full" align="center">Duplicate of <a href="#48">48</a></td>    </tr>    <tr id="83">      <td><a href="https://cplusplus.github.io/CWG/issues/83.html">83</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>TC1</td>      <td>Overloading and deprecated conversion of string literal</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="84">      <td><a href="https://cplusplus.github.io/CWG/issues/84.html">84</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>TC1</td>      <td>Overloading and conversion loophole used by <TT>auto_ptr</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="85">      <td><a href="https://cplusplus.github.io/CWG/issues/85.html">85</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.elab">basic.lookup.elab</a>]</td>      <td>TC1</td>      <td>Redeclaration of member class</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="86">      <td><a href="https://cplusplus.github.io/CWG/issues/86.html">86</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Lifetime of temporaries in query expressions</td>      <td class="full" align="center">Duplicate of <a href="#446">446</a></td>    </tr>    <tr id="87">      <td><a href="https://cplusplus.github.io/CWG/issues/87.html">87</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD1</td>      <td>Exception specifications on function parameters</td>      <td class="none" align="center">No</td>    </tr>    <tr id="88">      <td><a href="https://cplusplus.github.io/CWG/issues/88.html">88</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Specialization of member constant templates</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="89">      <td><a href="https://cplusplus.github.io/CWG/issues/89.html">89</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>TC1</td>      <td>Object lifetime does not account for reference rebinding</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="90">      <td><a href="https://cplusplus.github.io/CWG/issues/90.html">90</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>TC1</td>      <td>Should the enclosing class be an "associated class" too?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="91">      <td><a href="https://cplusplus.github.io/CWG/issues/91.html">91</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>NAD</td>      <td>A union's associated types should include the union itself</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="92">      <td><a href="https://cplusplus.github.io/CWG/issues/92.html">92</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Should <I>exception-specification</I>s be part of the type system?</td>      <td class="full" align="center">Clang 4 (C++17 onwards)</td>    </tr>    <tr id="93">      <td><a href="https://cplusplus.github.io/CWG/issues/93.html">93</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>TC1</td>      <td>Missing word in 3.8 <U>basic.life</U> paragraph 2</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="94">      <td><a href="https://cplusplus.github.io/CWG/issues/94.html">94</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>TC1</td>      <td>Inconsistencies in the descriptions of constant expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="95">      <td><a href="https://cplusplus.github.io/CWG/issues/95.html">95</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>NAD</td>      <td>Elaborated type specifiers referencing names declared in friend decls</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="96">      <td><a href="https://cplusplus.github.io/CWG/issues/96.html">96</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>C++11</td>      <td>Syntactic disambiguation using the <TT>template</TT> keyword</td>      <td class="na" align="center">Superseded by <a href="https://wg21.link/P1787">P1787</a></td>    </tr>    <tr id="97">      <td><a href="https://cplusplus.github.io/CWG/issues/97.html">97</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Use of bool constants in integral constant expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="98">      <td><a href="https://cplusplus.github.io/CWG/issues/98.html">98</a></td> +    <td>[<a href="https://wg21.link/except">except</a>]</td>      <td>TC1</td>      <td>Branching into try block</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="99">      <td><a href="https://cplusplus.github.io/CWG/issues/99.html">99</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>NAD</td>      <td>Partial ordering, references and cv-qualifiers</td>      <td class="full-superseded" align="center">Superseded by <a href="#214">214</a></td>    </tr>    <tr id="100">      <td><a href="https://cplusplus.github.io/CWG/issues/100.html">100</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>TC1</td>      <td>Clarify why string literals are not allowed as template arguments</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="101">      <td><a href="https://cplusplus.github.io/CWG/issues/101.html">101</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>TC1</td>      <td>Redeclaration of extern "C" names via using-declarations</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="102">      <td><a href="https://cplusplus.github.io/CWG/issues/102.html">102</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>NAD</td>      <td>Operator lookup rules do not work well with parts of the library</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="103">      <td><a href="https://cplusplus.github.io/CWG/issues/103.html">103</a></td> +    <td>[<a href="https://wg21.link/namespace.udir">namespace.udir</a>]</td>      <td>TC1</td>      <td>Is it <I>extended-namespace-definition</I> or <I>extension-namespace-definition</I> ?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="104">      <td><a href="https://cplusplus.github.io/CWG/issues/104.html">104</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>NAD</td>      <td>Destroying the exception temp when no handler is found</td>      <td class="na" align="center">N/A (Library DR)</td>    </tr>    <tr id="105">      <td><a href="https://cplusplus.github.io/CWG/issues/105.html">105</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>TC1</td>      <td>Meaning of "template function"</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="106">      <td><a href="https://cplusplus.github.io/CWG/issues/106.html">106</a></td> +    <td>[<a href="https://wg21.link/unknown">unknown</a>]</td>      <td>CD1</td>      <td>Creating references to references during template deduction/instantiation</td>      <td class="full-superseded" align="center">Superseded by <a href="#540">540</a></td>    </tr>    <tr id="107">      <td><a href="https://cplusplus.github.io/CWG/issues/107.html">107</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td>Linkage of operator functions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="108">      <td><a href="https://cplusplus.github.io/CWG/issues/108.html">108</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>TC1</td>      <td>Are classes nested in templates dependent?</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="109">      <td><a href="https://cplusplus.github.io/CWG/issues/109.html">109</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>NAD</td>      <td>Allowing <TT>::template</TT> in <I>using-declaration</I>s</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="110">      <td><a href="https://cplusplus.github.io/CWG/issues/110.html">110</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>CD6</td>      <td>Can template functions and classes be declared in the same scope?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="111">      <td><a href="https://cplusplus.github.io/CWG/issues/111.html">111</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Copy constructors and cv-qualifiers</td>      <td class="full" align="center">Duplicate of <a href="#535">535</a></td>    </tr>    <tr id="112">      <td><a href="https://cplusplus.github.io/CWG/issues/112.html">112</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>CD1</td>      <td>Array types and cv-qualifiers</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="113">      <td><a href="https://cplusplus.github.io/CWG/issues/113.html">113</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD1</td>      <td>Visibility of called function</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="114">      <td><a href="https://cplusplus.github.io/CWG/issues/114.html">114</a></td> +    <td>[<a href="https://wg21.link/temp.mem">temp.mem</a>]</td>      <td>NAD</td>      <td>Virtual overriding by template member function specializations</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="115">      <td><a href="https://cplusplus.github.io/CWG/issues/115.html">115</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>CD1</td>      <td>Address of template-id</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="116">      <td><a href="https://cplusplus.github.io/CWG/issues/116.html">116</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>TC1</td>      <td>Equivalent and functionally-equivalent function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="117">      <td><a href="https://cplusplus.github.io/CWG/issues/117.html">117</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>NAD</td>      <td>Timing of destruction of temporaries</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="118">      <td><a href="https://cplusplus.github.io/CWG/issues/118.html">118</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD1</td>      <td>Calls via pointers to virtual member functions</td>      <td class="full" align="center">Yes</td>    </tr>    <tr id="119">      <td><a href="https://cplusplus.github.io/CWG/issues/119.html">119</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD1</td>      <td>Object lifetime and aggregate initialization</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="120">      <td><a href="https://cplusplus.github.io/CWG/issues/120.html">120</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>TC1</td>      <td>Nonexistent non-terminal <I>qualified-name</I></td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="121">      <td><a href="https://cplusplus.github.io/CWG/issues/121.html">121</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>TC1</td>      <td>Dependent type names with non-dependent <I>nested-name-specifier</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="122">      <td><a href="https://cplusplus.github.io/CWG/issues/122.html">122</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD1</td>      <td><I>template-id</I>s as <I>unqualified-id</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="123">      <td><a href="https://cplusplus.github.io/CWG/issues/123.html">123</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>TC1</td>      <td>Bad cross-reference</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="124">      <td><a href="https://cplusplus.github.io/CWG/issues/124.html">124</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Lifetime of temporaries in default initialization of class arrays</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="125">      <td><a href="https://cplusplus.github.io/CWG/issues/125.html">125</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD1</td>      <td>Ambiguity in <TT>friend</TT> declaration syntax</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="126">      <td><a href="https://cplusplus.github.io/CWG/issues/126.html">126</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>TC1</td>      <td>Exception specifications and <TT>const</TT></td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="127">      <td><a href="https://cplusplus.github.io/CWG/issues/127.html">127</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>TC1</td>      <td>Ambiguity in description of matching deallocation function</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="128">      <td><a href="https://cplusplus.github.io/CWG/issues/128.html">128</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>TC1</td>      <td>Casting between enum types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="129">      <td><a href="https://cplusplus.github.io/CWG/issues/129.html">129</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD3</td>      <td>Stability of uninitialized auto variables</td>      <td class="full" align="center">Duplicate of <a href="#616">616</a></td>    </tr>    <tr id="130">      <td><a href="https://cplusplus.github.io/CWG/issues/130.html">130</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>NAD</td>      <td>Sequence points and <I>new-expression</I>s</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="131">      <td><a href="https://cplusplus.github.io/CWG/issues/131.html">131</a></td> +    <td>[<a href="https://wg21.link/extendid">extendid</a>]</td>      <td>TC1</td>      <td>Typo in Lao characters</td>      <td class="na" align="center">Superseded by <a href="https://wg21.link/P1949">P1949</a></td>    </tr>    <tr id="132">      <td><a href="https://cplusplus.github.io/CWG/issues/132.html">132</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>NAD</td>      <td>Local types and linkage</td>      <td class="none" align="center">No</td>    </tr>    <tr id="133">      <td><a href="https://cplusplus.github.io/CWG/issues/133.html">133</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>dup</td>      <td>Exception specifications and checking</td>      <td class="none" align="center">Duplicate of <a href="#87">87</a></td>    </tr>    <tr id="134">      <td><a href="https://cplusplus.github.io/CWG/issues/134.html">134</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>TC1</td>      <td>Template classes and <I>declarator-id</I>s</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="135">      <td><a href="https://cplusplus.github.io/CWG/issues/135.html">135</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>TC1</td>      <td>Class type in in-class member function definitions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="136">      <td><a href="https://cplusplus.github.io/CWG/issues/136.html">136</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD1</td>      <td>Default arguments and friend declarations</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="137">      <td><a href="https://cplusplus.github.io/CWG/issues/137.html">137</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>TC1</td>      <td><TT>static_cast</TT> of <I>cv</I> <TT>void*</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="138">      <td><a href="https://cplusplus.github.io/CWG/issues/138.html">138</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>CD6</td>      <td>Friend declaration name lookup</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="139">      <td><a href="https://cplusplus.github.io/CWG/issues/139.html">139</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD1</td>      <td>Error in <TT>friend</TT> lookup example</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="140">      <td><a href="https://cplusplus.github.io/CWG/issues/140.html">140</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD1</td>      <td>Agreement of parameter declarations</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="141">      <td><a href="https://cplusplus.github.io/CWG/issues/141.html">141</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD1</td>      <td>Non-member function templates in member access expressions</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="142">      <td><a href="https://cplusplus.github.io/CWG/issues/142.html">142</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>TC1</td>      <td>Injection-related errors in access example</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="143">      <td><a href="https://cplusplus.github.io/CWG/issues/143.html">143</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD1</td>      <td>Friends and Koenig lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="144">      <td><a href="https://cplusplus.github.io/CWG/issues/144.html">144</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>open</td>      <td>Position of <TT>friend</TT> specifier</td>      <td align="center">Not resolved</td>    </tr>    <tr id="145">      <td><a href="https://cplusplus.github.io/CWG/issues/145.html">145</a></td> +    <td>[<a href="https://wg21.link/depr.impldec">depr.impldec</a>]</td>      <td>TC1</td>      <td>Deprecation of prefix <TT>++</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="146">      <td><a href="https://cplusplus.github.io/CWG/issues/146.html">146</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>open</td>      <td>Floating-point zero</td>      <td align="center">Not resolved</td>    </tr>    <tr id="147">      <td><a href="https://cplusplus.github.io/CWG/issues/147.html">147</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>TC1</td>      <td>Naming the constructor</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="148">      <td><a href="https://cplusplus.github.io/CWG/issues/148.html">148</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>TC1</td>      <td>POD classes and pointers to members</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="149">      <td><a href="https://cplusplus.github.io/CWG/issues/149.html">149</a></td> +    <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>      <td>TC1</td>      <td>Accessibility and ambiguity</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="150">      <td><a href="https://cplusplus.github.io/CWG/issues/150.html">150</a></td> +    <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>      <td>C++17</td>      <td>Template template parameters and default arguments</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="151">      <td><a href="https://cplusplus.github.io/CWG/issues/151.html">151</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>TC1</td>      <td>Terminology of zero-initialization</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="152">      <td><a href="https://cplusplus.github.io/CWG/issues/152.html">152</a></td> +    <td>[<a href="https://wg21.link/class.conv.ctor">class.conv.ctor</a>]</td>      <td>TC1</td>      <td><TT>explicit</TT> copy constructors</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="153">      <td><a href="https://cplusplus.github.io/CWG/issues/153.html">153</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>TC1</td>      <td>Misleading wording (rank of conversion)</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="154">      <td><a href="https://cplusplus.github.io/CWG/issues/154.html">154</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>NAD</td>      <td>Anonymous unions in unnamed namespaces</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="155">      <td><a href="https://cplusplus.github.io/CWG/issues/155.html">155</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>dup</td>      <td>Brace initializer for scalar</td>      <td class="full" align="center">Duplicate of <a href="#632">632</a></td>    </tr>    <tr id="156">      <td><a href="https://cplusplus.github.io/CWG/issues/156.html">156</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>NAD</td>      <td>Name lookup for conversion functions</td>      <td class="partial-superseded" align="center">Superseded by <a href="#1111">1111</a></td>    </tr>    <tr class="open" id="157">      <td><a href="https://cplusplus.github.io/CWG/issues/157.html">157</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>open</td>      <td>Omitted typedef declarator</td>      <td align="center">Not resolved</td>    </tr>    <tr id="158">      <td><a href="https://cplusplus.github.io/CWG/issues/158.html">158</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD1</td>      <td>Aliasing and qualification conversions</td>      <td class="full" align="center">Yes</td>    </tr>    <tr id="159">      <td><a href="https://cplusplus.github.io/CWG/issues/159.html">159</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>TC1</td>      <td>Namespace qualification in declarators</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="160">      <td><a href="https://cplusplus.github.io/CWG/issues/160.html">160</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>CD1</td>      <td>Missing <TT>std::</TT> qualification</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="161">      <td><a href="https://cplusplus.github.io/CWG/issues/161.html">161</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>TC1</td>      <td>Access to protected nested type</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="162">      <td><a href="https://cplusplus.github.io/CWG/issues/162.html">162</a></td> +    <td>[<a href="https://wg21.link/over.match.call">over.match.call</a>]</td>      <td>CD1</td>      <td>(<TT>&C::f)()</TT> with nonstatic members</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="163">      <td><a href="https://cplusplus.github.io/CWG/issues/163.html">163</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>TC1</td>      <td>Description of subaggregate initializer</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="164">      <td><a href="https://cplusplus.github.io/CWG/issues/164.html">164</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>TC1</td>      <td>Overlap between Koenig and normal lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="165">      <td><a href="https://cplusplus.github.io/CWG/issues/165.html">165</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>NAD</td>      <td>Definitions of friends and block-scope externs</td>      <td class="none" align="center">No</td>    </tr>    <tr id="166">      <td><a href="https://cplusplus.github.io/CWG/issues/166.html">166</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>TC1</td>      <td>Friend declarations of <I>template-id</I>s</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="167">      <td><a href="https://cplusplus.github.io/CWG/issues/167.html">167</a></td> +    <td>[<a href="https://wg21.link/depr.static">depr.static</a>]</td>      <td>NAD</td>      <td>Deprecating static functions</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#1012">1012</a></td>    </tr>    <tr id="168">      <td><a href="https://cplusplus.github.io/CWG/issues/168.html">168</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td>C linkage for static member functions</td>      <td class="none" align="center">No</td>    </tr>    <tr id="169">      <td><a href="https://cplusplus.github.io/CWG/issues/169.html">169</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>NAD</td>      <td><I>template-id</I>s in <I>using-declaration</I>s</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="170">      <td><a href="https://cplusplus.github.io/CWG/issues/170.html">170</a></td> +    <td>[<a href="https://wg21.link/conv.mem">conv.mem</a>]</td>      <td>CD7</td>      <td>Pointer-to-member conversions</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="171">      <td><a href="https://cplusplus.github.io/CWG/issues/171.html">171</a></td> +    <td>[<a href="https://wg21.link/basic.namespace">basic.namespace</a>]</td>      <td>TC1</td>      <td>Global namespace scope</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="172">      <td><a href="https://cplusplus.github.io/CWG/issues/172.html">172</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD1</td>      <td>Unsigned int as underlying type of enum</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="173">      <td><a href="https://cplusplus.github.io/CWG/issues/173.html">173</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>TC1</td>      <td>Constraints on execution character set</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="174">      <td><a href="https://cplusplus.github.io/CWG/issues/174.html">174</a></td> +    <td>[<a href="https://wg21.link/depr.static">depr.static</a>]</td>      <td>NAD</td>      <td>Undeprecating global static</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#1012">1012</a></td>    </tr>    <tr id="175">      <td><a href="https://cplusplus.github.io/CWG/issues/175.html">175</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>Class name injection and base name access</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="176">      <td><a href="https://cplusplus.github.io/CWG/issues/176.html">176</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>TC1</td>      <td>Name injection and templates</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="177">      <td><a href="https://cplusplus.github.io/CWG/issues/177.html">177</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>Lvalues vs rvalues in copy-initialization</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="178">      <td><a href="https://cplusplus.github.io/CWG/issues/178.html">178</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>TC1</td>      <td>More on value-initialization</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="179">      <td><a href="https://cplusplus.github.io/CWG/issues/179.html">179</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>TC1</td>      <td>Function pointers and subtraction</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="180">      <td><a href="https://cplusplus.github.io/CWG/issues/180.html">180</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD1</td>      <td><TT>typename</TT> and elaborated types</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="181">      <td><a href="https://cplusplus.github.io/CWG/issues/181.html">181</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>TC1</td>      <td>Errors in template <I>template-parameter</I> example</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="182">      <td><a href="https://cplusplus.github.io/CWG/issues/182.html">182</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Access checking on explicit specializations</td>      <td class="full" align="center">Clang 14</td>    </tr>    <tr id="183">      <td><a href="https://cplusplus.github.io/CWG/issues/183.html">183</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>TC1</td>      <td><TT>typename</TT> in explicit specializations</td>      <td class="full-superseded" align="center">Superseded by <a href="#382">382</a></td>    </tr>    <tr id="184">      <td><a href="https://cplusplus.github.io/CWG/issues/184.html">184</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD1</td>      <td>Default arguments in template <I>template-parameter</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="185">      <td><a href="https://cplusplus.github.io/CWG/issues/185.html">185</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>TC1</td>      <td>"Named" temporaries and copy elision</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="186">      <td><a href="https://cplusplus.github.io/CWG/issues/186.html">186</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>open</td>      <td>Name hiding and template <I>template-parameter</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="187">      <td><a href="https://cplusplus.github.io/CWG/issues/187.html">187</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>TC1</td>      <td>Scope of template parameter names</td>      <td class="full-superseded" align="center">Superseded by <a href="#481">481</a></td>    </tr>    <tr id="188">      <td><a href="https://cplusplus.github.io/CWG/issues/188.html">188</a></td> +    <td>[<a href="https://wg21.link/expr.comma">expr.comma</a>]</td>      <td>TC1</td>      <td>Comma operator and rvalue conversion</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="189">      <td><a href="https://cplusplus.github.io/CWG/issues/189.html">189</a></td> +    <td>[<a href="https://wg21.link/lex.operators">lex.operators</a>]</td>      <td>open</td>      <td>Definition of <I>operator</I> and <I>punctuator</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="190">      <td><a href="https://cplusplus.github.io/CWG/issues/190.html">190</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>TC1</td>      <td>Layout-compatible POD-struct types</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="191">      <td><a href="https://cplusplus.github.io/CWG/issues/191.html">191</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD6</td>      <td>Name lookup does not handle complex nesting</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="192">      <td><a href="https://cplusplus.github.io/CWG/issues/192.html">192</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>NAD</td>      <td>Name lookup in parameters</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="193">      <td><a href="https://cplusplus.github.io/CWG/issues/193.html">193</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>TC1</td>      <td>Order of destruction of local automatics of destructor</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="194">      <td><a href="https://cplusplus.github.io/CWG/issues/194.html">194</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>TC1</td>      <td>Identifying constructors</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="195">      <td><a href="https://cplusplus.github.io/CWG/issues/195.html">195</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD1</td>      <td>Converting between function and object pointers</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="196">      <td><a href="https://cplusplus.github.io/CWG/issues/196.html">196</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>open</td>      <td>Arguments to deallocation functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="197">      <td><a href="https://cplusplus.github.io/CWG/issues/197.html">197</a></td> +    <td>[<a href="https://wg21.link/temp.dep.candidate">temp.dep.candidate</a>]</td>      <td>CD1</td>      <td>Issues with two-stage lookup of dependent names</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="198">      <td><a href="https://cplusplus.github.io/CWG/issues/198.html">198</a></td> +    <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>      <td>CD1</td>      <td>Definition of "use" in local and nested classes</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="199">      <td><a href="https://cplusplus.github.io/CWG/issues/199.html">199</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Order of destruction of temporaries</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="200">      <td><a href="https://cplusplus.github.io/CWG/issues/200.html">200</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>dup</td>      <td>Partial ordering and explicit arguments</td>      <td class="full" align="center">Duplicate of <a href="#214">214</a></td>    </tr>    <tr id="201">      <td><a href="https://cplusplus.github.io/CWG/issues/201.html">201</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Order of destruction of temporaries in initializers</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="202">      <td><a href="https://cplusplus.github.io/CWG/issues/202.html">202</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>TC1</td>      <td>Use of overloaded function name</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="203">      <td><a href="https://cplusplus.github.io/CWG/issues/203.html">203</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>NAD</td>      <td>Type of address-of-member expression</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="204">      <td><a href="https://cplusplus.github.io/CWG/issues/204.html">204</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>CD1</td>      <td>Exported class templates</td>      <td class="full-superseded" align="center">Superseded by <a href="#820">820</a></td>    </tr>    <tr class="open" id="205">      <td><a href="https://cplusplus.github.io/CWG/issues/205.html">205</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>drafting</td>      <td>Templates and static data members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="206">      <td><a href="https://cplusplus.github.io/CWG/issues/206.html">206</a></td> +    <td>[<a href="https://wg21.link/temp.nondep">temp.nondep</a>]</td>      <td>TC1</td>      <td>Semantic constraints on non-dependent names</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="207">      <td><a href="https://cplusplus.github.io/CWG/issues/207.html">207</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>CD1</td>      <td><I>using-declaration</I>s and protected access</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="208">      <td><a href="https://cplusplus.github.io/CWG/issues/208.html">208</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD1</td>      <td>Rethrowing exceptions in nested handlers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="209">      <td><a href="https://cplusplus.github.io/CWG/issues/209.html">209</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td> -    <td>Must friend declaration names be -accessible?</td> +    <td>Must friend declaration names be accessible?</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="210">      <td><a href="https://cplusplus.github.io/CWG/issues/210.html">210</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>TC1</td>      <td>What is the type matched by an exception handler?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="211">      <td><a href="https://cplusplus.github.io/CWG/issues/211.html">211</a></td> +    <td>[<a href="https://wg21.link/except">except</a>]</td>      <td>NAD</td>      <td>Constructors should not be allowed to return normally after an exception</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="212">      <td><a href="https://cplusplus.github.io/CWG/issues/212.html">212</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>CD4</td>      <td>Implicit instantiation is not described clearly enough</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> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>TC1</td>      <td>Lookup in dependent base classes</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="214">      <td><a href="https://cplusplus.github.io/CWG/issues/214.html">214</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>CD1</td>      <td>Partial ordering of function templates is underspecified</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="215">      <td><a href="https://cplusplus.github.io/CWG/issues/215.html">215</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD1</td>      <td>Template parameters are not allowed in <I>nested-name-specifier</I>s</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="216">      <td><a href="https://cplusplus.github.io/CWG/issues/216.html">216</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD1</td>      <td>Linkage of nameless class-scope enumeration types</td>      <td class="none" align="center">No</td>    </tr>    <tr id="217">      <td><a href="https://cplusplus.github.io/CWG/issues/217.html">217</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>TC1</td>      <td>Default arguments for non-template member functions of class templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="218">      <td><a href="https://cplusplus.github.io/CWG/issues/218.html">218</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD1</td>      <td>Specification of Koenig lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="219">      <td><a href="https://cplusplus.github.io/CWG/issues/219.html">219</a></td> +    <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>      <td>NAD</td>      <td>Cannot defend against destructors that throw exceptions</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="220">      <td><a href="https://cplusplus.github.io/CWG/issues/220.html">220</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>CD1</td>      <td>All deallocation functions should be required not to throw</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="221">      <td><a href="https://cplusplus.github.io/CWG/issues/221.html">221</a></td> +    <td>[<a href="https://wg21.link/over.assign">over.assign</a>]</td>      <td>CD1</td>      <td>Must compound assignment operators be member functions?</td>      <td class="full" align="center">Clang 3.6</td>    </tr>    <tr id="222">      <td><a href="https://cplusplus.github.io/CWG/issues/222.html">222</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD1</td>      <td>Sequence points and lvalue-returning operators</td>      <td class="full" align="center">Duplicate of <a href="#637">637</a></td>    </tr>    <tr id="223">      <td><a href="https://cplusplus.github.io/CWG/issues/223.html">223</a></td> +    <td>[<a href="https://wg21.link/depr">depr</a>]</td>      <td>CD3</td>      <td>The meaning of deprecation</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="224">      <td><a href="https://cplusplus.github.io/CWG/issues/224.html">224</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD1</td>      <td>Definition of dependent names</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="225">      <td><a href="https://cplusplus.github.io/CWG/issues/225.html">225</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>NAD</td>      <td>Koenig lookup and fundamental types</td>      <td class="full" align="center">Yes</td>    </tr>    <tr id="226">      <td><a href="https://cplusplus.github.io/CWG/issues/226.html">226</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD1</td>      <td>Default template arguments for function templates</td>      <td class="none" align="center">No</td>    </tr>    <tr id="227">      <td><a href="https://cplusplus.github.io/CWG/issues/227.html">227</a></td> +    <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>      <td>TC1</td>      <td>How many scopes in an <TT>if</TT> statement?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="228">      <td><a href="https://cplusplus.github.io/CWG/issues/228.html">228</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>CD1</td>      <td>Use of <TT>template</TT> keyword with non-member templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="229">      <td><a href="https://cplusplus.github.io/CWG/issues/229.html">229</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>NAD</td>      <td>Partial specialization of function templates</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="230">      <td><a href="https://cplusplus.github.io/CWG/issues/230.html">230</a></td> +    <td>[<a href="https://wg21.link/class.abstract">class.abstract</a>]</td>      <td>NAD</td>      <td>Calls to pure virtual functions</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="231">      <td><a href="https://cplusplus.github.io/CWG/issues/231.html">231</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>NAD</td>      <td>Visibility of names after <I>using-directive</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="232">      <td><a href="https://cplusplus.github.io/CWG/issues/232.html">232</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>NAD</td>      <td>Is indirection through a null pointer undefined behavior?</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> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD7</td>      <td>References vs pointers in UDC overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="234">      <td><a href="https://cplusplus.github.io/CWG/issues/234.html">234</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>NAD</td>      <td>Reuse of base class subobjects</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="235">      <td><a href="https://cplusplus.github.io/CWG/issues/235.html">235</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>TC1</td>      <td>Assignment vs initialization</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="236">      <td><a href="https://cplusplus.github.io/CWG/issues/236.html">236</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Explicit temporaries and integral constant expressions</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="237">      <td><a href="https://cplusplus.github.io/CWG/issues/237.html">237</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD1</td>      <td>Explicit instantiation and base class members</td>      <td class="full" align="center">Duplicate of <a href="#470">470</a></td>    </tr>    <tr id="238">      <td><a href="https://cplusplus.github.io/CWG/issues/238.html">238</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD4</td>      <td>Precision and accuracy constraints on floating point</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="239">      <td><a href="https://cplusplus.github.io/CWG/issues/239.html">239</a></td> +    <td>[<a href="https://wg21.link/over.call.func">over.call.func</a>]</td>      <td>CD1</td>      <td>Footnote 116 and Koenig lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="240">      <td><a href="https://cplusplus.github.io/CWG/issues/240.html">240</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>CD3</td>      <td>Uninitialized values and undefined behavior</td>      <td class="full" align="center">Duplicate of <a href="#616">616</a></td>    </tr>    <tr id="241">      <td><a href="https://cplusplus.github.io/CWG/issues/241.html">241</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>TC1</td>      <td>Error in example in 14.8.1</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="242">      <td><a href="https://cplusplus.github.io/CWG/issues/242.html">242</a></td> +    <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>      <td>CD4</td>      <td>Interpretation of old-style casts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="243">      <td><a href="https://cplusplus.github.io/CWG/issues/243.html">243</a></td> +    <td>[<a href="https://wg21.link/over.ics.user">over.ics.user</a>]</td>      <td>NAD</td>      <td>Weighting of conversion functions in direct-initialization</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="244">      <td><a href="https://cplusplus.github.io/CWG/issues/244.html">244</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD1</td>      <td>Destructor lookup</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="245">      <td><a href="https://cplusplus.github.io/CWG/issues/245.html">245</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.elab">basic.lookup.elab</a>]</td>      <td>CD1</td>      <td>Name lookup in <I>elaborated-type-specifier</I>s</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="246">      <td><a href="https://cplusplus.github.io/CWG/issues/246.html">246</a></td> +    <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>      <td>CD1</td>      <td>Jumps in <I>function-try-block</I> handlers</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="247">      <td><a href="https://cplusplus.github.io/CWG/issues/247.html">247</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>NAD</td>      <td>Pointer-to-member casts and function overload resolution</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="248">      <td><a href="https://cplusplus.github.io/CWG/issues/248.html">248</a></td> +    <td>[<a href="https://wg21.link/extendid">extendid</a>]</td>      <td>C++11</td>      <td>Identifier characters</td>      <td class="na" align="center">Superseded by <a href="https://wg21.link/P1949">P1949</a></td>    </tr>    <tr id="249">      <td><a href="https://cplusplus.github.io/CWG/issues/249.html">249</a></td> +    <td>[<a href="https://wg21.link/temp.mem.func">temp.mem.func</a>]</td>      <td>TC1</td>      <td>What is a member function template?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="250">      <td><a href="https://cplusplus.github.io/CWG/issues/250.html">250</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>TC1</td>      <td>Address of function template specialization with non-deduced template arguments</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="251">      <td><a href="https://cplusplus.github.io/CWG/issues/251.html">251</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>open</td>      <td>How many signed integer types are there?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="252">      <td><a href="https://cplusplus.github.io/CWG/issues/252.html">252</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD1</td>      <td>Looking up deallocation functions in virtual destructors</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="253">      <td><a href="https://cplusplus.github.io/CWG/issues/253.html">253</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>C++17</td>      <td>Why must empty or fully-initialized const objects be initialized?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="254">      <td><a href="https://cplusplus.github.io/CWG/issues/254.html">254</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.elab">basic.lookup.elab</a>]</td>      <td>CD1</td>      <td>Definitional problems with <I>elaborated-type-specifier</I>s</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="255">      <td><a href="https://cplusplus.github.io/CWG/issues/255.html">255</a></td> +    <td>[<a href="https://wg21.link/class.free">class.free</a>]</td>      <td>CD6</td>      <td>Placement deallocation functions and lookup ambiguity</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="256">      <td><a href="https://cplusplus.github.io/CWG/issues/256.html">256</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD1</td>      <td>Overflow in size calculations</td>      <td class="unknown" align="center">Duplicate of <a href="#624">624</a></td>    </tr>    <tr id="257">      <td><a href="https://cplusplus.github.io/CWG/issues/257.html">257</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD2</td>      <td>Abstract base constructors and virtual base initialization</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="258">      <td><a href="https://cplusplus.github.io/CWG/issues/258.html">258</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD1</td>      <td><I>using-declaration</I>s and cv-qualifiers</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="259">      <td><a href="https://cplusplus.github.io/CWG/issues/259.html">259</a></td> +    <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>      <td>CD1</td>      <td>Restrictions on explicit specialization and instantiation</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr class="open" id="260">      <td><a href="https://cplusplus.github.io/CWG/issues/260.html">260</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>open</td>      <td>User-defined conversions and built-in <TT>operator=</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="261">      <td><a href="https://cplusplus.github.io/CWG/issues/261.html">261</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD1</td>      <td>When is a deallocation function "used?"</td>      <td class="none" align="center">No</td>    </tr>    <tr id="262">      <td><a href="https://cplusplus.github.io/CWG/issues/262.html">262</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD1</td>      <td>Default arguments and ellipsis</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="263">      <td><a href="https://cplusplus.github.io/CWG/issues/263.html">263</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD1</td>      <td>Can a constructor be declared a friend?</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr class="open" id="264">      <td><a href="https://cplusplus.github.io/CWG/issues/264.html">264</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>open</td>      <td>Unusable template constructors and conversion functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="265">      <td><a href="https://cplusplus.github.io/CWG/issues/265.html">265</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>dup</td>      <td>Destructors, exceptions, and deallocation</td>      <td class="unknown" align="center">Duplicate of <a href="#353">353</a></td>    </tr>    <tr id="266">      <td><a href="https://cplusplus.github.io/CWG/issues/266.html">266</a></td> +    <td>[<a href="https://wg21.link/gram">gram</a>]</td>      <td>NAD</td>      <td>No grammar sentence symbol</td>      <td class="na" align="center">N/A</td>    </tr>    <tr class="open" id="267">      <td><a href="https://cplusplus.github.io/CWG/issues/267.html">267</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Alignment requirement for <I>new-expression</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="268">      <td><a href="https://cplusplus.github.io/CWG/issues/268.html">268</a></td> +    <td>[<a href="https://wg21.link/cpp.rescan">cpp.rescan</a>]</td>      <td>open</td>      <td>Macro name suppression in rescanned replacement text</td>      <td align="center">Not resolved</td>    </tr>    <tr id="269">      <td><a href="https://cplusplus.github.io/CWG/issues/269.html">269</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>NAD</td> -    <td>Order of initialization of multiply-defined static data members -of class templates</td> +    <td>Order of initialization of multiply-defined static data members of class templates</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="270">      <td><a href="https://cplusplus.github.io/CWG/issues/270.html">270</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD1</td>      <td>Order of initialization of static data members of class templates</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="271">      <td><a href="https://cplusplus.github.io/CWG/issues/271.html">271</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD6</td>      <td>Explicit instantiation and template argument deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="272">      <td><a href="https://cplusplus.github.io/CWG/issues/272.html">272</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD1</td>      <td>Explicit destructor invocation and <I>qualified-id</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="273">      <td><a href="https://cplusplus.github.io/CWG/issues/273.html">273</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>POD classes and <TT>operator&()</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="274">      <td><a href="https://cplusplus.github.io/CWG/issues/274.html">274</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD1</td>      <td>Cv-qualification and char-alias access to out-of-lifetime objects</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="275">      <td><a href="https://cplusplus.github.io/CWG/issues/275.html">275</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD1</td>      <td>Explicit instantiation/specialization and <I>using-directive</I>s</td>      <td class="none" align="center">No</td>    </tr>    <tr id="276">      <td><a href="https://cplusplus.github.io/CWG/issues/276.html">276</a></td> +    <td>[<a href="https://wg21.link/stmt.jump">stmt.jump</a>]</td>      <td>CD1</td>      <td>Order of destruction of parameters and temporaries</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="277">      <td><a href="https://cplusplus.github.io/CWG/issues/277.html">277</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>Zero-initialization of pointers</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="278">      <td><a href="https://cplusplus.github.io/CWG/issues/278.html">278</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>NAD</td>      <td>External linkage and nameless entities</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="279">      <td><a href="https://cplusplus.github.io/CWG/issues/279.html">279</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD6</td>      <td>Correspondence of "names for linkage purposes"</td>      <td class="none" align="center">No</td>    </tr>    <tr id="280">      <td><a href="https://cplusplus.github.io/CWG/issues/280.html">280</a></td> +    <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>      <td>CD1</td>      <td>Access and surrogate call functions</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="281">      <td><a href="https://cplusplus.github.io/CWG/issues/281.html">281</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD1</td>      <td><TT>inline</TT> specifier in <TT>friend</TT> declarations</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="282">      <td><a href="https://cplusplus.github.io/CWG/issues/282.html">282</a></td> +    <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>      <td>open</td>      <td>Namespace for <TT>extended_type_info</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="283">      <td><a href="https://cplusplus.github.io/CWG/issues/283.html">283</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD1</td>      <td>Template <I>type-parameter</I>s are not syntactically <I>type-name</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="284">      <td><a href="https://cplusplus.github.io/CWG/issues/284.html">284</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td><I>qualified-id</I>s in class declarations</td>      <td class="none" align="center">No</td>    </tr>    <tr id="285">      <td><a href="https://cplusplus.github.io/CWG/issues/285.html">285</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Identifying a function template being specialized</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="286">      <td><a href="https://cplusplus.github.io/CWG/issues/286.html">286</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>CD1</td>      <td>Incorrect example in partial specialization</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr class="open" id="287">      <td><a href="https://cplusplus.github.io/CWG/issues/287.html">287</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>drafting</td>      <td>Order dependencies in template instantiation</td>      <td align="center">Not resolved</td>    </tr>    <tr id="288">      <td><a href="https://cplusplus.github.io/CWG/issues/288.html">288</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD1</td>      <td>Misuse of "static type" in describing pointers</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="289">      <td><a href="https://cplusplus.github.io/CWG/issues/289.html">289</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD1</td>      <td>Incomplete list of contexts requiring a complete type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="290">      <td><a href="https://cplusplus.github.io/CWG/issues/290.html">290</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>NAD</td>      <td>Should memcpy be allowed into a POD with a const member?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="291">      <td><a href="https://cplusplus.github.io/CWG/issues/291.html">291</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD1</td>      <td>Overload resolution needed when binding reference to class rvalue</td>      <td class="full" align="center">Duplicate of <a href="#391">391</a></td>    </tr>    <tr id="292">      <td><a href="https://cplusplus.github.io/CWG/issues/292.html">292</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD3</td>      <td>Deallocation on exception in <TT>new</TT> before arguments evaluated</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr class="open" id="293">      <td><a href="https://cplusplus.github.io/CWG/issues/293.html">293</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>open</td>      <td>Syntax of explicit instantiation/specialization too permissive</td>      <td align="center">Not resolved</td>    </tr>    <tr id="294">      <td><a href="https://cplusplus.github.io/CWG/issues/294.html">294</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>NAD</td>      <td>Can <TT>static_cast</TT> drop exception specifications?</td>      <td class="none" align="center">No</td>    </tr>    <tr id="295">      <td><a href="https://cplusplus.github.io/CWG/issues/295.html">295</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD1</td>      <td>cv-qualifiers on function types</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="296">      <td><a href="https://cplusplus.github.io/CWG/issues/296.html">296</a></td> +    <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>      <td>CD1</td>      <td>Can conversion functions be static?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="297">      <td><a href="https://cplusplus.github.io/CWG/issues/297.html">297</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>NAD</td>      <td>Which template does an explicit specialization specialize?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="298">      <td><a href="https://cplusplus.github.io/CWG/issues/298.html">298</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>CD1</td>      <td><TT>T::x</TT> when <TT>T</TT> is cv-qualified</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="299">      <td><a href="https://cplusplus.github.io/CWG/issues/299.html">299</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD1</td>      <td>Conversion on array bound expression in <TT>new</TT></td>      <td class="full" align="center">Clang 2.8 (C++11 onwards)</td>    </tr>    <tr id="300">      <td><a href="https://cplusplus.github.io/CWG/issues/300.html">300</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD1</td>      <td>References to functions in template argument deduction</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="301">      <td><a href="https://cplusplus.github.io/CWG/issues/301.html">301</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>CD1</td>      <td>Syntax for <I>template-name</I></td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="302">      <td><a href="https://cplusplus.github.io/CWG/issues/302.html">302</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>Value-initialization and generation of default constructor</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="303">      <td><a href="https://cplusplus.github.io/CWG/issues/303.html">303</a></td> +    <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>      <td>NAD</td>      <td>Integral promotions on bit-fields</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="304">      <td><a href="https://cplusplus.github.io/CWG/issues/304.html">304</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>TC1</td>      <td>Value-initialization of a reference</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="305">      <td><a href="https://cplusplus.github.io/CWG/issues/305.html">305</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD1</td>      <td>Name lookup in destructor call</td>      <td class="none" align="center">No</td>    </tr>    <tr id="306">      <td><a href="https://cplusplus.github.io/CWG/issues/306.html">306</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>CD1</td>      <td>Ambiguity by class name injection</td>      <td class="none" align="center">Duplicate of <a href="#39">39</a></td>    </tr>    <tr id="307">      <td><a href="https://cplusplus.github.io/CWG/issues/307.html">307</a></td> +    <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>      <td>NAD</td>      <td>Initialization of a virtual base class subobject</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="308">      <td><a href="https://cplusplus.github.io/CWG/issues/308.html">308</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>NAD</td>      <td>Catching exceptions with ambiguous base classes</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="309">      <td><a href="https://cplusplus.github.io/CWG/issues/309.html">309</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>CD1</td>      <td>Linkage of entities whose names are not simply identifiers, in introduction</td>      <td class="full" align="center">Duplicate of <a href="#485">485</a></td>    </tr>    <tr class="open" id="310">      <td><a href="https://cplusplus.github.io/CWG/issues/310.html">310</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>open</td>      <td>Can function templates differing only in parameter cv-qualifiers be overloaded?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="311">      <td><a href="https://cplusplus.github.io/CWG/issues/311.html">311</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>NAD</td>      <td>Using qualified name to reopen nested namespace</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="312">      <td><a href="https://cplusplus.github.io/CWG/issues/312.html">312</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>CD3</td>      <td>“use” of invalid pointer value not defined</td>      <td class="full" align="center">Duplicate of <a href="#616">616</a></td>    </tr>    <tr id="313">      <td><a href="https://cplusplus.github.io/CWG/issues/313.html">313</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>dup</td>      <td>Class with single conversion function to integral as array size in <TT>new</TT></td>      <td class="full" align="center">Duplicate of <a href="#299">299</a> (C++11 onwards)</td>    </tr>    <tr id="314">      <td><a href="https://cplusplus.github.io/CWG/issues/314.html">314</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>C++17</td>      <td><TT>template</TT> in base class specifier</td>      <td class="none" align="center">No</td>    </tr>    <tr id="315">      <td><a href="https://cplusplus.github.io/CWG/issues/315.html">315</a></td> +    <td>[<a href="https://wg21.link/class.static.mfct">class.static.mfct</a>]</td>      <td>NAD</td>      <td>Is call of static member function through null pointer undefined?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="316">      <td><a href="https://cplusplus.github.io/CWG/issues/316.html">316</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>NAD</td>      <td>Injected-class-name of template used as template template parameter</td>      <td class="full-superseded" align="center">Superseded by <a href="#1004">1004</a></td>    </tr>    <tr id="317">      <td><a href="https://cplusplus.github.io/CWG/issues/317.html">317</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD1</td>      <td>Can a function be declared inline after it has been called?</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="318">      <td><a href="https://cplusplus.github.io/CWG/issues/318.html">318</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>CD1</td>      <td><TT>struct A::A</TT> should not name the constructor of <TT>A</TT></td>      <td class="full-superseded" align="center">Superseded by <a href="#1310">1310</a></td>    </tr>    <tr id="319">      <td><a href="https://cplusplus.github.io/CWG/issues/319.html">319</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD1</td>      <td>Use of names without linkage in declaring entities with linkage</td>      <td class="none" align="center">No</td>    </tr>    <tr id="320">      <td><a href="https://cplusplus.github.io/CWG/issues/320.html">320</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Question on copy constructor elision example</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="321">      <td><a href="https://cplusplus.github.io/CWG/issues/321.html">321</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>dup</td>      <td>Associated classes and namespaces for argument-dependent lookup</td>      <td class="full" align="center">Duplicate of <a href="#557">557</a></td>    </tr>    <tr id="322">      <td><a href="https://cplusplus.github.io/CWG/issues/322.html">322</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD1</td>      <td>Deduction of reference conversions</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="323">      <td><a href="https://cplusplus.github.io/CWG/issues/323.html">323</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>CD1</td>      <td>Where must <TT>export</TT> appear?</td>      <td class="full-superseded" align="center">Superseded by <a href="#820">820</a></td>    </tr>    <tr id="324">      <td><a href="https://cplusplus.github.io/CWG/issues/324.html">324</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>CD1</td>      <td>Can "<TT>&</TT>" be applied to assignment to bit-field?</td>      <td class="full" align="center">Clang 3.6</td>    </tr>    <tr class="open" id="325">      <td><a href="https://cplusplus.github.io/CWG/issues/325.html">325</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>open</td>      <td>When are default arguments parsed?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="326">      <td><a href="https://cplusplus.github.io/CWG/issues/326.html">326</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD1</td>      <td>Wording for definition of trivial constructor</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="327">      <td><a href="https://cplusplus.github.io/CWG/issues/327.html">327</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>Use of "structure" without definition</td>      <td class="na" align="center">Duplicate of <a href="#538">538</a></td>    </tr>    <tr id="328">      <td><a href="https://cplusplus.github.io/CWG/issues/328.html">328</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD1</td>      <td>Missing requirement that class member types be complete</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="329">      <td><a href="https://cplusplus.github.io/CWG/issues/329.html">329</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD1</td>      <td>Evaluation of friends of templates</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="330">      <td><a href="https://cplusplus.github.io/CWG/issues/330.html">330</a></td> +    <td>[<a href="https://wg21.link/conv.qual">conv.qual</a>]</td>      <td>CD4</td>      <td>Qualification conversions and pointers to arrays of pointers</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="331">      <td><a href="https://cplusplus.github.io/CWG/issues/331.html">331</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD1</td>      <td>Allowed copy constructor signatures</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="332">      <td><a href="https://cplusplus.github.io/CWG/issues/332.html">332</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD3</td>      <td>cv-qualified <TT>void</TT> parameter types</td>      <td class="full" align="center">Duplicate of <a href="#577">577</a></td>    </tr>    <tr id="333">      <td><a href="https://cplusplus.github.io/CWG/issues/333.html">333</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>NAD</td>      <td>Ambiguous use of "declaration" in disambiguation section</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="334">      <td><a href="https://cplusplus.github.io/CWG/issues/334.html">334</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>NAD</td>      <td>Is a comma-expression dependent if its first operand is?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="335">      <td><a href="https://cplusplus.github.io/CWG/issues/335.html">335</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>CD1</td>      <td>Allowing <TT>export</TT> on template members of nontemplate classes</td>      <td class="full-superseded" align="center">Superseded by <a href="#820">820</a></td>    </tr>    <tr id="336">      <td><a href="https://cplusplus.github.io/CWG/issues/336.html">336</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD1</td>      <td>Explicit specialization examples are still incorrect</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="337">      <td><a href="https://cplusplus.github.io/CWG/issues/337.html">337</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD1</td>      <td>Attempt to create array of abtract type should cause deduction to fail</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="338">      <td><a href="https://cplusplus.github.io/CWG/issues/338.html">338</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD6</td>      <td>Enumerator name with linkage used as class name in other translation unit</td>      <td class="partial" align="center">Duplicate of <a href="#1884">1884</a></td>    </tr>    <tr id="339">      <td><a href="https://cplusplus.github.io/CWG/issues/339.html">339</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD1</td>      <td>Overload resolution in operand of <TT>sizeof</TT> in constant expression</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="340">      <td><a href="https://cplusplus.github.io/CWG/issues/340.html">340</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>NAD</td>      <td>Unclear wording in disambiguation section</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="341">      <td><a href="https://cplusplus.github.io/CWG/issues/341.html">341</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>C++11</td>      <td><TT>extern "C"</TT> namespace member function versus global variable</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#1708">1708</a></td>    </tr>    <tr id="342">      <td><a href="https://cplusplus.github.io/CWG/issues/342.html">342</a></td> +    <td>[<a href="https://wg21.link/expr.unary">expr.unary</a>]</td>      <td>CD3</td>      <td>Terminology: "indirection" versus "dereference"</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="343">      <td><a href="https://cplusplus.github.io/CWG/issues/343.html">343</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>C++17</td>      <td>Make <TT>template</TT> optional in contexts that require a type</td>      <td class="none" align="center">No</td>    </tr>    <tr id="344">      <td><a href="https://cplusplus.github.io/CWG/issues/344.html">344</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD3</td>      <td>Naming destructors</td>      <td class="unknown" align="center">Duplicate of <a href="#1435">1435</a></td>    </tr>    <tr id="345">      <td><a href="https://cplusplus.github.io/CWG/issues/345.html">345</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD1</td>      <td>Misleading comment on example in templates chapter</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="346">      <td><a href="https://cplusplus.github.io/CWG/issues/346.html">346</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td>Typo in 15.4</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="347">      <td><a href="https://cplusplus.github.io/CWG/issues/347.html">347</a></td> +    <td>[<a href="https://wg21.link/class.nest">class.nest</a>]</td>      <td>NAD</td>      <td>Use of derived class name in defining base class nested class</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="348">      <td><a href="https://cplusplus.github.io/CWG/issues/348.html">348</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>CD1</td>      <td><TT>delete</TT> and user-written deallocation functions</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="349">      <td><a href="https://cplusplus.github.io/CWG/issues/349.html">349</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD1</td>      <td>Template argument deduction for conversion functions and qualification conversions</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="350">      <td><a href="https://cplusplus.github.io/CWG/issues/350.html">350</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>open</td>      <td><TT>signed char</TT> underlying representation for objects</td>      <td align="center">Not resolved</td>    </tr>    <tr id="351">      <td><a href="https://cplusplus.github.io/CWG/issues/351.html">351</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD1</td>      <td>Sequence point error: unspecified or undefined?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="352">      <td><a href="https://cplusplus.github.io/CWG/issues/352.html">352</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD1</td>      <td>Nondeduced contexts</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="353">      <td><a href="https://cplusplus.github.io/CWG/issues/353.html">353</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD1</td>      <td>Is deallocation routine called if destructor throws exception in delete?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="354">      <td><a href="https://cplusplus.github.io/CWG/issues/354.html">354</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>CD1</td>      <td>Null as nontype template argument</td>      <td class="full" align="center">Clang 3.1 (C++11 onwards)</td>    </tr>    <tr id="355">      <td><a href="https://cplusplus.github.io/CWG/issues/355.html">355</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>C++11</td>      <td>Global-scope <TT>::</TT> in <I>nested-name-specifier</I></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="356">      <td><a href="https://cplusplus.github.io/CWG/issues/356.html">356</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Wording of behavior of generated copy constructor for scalar members</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="357">      <td><a href="https://cplusplus.github.io/CWG/issues/357.html">357</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>CD1</td>      <td>Definition of signature should include name</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="358">      <td><a href="https://cplusplus.github.io/CWG/issues/358.html">358</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td>Namespaces and extern "C"</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="359">      <td><a href="https://cplusplus.github.io/CWG/issues/359.html">359</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>NAD</td>      <td>Type definition in anonymous union</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="360">      <td><a href="https://cplusplus.github.io/CWG/issues/360.html">360</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>CD6</td>      <td>Using-declaration that reduces access</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr class="open" id="361">      <td><a href="https://cplusplus.github.io/CWG/issues/361.html">361</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>open</td>      <td>Forward reference to default argument</td>      <td align="center">Not resolved</td>    </tr>    <tr id="362">      <td><a href="https://cplusplus.github.io/CWG/issues/362.html">362</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD1</td>      <td>Order of initialization in instantiation units</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="363">      <td><a href="https://cplusplus.github.io/CWG/issues/363.html">363</a></td> +    <td>[<a href="https://wg21.link/class.expl.init">class.expl.init</a>]</td>      <td>NAD</td>      <td>Initialization of class from self</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="364">      <td><a href="https://cplusplus.github.io/CWG/issues/364.html">364</a></td> +    <td>[<a href="https://wg21.link/over.call.func">over.call.func</a>]</td>      <td>CD1</td>      <td>Calling overloaded function with static in set, with no object</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="365">      <td><a href="https://cplusplus.github.io/CWG/issues/365.html">365</a></td> +    <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>      <td>open</td>      <td>Storage duration and temporaries</td>      <td align="center">Not resolved</td>    </tr>    <tr id="366">      <td><a href="https://cplusplus.github.io/CWG/issues/366.html">366</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD1</td>      <td>String literal allowed in integral constant expression?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="367">      <td><a href="https://cplusplus.github.io/CWG/issues/367.html">367</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD1</td>      <td><TT>throw</TT> operator allowed in constant expression?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="368">      <td><a href="https://cplusplus.github.io/CWG/issues/368.html">368</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD1</td>      <td>Uses of non-type parameters that should cause deduction to fail</td>      <td class="full" align="center">Clang 3.6</td>    </tr>    <tr class="open" id="369">      <td><a href="https://cplusplus.github.io/CWG/issues/369.html">369</a></td> +    <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>      <td>open</td>      <td>Are <TT>new</TT>/<TT>delete</TT> identifiers or <I>preprocessing-op-or-punc</I>?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="370">      <td><a href="https://cplusplus.github.io/CWG/issues/370.html">370</a></td> +    <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>      <td>CD1</td>      <td>Can <TT>#include <...></TT> form be used other than for standard C++ headers?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr class="open" id="371">      <td><a href="https://cplusplus.github.io/CWG/issues/371.html">371</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>open</td>      <td>Interleaving of constructor calls</td>      <td align="center">Not resolved</td>    </tr>    <tr id="372">      <td><a href="https://cplusplus.github.io/CWG/issues/372.html">372</a></td> +    <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>      <td>CD1</td>      <td>Is access granted by base class specifiers available in following base class specifiers?</td>      <td class="none" align="center">No</td>    </tr>    <tr id="373">      <td><a href="https://cplusplus.github.io/CWG/issues/373.html">373</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.udir">basic.lookup.udir</a>]</td>      <td>C++11</td>      <td>Lookup on namespace qualified name in using-directive</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr id="374">      <td><a href="https://cplusplus.github.io/CWG/issues/374.html">374</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>CD2</td>      <td>Can explicit specialization outside namespace use qualified name?</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="375">      <td><a href="https://cplusplus.github.io/CWG/issues/375.html">375</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>dup</td>      <td>Confusing example on lookup with <TT>typename</TT></td>      <td class="full" align="center">Duplicate of <a href="#345">345</a></td>    </tr>    <tr id="376">      <td><a href="https://cplusplus.github.io/CWG/issues/376.html">376</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>NAD</td>      <td>Class "definition" versus class "declaration"</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="377">      <td><a href="https://cplusplus.github.io/CWG/issues/377.html">377</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD1</td>      <td>Enum whose enumerators will not fit in any integral type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="378">      <td><a href="https://cplusplus.github.io/CWG/issues/378.html">378</a></td> +    <td>[<a href="https://wg21.link/stmt.jump">stmt.jump</a>]</td>      <td>CD1</td>      <td>Wording that says temporaries are declared</td>      <td class="na" align="center">Duplicate of <a href="#276">276</a></td>    </tr>    <tr id="379">      <td><a href="https://cplusplus.github.io/CWG/issues/379.html">379</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>Change "class declaration" to "class definition"</td>      <td class="na" align="center">N/A</td>    </tr>    <tr class="open" id="380">      <td><a href="https://cplusplus.github.io/CWG/issues/380.html">380</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>open</td>      <td>Definition of "ambiguous base class" missing</td>      <td align="center">Not resolved</td>    </tr>    <tr id="381">      <td><a href="https://cplusplus.github.io/CWG/issues/381.html">381</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD1</td>      <td>Incorrect example of base class member lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="382">      <td><a href="https://cplusplus.github.io/CWG/issues/382.html">382</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD1</td>      <td>Allow <TT>typename</TT> outside of templates</td>      <td class="full" align="center">Clang 2.7 (C++11 onwards)</td>    </tr>    <tr id="383">      <td><a href="https://cplusplus.github.io/CWG/issues/383.html">383</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>Is a class with a declared but not defined destructor a POD?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="384">      <td><a href="https://cplusplus.github.io/CWG/issues/384.html">384</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>NAD</td>      <td>Argument-dependent lookup and operator functions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="385">      <td><a href="https://cplusplus.github.io/CWG/issues/385.html">385</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>CD1</td>      <td>How does protected member check of 11.5 interact with using-declarations?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="386">      <td><a href="https://cplusplus.github.io/CWG/issues/386.html">386</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD6</td>      <td>Friend declaration of name brought in by <I>using-declaration</I></td>      <td class="none" align="center">No</td>    </tr>    <tr id="387">      <td><a href="https://cplusplus.github.io/CWG/issues/387.html">387</a></td> +    <td>[<a href="https://wg21.link/temp.inject">temp.inject</a>]</td>      <td>CD1</td>      <td>Errors in example in 14.6.5</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="388">      <td><a href="https://cplusplus.github.io/CWG/issues/388.html">388</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>CD3</td>      <td>Catching base<TT>*&</TT> from a throw of derived<TT>*</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="389">      <td><a href="https://cplusplus.github.io/CWG/issues/389.html">389</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD1</td>      <td>Unnamed types in entities with linkage</td>      <td class="none" align="center">No</td>    </tr>    <tr id="390">      <td><a href="https://cplusplus.github.io/CWG/issues/390.html">390</a></td> +    <td>[<a href="https://wg21.link/class.abstract">class.abstract</a>]</td>      <td>CD1</td>      <td>Pure virtual must be defined when implicitly called</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="391">      <td><a href="https://cplusplus.github.io/CWG/issues/391.html">391</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD1</td>      <td>Require direct binding of short-lived references to rvalues</td>      <td class="full" align="center">Clang 2.8 (C++11 onwards)</td>    </tr>    <tr id="392">      <td><a href="https://cplusplus.github.io/CWG/issues/392.html">392</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Use of full expression lvalue before temporary destruction</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="393">      <td><a href="https://cplusplus.github.io/CWG/issues/393.html">393</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD4</td>      <td>Pointer to array of unknown bound in template argument list in parameter</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="394">      <td><a href="https://cplusplus.github.io/CWG/issues/394.html">394</a></td> +    <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>      <td>CD1</td>      <td><I>identifier-list</I> is never defined</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="395">      <td><a href="https://cplusplus.github.io/CWG/issues/395.html">395</a></td> +    <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>      <td>NAD</td>      <td>Conversion operator template syntax</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="396">      <td><a href="https://cplusplus.github.io/CWG/issues/396.html">396</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD1</td>      <td>Misleading note regarding use of <TT>auto</TT> for disambiguation</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="397">      <td><a href="https://cplusplus.github.io/CWG/issues/397.html">397</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD1</td>      <td>Same address for string literals from default arguments in inline functions?</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#1823">1823</a></td>    </tr>    <tr id="398">      <td><a href="https://cplusplus.github.io/CWG/issues/398.html">398</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD1</td>      <td>Ambiguous wording on naming a type in deduction</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="399">      <td><a href="https://cplusplus.github.io/CWG/issues/399.html">399</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD6</td>      <td>Destructor lookup redux</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="400">      <td><a href="https://cplusplus.github.io/CWG/issues/400.html">400</a></td> +    <td>[<a href="https://wg21.link/namespace.qual">namespace.qual</a>]</td>      <td>CD1</td>      <td>Using-declarations and the "struct hack"</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="401">      <td><a href="https://cplusplus.github.io/CWG/issues/401.html">401</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD1</td>      <td>When is access for template parameter default arguments checked?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr class="open" id="402">      <td><a href="https://cplusplus.github.io/CWG/issues/402.html">402</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>open</td>      <td>More on partial ordering of function templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="403">      <td><a href="https://cplusplus.github.io/CWG/issues/403.html">403</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD1</td>      <td>Reference to a type as a <I>template-id</I></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="404">      <td><a href="https://cplusplus.github.io/CWG/issues/404.html">404</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD1</td>      <td>Unclear reference to construction with non-trivial constructor</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="405">      <td><a href="https://cplusplus.github.io/CWG/issues/405.html">405</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD6</td>      <td>Unqualified function name lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="406">      <td><a href="https://cplusplus.github.io/CWG/issues/406.html">406</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>CD1</td>      <td>Static data member in class with name for linkage purposes</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="407">      <td><a href="https://cplusplus.github.io/CWG/issues/407.html">407</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>C++11</td>      <td>Named class with associated typedef: two names or one?</td>      <td class="full" align="center">Clang 3.8</td>    </tr>    <tr id="408">      <td><a href="https://cplusplus.github.io/CWG/issues/408.html">408</a></td> +    <td>[<a href="https://wg21.link/temp.static">temp.static</a>]</td>      <td>CD2</td>      <td>sizeof applied to unknown-bound array static data member of template</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="409">      <td><a href="https://cplusplus.github.io/CWG/issues/409.html">409</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD1</td>      <td>Obsolete paragraph missed by changes for issue 224</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="410">      <td><a href="https://cplusplus.github.io/CWG/issues/410.html">410</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD1</td>      <td>Paragraph missed in changes for issue 166</td>      <td class="none" align="center">No</td>    </tr>    <tr id="411">      <td><a href="https://cplusplus.github.io/CWG/issues/411.html">411</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD6</td>      <td>Use of universal-character-name in character versus string literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="412">      <td><a href="https://cplusplus.github.io/CWG/issues/412.html">412</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>NAD</td>      <td>Can a replacement allocation function be inline?</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="413">      <td><a href="https://cplusplus.github.io/CWG/issues/413.html">413</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>Definition of "empty class"</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="414">      <td><a href="https://cplusplus.github.io/CWG/issues/414.html">414</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD1</td>      <td>Multiple types found on destructor lookup</td>      <td class="none" align="center">Duplicate of <a href="#305">305</a></td>    </tr>    <tr id="415">      <td><a href="https://cplusplus.github.io/CWG/issues/415.html">415</a></td> +    <td>[<a href="https://wg21.link/temp.over">temp.over</a>]</td>      <td>CD1</td>      <td>Template deduction does not cause instantiation</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="416">      <td><a href="https://cplusplus.github.io/CWG/issues/416.html">416</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>CD1</td>      <td>Class must be complete to allow operator lookup?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="417">      <td><a href="https://cplusplus.github.io/CWG/issues/417.html">417</a></td> +    <td>[<a href="https://wg21.link/class.name">class.name</a>]</td>      <td>CD1</td>      <td>Using derived-class qualified name in out-of-class nested class definition</td>      <td class="none" align="center">No</td>    </tr>    <tr id="418">      <td><a href="https://cplusplus.github.io/CWG/issues/418.html">418</a></td> +    <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>      <td>CD6</td>      <td>Imperfect wording on error on multiple default arguments on a called function</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="419">      <td><a href="https://cplusplus.github.io/CWG/issues/419.html">419</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Can cast to virtual base class be done on partially-constructed object?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="420">      <td><a href="https://cplusplus.github.io/CWG/issues/420.html">420</a></td> +    <td>[<a href="https://wg21.link/over.ref">over.ref</a>]</td>      <td>CD1</td>      <td>postfixexpression->scalar_type_dtor() inconsistent</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="421">      <td><a href="https://cplusplus.github.io/CWG/issues/421.html">421</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD1</td>      <td>Is rvalue.field an rvalue?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="422">      <td><a href="https://cplusplus.github.io/CWG/issues/422.html">422</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>NAD</td>      <td>Is a typedef redeclaration allowed with a template type that might be the same?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="423">      <td><a href="https://cplusplus.github.io/CWG/issues/423.html">423</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>NAD</td>      <td>Can a conversion be done on the left operand of a compound assignment?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="424">      <td><a href="https://cplusplus.github.io/CWG/issues/424.html">424</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD1</td>      <td>Wording problem with issue 56 resolution on redeclaring typedefs in class scope</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="425">      <td><a href="https://cplusplus.github.io/CWG/issues/425.html">425</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>CD1</td>      <td>Set of candidates for overloaded built-in operator with float operand</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="426">      <td><a href="https://cplusplus.github.io/CWG/issues/426.html">426</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>C++17</td>      <td>Identically-named variables, one internally and one externally linked, allowed?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="427">      <td><a href="https://cplusplus.github.io/CWG/issues/427.html">427</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD1</td>      <td><TT>static_cast</TT> ambiguity: conversion versus cast to derived</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="428">      <td><a href="https://cplusplus.github.io/CWG/issues/428.html">428</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD1</td>      <td>Mention of expression with reference type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="429">      <td><a href="https://cplusplus.github.io/CWG/issues/429.html">429</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD1</td>      <td>Matching deallocation function chosen based on syntax or signature?</td>      <td class="full" align="center">Clang 2.8 (C++11 onwards)</td>    </tr>    <tr id="430">      <td><a href="https://cplusplus.github.io/CWG/issues/430.html">430</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD1</td>      <td>Ordering of expression evaluation in initializer list</td>      <td class="full" align="center">Clang 2.7 (C++11 onwards)</td>    </tr>    <tr id="431">      <td><a href="https://cplusplus.github.io/CWG/issues/431.html">431</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>C++11</td>      <td>Defect in wording in 14.2</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="432">      <td><a href="https://cplusplus.github.io/CWG/issues/432.html">432</a></td> +    <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>      <td>CD1</td>      <td>Is injected class name visible in base class specifier list?</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="433">      <td><a href="https://cplusplus.github.io/CWG/issues/433.html">433</a></td> +    <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>      <td>CD1</td>      <td>Do elaborated type specifiers in templates inject into enclosing namespace scope?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="434">      <td><a href="https://cplusplus.github.io/CWG/issues/434.html">434</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>NAD</td>      <td>Unclear suppression of standard conversions while binding reference to lvalue</td>      <td class="full-superseded" align="center">Superseded by <a href="#2352">2352</a></td>    </tr>    <tr id="435">      <td><a href="https://cplusplus.github.io/CWG/issues/435.html">435</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>NAD</td>      <td>Change "declararation or definition" to "declaration"</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="436">      <td><a href="https://cplusplus.github.io/CWG/issues/436.html">436</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD1</td>      <td>Problem in example in 9.6 paragraph 4</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="437">      <td><a href="https://cplusplus.github.io/CWG/issues/437.html">437</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD1</td>      <td>Is type of class allowed in member function exception specification?</td>      <td class="full-superseded-superseded" align="center">Superseded by <a href="#1308">1308</a></td>    </tr>    <tr id="438">      <td><a href="https://cplusplus.github.io/CWG/issues/438.html">438</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD2</td>      <td>Possible flaw in wording for multiple accesses to object between sequence points</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="439">      <td><a href="https://cplusplus.github.io/CWG/issues/439.html">439</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD1</td>      <td>Guarantees on casting pointer back to cv-qualified version of original type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="440">      <td><a href="https://cplusplus.github.io/CWG/issues/440.html">440</a></td> +    <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>      <td>NAD</td>      <td>Allow implicit pointer-to-member conversion on nontype template argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="441">      <td><a href="https://cplusplus.github.io/CWG/issues/441.html">441</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD1</td>      <td>Ordering of static reference initialization</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="442">      <td><a href="https://cplusplus.github.io/CWG/issues/442.html">442</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD1</td>      <td>Incorrect use of null pointer constant in description of delete operator</td>      <td class="na-superseded" align="center">Superseded by <a href="#348">348</a></td>    </tr>    <tr id="443">      <td><a href="https://cplusplus.github.io/CWG/issues/443.html">443</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Wording nit in description of lifetime of temporaries</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="444">      <td><a href="https://cplusplus.github.io/CWG/issues/444.html">444</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>NAD</td>      <td>Overriding and the generated copy assignment operator</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="445">      <td><a href="https://cplusplus.github.io/CWG/issues/445.html">445</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td>      <td>Wording issue on friend declarations</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="446">      <td><a href="https://cplusplus.github.io/CWG/issues/446.html">446</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD1</td>      <td>Does an lvalue-to-rvalue conversion on the "?" operator produce a temporary?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="447">      <td><a href="https://cplusplus.github.io/CWG/issues/447.html">447</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD1</td>      <td>Is offsetof type-dependent?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="448">      <td><a href="https://cplusplus.github.io/CWG/issues/448.html">448</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>C++11</td>      <td>Set of template functions in call with dependent explicit argument</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="449">      <td><a href="https://cplusplus.github.io/CWG/issues/449.html">449</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>NAD</td>      <td>Consistency in use of hyphen with names of "non" entities</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="450">      <td><a href="https://cplusplus.github.io/CWG/issues/450.html">450</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD1</td>      <td>Binding a reference to const to a cv-qualified array rvalue</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="451">      <td><a href="https://cplusplus.github.io/CWG/issues/451.html">451</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD1</td>      <td>Expressions with invalid results and ill-formedness</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="452">      <td><a href="https://cplusplus.github.io/CWG/issues/452.html">452</a></td> +    <td>[<a href="https://wg21.link/class.this">class.this</a>]</td>      <td>CD1</td>      <td>Wording nit on description of <TT>this</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="453">      <td><a href="https://cplusplus.github.io/CWG/issues/453.html">453</a></td> +    <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>      <td>CD7</td>      <td>References may only bind to “valid” objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="454">      <td><a href="https://cplusplus.github.io/CWG/issues/454.html">454</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>CD1</td>      <td>When is a definition of a static data member required?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="455">      <td><a href="https://cplusplus.github.io/CWG/issues/455.html">455</a></td> +    <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>      <td>NAD</td>      <td>Partial ordering and non-deduced arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="456">      <td><a href="https://cplusplus.github.io/CWG/issues/456.html">456</a></td> +    <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>      <td>NAD</td>      <td>Is initialized const int or const bool variable a null pointer constant?</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="457">      <td><a href="https://cplusplus.github.io/CWG/issues/457.html">457</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD1</td>      <td>Wording nit on use of const variables in constant expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="458">      <td><a href="https://cplusplus.github.io/CWG/issues/458.html">458</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>C++11</td>      <td>Hiding of member template parameters by other members</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="459">      <td><a href="https://cplusplus.github.io/CWG/issues/459.html">459</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>NAD</td>      <td>Hiding of template parameters by base class members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="460">      <td><a href="https://cplusplus.github.io/CWG/issues/460.html">460</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD1</td>      <td>Can a <I>using-declaration</I> name a namespace?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="461">      <td><a href="https://cplusplus.github.io/CWG/issues/461.html">461</a></td> +    <td>[<a href="https://wg21.link/dcl.asm">dcl.asm</a>]</td>      <td>NAD</td>      <td>Make <TT>asm</TT> conditionally-supported</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="462">      <td><a href="https://cplusplus.github.io/CWG/issues/462.html">462</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD3</td>      <td>Lifetime of temporaries bound to comma expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="463">      <td><a href="https://cplusplus.github.io/CWG/issues/463.html">463</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD1</td>      <td><TT>reinterpret_cast<T*>(0)</TT></td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="464">      <td><a href="https://cplusplus.github.io/CWG/issues/464.html">464</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD1</td>      <td>Wording nit on lifetime of temporaries to which references are bound</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="465">      <td><a href="https://cplusplus.github.io/CWG/issues/465.html">465</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>NAD</td>      <td>May constructors of global objects call <TT>exit()</TT>?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="466">      <td><a href="https://cplusplus.github.io/CWG/issues/466.html">466</a></td> +    <td>[<a href="https://wg21.link/expr.pseudo">expr.pseudo</a>]</td>      <td>CD1</td>      <td>cv-qualifiers on pseudo-destructor type</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="467">      <td><a href="https://cplusplus.github.io/CWG/issues/467.html">467</a></td> +    <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>      <td>NAD</td>      <td>Jump past initialization of local static variable</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="468">      <td><a href="https://cplusplus.github.io/CWG/issues/468.html">468</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>CD1</td>      <td>Allow <TT>::template</TT> outside of templates</td>      <td class="full" align="center">Clang 2.7 (C++11 onwards)</td>    </tr>    <tr id="469">      <td><a href="https://cplusplus.github.io/CWG/issues/469.html">469</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>NAD</td>      <td>Const template specializations and reference arguments</td>      <td class="none" align="center">No</td>    </tr>    <tr id="470">      <td><a href="https://cplusplus.github.io/CWG/issues/470.html">470</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD1</td>      <td>Instantiation of members of an explicitly-instantiated class template</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="471">      <td><a href="https://cplusplus.github.io/CWG/issues/471.html">471</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>NAD</td>      <td>Conflicting inherited access specifications</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr class="open" id="472">      <td><a href="https://cplusplus.github.io/CWG/issues/472.html">472</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>open</td>      <td>Casting across protected inheritance</td>      <td align="center"> @@ -2887,5528 +3358,6447 @@ of class templates</td>    </tr>    <tr id="473">      <td><a href="https://cplusplus.github.io/CWG/issues/473.html">473</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>NAD</td>      <td>Block-scope declarations of allocator functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="474">      <td><a href="https://cplusplus.github.io/CWG/issues/474.html">474</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD1</td>      <td>Block-scope <TT>extern</TT> declarations in namespace members</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="475">      <td><a href="https://cplusplus.github.io/CWG/issues/475.html">475</a></td> +    <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>      <td>C++11</td>      <td>When is <TT>std::uncaught_exception()</TT> true? (take 2)</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="476">      <td><a href="https://cplusplus.github.io/CWG/issues/476.html">476</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD5</td>      <td>Determining the buffer size for placement new</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="477">      <td><a href="https://cplusplus.github.io/CWG/issues/477.html">477</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD1</td>      <td>Can <TT>virtual</TT> appear in a <TT>friend</TT> declaration?</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="478">      <td><a href="https://cplusplus.github.io/CWG/issues/478.html">478</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>NAD</td>      <td>May a function parameter be an array of an abstract class type?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="479">      <td><a href="https://cplusplus.github.io/CWG/issues/479.html">479</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD1</td>      <td>Copy elision in exception handling</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="480">      <td><a href="https://cplusplus.github.io/CWG/issues/480.html">480</a></td> +    <td>[<a href="https://wg21.link/conv.mem">conv.mem</a>]</td>      <td>CD1</td>      <td>Is a base of a virtual base also virtual?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="481">      <td><a href="https://cplusplus.github.io/CWG/issues/481.html">481</a></td> +    <td>[<a href="https://wg21.link/basic.scope">basic.scope</a>]</td>      <td>CD2</td>      <td>Scope of template parameters</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="482">      <td><a href="https://cplusplus.github.io/CWG/issues/482.html">482</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>CD3</td>      <td>Qualified declarators in redeclarations</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="483">      <td><a href="https://cplusplus.github.io/CWG/issues/483.html">483</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD3</td>      <td>Normative requirements on integral ranges</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="484">      <td><a href="https://cplusplus.github.io/CWG/issues/484.html">484</a></td> +    <td>[<a href="https://wg21.link/class.derived">class.derived</a>]</td>      <td>CD1</td>      <td>Can a <I>base-specifier</I> name a cv-qualified class type?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="485">      <td><a href="https://cplusplus.github.io/CWG/issues/485.html">485</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>CD1</td>      <td>What is a “name”?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="486">      <td><a href="https://cplusplus.github.io/CWG/issues/486.html">486</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD1</td>      <td>Invalid return types and template argument deduction</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="487">      <td><a href="https://cplusplus.github.io/CWG/issues/487.html">487</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Operator overloading in constant expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="488">      <td><a href="https://cplusplus.github.io/CWG/issues/488.html">488</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD1</td>      <td>Local types, overload resolution, and template argument deduction</td>      <td class="full" align="center">Clang 2.9 (C++11 onwards)</td>    </tr>    <tr id="489">      <td><a href="https://cplusplus.github.io/CWG/issues/489.html">489</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>NAD</td>      <td>Must member function templates be instantiated during overload resolution?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="490">      <td><a href="https://cplusplus.github.io/CWG/issues/490.html">490</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD2</td>      <td>Name lookup in friend declarations</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="491">      <td><a href="https://cplusplus.github.io/CWG/issues/491.html">491</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD1</td>      <td>Initializers for empty-class aggregrate members</td>      <td class="full" align="center">Duplicate of <a href="#413">413</a></td>    </tr>    <tr id="492">      <td><a href="https://cplusplus.github.io/CWG/issues/492.html">492</a></td> +    <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>      <td>CD1</td>      <td><TT>typeid</TT> constness inconsistent with example</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="493">      <td><a href="https://cplusplus.github.io/CWG/issues/493.html">493</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD2</td>      <td>Type deduction from a <TT>bool</TT> context</td>      <td class="unknown" align="center">Duplicate of <a href="#976">976</a></td>    </tr>    <tr id="494">      <td><a href="https://cplusplus.github.io/CWG/issues/494.html">494</a></td> +    <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>      <td>CD1</td>      <td>Problems with the resolution of issue 45</td>      <td class="none" align="center">Duplicate of <a href="#372">372</a></td>    </tr>    <tr id="495">      <td><a href="https://cplusplus.github.io/CWG/issues/495.html">495</a></td> +    <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>      <td>CD2</td>      <td>Overload resolution with template and non-template conversion functions</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="496">      <td><a href="https://cplusplus.github.io/CWG/issues/496.html">496</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD3</td>      <td>Is a volatile-qualified type really a POD?</td>      <td class="full-superseded" align="center">Superseded by <a href="#2094">2094</a></td>    </tr>    <tr id="497">      <td><a href="https://cplusplus.github.io/CWG/issues/497.html">497</a></td> +    <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>      <td>CD1</td>      <td>Missing required initialization in example</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#253">253</a></td>    </tr>    <tr class="open" id="498">      <td><a href="https://cplusplus.github.io/CWG/issues/498.html">498</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>open</td>      <td>Storage class specifiers in definitions of class members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="499">      <td><a href="https://cplusplus.github.io/CWG/issues/499.html">499</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD2</td>      <td>Throwing an array of unknown size</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="500">      <td><a href="https://cplusplus.github.io/CWG/issues/500.html">500</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>CD1</td>      <td>Access in <I>base-specifier</I>s of friend and nested classes</td>      <td class="none" align="center">Duplicate of <a href="#372">372</a></td>    </tr>    <tr id="501">      <td><a href="https://cplusplus.github.io/CWG/issues/501.html">501</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td>      <td>Visibility of friend declarations within the befriending class</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="502">      <td><a href="https://cplusplus.github.io/CWG/issues/502.html">502</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++11</td>      <td>Dependency of nested enumerations and enumerators</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="503">      <td><a href="https://cplusplus.github.io/CWG/issues/503.html">503</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>open</td>      <td>Cv-qualified function types in template argument deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="504">      <td><a href="https://cplusplus.github.io/CWG/issues/504.html">504</a></td> +    <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>      <td>NAD</td>      <td>Should use of a variable in its own initializer require a diagnostic?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="505">      <td><a href="https://cplusplus.github.io/CWG/issues/505.html">505</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD1</td>      <td>Conditionally-supported behavior for unknown character escapes</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="506">      <td><a href="https://cplusplus.github.io/CWG/issues/506.html">506</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD1</td>      <td>Conditionally-supported behavior for non-POD objects passed to ellipsis</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="507">      <td><a href="https://cplusplus.github.io/CWG/issues/507.html">507</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>dup</td>      <td>Ambiguity assigning class object to built-in type</td>      <td class="unknown" align="center">Duplicate of <a href="#260">260</a></td>    </tr>    <tr id="508">      <td><a href="https://cplusplus.github.io/CWG/issues/508.html">508</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>C++11</td>      <td>Non-constructed value-initialized objects</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="509">      <td><a href="https://cplusplus.github.io/CWG/issues/509.html">509</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>Dead code in the specification of default initialization</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="510">      <td><a href="https://cplusplus.github.io/CWG/issues/510.html">510</a></td> +    <td>[<a href="https://wg21.link/class.init">class.init</a>]</td>      <td>CD1</td>      <td>Default initialization of POD classes?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="511">      <td><a href="https://cplusplus.github.io/CWG/issues/511.html">511</a></td> +    <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>      <td>NAD</td>      <td>POD-structs with template assignment operators</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> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>NAD</td>      <td>Union members with user-declared non-default constructors</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="513">      <td><a href="https://cplusplus.github.io/CWG/issues/513.html">513</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>CD1</td>      <td>Non-class “most-derived” objects</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="514">      <td><a href="https://cplusplus.github.io/CWG/issues/514.html">514</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD1</td>      <td>Is the initializer for a namespace member in the scope of the namespace?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="515">      <td><a href="https://cplusplus.github.io/CWG/issues/515.html">515</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD1</td>      <td>Non-dependent references to base class members</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#1017">1017</a></td>    </tr>    <tr id="516">      <td><a href="https://cplusplus.github.io/CWG/issues/516.html">516</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD1</td>      <td>Use of <TT>signed</TT> in bit-field declarations</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="517">      <td><a href="https://cplusplus.github.io/CWG/issues/517.html">517</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>CD1</td>      <td>Partial specialization following explicit instantiation</td>      <td class="none" align="center">No</td>    </tr>    <tr id="518">      <td><a href="https://cplusplus.github.io/CWG/issues/518.html">518</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD1</td>      <td>Trailing comma following <I>enumerator-list</I></td>      <td class="full" align="center">Clang 2.7 (C++11 onwards)</td>    </tr>    <tr id="519">      <td><a href="https://cplusplus.github.io/CWG/issues/519.html">519</a></td> +    <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>      <td>CD1</td>      <td>Null pointer preservation in <TT>void*</TT> conversions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="520">      <td><a href="https://cplusplus.github.io/CWG/issues/520.html">520</a></td> +    <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>      <td>CD1</td>      <td>Old-style casts between incomplete class types</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="521">      <td><a href="https://cplusplus.github.io/CWG/issues/521.html">521</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>CD1</td>      <td>Requirements for exceptions thrown by allocation functions</td>      <td class="none" align="center">No</td>    </tr>    <tr id="522">      <td><a href="https://cplusplus.github.io/CWG/issues/522.html">522</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD1</td>      <td>Array-to-pointer decay in template argument deduction</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="523">      <td><a href="https://cplusplus.github.io/CWG/issues/523.html">523</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>open</td>      <td>Can a one-past-the-end pointer be invalidated by deleting an adjacent object?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="524">      <td><a href="https://cplusplus.github.io/CWG/issues/524.html">524</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD1</td>      <td>Can function-notation calls to operator functions be dependent?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="525">      <td><a href="https://cplusplus.github.io/CWG/issues/525.html">525</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>CD1</td>      <td>Missing <TT>*</TT> in example</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="526">      <td><a href="https://cplusplus.github.io/CWG/issues/526.html">526</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD1</td>      <td>Confusing aspects in the specification of non-deduced contexts</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="527">      <td><a href="https://cplusplus.github.io/CWG/issues/527.html">527</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD2</td>      <td>Problems with linkage of types</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="528">      <td><a href="https://cplusplus.github.io/CWG/issues/528.html">528</a></td> +    <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>      <td>NAD</td>      <td>Why are incomplete class types not allowed with <TT>typeid</TT>?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="529">      <td><a href="https://cplusplus.github.io/CWG/issues/529.html">529</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>open</td>      <td>Use of <TT>template<></TT> with “explicitly-specialized” class templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="530">      <td><a href="https://cplusplus.github.io/CWG/issues/530.html">530</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD1</td>      <td>Nontype template arguments in constant expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="531">      <td><a href="https://cplusplus.github.io/CWG/issues/531.html">531</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++11</td>      <td>Defining members of explicit specializations</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="532">      <td><a href="https://cplusplus.github.io/CWG/issues/532.html">532</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>C++11</td>      <td>Member/nonmember operator template partial ordering</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="533">      <td><a href="https://cplusplus.github.io/CWG/issues/533.html">533</a></td> +    <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>      <td>NAD</td>      <td>Special treatment for C-style header names</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="534">      <td><a href="https://cplusplus.github.io/CWG/issues/534.html">534</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>CD1</td>      <td><I>template-name</I>s and <I>operator-function-id</I>s</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="535">      <td><a href="https://cplusplus.github.io/CWG/issues/535.html">535</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD3</td>      <td>Copy construction without a copy constructor</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="536">      <td><a href="https://cplusplus.github.io/CWG/issues/536.html">536</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD6</td>      <td>Problems in the description of <I>id-expression</I>s</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="537">      <td><a href="https://cplusplus.github.io/CWG/issues/537.html">537</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>CD1</td>      <td>Definition of “signature”</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="538">      <td><a href="https://cplusplus.github.io/CWG/issues/538.html">538</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td> -    <td>Definition and usage -of <I>structure</I>, <I>POD-struct</I>, <I>POD-union</I>, -and <I>POD class</I></td> +    <td>Definition and usage of <I>structure</I>, <I>POD-struct</I>, <I>POD-union</I>, and <I>POD class</I></td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="539">      <td><a href="https://cplusplus.github.io/CWG/issues/539.html">539</a></td> +    <td>[<a href="https://wg21.link/dcl.type">dcl.type</a>]</td>      <td>CD3</td>      <td>Constraints on <I>type-specifier-seq</I></td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="540">      <td><a href="https://cplusplus.github.io/CWG/issues/540.html">540</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD1</td>      <td>Propagation of cv-qualifiers in reference-to-reference collapse</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="541">      <td><a href="https://cplusplus.github.io/CWG/issues/541.html">541</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>CD2</td>      <td>Dependent function types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="542">      <td><a href="https://cplusplus.github.io/CWG/issues/542.html">542</a></td> +    <td>[<a href="https://wg21.link/class.init">class.init</a>]</td>      <td>CD2</td>      <td>Value initialization of arrays of POD-structs</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="543">      <td><a href="https://cplusplus.github.io/CWG/issues/543.html">543</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD1</td>      <td>Value initialization and default constructors</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="544">      <td><a href="https://cplusplus.github.io/CWG/issues/544.html">544</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>NAD</td>      <td>Base class lookup in explicit specialization</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="545">      <td><a href="https://cplusplus.github.io/CWG/issues/545.html">545</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>open</td>      <td>User-defined conversions and built-in operator overload resolution</td>      <td align="center">Not resolved</td>    </tr>    <tr id="546">      <td><a href="https://cplusplus.github.io/CWG/issues/546.html">546</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>C++11</td>      <td>Explicit instantiation of class template members</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="547">      <td><a href="https://cplusplus.github.io/CWG/issues/547.html">547</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>C++11</td>      <td>Partial specialization on member function types</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="548">      <td><a href="https://cplusplus.github.io/CWG/issues/548.html">548</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>dup</td>      <td><I>qualified-id</I>s in declarations</td>      <td class="full" align="center">Duplicate of <a href="#482">482</a></td>    </tr>    <tr class="open" id="549">      <td><a href="https://cplusplus.github.io/CWG/issues/549.html">549</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.match">temp.spec.partial.match</a>]</td>      <td>drafting</td>      <td>Non-deducible parameters in partial specializations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="550">      <td><a href="https://cplusplus.github.io/CWG/issues/550.html">550</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>dup</td>      <td>Pointer to array of unknown bound in parameter declarations</td>      <td class="full" align="center">Duplicate of <a href="#393">393</a></td>    </tr>    <tr id="551">      <td><a href="https://cplusplus.github.io/CWG/issues/551.html">551</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD1</td>      <td>When is <TT>inline</TT> permitted in an explicit instantiation?</td>      <td class="full" align="center">Clang 2.7 (C++11 onwards)</td>    </tr>    <tr id="552">      <td><a href="https://cplusplus.github.io/CWG/issues/552.html">552</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>NAD</td>      <td>Use of <TT>typename</TT> in the type in a non-type <I>parameter-declaration</I></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="553">      <td><a href="https://cplusplus.github.io/CWG/issues/553.html">553</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>NAD</td>      <td>Problems with friend allocation and deallocation functions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="554">      <td><a href="https://cplusplus.github.io/CWG/issues/554.html">554</a></td> +    <td>[<a href="https://wg21.link/basic.scope">basic.scope</a>]</td>      <td>CD6</td>      <td>Definition of “declarative region” and “scope”</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="555">      <td><a href="https://cplusplus.github.io/CWG/issues/555.html">555</a></td> +    <td>[<a href="https://wg21.link/basic.lookup">basic.lookup</a>]</td>      <td>CD5</td>      <td>Pseudo-destructor name lookup</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="556">      <td><a href="https://cplusplus.github.io/CWG/issues/556.html">556</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>CD2</td>      <td>Conflicting requirements for acceptable aliasing</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="557">      <td><a href="https://cplusplus.github.io/CWG/issues/557.html">557</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD1</td>      <td>Does argument-dependent lookup cause template instantiation?</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="558">      <td><a href="https://cplusplus.github.io/CWG/issues/558.html">558</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>CD1</td>      <td>Excluded characters in universal character names</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="559">      <td><a href="https://cplusplus.github.io/CWG/issues/559.html">559</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD1</td>      <td>Editing error in issue 382 resolution</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="560">      <td><a href="https://cplusplus.github.io/CWG/issues/560.html">560</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>NAD</td>      <td>Use of the <TT>typename</TT> keyword in return types</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="561">      <td><a href="https://cplusplus.github.io/CWG/issues/561.html">561</a></td> +    <td>[<a href="https://wg21.link/temp.dep.candidate">temp.dep.candidate</a>]</td>      <td>CD2</td>      <td>Internal linkage functions in dependent name lookup</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="562">      <td><a href="https://cplusplus.github.io/CWG/issues/562.html">562</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>CD6</td>      <td><I>qualified-id</I>s in non-expression contexts</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="563">      <td><a href="https://cplusplus.github.io/CWG/issues/563.html">563</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD6</td>      <td>Linkage specification for objects</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="564">      <td><a href="https://cplusplus.github.io/CWG/issues/564.html">564</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD2</td>      <td>Agreement of language linkage or <I>linkage-specification</I>s?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="565">      <td><a href="https://cplusplus.github.io/CWG/issues/565.html">565</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD3</td>      <td>Conflict rules for <I>using-declaration</I>s naming function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="566">      <td><a href="https://cplusplus.github.io/CWG/issues/566.html">566</a></td> +    <td>[<a href="https://wg21.link/conv.fpint">conv.fpint</a>]</td>      <td>NAD</td>      <td>Conversion of negative floating point values to integer type</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="567">      <td><a href="https://cplusplus.github.io/CWG/issues/567.html">567</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>NAD</td>      <td>Can <TT>size_t</TT> and <TT>ptrdiff_t</TT> be larger than <TT>long</TT>?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="568">      <td><a href="https://cplusplus.github.io/CWG/issues/568.html">568</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD1</td>      <td>Definition of POD is too strict</td>      <td class="full" align="center">Clang 3.0 (C++11 onwards)</td>    </tr>    <tr id="569">      <td><a href="https://cplusplus.github.io/CWG/issues/569.html">569</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>CD2</td>      <td>Spurious semicolons at namespace scope should be allowed</td>      <td class="full" align="center">Clang 2.7 (C++11 onwards)</td>    </tr>    <tr id="570">      <td><a href="https://cplusplus.github.io/CWG/issues/570.html">570</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD2</td>      <td>Are references subject to the ODR?</td>      <td class="na" align="center">Duplicate of <a href="#633">633</a></td>    </tr>    <tr id="571">      <td><a href="https://cplusplus.github.io/CWG/issues/571.html">571</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD2</td>      <td>References declared <TT>const</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="572">      <td><a href="https://cplusplus.github.io/CWG/issues/572.html">572</a></td> +    <td>[<a href="https://wg21.link/conv">conv</a>]</td>      <td>C++11</td>      <td>Standard conversions for non-built-in types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="573">      <td><a href="https://cplusplus.github.io/CWG/issues/573.html">573</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>C++11</td>      <td>Conversions between function pointers and <TT>void*</TT></td>      <td class="none" align="center">No</td>    </tr>    <tr id="574">      <td><a href="https://cplusplus.github.io/CWG/issues/574.html">574</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>NAD</td>      <td>Definition of “copy assignment operator”</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="575">      <td><a href="https://cplusplus.github.io/CWG/issues/575.html">575</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>C++11</td>      <td>Criteria for deduction failure</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="576">      <td><a href="https://cplusplus.github.io/CWG/issues/576.html">576</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD2</td>      <td>Typedefs in function definitions</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="577">      <td><a href="https://cplusplus.github.io/CWG/issues/577.html">577</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD3</td>      <td><TT>void</TT> in an empty parameter list</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="578">      <td><a href="https://cplusplus.github.io/CWG/issues/578.html">578</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD6</td>      <td>Phase 1 replacement of characters with <I>universal-character-name</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="579">      <td><a href="https://cplusplus.github.io/CWG/issues/579.html">579</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>open</td>      <td>What is a “nested” <TT>></TT> or <TT>>></TT>?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="580">      <td><a href="https://cplusplus.github.io/CWG/issues/580.html">580</a></td> +    <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>      <td>C++11</td>      <td>Access in <I>template-parameter</I>s of member and friend definitions</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="581">      <td><a href="https://cplusplus.github.io/CWG/issues/581.html">581</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>CD5</td>      <td>Can a templated constructor be explicitly instantiated or specialized?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="582">      <td><a href="https://cplusplus.github.io/CWG/issues/582.html">582</a></td> +    <td>[<a href="https://wg21.link/temp.mem">temp.mem</a>]</td>      <td>CD1</td>      <td>Template conversion functions</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="583">      <td><a href="https://cplusplus.github.io/CWG/issues/583.html">583</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD3</td>      <td>Relational pointer comparisons against the null pointer constant</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="584">      <td><a href="https://cplusplus.github.io/CWG/issues/584.html">584</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>NAD</td>      <td>Unions and aliasing</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="585">      <td><a href="https://cplusplus.github.io/CWG/issues/585.html">585</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td>      <td>Friend template template parameters</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="586">      <td><a href="https://cplusplus.github.io/CWG/issues/586.html">586</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>NAD</td>      <td>Default <I>template-argument</I>s and template argument deduction</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="587">      <td><a href="https://cplusplus.github.io/CWG/issues/587.html">587</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD2</td>      <td>Lvalue operands of a conditional expression differing only in cv-qualification</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="588">      <td><a href="https://cplusplus.github.io/CWG/issues/588.html">588</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD2</td>      <td>Searching dependent bases of classes local to function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="589">      <td><a href="https://cplusplus.github.io/CWG/issues/589.html">589</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD2</td>      <td>Direct binding of class and array rvalues in reference initialization</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="590">      <td><a href="https://cplusplus.github.io/CWG/issues/590.html">590</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++11</td>      <td>Nested classes and the “current instantiation”</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="591">      <td><a href="https://cplusplus.github.io/CWG/issues/591.html">591</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD4</td>      <td>When a dependent base class is the current instantiation</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="592">      <td><a href="https://cplusplus.github.io/CWG/issues/592.html">592</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>CD1</td>      <td>Exceptions during construction of local static objects</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="593">      <td><a href="https://cplusplus.github.io/CWG/issues/593.html">593</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>NAD</td>      <td>Falling off the end of a destructor's <I>function-try-block</I> handler</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="594">      <td><a href="https://cplusplus.github.io/CWG/issues/594.html">594</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD1</td>      <td>Coordinating issues 119 and 404 with delegating constructors</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="595">      <td><a href="https://cplusplus.github.io/CWG/issues/595.html">595</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>dup</td>      <td>Exception specifications in templates instantiated from class bodies</td>      <td class="full" align="center">Duplicate of <a href="#1330">1330</a></td>    </tr>    <tr id="596">      <td><a href="https://cplusplus.github.io/CWG/issues/596.html">596</a></td> +    <td>[<a href="https://wg21.link/except.unexpected">except.unexpected</a>]</td>      <td>NAD</td>      <td>Replacing an exception object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="597">      <td><a href="https://cplusplus.github.io/CWG/issues/597.html">597</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD3</td>      <td>Conversions applied to out-of-lifetime non-POD lvalues</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="598">      <td><a href="https://cplusplus.github.io/CWG/issues/598.html">598</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD2</td>      <td>Associated namespaces of overloaded functions and function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="599">      <td><a href="https://cplusplus.github.io/CWG/issues/599.html">599</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD2</td>      <td>Deleting a null function pointer</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="600">      <td><a href="https://cplusplus.github.io/CWG/issues/600.html">600</a></td> +    <td>[<a href="https://wg21.link/class.access">class.access</a>]</td>      <td>CD6</td>      <td>Does access control apply to members or to names?</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="601">      <td><a href="https://cplusplus.github.io/CWG/issues/601.html">601</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD2</td>      <td>Type of literals in preprocessing expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="602">      <td><a href="https://cplusplus.github.io/CWG/issues/602.html">602</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>C++11</td>      <td>When is the injected-class-name of a class template a template?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="603">      <td><a href="https://cplusplus.github.io/CWG/issues/603.html">603</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>CD1</td>      <td>Type equivalence and unsigned overflow</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="604">      <td><a href="https://cplusplus.github.io/CWG/issues/604.html">604</a></td> +    <td>[<a href="https://wg21.link/over.match.ctor">over.match.ctor</a>]</td>      <td>CD2</td>      <td>Argument list for overload resolution in copy-initialization</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="605">      <td><a href="https://cplusplus.github.io/CWG/issues/605.html">605</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++11</td>      <td>Linkage of explicit specializations</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="606">      <td><a href="https://cplusplus.github.io/CWG/issues/606.html">606</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD1</td>      <td>Template argument deduction for rvalue references</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="607">      <td><a href="https://cplusplus.github.io/CWG/issues/607.html">607</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD6</td>      <td>Lookup of <I>mem-initializer-id</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="608">      <td><a href="https://cplusplus.github.io/CWG/issues/608.html">608</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>CD2</td>      <td>Determining the final overrider of a virtual function</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="609">      <td><a href="https://cplusplus.github.io/CWG/issues/609.html">609</a></td> +    <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>      <td>CD4</td>      <td>What is a “top-level” cv-qualifier?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="610">      <td><a href="https://cplusplus.github.io/CWG/issues/610.html">610</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>NAD</td>      <td>Computing the negative of <TT>0U</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="611">      <td><a href="https://cplusplus.github.io/CWG/issues/611.html">611</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD2</td>      <td>Zero-initializing references</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="612">      <td><a href="https://cplusplus.github.io/CWG/issues/612.html">612</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD2</td>      <td>Requirements on a conforming implementation</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="613">      <td><a href="https://cplusplus.github.io/CWG/issues/613.html">613</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD1</td>      <td>Unevaluated uses of non-static class members</td>      <td class="full" align="center">Clang 3.1 (C++11 onwards)</td>    </tr>    <tr id="614">      <td><a href="https://cplusplus.github.io/CWG/issues/614.html">614</a></td> +    <td>[<a href="https://wg21.link/expr.mul">expr.mul</a>]</td>      <td>CD1</td>      <td>Results of integer <TT>/</TT> and <TT>%</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="615">      <td><a href="https://cplusplus.github.io/CWG/issues/615.html">615</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>C++11</td>      <td>Incorrect description of variables that can be initialized</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="616">      <td><a href="https://cplusplus.github.io/CWG/issues/616.html">616</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>CD3</td>      <td>Definition of “indeterminate value”</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="617">      <td><a href="https://cplusplus.github.io/CWG/issues/617.html">617</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>NAD</td>      <td>Lvalue-to-rvalue conversions of uninitialized <TT>char</TT> objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="618">      <td><a href="https://cplusplus.github.io/CWG/issues/618.html">618</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD2</td>      <td>Casts in preprocessor conditional expressions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="619">      <td><a href="https://cplusplus.github.io/CWG/issues/619.html">619</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++11</td>      <td>Completeness of array types</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="620">      <td><a href="https://cplusplus.github.io/CWG/issues/620.html">620</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD1</td>      <td>Declaration order in layout-compatible POD structs</td>      <td class="full" align="center">Duplicate of <a href="#568">568</a></td>    </tr>    <tr id="621">      <td><a href="https://cplusplus.github.io/CWG/issues/621.html">621</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++11</td>      <td>Template argument deduction from function return types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="622">      <td><a href="https://cplusplus.github.io/CWG/issues/622.html">622</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>NAD</td>      <td>Relational comparisons of arbitrary pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="623">      <td><a href="https://cplusplus.github.io/CWG/issues/623.html">623</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>CD3</td>      <td>Use of pointers to deallocated storage</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="624">      <td><a href="https://cplusplus.github.io/CWG/issues/624.html">624</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD1</td>      <td>Overflow in calculating size of allocation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="625">      <td><a href="https://cplusplus.github.io/CWG/issues/625.html">625</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD2</td>      <td>Use of <TT>auto</TT> as a <I>template-argument</I></td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="626">      <td><a href="https://cplusplus.github.io/CWG/issues/626.html">626</a></td> +    <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>      <td>CD2</td>      <td>Preprocessor string literals</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="627">      <td><a href="https://cplusplus.github.io/CWG/issues/627.html">627</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>NAD</td>      <td>Values behaving as types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="628">      <td><a href="https://cplusplus.github.io/CWG/issues/628.html">628</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD2</td>      <td>The values of an enumeration with no enumerator</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="629">      <td><a href="https://cplusplus.github.io/CWG/issues/629.html">629</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD1</td>      <td><TT>auto</TT> parsing ambiguity</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="630">      <td><a href="https://cplusplus.github.io/CWG/issues/630.html">630</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>CD2</td>      <td>Equality of narrow and wide character values in the basic character set</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="631">      <td><a href="https://cplusplus.github.io/CWG/issues/631.html">631</a></td> +    <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>      <td>CD3</td>      <td>Jumping into a “then” clause</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="632">      <td><a href="https://cplusplus.github.io/CWG/issues/632.html">632</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD1</td>      <td>Brace-enclosed initializer for scalar member of aggregate</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="633">      <td><a href="https://cplusplus.github.io/CWG/issues/633.html">633</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>CD2</td>      <td>Specifications for variables that should also apply to references</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="634">      <td><a href="https://cplusplus.github.io/CWG/issues/634.html">634</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD1</td>      <td>Conditionally-supported behavior for non-POD objects passed to ellipsis redux</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="635">      <td><a href="https://cplusplus.github.io/CWG/issues/635.html">635</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>NAD</td>      <td>Names of constructors and destructors of templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="636">      <td><a href="https://cplusplus.github.io/CWG/issues/636.html">636</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD4</td>      <td>Dynamic type of objects and aliasing</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="637">      <td><a href="https://cplusplus.github.io/CWG/issues/637.html">637</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD1</td>      <td>Sequencing rules and example disagree</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="638">      <td><a href="https://cplusplus.github.io/CWG/issues/638.html">638</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD2</td>      <td>Explicit specialization and friendship</td>      <td class="none" align="center">No</td>    </tr>    <tr id="639">      <td><a href="https://cplusplus.github.io/CWG/issues/639.html">639</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD1</td>      <td>What makes side effects “different” from one another?</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="640">      <td><a href="https://cplusplus.github.io/CWG/issues/640.html">640</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>NAD</td>      <td>Accessing destroyed local objects of static storage duration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="641">      <td><a href="https://cplusplus.github.io/CWG/issues/641.html">641</a></td> +    <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>      <td>CD2</td>      <td>Overload resolution and conversion-to-same-type operators</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="642">      <td><a href="https://cplusplus.github.io/CWG/issues/642.html">642</a></td> +    <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>      <td>CD2</td>      <td>Definition and use of “block scope” and “local scope”</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="643">      <td><a href="https://cplusplus.github.io/CWG/issues/643.html">643</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>NAD</td>      <td>Use of <TT>decltype</TT> in a class <I>member-specification</I></td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="644">      <td><a href="https://cplusplus.github.io/CWG/issues/644.html">644</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD1</td>      <td>Should a trivial class type be a literal type?</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="645">      <td><a href="https://cplusplus.github.io/CWG/issues/645.html">645</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD2</td>      <td>Are bit-field and non-bit-field members layout compatible?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="646">      <td><a href="https://cplusplus.github.io/CWG/issues/646.html">646</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>NAD</td>      <td>Can a class with a constexpr copy constructor be a literal type?</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#981">981</a></td>    </tr>    <tr id="647">      <td><a href="https://cplusplus.github.io/CWG/issues/647.html">647</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD1</td>      <td>Non-constexpr instances of constexpr constructor templates</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="648">      <td><a href="https://cplusplus.github.io/CWG/issues/648.html">648</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD1</td>      <td>Constant expressions in constexpr initializers</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="649">      <td><a href="https://cplusplus.github.io/CWG/issues/649.html">649</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>CD1</td>      <td>Optionally ill-formed extended alignment requests</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="650">      <td><a href="https://cplusplus.github.io/CWG/issues/650.html">650</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD2</td>      <td>Order of destruction for temporaries bound to the returned value of a function</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="651">      <td><a href="https://cplusplus.github.io/CWG/issues/651.html">651</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD1</td>      <td>Problems in <TT>decltype</TT> specification and examples</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="652">      <td><a href="https://cplusplus.github.io/CWG/issues/652.html">652</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD2</td>      <td>Compile-time evaluation of floating-point expressions</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="653">      <td><a href="https://cplusplus.github.io/CWG/issues/653.html">653</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>CD2</td>      <td>Copy assignment of unions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="654">      <td><a href="https://cplusplus.github.io/CWG/issues/654.html">654</a></td> +    <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>      <td>CD1</td>      <td>Conversions to and from <TT>nullptr_t</TT></td>      <td class="full-superseded" align="center">Superseded by <a href="#1423">1423</a></td>    </tr>    <tr id="655">      <td><a href="https://cplusplus.github.io/CWG/issues/655.html">655</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>C++11</td>      <td>Initialization not specified for forwarding constructors</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="656">      <td><a href="https://cplusplus.github.io/CWG/issues/656.html">656</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD2</td>      <td>Direct binding to the result of a conversion operator</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="657">      <td><a href="https://cplusplus.github.io/CWG/issues/657.html">657</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD2</td>      <td>Abstract class parameter in synthesized declaration</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="658">      <td><a href="https://cplusplus.github.io/CWG/issues/658.html">658</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD2</td>      <td>Defining <TT>reinterpret_cast</TT> for pointer types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="659">      <td><a href="https://cplusplus.github.io/CWG/issues/659.html">659</a></td> +    <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>      <td>CD1</td>      <td>Alignment of function types</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="660">      <td><a href="https://cplusplus.github.io/CWG/issues/660.html">660</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD1</td>      <td>Unnamed scoped enumerations</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="661">      <td><a href="https://cplusplus.github.io/CWG/issues/661.html">661</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD1</td>      <td>Semantics of arithmetic comparisons</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="662">      <td><a href="https://cplusplus.github.io/CWG/issues/662.html">662</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>NAD</td>      <td>Forming a pointer to a reference type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="663">      <td><a href="https://cplusplus.github.io/CWG/issues/663.html">663</a></td> +    <td>[<a href="https://wg21.link/extendid">extendid</a>]</td>      <td>CD1</td>      <td>Valid Cyrillic identifier characters</td>      <td class="na" align="center">Superseded by <a href="https://wg21.link/P1949">P1949</a></td>    </tr>    <tr id="664">      <td><a href="https://cplusplus.github.io/CWG/issues/664.html">664</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD2</td>      <td>Direct binding of references to non-class rvalue references</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="665">      <td><a href="https://cplusplus.github.io/CWG/issues/665.html">665</a></td> +    <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>      <td>CD2</td>      <td>Problems in the specification of <TT>dynamic_cast</TT></td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="666">      <td><a href="https://cplusplus.github.io/CWG/issues/666.html">666</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD1</td>      <td>Dependent <I>qualified-id</I>s without the <TT>typename</TT> keyword</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="667">      <td><a href="https://cplusplus.github.io/CWG/issues/667.html">667</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD2</td>      <td>Trivial special member functions that cannot be implicitly defined</td>      <td class="full" align="center">Clang 8</td>    </tr>    <tr id="668">      <td><a href="https://cplusplus.github.io/CWG/issues/668.html">668</a></td> +    <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>      <td>CD2</td>      <td>Throwing an exception from the destructor of a local static object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="669">      <td><a href="https://cplusplus.github.io/CWG/issues/669.html">669</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>NAD</td>      <td>Confusing specification of the meaning of <TT>decltype</TT></td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="670">      <td><a href="https://cplusplus.github.io/CWG/issues/670.html">670</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD4</td>      <td>Copy initialization via derived-to-base conversion in the second step</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="671">      <td><a href="https://cplusplus.github.io/CWG/issues/671.html">671</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD1</td>      <td>Explicit conversion from a scoped enumeration type to integral type</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="672">      <td><a href="https://cplusplus.github.io/CWG/issues/672.html">672</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD2</td>      <td>Sequencing of initialization in <I>new-expression</I>s</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="673">      <td><a href="https://cplusplus.github.io/CWG/issues/673.html">673</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>NAD</td>      <td>Injection of names from <I>elaborated-type-specifier</I>s in <TT>friend</TT> declarations</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="674">      <td><a href="https://cplusplus.github.io/CWG/issues/674.html">674</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>C++11</td>      <td>“matching specialization” for a friend declaration</td>      <td class="full" align="center">Clang 8</td>    </tr>    <tr id="675">      <td><a href="https://cplusplus.github.io/CWG/issues/675.html">675</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD3</td>      <td>Signedness of bit-field with typedef or template parameter type</td>      <td class="unknown" align="center">Duplicate of <a href="#739">739</a></td>    </tr>    <tr id="676">      <td><a href="https://cplusplus.github.io/CWG/issues/676.html">676</a></td> +    <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>      <td>C++11</td>      <td><I>static_assert-declaration</I>s and general requirements for declarations</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="677">      <td><a href="https://cplusplus.github.io/CWG/issues/677.html">677</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD1</td>      <td>Deleted <TT>operator delete</TT> and virtual destructors</td>      <td class="none" align="center">No</td>    </tr>    <tr id="678">      <td><a href="https://cplusplus.github.io/CWG/issues/678.html">678</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++11</td>      <td>Language linkage of member function parameter types and the ODR</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="679">      <td><a href="https://cplusplus.github.io/CWG/issues/679.html">679</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>CD1</td>      <td>Equivalence of <I>template-id</I>s and operator function templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="680">      <td><a href="https://cplusplus.github.io/CWG/issues/680.html">680</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD2</td>      <td>What is a move constructor?</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="681">      <td><a href="https://cplusplus.github.io/CWG/issues/681.html">681</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD1</td>      <td>Restrictions on declarators with late-specified return types</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="682">      <td><a href="https://cplusplus.github.io/CWG/issues/682.html">682</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD5</td>      <td>Missing description of lookup of template aliases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="683">      <td><a href="https://cplusplus.github.io/CWG/issues/683.html">683</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD1</td>      <td>Requirements for trivial subobject special functions</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="684">      <td><a href="https://cplusplus.github.io/CWG/issues/684.html">684</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD1</td>      <td>Constant expressions involving the address of an automatic variable</td>      <td class="unknown-superseded" align="center">Superseded by <a href="#1454">1454</a></td>    </tr>    <tr id="685">      <td><a href="https://cplusplus.github.io/CWG/issues/685.html">685</a></td> +    <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>      <td>CD2</td>      <td>Integral promotion of enumeration ignores fixed underlying type</td>      <td class="full" align="center">Clang 10</td>    </tr>    <tr id="686">      <td><a href="https://cplusplus.github.io/CWG/issues/686.html">686</a></td> +    <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>      <td>CD1</td>      <td>Type declarations/definitions in <I>type-specifier-seq</I>s and <I>type-id</I>s</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="687">      <td><a href="https://cplusplus.github.io/CWG/issues/687.html">687</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>NAD</td>      <td><TT>template</TT> keyword with <I>unqualified-id</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="688">      <td><a href="https://cplusplus.github.io/CWG/issues/688.html">688</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD1</td>      <td>Constexpr constructors and static initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="689">      <td><a href="https://cplusplus.github.io/CWG/issues/689.html">689</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD5</td>      <td>Maximum values of signed and unsigned integers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="690">      <td><a href="https://cplusplus.github.io/CWG/issues/690.html">690</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>CD2</td>      <td>The dynamic type of an rvalue reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="691">      <td><a href="https://cplusplus.github.io/CWG/issues/691.html">691</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>C++11</td>      <td>Template parameter packs in class template partial specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="692">      <td><a href="https://cplusplus.github.io/CWG/issues/692.html">692</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>C++11</td>      <td>Partial ordering of variadic class template partial specializations</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="693">      <td><a href="https://cplusplus.github.io/CWG/issues/693.html">693</a></td> +    <td>[<a href="https://wg21.link/conv.array">conv.array</a>]</td>      <td>CD2</td>      <td>New string types and deprecated conversion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="694">      <td><a href="https://cplusplus.github.io/CWG/issues/694.html">694</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>C++11</td>      <td>Zero- and value-initialization of union objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="695">      <td><a href="https://cplusplus.github.io/CWG/issues/695.html">695</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD2</td>      <td>Compile-time calculation errors in constexpr functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="696">      <td><a href="https://cplusplus.github.io/CWG/issues/696.html">696</a></td> +    <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>      <td>C++11</td>      <td>Use of block-scope constants in local classes</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr class="open" id="697">      <td><a href="https://cplusplus.github.io/CWG/issues/697.html">697</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>open</td>      <td>Deduction rules apply to more than functions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="698">      <td><a href="https://cplusplus.github.io/CWG/issues/698.html">698</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>open</td>      <td>The definition of “sequenced before” is too narrow</td>      <td align="center">Not resolved</td>    </tr>    <tr id="699">      <td><a href="https://cplusplus.github.io/CWG/issues/699.html">699</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD2</td>      <td>Must constexpr member functions be defined in the class <I>member-specification</I>?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="700">      <td><a href="https://cplusplus.github.io/CWG/issues/700.html">700</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Constexpr member functions of class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="701">      <td><a href="https://cplusplus.github.io/CWG/issues/701.html">701</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>CD2</td>      <td>When is the array-to-pointer conversion applied?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="702">      <td><a href="https://cplusplus.github.io/CWG/issues/702.html">702</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD2</td>      <td>Preferring conversion to <TT>std::initializer_list</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="703">      <td><a href="https://cplusplus.github.io/CWG/issues/703.html">703</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD2</td>      <td>Narrowing for literals that cannot be exactly represented</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="704">      <td><a href="https://cplusplus.github.io/CWG/issues/704.html">704</a></td> +    <td>[<a href="https://wg21.link/over.match.call">over.match.call</a>]</td>      <td>CD2</td>      <td>To which <I>postfix-expression</I>s does overload resolution apply?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="705">      <td><a href="https://cplusplus.github.io/CWG/issues/705.html">705</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD2</td>      <td>Suppressing argument-dependent lookup via parentheses</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="706">      <td><a href="https://cplusplus.github.io/CWG/issues/706.html">706</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>NAD</td>      <td>Use of <TT>auto</TT> with rvalue references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="707">      <td><a href="https://cplusplus.github.io/CWG/issues/707.html">707</a></td> +    <td>[<a href="https://wg21.link/conv.fpint">conv.fpint</a>]</td>      <td>CD2</td>      <td>Undefined behavior in integral-to-floating conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="708">      <td><a href="https://cplusplus.github.io/CWG/issues/708.html">708</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>open</td>      <td>Partial specialization of member templates of class templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="709">      <td><a href="https://cplusplus.github.io/CWG/issues/709.html">709</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>C++11</td>      <td>Enumeration names as <I>nested-name-specifier</I>s in deduction failure</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="710">      <td><a href="https://cplusplus.github.io/CWG/issues/710.html">710</a></td> +    <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>      <td>CD2</td>      <td>Data races during construction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="711">      <td><a href="https://cplusplus.github.io/CWG/issues/711.html">711</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD2</td>      <td><TT>auto</TT> with <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="712">      <td><a href="https://cplusplus.github.io/CWG/issues/712.html">712</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD3</td>      <td>Are integer constant operands of a <I>conditional-expression</I> “used?”</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="713">      <td><a href="https://cplusplus.github.io/CWG/issues/713.html">713</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD2</td>      <td>Unclear note about cv-qualified function types</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="714">      <td><a href="https://cplusplus.github.io/CWG/issues/714.html">714</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>CD2</td>      <td>Static const data members and <I>braced-init-list</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="715">      <td><a href="https://cplusplus.github.io/CWG/issues/715.html">715</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD2</td>      <td>Class member access constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="716">      <td><a href="https://cplusplus.github.io/CWG/issues/716.html">716</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>CD2</td>      <td>Specifications that should apply only to non-static union data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="717">      <td><a href="https://cplusplus.github.io/CWG/issues/717.html">717</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD2</td>      <td>Unintentional restrictions on the use of <TT>thread_local</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="718">      <td><a href="https://cplusplus.github.io/CWG/issues/718.html">718</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td>      <td>Non-class, non-function friend declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="719">      <td><a href="https://cplusplus.github.io/CWG/issues/719.html">719</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>CD2</td>      <td>Specifications for <I>operator-function-id</I> that should also apply to <I>literal-operator-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="720">      <td><a href="https://cplusplus.github.io/CWG/issues/720.html">720</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Need examples of <I>lambda-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="721">      <td><a href="https://cplusplus.github.io/CWG/issues/721.html">721</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD2</td>      <td>Where must a variable be initialized to be used in a constant expression?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="722">      <td><a href="https://cplusplus.github.io/CWG/issues/722.html">722</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD2</td>      <td>Can <TT>nullptr</TT> be passed to an ellipsis?</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="726">      <td><a href="https://cplusplus.github.io/CWG/issues/726.html">726</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>CD2</td>      <td>Atomic and non-atomic objects in the memory model</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="727">      <td><a href="https://cplusplus.github.io/CWG/issues/727.html">727</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++17</td>      <td>In-class explicit specializations</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="728">      <td><a href="https://cplusplus.github.io/CWG/issues/728.html">728</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>NAD</td>      <td>Restrictions on local classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="729">      <td><a href="https://cplusplus.github.io/CWG/issues/729.html">729</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>CD3</td>      <td>Qualification conversions and handlers of reference-to-pointer type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="730">      <td><a href="https://cplusplus.github.io/CWG/issues/730.html">730</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD2</td>      <td>Explicit specializations of members of non-template classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="731">      <td><a href="https://cplusplus.github.io/CWG/issues/731.html">731</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD2</td>      <td>Omitted reference qualification of member function type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="732">      <td><a href="https://cplusplus.github.io/CWG/issues/732.html">732</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>      <td>CD2</td>      <td>Late-specified return types in function definitions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="733">      <td><a href="https://cplusplus.github.io/CWG/issues/733.html">733</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>NAD</td>      <td>Reference qualification of copy assignment operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="734">      <td><a href="https://cplusplus.github.io/CWG/issues/734.html">734</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD2</td>      <td>Are unique addresses required for namespace-scope variables?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="735">      <td><a href="https://cplusplus.github.io/CWG/issues/735.html">735</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>      <td>CD2</td>      <td>Missing case in specification of safely-derived pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="736">      <td><a href="https://cplusplus.github.io/CWG/issues/736.html">736</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>NAD</td>      <td>Is the <TT>&</TT> <I>ref-qualifier</I> needed?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="737">      <td><a href="https://cplusplus.github.io/CWG/issues/737.html">737</a></td> +    <td>[<a href="https://wg21.link/dcl.init.string">dcl.init.string</a>]</td>      <td>CD2</td>      <td>Uninitialized trailing characters in string initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="738">      <td><a href="https://cplusplus.github.io/CWG/issues/738.html">738</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> not permitted by the syntax of constructor declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="739">      <td><a href="https://cplusplus.github.io/CWG/issues/739.html">739</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD3</td>      <td>Signedness of plain bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="740">      <td><a href="https://cplusplus.github.io/CWG/issues/740.html">740</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>CD2</td>      <td>Incorrect note on data races</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="741">      <td><a href="https://cplusplus.github.io/CWG/issues/741.html">741</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>C++11</td>      <td>“plain” <TT>long long</TT> bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="742">      <td><a href="https://cplusplus.github.io/CWG/issues/742.html">742</a></td> +    <td>[<a href="https://wg21.link/expr.post.incr">expr.post.incr</a>]</td>      <td>open</td>      <td>Postfix increment/decrement with long bit-field operands</td>      <td align="center">Not resolved</td>    </tr>    <tr id="743">      <td><a href="https://cplusplus.github.io/CWG/issues/743.html">743</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD2</td>      <td>Use of <TT>decltype</TT> in a <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="744">      <td><a href="https://cplusplus.github.io/CWG/issues/744.html">744</a></td> +    <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>      <td>CD2</td>      <td>Matching template arguments with template template parameters with parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="745">      <td><a href="https://cplusplus.github.io/CWG/issues/745.html">745</a></td> +    <td>[<a href="https://wg21.link/cpp.error">cpp.error</a>]</td>      <td>C++23</td>      <td>Effect of ill-formedness resulting from <TT>#error</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="746">      <td><a href="https://cplusplus.github.io/CWG/issues/746.html">746</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD2</td>      <td>Use of <TT>auto</TT> in <I>new-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="747">      <td><a href="https://cplusplus.github.io/CWG/issues/747.html">747</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>dup</td>      <td>Access of protected base classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="749">      <td><a href="https://cplusplus.github.io/CWG/issues/749.html">749</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>CD2</td>      <td>References to function types with a <I>cv-qualifier</I> or <I>ref-qualifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="750">      <td><a href="https://cplusplus.github.io/CWG/issues/750.html">750</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Implementation constraints on reference-only closure objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="751">      <td><a href="https://cplusplus.github.io/CWG/issues/751.html">751</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Deriving from closure classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="752">      <td><a href="https://cplusplus.github.io/CWG/issues/752.html">752</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Name lookup in nested <I>lambda-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="753">      <td><a href="https://cplusplus.github.io/CWG/issues/753.html">753</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD2</td>      <td>Array names in lambda capture sets</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="754">      <td><a href="https://cplusplus.github.io/CWG/issues/754.html">754</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Lambda expressions in default arguments of block-scope function declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="755">      <td><a href="https://cplusplus.github.io/CWG/issues/755.html">755</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD3</td>      <td>Generalized <I>lambda-capture</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="756">      <td><a href="https://cplusplus.github.io/CWG/issues/756.html">756</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Dropping cv-qualification on members of closure objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="757">      <td><a href="https://cplusplus.github.io/CWG/issues/757.html">757</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD2</td>      <td>Types without linkage in declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="758">      <td><a href="https://cplusplus.github.io/CWG/issues/758.html">758</a></td> +    <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>      <td>C++11</td>      <td>Missing cases of declarations that are not definitions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="759">      <td><a href="https://cplusplus.github.io/CWG/issues/759.html">759</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Destruction of closure objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="760">      <td><a href="https://cplusplus.github.io/CWG/issues/760.html">760</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD2</td>      <td><TT>this</TT> inside a nested class of a non-static member function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="761">      <td><a href="https://cplusplus.github.io/CWG/issues/761.html">761</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Inferred return type of closure object call operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="762">      <td><a href="https://cplusplus.github.io/CWG/issues/762.html">762</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Name lookup in the <I>compound-statement</I> of a lambda expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="763">      <td><a href="https://cplusplus.github.io/CWG/issues/763.html">763</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Is a closure object's <TT>operator()</TT> inline?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="764">      <td><a href="https://cplusplus.github.io/CWG/issues/764.html">764</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD2</td>      <td>Capturing unused variables in a lambda expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="765">      <td><a href="https://cplusplus.github.io/CWG/issues/765.html">765</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD2</td>      <td>Local types in inline functions with external linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="766">      <td><a href="https://cplusplus.github.io/CWG/issues/766.html">766</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Where may lambda expressions appear?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="767">      <td><a href="https://cplusplus.github.io/CWG/issues/767.html">767</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td><TT>void</TT> and other unnamed <I>lambda-parameter</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="768">      <td><a href="https://cplusplus.github.io/CWG/issues/768.html">768</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Ellipsis in a lambda parameter list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="769">      <td><a href="https://cplusplus.github.io/CWG/issues/769.html">769</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Initialization of closure objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="770">      <td><a href="https://cplusplus.github.io/CWG/issues/770.html">770</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD2</td>      <td>Ambiguity in late-specified return type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="771">      <td><a href="https://cplusplus.github.io/CWG/issues/771.html">771</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Move-construction of reference members of closure objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="772">      <td><a href="https://cplusplus.github.io/CWG/issues/772.html">772</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD2</td>      <td><I>capture-default</I> in lambdas in local default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="773">      <td><a href="https://cplusplus.github.io/CWG/issues/773.html">773</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++11</td>      <td>Parentheses in address non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="774">      <td><a href="https://cplusplus.github.io/CWG/issues/774.html">774</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Can a closure class be a POD?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="775">      <td><a href="https://cplusplus.github.io/CWG/issues/775.html">775</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD2</td>      <td>Capturing references to functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="776">      <td><a href="https://cplusplus.github.io/CWG/issues/776.html">776</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>CD2</td>      <td>Delegating constructors, destructors, and <TT>std::exit</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="777">      <td><a href="https://cplusplus.github.io/CWG/issues/777.html">777</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD2</td>      <td>Default arguments and parameter packs</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="778">      <td><a href="https://cplusplus.github.io/CWG/issues/778.html">778</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>C++11</td>      <td>Template parameter packs in non-type template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="779">      <td><a href="https://cplusplus.github.io/CWG/issues/779.html">779</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Rvalue reference members of closure objects?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="782">      <td><a href="https://cplusplus.github.io/CWG/issues/782.html">782</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Lambda expressions and argument-dependent lookup</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="783">      <td><a href="https://cplusplus.github.io/CWG/issues/783.html">783</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>open</td>      <td>Definition of “argument”</td>      <td align="center">Not resolved</td>    </tr>    <tr id="784">      <td><a href="https://cplusplus.github.io/CWG/issues/784.html">784</a></td> +    <td>[<a href="https://wg21.link/intro.structure">intro.structure</a>]</td>      <td>C++11</td>      <td>List of incompatibilities with the previous Standard</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="785">      <td><a href="https://cplusplus.github.io/CWG/issues/785.html">785</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD2</td>      <td>“Execution sequence” is inappropriate phraseology</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="786">      <td><a href="https://cplusplus.github.io/CWG/issues/786.html">786</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>CD2</td>      <td>Definition of “thread”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="787">      <td><a href="https://cplusplus.github.io/CWG/issues/787.html">787</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD2</td>      <td>Unnecessary lexical undefined behavior</td>      <td class="full" align="center">Clang 21</td>    </tr>    <tr id="788">      <td><a href="https://cplusplus.github.io/CWG/issues/788.html">788</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>CD2</td>      <td>Relationship between locale and values of the execution character set</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="789">      <td><a href="https://cplusplus.github.io/CWG/issues/789.html">789</a></td> +    <td>[<a href="https://wg21.link/lex.trigraph">lex.trigraph</a>]</td>      <td>CD2</td>      <td>Deprecating trigraphs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="790">      <td><a href="https://cplusplus.github.io/CWG/issues/790.html">790</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD2</td>      <td>Concatenation of raw and non-raw string literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="792">      <td><a href="https://cplusplus.github.io/CWG/issues/792.html">792</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD2</td>      <td>Effects of <TT>std::quick_exit</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="793">      <td><a href="https://cplusplus.github.io/CWG/issues/793.html">793</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD2</td>      <td>Use of class members during destruction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="794">      <td><a href="https://cplusplus.github.io/CWG/issues/794.html">794</a></td> +    <td>[<a href="https://wg21.link/conv.mem">conv.mem</a>]</td>      <td>NAD</td>      <td>Base-derived conversion in member type of pointer-to-member conversion</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="795">      <td><a href="https://cplusplus.github.io/CWG/issues/795.html">795</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>NAD</td>      <td>Dependency of lambdas on <TT><functional></TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="796">      <td><a href="https://cplusplus.github.io/CWG/issues/796.html">796</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD2</td>      <td>Lifetime of a closure object with members captured by reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="797">      <td><a href="https://cplusplus.github.io/CWG/issues/797.html">797</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Converting a no-capture lambda to a function type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="798">      <td><a href="https://cplusplus.github.io/CWG/issues/798.html">798</a></td> +    <td>[<a href="https://wg21.link/expr.sub">expr.sub</a>]</td>      <td>C++11</td>      <td>Overloaded subscript operator described in clause 5</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="799">      <td><a href="https://cplusplus.github.io/CWG/issues/799.html">799</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD2</td>      <td>Can <TT>reinterpret_cast</TT> be used to cast an operand to its own type?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="800">      <td><a href="https://cplusplus.github.io/CWG/issues/800.html">800</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>NAD</td>      <td>Safely-derived pointers and object pointers converted from function pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="801">      <td><a href="https://cplusplus.github.io/CWG/issues/801.html">801</a></td> +    <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>      <td>CD2</td>      <td>Casting away constness in a cast to rvalue reference type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="803">      <td><a href="https://cplusplus.github.io/CWG/issues/803.html">803</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>CD2</td>      <td><TT>sizeof</TT> an enumeration type with a fixed underlying type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="804">      <td><a href="https://cplusplus.github.io/CWG/issues/804.html">804</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD2</td>      <td>Deducing the type in <TT>new auto(x)</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="805">      <td><a href="https://cplusplus.github.io/CWG/issues/805.html">805</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD2</td>      <td>Which exception to throw for overflow in array size calculation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="806">      <td><a href="https://cplusplus.github.io/CWG/issues/806.html">806</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD2</td>      <td>Enumeration types in integral constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="807">      <td><a href="https://cplusplus.github.io/CWG/issues/807.html">807</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td><TT>typeid</TT> expressions in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="808">      <td><a href="https://cplusplus.github.io/CWG/issues/808.html">808</a></td> +    <td>[<a href="https://wg21.link/dcl.spec">dcl.spec</a>]</td>      <td>CD2</td>      <td>Non-type <I>decl-specifier</I>s versus max-munch</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="809">      <td><a href="https://cplusplus.github.io/CWG/issues/809.html">809</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD2</td>      <td>Deprecation of the <TT>register</TT> keyword</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="810">      <td><a href="https://cplusplus.github.io/CWG/issues/810.html">810</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD2</td>      <td>Block-scope <TT>thread_local</TT> variables should be implicitly <TT>static</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="811">      <td><a href="https://cplusplus.github.io/CWG/issues/811.html">811</a></td> +    <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>      <td>CD2</td>      <td>Unclear implications of const-qualification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="812">      <td><a href="https://cplusplus.github.io/CWG/issues/812.html">812</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD2</td>      <td>Duplicate names in inline namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="813">      <td><a href="https://cplusplus.github.io/CWG/issues/813.html">813</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>open</td>      <td><TT>typename</TT> in a <I>using-declaration</I> with a non-dependent name</td>      <td align="center">Not resolved</td>    </tr>    <tr id="814">      <td><a href="https://cplusplus.github.io/CWG/issues/814.html">814</a></td> +    <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>      <td>CD2</td>      <td>Attribute to indicate that a function throws nothing</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="815">      <td><a href="https://cplusplus.github.io/CWG/issues/815.html">815</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>CD2</td>      <td>Parameter pack expansion inside attributes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="816">      <td><a href="https://cplusplus.github.io/CWG/issues/816.html">816</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.final">dcl.attr.final</a>]</td>      <td>CD2</td>      <td>Diagnosing violations of <TT>[[final]]</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="817">      <td><a href="https://cplusplus.github.io/CWG/issues/817.html">817</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.final">dcl.attr.final</a>]</td>      <td>CD2</td>      <td>Meaning of <TT>[[final]]</TT> applied to a class definition</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="818">      <td><a href="https://cplusplus.github.io/CWG/issues/818.html">818</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD2</td>      <td>Function parameter packs in non-final positions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="819">      <td><a href="https://cplusplus.github.io/CWG/issues/819.html">819</a></td> +    <td>[<a href="https://wg21.link/special">special</a>]</td>      <td>NAD</td>      <td>Access control and deleted implicitly-declared special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="820">      <td><a href="https://cplusplus.github.io/CWG/issues/820.html">820</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>CD2</td>      <td>Deprecation of <TT>export</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="822">      <td><a href="https://cplusplus.github.io/CWG/issues/822.html">822</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>NAD</td>      <td>Additional contexts for template aliases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="823">      <td><a href="https://cplusplus.github.io/CWG/issues/823.html">823</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>CD2</td>      <td>Literal types with constexpr conversions as non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="828">      <td><a href="https://cplusplus.github.io/CWG/issues/828.html">828</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD2</td>      <td>Destruction of exception objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="829">      <td><a href="https://cplusplus.github.io/CWG/issues/829.html">829</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td>At what point is <TT>std::unexpected</TT> called?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="830">      <td><a href="https://cplusplus.github.io/CWG/issues/830.html">830</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD2</td>      <td>Deprecating exception specifications</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="831">      <td><a href="https://cplusplus.github.io/CWG/issues/831.html">831</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>CD2</td>      <td>Limit on recursively nested template instantiations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="832">      <td><a href="https://cplusplus.github.io/CWG/issues/832.html">832</a></td> +    <td>[<a href="https://wg21.link/lex.ppnumber">lex.ppnumber</a>]</td>      <td>CD2</td>      <td>Value of preprocessing numbers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="833">      <td><a href="https://cplusplus.github.io/CWG/issues/833.html">833</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD2</td>      <td>Explicit conversion of a scoped enumeration value to a floating type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="834">      <td><a href="https://cplusplus.github.io/CWG/issues/834.html">834</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD2</td>      <td>What is an “ordinary string literal”?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="835">      <td><a href="https://cplusplus.github.io/CWG/issues/835.html">835</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD2</td>      <td>Scoped enumerations and the “usual arithmetic conversions”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="836">      <td><a href="https://cplusplus.github.io/CWG/issues/836.html">836</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.noreturn">dcl.attr.noreturn</a>]</td>      <td>NAD</td>      <td><TT>[[noreturn]]</TT> applied to function types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="837">      <td><a href="https://cplusplus.github.io/CWG/issues/837.html">837</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Constexpr functions and <TT>return</TT> <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="838">      <td><a href="https://cplusplus.github.io/CWG/issues/838.html">838</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>C++11</td>      <td>Use of <TT>this</TT> in a <I>brace-or-equal-initializer</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="839">      <td><a href="https://cplusplus.github.io/CWG/issues/839.html">839</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>dup</td>      <td><TT>sizeof</TT> with opaque enumerations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="840">      <td><a href="https://cplusplus.github.io/CWG/issues/840.html">840</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD2</td>      <td>Rvalue references as nontype template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="842">      <td><a href="https://cplusplus.github.io/CWG/issues/842.html">842</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD2</td>      <td>Casting to rvalue reference type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="845">      <td><a href="https://cplusplus.github.io/CWG/issues/845.html">845</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>      <td>CD2</td>      <td>What is the “first declaration” of an explicit specialization?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="846">      <td><a href="https://cplusplus.github.io/CWG/issues/846.html">846</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD2</td>      <td>Rvalue references to functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="847">      <td><a href="https://cplusplus.github.io/CWG/issues/847.html">847</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD2</td>      <td>Error in rvalue reference deduction example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="850">      <td><a href="https://cplusplus.github.io/CWG/issues/850.html">850</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD2</td>      <td>Restrictions on use of non-static data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="852">      <td><a href="https://cplusplus.github.io/CWG/issues/852.html">852</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD6</td>      <td><I>using-declaration</I>s and dependent base classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="853">      <td><a href="https://cplusplus.github.io/CWG/issues/853.html">853</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>      <td>CD2</td>      <td>Support for relaxed pointer safety</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="854">      <td><a href="https://cplusplus.github.io/CWG/issues/854.html">854</a></td> +    <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>      <td>CD2</td>      <td>Left shift and unsigned extended types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="855">      <td><a href="https://cplusplus.github.io/CWG/issues/855.html">855</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>CD2</td>      <td>Incorrect comments in <I>braced-init-list</I> assignment example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="858">      <td><a href="https://cplusplus.github.io/CWG/issues/858.html">858</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD2</td>      <td>Example binding an rvalue reference to an lvalue</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="860">      <td><a href="https://cplusplus.github.io/CWG/issues/860.html">860</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Explicit qualification of constexpr member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="861">      <td><a href="https://cplusplus.github.io/CWG/issues/861.html">861</a></td> +    <td>[<a href="https://wg21.link/namespace.qual">namespace.qual</a>]</td>      <td>CD2</td>      <td>Unintended ambiguity in inline namespace lookup</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="862">      <td><a href="https://cplusplus.github.io/CWG/issues/862.html">862</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD2</td>      <td>Undefined behavior with enumerator value overflow</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="863">      <td><a href="https://cplusplus.github.io/CWG/issues/863.html">863</a></td> +    <td>[<a href="https://wg21.link/expr.post">expr.post</a>]</td>      <td>CD2</td>      <td>Rvalue reference cast to incomplete type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="864">      <td><a href="https://cplusplus.github.io/CWG/issues/864.html">864</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>C++11</td>      <td><I>braced-init-list</I> in the range-based <TT>for</TT> statement</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="865">      <td><a href="https://cplusplus.github.io/CWG/issues/865.html">865</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD2</td>      <td>Initializing a <TT>std::initializer_list</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="869">      <td><a href="https://cplusplus.github.io/CWG/issues/869.html">869</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD2</td>      <td>Uninitialized <TT>thread_local</TT> objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="872">      <td><a href="https://cplusplus.github.io/CWG/issues/872.html">872</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD2</td>      <td>Lexical issues with raw strings</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="873">      <td><a href="https://cplusplus.github.io/CWG/issues/873.html">873</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>C++11</td>      <td>Deducing rvalue references in declarative contexts</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="874">      <td><a href="https://cplusplus.github.io/CWG/issues/874.html">874</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD2</td>      <td>Class-scope definitions of enumeration types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="876">      <td><a href="https://cplusplus.github.io/CWG/issues/876.html">876</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD2</td>      <td>Type references in rvalue reference deduction specification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="877">      <td><a href="https://cplusplus.github.io/CWG/issues/877.html">877</a></td> +    <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>      <td>CD2</td>      <td>Viable functions and binding references to rvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="879">      <td><a href="https://cplusplus.github.io/CWG/issues/879.html">879</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>CD2</td>      <td>Missing built-in comparison operators for pointer types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="880">      <td><a href="https://cplusplus.github.io/CWG/issues/880.html">880</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>CD2</td>      <td>Built-in conditional operator for scoped enumerations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="882">      <td><a href="https://cplusplus.github.io/CWG/issues/882.html">882</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD2</td>      <td>Defining <TT>main</TT> as deleted</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="883">      <td><a href="https://cplusplus.github.io/CWG/issues/883.html">883</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD2</td>      <td><TT>std::memcpy</TT> vs <TT>std::memmove</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="884">      <td><a href="https://cplusplus.github.io/CWG/issues/884.html">884</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD2</td>      <td>Defining an explicitly-specialized static data member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="885">      <td><a href="https://cplusplus.github.io/CWG/issues/885.html">885</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>NAD</td>      <td>Partial ordering of function templates with unordered parameter pairs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="886">      <td><a href="https://cplusplus.github.io/CWG/issues/886.html">886</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD2</td>      <td>Member initializers and aggregates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="887">      <td><a href="https://cplusplus.github.io/CWG/issues/887.html">887</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD2</td>      <td>Move construction of thrown object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="888">      <td><a href="https://cplusplus.github.io/CWG/issues/888.html">888</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD2</td>      <td>Union member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="891">      <td><a href="https://cplusplus.github.io/CWG/issues/891.html">891</a></td> +    <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>      <td>CD2</td>      <td><TT>const_cast</TT> to rvalue reference from objectless rvalue</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="892">      <td><a href="https://cplusplus.github.io/CWG/issues/892.html">892</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Missing requirements for constexpr constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="893">      <td><a href="https://cplusplus.github.io/CWG/issues/893.html">893</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>NAD</td>      <td>Brace syntax for <I>enumerator-definition</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="896">      <td><a href="https://cplusplus.github.io/CWG/issues/896.html">896</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD2</td>      <td>Rvalue references and rvalue-reference conversion functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="897">      <td><a href="https://cplusplus.github.io/CWG/issues/897.html">897</a></td> +    <td>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</a>]</td>      <td>open</td>      <td><TT>_Pragma</TT> and extended <I>string-literal</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="898">      <td><a href="https://cplusplus.github.io/CWG/issues/898.html">898</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Declarations in constexpr functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="899">      <td><a href="https://cplusplus.github.io/CWG/issues/899.html">899</a></td> +    <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>      <td>CD2</td>      <td>Explicit conversion functions in direct class initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="900">      <td><a href="https://cplusplus.github.io/CWG/issues/900.html">900</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>C++23</td>      <td>Lifetime of temporaries in range-based <TT>for</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="901">      <td><a href="https://cplusplus.github.io/CWG/issues/901.html">901</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Deleted <TT>operator delete</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="902">      <td><a href="https://cplusplus.github.io/CWG/issues/902.html">902</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>NAD</td>      <td>In-class initialization of non-constant static data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="903">      <td><a href="https://cplusplus.github.io/CWG/issues/903.html">903</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD3</td>      <td>Value-dependent integral null pointer constants</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="904">      <td><a href="https://cplusplus.github.io/CWG/issues/904.html">904</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD2</td>      <td>Parameter packs in <I>lambda-capture</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="905">      <td><a href="https://cplusplus.github.io/CWG/issues/905.html">905</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD2</td>      <td>Explicit defaulted copy constructors and trivial copyability</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="906">      <td><a href="https://cplusplus.github.io/CWG/issues/906.html">906</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>      <td>CD2</td>      <td>Which special member functions can be defaulted?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="908">      <td><a href="https://cplusplus.github.io/CWG/issues/908.html">908</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>      <td>CD2</td>      <td>Deleted global allocation and deallocation functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="909">      <td><a href="https://cplusplus.github.io/CWG/issues/909.html">909</a></td> +    <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>      <td>NAD</td>      <td>Old-style casts with conversion functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="910">      <td><a href="https://cplusplus.github.io/CWG/issues/910.html">910</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD2</td>      <td>Move constructors and implicitly-declared copy constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="912">      <td><a href="https://cplusplus.github.io/CWG/issues/912.html">912</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD3</td>      <td>Character literals and <I>universal-character-name</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="913">      <td><a href="https://cplusplus.github.io/CWG/issues/913.html">913</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD2</td>      <td>Deduction rules for array- and function-type conversion functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="914">      <td><a href="https://cplusplus.github.io/CWG/issues/914.html">914</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>open</td>      <td>Value-initialization of array types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="915">      <td><a href="https://cplusplus.github.io/CWG/issues/915.html">915</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>      <td>CD2</td>      <td>Deleted specializations of member function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="919">      <td><a href="https://cplusplus.github.io/CWG/issues/919.html">919</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD2</td>      <td>Contradictions regarding inline namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="920">      <td><a href="https://cplusplus.github.io/CWG/issues/920.html">920</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>CD2</td>      <td>Interaction of inline namespaces and <I>using-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="921">      <td><a href="https://cplusplus.github.io/CWG/issues/921.html">921</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD2</td>      <td>Unclear specification of inline namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="922">      <td><a href="https://cplusplus.github.io/CWG/issues/922.html">922</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD2</td>      <td>Implicit default constructor definitions and <TT>const</TT> variant members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="923">      <td><a href="https://cplusplus.github.io/CWG/issues/923.html">923</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD2</td>      <td>Inline explicit specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="924">      <td><a href="https://cplusplus.github.io/CWG/issues/924.html">924</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>C++11</td>      <td><I>alias-declaration</I> as a class member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="925">      <td><a href="https://cplusplus.github.io/CWG/issues/925.html">925</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>open</td>      <td>Type of character literals in preprocessor expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="926">      <td><a href="https://cplusplus.github.io/CWG/issues/926.html">926</a></td> +    <td>[<a href="https://wg21.link/namespace.unnamed">namespace.unnamed</a>]</td>      <td>CD2</td>      <td>Inline unnamed namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="927">      <td><a href="https://cplusplus.github.io/CWG/issues/927.html">927</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD2</td>      <td>Implicitly-deleted default constructors and member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="928">      <td><a href="https://cplusplus.github.io/CWG/issues/928.html">928</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def">dcl.fct.def</a>]</td>      <td>CD2</td>      <td>Defaulting a function that would be implicitly defined as deleted</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="929">      <td><a href="https://cplusplus.github.io/CWG/issues/929.html">929</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>CD2</td>      <td>What is a template alias?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="930">      <td><a href="https://cplusplus.github.io/CWG/issues/930.html">930</a></td> +    <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>      <td>CD2</td>      <td><TT>alignof</TT> with incomplete array type</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="931">      <td><a href="https://cplusplus.github.io/CWG/issues/931.html">931</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>CD2</td>      <td>Confusing reference to the length of a user-defined string literal</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="932">      <td><a href="https://cplusplus.github.io/CWG/issues/932.html">932</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD2</td>      <td>UCNs in closing delimiters of raw string literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="933">      <td><a href="https://cplusplus.github.io/CWG/issues/933.html">933</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD2</td>      <td>32-bit UCNs with 16-bit <TT>wchar_t</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="934">      <td><a href="https://cplusplus.github.io/CWG/issues/934.html">934</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD2</td>      <td>List-initialization of references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="935">      <td><a href="https://cplusplus.github.io/CWG/issues/935.html">935</a></td> +    <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>      <td>CD2</td>      <td>Missing overloads for character types for user-defined literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="936">      <td><a href="https://cplusplus.github.io/CWG/issues/936.html">936</a></td> +    <td>[<a href="https://wg21.link/dcl.init.string">dcl.init.string</a>]</td>      <td>CD2</td>      <td>Array initialization with new string literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="937">      <td><a href="https://cplusplus.github.io/CWG/issues/937.html">937</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>NAD</td>      <td>Restrictions on values of template arguments in user-defined literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="938">      <td><a href="https://cplusplus.github.io/CWG/issues/938.html">938</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++11</td>      <td>Initializer lists and array new</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="939">      <td><a href="https://cplusplus.github.io/CWG/issues/939.html">939</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>CD2</td>      <td>Explicitly checking virtual function overriding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="940">      <td><a href="https://cplusplus.github.io/CWG/issues/940.html">940</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD2</td>      <td>Global anonymous unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="941">      <td><a href="https://cplusplus.github.io/CWG/issues/941.html">941</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++11</td>      <td>Explicit specialization of deleted function template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="942">      <td><a href="https://cplusplus.github.io/CWG/issues/942.html">942</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>CD2</td>      <td>Is <TT>this</TT> an entity?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="943">      <td><a href="https://cplusplus.github.io/CWG/issues/943.html">943</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>CD5</td>      <td>Is <TT>T()</TT> a temporary?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="944">      <td><a href="https://cplusplus.github.io/CWG/issues/944.html">944</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>NAD</td>      <td><TT>reinterpret_cast</TT> for all types with the same size and alignment</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="945">      <td><a href="https://cplusplus.github.io/CWG/issues/945.html">945</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>C++11</td>      <td>Use of <TT>this</TT> in a late-specified return type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="946">      <td><a href="https://cplusplus.github.io/CWG/issues/946.html">946</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>CD2</td>      <td>Order of destruction of local static objects and calls to <TT>std::atexit</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="947">      <td><a href="https://cplusplus.github.io/CWG/issues/947.html">947</a></td> +    <td>[<a href="https://wg21.link/temp.over">temp.over</a>]</td>      <td>NAD</td>      <td>Deducing type template arguments from default function arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="948">      <td><a href="https://cplusplus.github.io/CWG/issues/948.html">948</a></td> +    <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> in <I>condition</I>s</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr class="open" id="949">      <td><a href="https://cplusplus.github.io/CWG/issues/949.html">949</a></td> +    <td>[<a href="https://wg21.link/intro.compliance">intro.compliance</a>]</td>      <td>open</td>      <td>Requirements for freestanding implementations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="950">      <td><a href="https://cplusplus.github.io/CWG/issues/950.html">950</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD2</td>      <td>Use of <TT>decltype</TT> as a <I>class-name</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="951">      <td><a href="https://cplusplus.github.io/CWG/issues/951.html">951</a></td> +    <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>      <td>CD2</td>      <td>Problems with <I>attribute-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="952">      <td><a href="https://cplusplus.github.io/CWG/issues/952.html">952</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>CD6</td>      <td>Insufficient description of “naming class”</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="953">      <td><a href="https://cplusplus.github.io/CWG/issues/953.html">953</a></td> +    <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>      <td>CD2</td>      <td>Rvalue references and function viability</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="954">      <td><a href="https://cplusplus.github.io/CWG/issues/954.html">954</a></td> +    <td>[<a href="https://wg21.link/over.built">over.built</a>]</td>      <td>open</td>      <td>Overload resolution of conversion operator templates with built-in types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="955">      <td><a href="https://cplusplus.github.io/CWG/issues/955.html">955</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD2</td>      <td>Can a closure type's <TT>operator()</TT> be virtual?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="956">      <td><a href="https://cplusplus.github.io/CWG/issues/956.html">956</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD2</td>      <td>Function prototype scope with late-specified return types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="957">      <td><a href="https://cplusplus.github.io/CWG/issues/957.html">957</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>CD2</td>      <td>Alternative tokens and <I>attribute-token</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="958">      <td><a href="https://cplusplus.github.io/CWG/issues/958.html">958</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>NAD</td>      <td>Lambdas and <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="959">      <td><a href="https://cplusplus.github.io/CWG/issues/959.html">959</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>CD2</td>      <td>Alignment attribute for class and enumeration types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="960">      <td><a href="https://cplusplus.github.io/CWG/issues/960.html">960</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>CD2</td>      <td>Covariant functions and lvalue/rvalue references</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="961">      <td><a href="https://cplusplus.github.io/CWG/issues/961.html">961</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD2</td>      <td>Overload resolution and conversion of <TT>std::nullptr_t</TT> to <TT>bool</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="962">      <td><a href="https://cplusplus.github.io/CWG/issues/962.html">962</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>CD2</td>      <td>Attributes appertaining to class and enum types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="963">      <td><a href="https://cplusplus.github.io/CWG/issues/963.html">963</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD2</td>      <td>Comparing <TT>nullptr</TT> with 0</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="964">      <td><a href="https://cplusplus.github.io/CWG/issues/964.html">964</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>C++11</td>      <td>Incorrect description of when the lvalue-to-rvalue conversion applies</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="965">      <td><a href="https://cplusplus.github.io/CWG/issues/965.html">965</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.depend">dcl.attr.depend</a>]</td>      <td>CD2</td>      <td>Limiting the applicability of the <TT>carries_dependency</TT> attribute</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="966">      <td><a href="https://cplusplus.github.io/CWG/issues/966.html">966</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD2</td>      <td>Nested types without linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="967">      <td><a href="https://cplusplus.github.io/CWG/issues/967.html">967</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic">basic.stc.dynamic</a>]</td>      <td>NAD</td>      <td>Exception specification of replacement allocation function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="968">      <td><a href="https://cplusplus.github.io/CWG/issues/968.html">968</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>CD2</td>      <td>Syntactic ambiguity of the attribute notation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="969">      <td><a href="https://cplusplus.github.io/CWG/issues/969.html">969</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD2</td>      <td>Explicit instantiation declarations of class template specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="970">      <td><a href="https://cplusplus.github.io/CWG/issues/970.html">970</a></td> +    <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>      <td>CD2</td>      <td>Consistent use of “appertain” and “apply”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="971">      <td><a href="https://cplusplus.github.io/CWG/issues/971.html">971</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>C++11</td>      <td>Incorrect treatment of <I>exception-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="972">      <td><a href="https://cplusplus.github.io/CWG/issues/972.html">972</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>C++11</td>      <td>Allowing multiple <I>attribute-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="973">      <td><a href="https://cplusplus.github.io/CWG/issues/973.html">973</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD2</td>      <td>Function types in <I>exception-specification</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="974">      <td><a href="https://cplusplus.github.io/CWG/issues/974.html">974</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD3</td>      <td>Default arguments for lambdas</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="975">      <td><a href="https://cplusplus.github.io/CWG/issues/975.html">975</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD3</td>      <td>Restrictions on return type deduction for lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="976">      <td><a href="https://cplusplus.github.io/CWG/issues/976.html">976</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD2</td>      <td>Deduction for <TT>const T&</TT> conversion operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="977">      <td><a href="https://cplusplus.github.io/CWG/issues/977.html">977</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD3</td>      <td>When is an enumeration type complete?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="978">      <td><a href="https://cplusplus.github.io/CWG/issues/978.html">978</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>CD2</td>      <td>Incorrect specification for copy initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="979">      <td><a href="https://cplusplus.github.io/CWG/issues/979.html">979</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD2</td>      <td>Position of <I>attribute-specifier</I> in declarator syntax</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="980">      <td><a href="https://cplusplus.github.io/CWG/issues/980.html">980</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD2</td>      <td>Explicit instantiation of a member of a class template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="981">      <td><a href="https://cplusplus.github.io/CWG/issues/981.html">981</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++11</td>      <td>Constexpr constructor templates and literal types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="982">      <td><a href="https://cplusplus.github.io/CWG/issues/982.html">982</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Initialization with an empty initializer list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="983">      <td><a href="https://cplusplus.github.io/CWG/issues/983.html">983</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>CD2</td>      <td>Ambiguous pointer-to-member constant</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="984">      <td><a href="https://cplusplus.github.io/CWG/issues/984.html">984</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD2</td>      <td>“Deduced type” is unclear in <TT>auto</TT> type deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="985">      <td><a href="https://cplusplus.github.io/CWG/issues/985.html">985</a></td> +    <td>[<a href="https://wg21.link/lex.digraph">lex.digraph</a>]</td>      <td>C++11</td>      <td>Alternative tokens and user-defined literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="986">      <td><a href="https://cplusplus.github.io/CWG/issues/986.html">986</a></td> +    <td>[<a href="https://wg21.link/namespace.udir">namespace.udir</a>]</td>      <td>CD2</td>      <td>Transitivity of <I>using-directive</I>s versus qualified lookup</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="987">      <td><a href="https://cplusplus.github.io/CWG/issues/987.html">987</a></td> +    <td>[<a href="https://wg21.link/basic.namespace">basic.namespace</a>]</td>      <td>CD4</td>      <td>Which declarations introduce namespace members?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="988">      <td><a href="https://cplusplus.github.io/CWG/issues/988.html">988</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD2</td>      <td>Reference-to-reference collapsing with <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="989">      <td><a href="https://cplusplus.github.io/CWG/issues/989.html">989</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD2</td>      <td>Misplaced list-initialization example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="990">      <td><a href="https://cplusplus.github.io/CWG/issues/990.html">990</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD2</td>      <td>Value initialization with multiple initializer-list constructors</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="991">      <td><a href="https://cplusplus.github.io/CWG/issues/991.html">991</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD2</td>      <td>Reference parameters of constexpr functions and constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="992">      <td><a href="https://cplusplus.github.io/CWG/issues/992.html">992</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Inheriting explicitness</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="993">      <td><a href="https://cplusplus.github.io/CWG/issues/993.html">993</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>C++11</td>      <td>Freedom to perform instantiation at the end of the translation unit</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="994">      <td><a href="https://cplusplus.github.io/CWG/issues/994.html">994</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>C++11</td>      <td><I>braced-init-list</I> as a default argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="995">      <td><a href="https://cplusplus.github.io/CWG/issues/995.html">995</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD2</td>      <td>Incorrect example for <I>using-declaration</I> and explicit instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="996">      <td><a href="https://cplusplus.github.io/CWG/issues/996.html">996</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>C++11</td>      <td>Ambiguous partial specializations of member class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="997">      <td><a href="https://cplusplus.github.io/CWG/issues/997.html">997</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>C++11</td>      <td>Argument-dependent lookup and dependent function template parameter types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="998">      <td><a href="https://cplusplus.github.io/CWG/issues/998.html">998</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>dup</td>      <td>Function parameter transformations and template functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="999">      <td><a href="https://cplusplus.github.io/CWG/issues/999.html">999</a></td> +    <td>[<a href="https://wg21.link/over.match">over.match</a>]</td>      <td>CD2</td>      <td>“Implicit” or “implied” object argument/parameter?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1000">      <td><a href="https://cplusplus.github.io/CWG/issues/1000.html">1000</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>CD2</td>      <td>Mistaking member typedefs for constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1001">      <td><a href="https://cplusplus.github.io/CWG/issues/1001.html">1001</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>review</td>      <td>Parameter type adjustment in dependent parameter types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1002">      <td><a href="https://cplusplus.github.io/CWG/issues/1002.html">1002</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>NAD</td>      <td>Pack expansion for function arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1003">      <td><a href="https://cplusplus.github.io/CWG/issues/1003.html">1003</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD3</td>      <td>Acceptable definitions of <TT>main</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1004">      <td><a href="https://cplusplus.github.io/CWG/issues/1004.html">1004</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>C++11</td>      <td>Injected-class-names as arguments for template template parameters</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr id="1005">      <td><a href="https://cplusplus.github.io/CWG/issues/1005.html">1005</a></td> +    <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>      <td>NAD</td>      <td>Qualified name resolution in member functions of class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1006">      <td><a href="https://cplusplus.github.io/CWG/issues/1006.html">1006</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>C++11</td>      <td><TT>std::nullptr_t</TT> as a non-type template parameter</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1007">      <td><a href="https://cplusplus.github.io/CWG/issues/1007.html">1007</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>NAD</td>      <td>Protected access and pointers to members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1008">      <td><a href="https://cplusplus.github.io/CWG/issues/1008.html">1008</a></td> +    <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>      <td>NAD</td>      <td>Querying the alignment of an object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1009">      <td><a href="https://cplusplus.github.io/CWG/issues/1009.html">1009</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>C++11</td>      <td>Missing cases in the <I>declarator-id</I> of a function template declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1010">      <td><a href="https://cplusplus.github.io/CWG/issues/1010.html">1010</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD2</td>      <td>Address of object with dynamic storage duration in constant expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1011">      <td><a href="https://cplusplus.github.io/CWG/issues/1011.html">1011</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>C++11</td>      <td>Standard conversions that cannot be inverted</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1012">      <td><a href="https://cplusplus.github.io/CWG/issues/1012.html">1012</a></td> +    <td>[<a href="https://wg21.link/namespace.unnamed">namespace.unnamed</a>]</td>      <td>C++11</td>      <td>Undeprecating <TT>static</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1013">      <td><a href="https://cplusplus.github.io/CWG/issues/1013.html">1013</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>CD3</td>      <td>Uninitialized <TT>std::nullptr_t</TT> objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1014">      <td><a href="https://cplusplus.github.io/CWG/issues/1014.html">1014</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>NAD</td>      <td>Overload resolution between <TT>const T&</TT> and <TT>T&&</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1015">      <td><a href="https://cplusplus.github.io/CWG/issues/1015.html">1015</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>C++11</td>      <td>Template arguments and argument-dependent lookup</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1016">      <td><a href="https://cplusplus.github.io/CWG/issues/1016.html">1016</a></td> +    <td>[<a href="https://wg21.link/over">over</a>]</td>      <td>C++11</td>      <td>Overloadable declarations, function templates, and references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1017">      <td><a href="https://cplusplus.github.io/CWG/issues/1017.html">1017</a></td> +    <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>      <td>C++11</td>      <td>Member access transformation in unevaluated operands</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1018">      <td><a href="https://cplusplus.github.io/CWG/issues/1018.html">1018</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>C++11</td>      <td>Ambiguity between <I>simple-declaration</I> and <I>attribute-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1019">      <td><a href="https://cplusplus.github.io/CWG/issues/1019.html">1019</a></td> +    <td>[<a href="https://wg21.link/class.derived">class.derived</a>]</td>      <td>dup</td>      <td>Dependent <I>simple-template-id</I>s in <I>base-specifier</I>s and <I>mem-initializer</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1020">      <td><a href="https://cplusplus.github.io/CWG/issues/1020.html">1020</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td>Implicitly-defined copy constructors and explicit base class constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1021">      <td><a href="https://cplusplus.github.io/CWG/issues/1021.html">1021</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>CD4</td>      <td>Definitions of namespace members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1022">      <td><a href="https://cplusplus.github.io/CWG/issues/1022.html">1022</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>C++11</td>      <td>Can an enumeration variable have values outside the values of the enumeration?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1023">      <td><a href="https://cplusplus.github.io/CWG/issues/1023.html">1023</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>dup</td>      <td><TT>thread_local</TT> objects as non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1024">      <td><a href="https://cplusplus.github.io/CWG/issues/1024.html">1024</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD3</td>      <td>Limits on multicharacter literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1025">      <td><a href="https://cplusplus.github.io/CWG/issues/1025.html">1025</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++11</td>      <td>Use of a reference as a non-type template argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1026">      <td><a href="https://cplusplus.github.io/CWG/issues/1026.html">1026</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>NAD</td>      <td>Cv-qualified non-class rvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1027">      <td><a href="https://cplusplus.github.io/CWG/issues/1027.html">1027</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>review</td>      <td>Type consistency and reallocation of scalar types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1028">      <td><a href="https://cplusplus.github.io/CWG/issues/1028.html">1028</a></td> +    <td>[<a href="https://wg21.link/temp.dep.res">temp.dep.res</a>]</td>      <td>CD6</td>      <td>Dependent names in non-defining declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1029">      <td><a href="https://cplusplus.github.io/CWG/issues/1029.html">1029</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>C++11</td>      <td>Type of a destructor call</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1030">      <td><a href="https://cplusplus.github.io/CWG/issues/1030.html">1030</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++11</td>      <td>Evaluation order in <I>initializer-list</I>s used in aggregate initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1031">      <td><a href="https://cplusplus.github.io/CWG/issues/1031.html">1031</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>C++11</td>      <td>Optional elements in attributes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1032">      <td><a href="https://cplusplus.github.io/CWG/issues/1032.html">1032</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>C++11</td>      <td>Empty pack expansions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1033">      <td><a href="https://cplusplus.github.io/CWG/issues/1033.html">1033</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>C++11</td>      <td>Restrictions on alignment attributes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1034">      <td><a href="https://cplusplus.github.io/CWG/issues/1034.html">1034</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>C++11</td>      <td>Attributes for <TT>return</TT> statements in lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1035">      <td><a href="https://cplusplus.github.io/CWG/issues/1035.html">1035</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>C++11</td>      <td>Omitted and required <I>decl-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1036">      <td><a href="https://cplusplus.github.io/CWG/issues/1036.html">1036</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>C++11</td>      <td>Alignment attribute in an <I>exception-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1037">      <td><a href="https://cplusplus.github.io/CWG/issues/1037.html">1037</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>C++11</td>      <td>Requirements for operands of <I>delete-expression</I>s and deallocation functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1038">      <td><a href="https://cplusplus.github.io/CWG/issues/1038.html">1038</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>CD7</td>      <td>Overload resolution of <TT>&x.static_func</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1039">      <td><a href="https://cplusplus.github.io/CWG/issues/1039.html">1039</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>dup</td>      <td>Coordinating C and C++ alignment specifications</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1040">      <td><a href="https://cplusplus.github.io/CWG/issues/1040.html">1040</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>NAD</td>      <td>Memory model issues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1041">      <td><a href="https://cplusplus.github.io/CWG/issues/1041.html">1041</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>dup</td>      <td><I>alias-declaration</I>s as class members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1042">      <td><a href="https://cplusplus.github.io/CWG/issues/1042.html">1042</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>C++11</td>      <td>Attributes in <I>alias-declaration</I>s</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1043">      <td><a href="https://cplusplus.github.io/CWG/issues/1043.html">1043</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++11</td>      <td>Qualified name lookup in the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1044">      <td><a href="https://cplusplus.github.io/CWG/issues/1044.html">1044</a></td> +    <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>      <td>C++11</td>      <td>Point of declaration for an <I>alias-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1045">      <td><a href="https://cplusplus.github.io/CWG/issues/1045.html">1045</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>NAD</td>      <td>Requiring explicit instantiation declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1046">      <td><a href="https://cplusplus.github.io/CWG/issues/1046.html">1046</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>open</td>      <td>What is a “use” of a class specialization?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1047">      <td><a href="https://cplusplus.github.io/CWG/issues/1047.html">1047</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>C++11</td>      <td>When is <TT>typeid</TT> value-dependent?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1048">      <td><a href="https://cplusplus.github.io/CWG/issues/1048.html">1048</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD3</td>      <td><TT>auto</TT> deduction and lambda return type deduction.</td>      <td class="full" align="center">Clang 3.6</td>    </tr>    <tr class="open" id="1049">      <td><a href="https://cplusplus.github.io/CWG/issues/1049.html">1049</a></td> +    <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>      <td>open</td>      <td>Copy elision through reference parameters of inline functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1050">      <td><a href="https://cplusplus.github.io/CWG/issues/1050.html">1050</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>NAD</td>      <td>Effects of thread support on object lifetime</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1051">      <td><a href="https://cplusplus.github.io/CWG/issues/1051.html">1051</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td>Reference members and generated copy constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1052">      <td><a href="https://cplusplus.github.io/CWG/issues/1052.html">1052</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>dup</td>      <td><TT>const</TT> non-static data member and PODness</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1053">      <td><a href="https://cplusplus.github.io/CWG/issues/1053.html">1053</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td>Terminate vs undefined behavior for noexcept violation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1054">      <td><a href="https://cplusplus.github.io/CWG/issues/1054.html">1054</a></td> +    <td>[<a href="https://wg21.link/stmt.expr">stmt.expr</a>]</td>      <td>C++11</td>      <td>Lvalue-to-rvalue conversions in expression statements</td>      <td class="none" align="center">No</td>    </tr>    <tr id="1055">      <td><a href="https://cplusplus.github.io/CWG/issues/1055.html">1055</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>C++11</td>      <td>Permissible uses of <TT>void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1056">      <td><a href="https://cplusplus.github.io/CWG/issues/1056.html">1056</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>C++11</td>      <td>Template aliases, member definitions, and the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1057">      <td><a href="https://cplusplus.github.io/CWG/issues/1057.html">1057</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++11</td>      <td><TT>decltype</TT> and the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1058">      <td><a href="https://cplusplus.github.io/CWG/issues/1058.html">1058</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>NAD</td>      <td>Reference binding of incompatible array types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1059">      <td><a href="https://cplusplus.github.io/CWG/issues/1059.html">1059</a></td> +    <td>[<a href="https://wg21.link/basic.type.qualifier">basic.type.qualifier</a>]</td>      <td>CD3</td>      <td>Cv-qualified array types (with rvalues)</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1060">      <td><a href="https://cplusplus.github.io/CWG/issues/1060.html">1060</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Scoped enumerators in integral constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1061">      <td><a href="https://cplusplus.github.io/CWG/issues/1061.html">1061</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>C++11</td>      <td>Negative array bounds in a <I>new-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1062">      <td><a href="https://cplusplus.github.io/CWG/issues/1062.html">1062</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>C++11</td>      <td>Syntax of <I>attribute-specifier</I>s in lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1063">      <td><a href="https://cplusplus.github.io/CWG/issues/1063.html">1063</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>      <td>C++11</td>      <td><TT>[[hiding]]</TT> with non-attribute declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1064">      <td><a href="https://cplusplus.github.io/CWG/issues/1064.html">1064</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td>Defaulted move constructor for a union</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1065">      <td><a href="https://cplusplus.github.io/CWG/issues/1065.html">1065</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>      <td>C++11</td>      <td><TT>[[hiding]]</TT> with <TT>[[override]]</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1066">      <td><a href="https://cplusplus.github.io/CWG/issues/1066.html">1066</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>C++11</td>      <td>When is a copy/move assignment operator implicitly defined?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1067">      <td><a href="https://cplusplus.github.io/CWG/issues/1067.html">1067</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>      <td>NAD</td>      <td><TT>[[hiding]]</TT>, <I>using-declaration</I>s, and multiple inheritance</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1068">      <td><a href="https://cplusplus.github.io/CWG/issues/1068.html">1068</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>C++11</td>      <td>Template aliases with default arguments and template parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1069">      <td><a href="https://cplusplus.github.io/CWG/issues/1069.html">1069</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>C++11</td>      <td>Incorrect function type with <I>trailing-return-type</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1070">      <td><a href="https://cplusplus.github.io/CWG/issues/1070.html">1070</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++11</td>      <td>Missing initializer clauses in aggregate initialization</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1071">      <td><a href="https://cplusplus.github.io/CWG/issues/1071.html">1071</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++11</td>      <td>Literal class types and trivial default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1072">      <td><a href="https://cplusplus.github.io/CWG/issues/1072.html">1072</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>C++11</td>      <td>Scoped enumerator with the same name as its containing class</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1073">      <td><a href="https://cplusplus.github.io/CWG/issues/1073.html">1073</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>C++11</td>      <td>Merging <I>dynamic-exception-specification</I>s and <I>noexcept-specification</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1074">      <td><a href="https://cplusplus.github.io/CWG/issues/1074.html">1074</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>C++11</td>      <td>Value-dependent <I>noexcept-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1075">      <td><a href="https://cplusplus.github.io/CWG/issues/1075.html">1075</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>C++11</td>      <td>Grammar does not allow template alias in <I>type-name</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1076">      <td><a href="https://cplusplus.github.io/CWG/issues/1076.html">1076</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD5</td>      <td>Value categories and lvalue temporaries</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1077">      <td><a href="https://cplusplus.github.io/CWG/issues/1077.html">1077</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>NAD</td>      <td>Explicit specializations in non-containing namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1078">      <td><a href="https://cplusplus.github.io/CWG/issues/1078.html">1078</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Narrowing and the usual arithmetic conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1079">      <td><a href="https://cplusplus.github.io/CWG/issues/1079.html">1079</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>C++11</td>      <td>Overload resolution involving aggregate initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1080">      <td><a href="https://cplusplus.github.io/CWG/issues/1080.html">1080</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td>Confusing relationship between templates and copy constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1081">      <td><a href="https://cplusplus.github.io/CWG/issues/1081.html">1081</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>C++11</td>      <td>Defaulted destructor and unusable operator delete</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1082">      <td><a href="https://cplusplus.github.io/CWG/issues/1082.html">1082</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td>Implicit copy function if subobject has none?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1083">      <td><a href="https://cplusplus.github.io/CWG/issues/1083.html">1083</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>C++11</td>      <td>Passing an object to ellipsis with non-trivial move constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1084">      <td><a href="https://cplusplus.github.io/CWG/issues/1084.html">1084</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Conditions for a deleted move function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1085">      <td><a href="https://cplusplus.github.io/CWG/issues/1085.html">1085</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>NAD</td>      <td>Move assignment operators and virtual bases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1086">      <td><a href="https://cplusplus.github.io/CWG/issues/1086.html">1086</a></td> +    <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>      <td>C++11</td>      <td><TT>const_cast</TT> to rvalue reference to function type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1087">      <td><a href="https://cplusplus.github.io/CWG/issues/1087.html">1087</a></td> +    <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>      <td>C++11</td>      <td>Additional applications of issue 899</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1088">      <td><a href="https://cplusplus.github.io/CWG/issues/1088.html">1088</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>C++11</td>      <td>Dependent non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1089">      <td><a href="https://cplusplus.github.io/CWG/issues/1089.html">1089</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.qual.general">basic.lookup.qual.general</a>]</td>      <td>open</td>      <td>Template parameters in member selections</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1090">      <td><a href="https://cplusplus.github.io/CWG/issues/1090.html">1090</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>C++11</td>      <td>Alignment of subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1091">      <td><a href="https://cplusplus.github.io/CWG/issues/1091.html">1091</a></td> +    <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>      <td>C++11</td>      <td>Inconsistent use of the term “object expression”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1092">      <td><a href="https://cplusplus.github.io/CWG/issues/1092.html">1092</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>drafting</td>      <td>Cycles in overload resolution during instantiation</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1093">      <td><a href="https://cplusplus.github.io/CWG/issues/1093.html">1093</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD3</td>      <td>Value-initializing non-objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1094">      <td><a href="https://cplusplus.github.io/CWG/issues/1094.html">1094</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>C++11</td>      <td>Converting floating-point values to scoped enumeration types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1095">      <td><a href="https://cplusplus.github.io/CWG/issues/1095.html">1095</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>C++11</td>      <td>List-initialization of references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1096">      <td><a href="https://cplusplus.github.io/CWG/issues/1096.html">1096</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>C++11</td>      <td>Missing requirement for template definitions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1097">      <td><a href="https://cplusplus.github.io/CWG/issues/1097.html">1097</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>NAD</td>      <td>Aggregate initialization of function parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1098">      <td><a href="https://cplusplus.github.io/CWG/issues/1098.html">1098</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Pointer conversions in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1099">      <td><a href="https://cplusplus.github.io/CWG/issues/1099.html">1099</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Infinite recursion in <TT>constexpr</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1100">      <td><a href="https://cplusplus.github.io/CWG/issues/1100.html">1100</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> conversion functions and non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1101">      <td><a href="https://cplusplus.github.io/CWG/issues/1101.html">1101</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>C++11</td>      <td>Non-integral initialized static data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1102">      <td><a href="https://cplusplus.github.io/CWG/issues/1102.html">1102</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>C++11</td>      <td>Better example of undefined behavior</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1103">      <td><a href="https://cplusplus.github.io/CWG/issues/1103.html">1103</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>C++11</td>      <td>Reversion of phase 1 and 2 transformations in raw string literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1104">      <td><a href="https://cplusplus.github.io/CWG/issues/1104.html">1104</a></td> +    <td>[<a href="https://wg21.link/lex.digraph">lex.digraph</a>]</td>      <td>C++11</td>      <td>Global-scope template arguments vs the <TT><:</TT> digraph</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1105">      <td><a href="https://cplusplus.github.io/CWG/issues/1105.html">1105</a></td> +    <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>      <td>C++11</td>      <td>Issues relating to TR 10176:2003</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1106">      <td><a href="https://cplusplus.github.io/CWG/issues/1106.html">1106</a></td> +    <td>[<a href="https://wg21.link/lex.nullptr">lex.nullptr</a>]</td>      <td>C++11</td>      <td>Need more detail in <TT>nullptr</TT> keyword description</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1107">      <td><a href="https://cplusplus.github.io/CWG/issues/1107.html">1107</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>C++11</td>      <td>Overload resolution for user-defined integer literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1108">      <td><a href="https://cplusplus.github.io/CWG/issues/1108.html">1108</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>NAD</td>      <td>User-defined literals have not been implemented</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1109">      <td><a href="https://cplusplus.github.io/CWG/issues/1109.html">1109</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++11</td>      <td>When is “use” a reference to the ODR meaning?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1110">      <td><a href="https://cplusplus.github.io/CWG/issues/1110.html">1110</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>NAD</td>      <td>Incomplete return type should be allowed in <TT>decltype</TT> operand</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1111">      <td><a href="https://cplusplus.github.io/CWG/issues/1111.html">1111</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>C++11</td>      <td>Remove dual-scope lookup of member template names</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="1112">      <td><a href="https://cplusplus.github.io/CWG/issues/1112.html">1112</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> variables should have internal linkage like <TT>const</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1113">      <td><a href="https://cplusplus.github.io/CWG/issues/1113.html">1113</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>C++11</td>      <td>Linkage of namespace member of unnamed namespace</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="1114">      <td><a href="https://cplusplus.github.io/CWG/issues/1114.html">1114</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>C++11</td>      <td>Incorrect use of placement <TT>new</TT> in example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1115">      <td><a href="https://cplusplus.github.io/CWG/issues/1115.html">1115</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>C++11</td>      <td>C-compatible alignment specification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1116">      <td><a href="https://cplusplus.github.io/CWG/issues/1116.html">1116</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD4</td>      <td>Aliasing of union members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1117">      <td><a href="https://cplusplus.github.io/CWG/issues/1117.html">1117</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>C++11</td>      <td>Incorrect note about xvalue member access expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1118">      <td><a href="https://cplusplus.github.io/CWG/issues/1118.html">1118</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>NAD</td>      <td>Implicit lambda capture via explicit copy constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1119">      <td><a href="https://cplusplus.github.io/CWG/issues/1119.html">1119</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>C++11</td>      <td>Missing case in description of member access ambiguity</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1120">      <td><a href="https://cplusplus.github.io/CWG/issues/1120.html">1120</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>C++11</td>      <td><TT>reinterpret_cast</TT> and <TT>void*</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1121">      <td><a href="https://cplusplus.github.io/CWG/issues/1121.html">1121</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>C++11</td>      <td>Unnecessary ambiguity error in formation of pointer to member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1122">      <td><a href="https://cplusplus.github.io/CWG/issues/1122.html">1122</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>C++11</td>      <td>Circular definition of <TT>std::size_t</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1123">      <td><a href="https://cplusplus.github.io/CWG/issues/1123.html">1123</a></td> +    <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>      <td>C++11</td>      <td>Destructors should be <TT>noexcept</TT> by default</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1124">      <td><a href="https://cplusplus.github.io/CWG/issues/1124.html">1124</a></td> +    <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>      <td>NAD</td>      <td>Error in description of value category of pointer-to-member expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1125">      <td><a href="https://cplusplus.github.io/CWG/issues/1125.html">1125</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Unclear definition of “potential constant expression”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1126">      <td><a href="https://cplusplus.github.io/CWG/issues/1126.html">1126</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> functions in <TT>const</TT> initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1127">      <td><a href="https://cplusplus.github.io/CWG/issues/1127.html">1127</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Overload resolution in <TT>constexpr</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1128">      <td><a href="https://cplusplus.github.io/CWG/issues/1128.html">1128</a></td> +    <td>[<a href="https://wg21.link/dcl.spec">dcl.spec</a>]</td>      <td>C++11</td>      <td><I>attribute-specifier</I>s in <I>decl-specifier-seq</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1129">      <td><a href="https://cplusplus.github.io/CWG/issues/1129.html">1129</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Default <TT>nothrow</TT> for <TT>constexpr</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1130">      <td><a href="https://cplusplus.github.io/CWG/issues/1130.html">1130</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>C++11</td>      <td>Function parameter type adjustments and <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1131">      <td><a href="https://cplusplus.github.io/CWG/issues/1131.html">1131</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>C++11</td>      <td>Template aliases in <I>elaborated-type-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1132">      <td><a href="https://cplusplus.github.io/CWG/issues/1132.html">1132</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.noreturn">dcl.attr.noreturn</a>]</td>      <td>NAD</td>      <td>Keyword vs attribute for <TT>noreturn</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1133">      <td><a href="https://cplusplus.github.io/CWG/issues/1133.html">1133</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.override">dcl.attr.override</a>]</td>      <td>C++11</td>      <td>Keywords vs attributes for control of hiding and overriding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1134">      <td><a href="https://cplusplus.github.io/CWG/issues/1134.html">1134</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>C++11</td>      <td>When is an explicitly-defaulted function defined?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1135">      <td><a href="https://cplusplus.github.io/CWG/issues/1135.html">1135</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>C++11</td>      <td>Explicitly-defaulted non-public special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1136">      <td><a href="https://cplusplus.github.io/CWG/issues/1136.html">1136</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>C++11</td>      <td>Explicitly-defaulted explicit constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1137">      <td><a href="https://cplusplus.github.io/CWG/issues/1137.html">1137</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>C++11</td>      <td>Explicitly-defaulted virtual special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1138">      <td><a href="https://cplusplus.github.io/CWG/issues/1138.html">1138</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>C++11</td>      <td>Rvalue-ness check for rvalue reference binding is wrong</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1139">      <td><a href="https://cplusplus.github.io/CWG/issues/1139.html">1139</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>C++11</td>      <td>Rvalue reference binding to scalar xvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1140">      <td><a href="https://cplusplus.github.io/CWG/issues/1140.html">1140</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>C++11</td>      <td>Incorrect redefinition of POD class</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1141">      <td><a href="https://cplusplus.github.io/CWG/issues/1141.html">1141</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>NAD</td>      <td>Non-static data member initializers have not been implemented</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1142">      <td><a href="https://cplusplus.github.io/CWG/issues/1142.html">1142</a></td> +    <td>[<a href="https://wg21.link/class.mfct">class.mfct</a>]</td>      <td>C++11</td>      <td><TT>friend</TT> declaration of member function of containing class</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1143">      <td><a href="https://cplusplus.github.io/CWG/issues/1143.html">1143</a></td> +    <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>      <td>NAD</td>      <td>Move semantics for <TT>*this</TT> have not been implemented</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1144">      <td><a href="https://cplusplus.github.io/CWG/issues/1144.html">1144</a></td> +    <td>[<a href="https://wg21.link/class.access.dcl">class.access.dcl</a>]</td>      <td>C++11</td>      <td>Remove access declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1145">      <td><a href="https://cplusplus.github.io/CWG/issues/1145.html">1145</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>C++11</td>      <td>Defaulting and triviality</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1146">      <td><a href="https://cplusplus.github.io/CWG/issues/1146.html">1146</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>C++11</td>      <td><I>exception-specification</I>s of defaulted functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1147">      <td><a href="https://cplusplus.github.io/CWG/issues/1147.html">1147</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>C++11</td>      <td>Destructors should be default <TT>nothrow</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1148">      <td><a href="https://cplusplus.github.io/CWG/issues/1148.html">1148</a></td> +    <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>      <td>C++11</td>      <td>Copy elision and move construction of function parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1149">      <td><a href="https://cplusplus.github.io/CWG/issues/1149.html">1149</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td>Trivial non-public copy operators in subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1150">      <td><a href="https://cplusplus.github.io/CWG/issues/1150.html">1150</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>NAD</td>      <td>Inheriting constructors have not been implemented</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="1151">      <td><a href="https://cplusplus.github.io/CWG/issues/1151.html">1151</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>C++11</td>      <td>Overload resolution with initializer-list and non-list constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1152">      <td><a href="https://cplusplus.github.io/CWG/issues/1152.html">1152</a></td> +    <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>      <td>C++11</td>      <td>Rules for determining existence of implicit conversion sequence</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1153">      <td><a href="https://cplusplus.github.io/CWG/issues/1153.html">1153</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>C++11</td>      <td>Type matching in address of overloaded function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1154">      <td><a href="https://cplusplus.github.io/CWG/issues/1154.html">1154</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++11</td>      <td>Address of <TT>thread_local</TT> variable as non-type template argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1155">      <td><a href="https://cplusplus.github.io/CWG/issues/1155.html">1155</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++11</td>      <td>Internal-linkage non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1156">      <td><a href="https://cplusplus.github.io/CWG/issues/1156.html">1156</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>C++11</td>      <td>Partial ordering in a non-call context</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1157">      <td><a href="https://cplusplus.github.io/CWG/issues/1157.html">1157</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>open</td>      <td>Partial ordering of function templates is still underspecified</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1158">      <td><a href="https://cplusplus.github.io/CWG/issues/1158.html">1158</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>C++11</td>      <td>Recursive instantiation via alias template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1159">      <td><a href="https://cplusplus.github.io/CWG/issues/1159.html">1159</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>C++11</td>      <td>Class and enumeration definitions in template aliases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1160">      <td><a href="https://cplusplus.github.io/CWG/issues/1160.html">1160</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++11</td>      <td>Definitions of template members and the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1161">      <td><a href="https://cplusplus.github.io/CWG/issues/1161.html">1161</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>C++11</td>      <td>Dependent <I>nested-name-specifier</I> in a pointer-to-member declarator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1162">      <td><a href="https://cplusplus.github.io/CWG/issues/1162.html">1162</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>NAD</td>      <td>Dependent <I>elaborated-type-specifier</I>s in non-deduced contexts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1163">      <td><a href="https://cplusplus.github.io/CWG/issues/1163.html">1163</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>NAD</td>      <td><TT>extern template</TT> prevents inlining functions not marked <TT>inline</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1164">      <td><a href="https://cplusplus.github.io/CWG/issues/1164.html">1164</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>C++11</td>      <td>Partial ordering of <TT>f(T&)</TT> and <TT>f(T&&)</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1165">      <td><a href="https://cplusplus.github.io/CWG/issues/1165.html">1165</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>C++11</td>      <td>Exceptions when destroying array elements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1166">      <td><a href="https://cplusplus.github.io/CWG/issues/1166.html">1166</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>C++11</td>      <td><I>exception-declaration</I>s that do not declare objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1167">      <td><a href="https://cplusplus.github.io/CWG/issues/1167.html">1167</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>C++11</td>      <td><I>function-try-block</I>s for destructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1168">      <td><a href="https://cplusplus.github.io/CWG/issues/1168.html">1168</a></td> +    <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>      <td>C++11</td>      <td>Additional reasons to call <TT>std::terminate</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1169">      <td><a href="https://cplusplus.github.io/CWG/issues/1169.html">1169</a></td> +    <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>      <td>C++11</td>      <td>Missing feature macro for strict pointer safety</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1170">      <td><a href="https://cplusplus.github.io/CWG/issues/1170.html">1170</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>C++11</td>      <td>Access checking during template argument deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1171">      <td><a href="https://cplusplus.github.io/CWG/issues/1171.html">1171</a></td> +    <td>[<a href="https://wg21.link/except.terminate">except.terminate</a>]</td>      <td>C++11</td>      <td>Partial stack unwinding with <TT>noexcept</TT> violation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1172">      <td><a href="https://cplusplus.github.io/CWG/issues/1172.html">1172</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>drafting</td>      <td>“instantiation-dependent” constructs</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1173">      <td><a href="https://cplusplus.github.io/CWG/issues/1173.html">1173</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>C++11</td>      <td>Unclear specification of effects of signal handling</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1174">      <td><a href="https://cplusplus.github.io/CWG/issues/1174.html">1174</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++11</td>      <td>When is a pure virtual function “used?”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1175">      <td><a href="https://cplusplus.github.io/CWG/issues/1175.html">1175</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>C++11</td>      <td>Disambiguating user-defined literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1176">      <td><a href="https://cplusplus.github.io/CWG/issues/1176.html">1176</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>C++11</td>      <td>Definition of release sequence</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1177">      <td><a href="https://cplusplus.github.io/CWG/issues/1177.html">1177</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>C++11</td>      <td>Intra-thread dependency-ordered-before</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1178">      <td><a href="https://cplusplus.github.io/CWG/issues/1178.html">1178</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.decl">temp.deduct.decl</a>]</td>      <td>C++11</td>      <td>Deduction failure matching placement new</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1179">      <td><a href="https://cplusplus.github.io/CWG/issues/1179.html">1179</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>NAD</td>      <td>Cv-qualification of non-type template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1180">      <td><a href="https://cplusplus.github.io/CWG/issues/1180.html">1180</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>C++11</td>      <td>Over-aligned class types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1181">      <td><a href="https://cplusplus.github.io/CWG/issues/1181.html">1181</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++11</td>      <td>What is a “built-in type?”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1182">      <td><a href="https://cplusplus.github.io/CWG/issues/1182.html">1182</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>C++11</td>      <td>Incorrect description of pack expansion syntax</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1183">      <td><a href="https://cplusplus.github.io/CWG/issues/1183.html">1183</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>C++11</td>      <td>Expansion of parameter packs in declarators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1184">      <td><a href="https://cplusplus.github.io/CWG/issues/1184.html">1184</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>C++11</td>      <td>Argument conversions to nondeduced parameter types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1185">      <td><a href="https://cplusplus.github.io/CWG/issues/1185.html">1185</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>C++11</td>      <td>Misleading description of language linkage and member function types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1186">      <td><a href="https://cplusplus.github.io/CWG/issues/1186.html">1186</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Non-dependent <TT>constexpr</TT> violations in function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1187">      <td><a href="https://cplusplus.github.io/CWG/issues/1187.html">1187</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>C++11</td>      <td>Problems in initialization example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1188">      <td><a href="https://cplusplus.github.io/CWG/issues/1188.html">1188</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Type punning in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1189">      <td><a href="https://cplusplus.github.io/CWG/issues/1189.html">1189</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>C++11</td>      <td>Address of distinct base class subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1190">      <td><a href="https://cplusplus.github.io/CWG/issues/1190.html">1190</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>      <td>C++11</td>      <td>Operations on non-safely-derived pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1191">      <td><a href="https://cplusplus.github.io/CWG/issues/1191.html">1191</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>C++11</td>      <td>Deleted subobject destructors and implicitly-defined constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1192">      <td><a href="https://cplusplus.github.io/CWG/issues/1192.html">1192</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++11</td>      <td>Inadvertent change to ODR and templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1193">      <td><a href="https://cplusplus.github.io/CWG/issues/1193.html">1193</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Use of address-constant pointers in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1194">      <td><a href="https://cplusplus.github.io/CWG/issues/1194.html">1194</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Constexpr references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1195">      <td><a href="https://cplusplus.github.io/CWG/issues/1195.html">1195</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>References to non-literal types in constexpr functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1196">      <td><a href="https://cplusplus.github.io/CWG/issues/1196.html">1196</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>C++11</td>      <td>Definition required for explicit instantiation after explicit specialization?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1197">      <td><a href="https://cplusplus.github.io/CWG/issues/1197.html">1197</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++11</td>      <td>Constexpr arrays</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1198">      <td><a href="https://cplusplus.github.io/CWG/issues/1198.html">1198</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++11</td>      <td>Literal types and copy constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1199">      <td><a href="https://cplusplus.github.io/CWG/issues/1199.html">1199</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td>Deleted constexpr functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1200">      <td><a href="https://cplusplus.github.io/CWG/issues/1200.html">1200</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD6</td>      <td>Lookup rules for template parameters</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="1201">      <td><a href="https://cplusplus.github.io/CWG/issues/1201.html">1201</a></td> +    <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>      <td>C++11</td>      <td>Are deleted and defaulted functions definitions?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1202">      <td><a href="https://cplusplus.github.io/CWG/issues/1202.html">1202</a></td> +    <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>      <td>C++11</td>      <td>Calling virtual functions during destruction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1203">      <td><a href="https://cplusplus.github.io/CWG/issues/1203.html">1203</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>dup</td>      <td>Misleading note regarding initialized static data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1204">      <td><a href="https://cplusplus.github.io/CWG/issues/1204.html">1204</a></td> +    <td>[<a href="https://wg21.link/stmt.iter">stmt.iter</a>]</td>      <td>C++11</td>      <td>Specifiers in a <I>for-range-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1205">      <td><a href="https://cplusplus.github.io/CWG/issues/1205.html">1205</a></td> +    <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>      <td>dup</td>      <td>Lvalue reference binding and function viability</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1206">      <td><a href="https://cplusplus.github.io/CWG/issues/1206.html">1206</a></td> +    <td>[<a href="https://wg21.link/temp.class">temp.class</a>]</td>      <td>C++11</td>      <td>Defining opaque enumeration members of class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1207">      <td><a href="https://cplusplus.github.io/CWG/issues/1207.html">1207</a></td> +    <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>      <td>C++11</td>      <td>Type of class member in <I>trailing-return-type</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1208">      <td><a href="https://cplusplus.github.io/CWG/issues/1208.html">1208</a></td> +    <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>      <td>C++11</td>      <td>Explicit <TT>noexcept</TT> in defaulted definition</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1209">      <td><a href="https://cplusplus.github.io/CWG/issues/1209.html">1209</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>open</td>      <td>Is a potentially-evaluated expression in a template definition a “use?”</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1210">      <td><a href="https://cplusplus.github.io/CWG/issues/1210.html">1210</a></td> +    <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>      <td>C++11</td>      <td>Injection of <I>elaborated-type-specifier</I> in enumeration scope</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1211">      <td><a href="https://cplusplus.github.io/CWG/issues/1211.html">1211</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>open</td>      <td>Misaligned lvalues</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1212">      <td><a href="https://cplusplus.github.io/CWG/issues/1212.html">1212</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>C++11</td>      <td>Non-function-call xvalues and <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1213">      <td><a href="https://cplusplus.github.io/CWG/issues/1213.html">1213</a></td> +    <td>[<a href="https://wg21.link/expr.sub">expr.sub</a>]</td>      <td>CD3</td>      <td>Array subscripting and xvalues</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="1214">      <td><a href="https://cplusplus.github.io/CWG/issues/1214.html">1214</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>C++11</td>      <td>Kinds of initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1215">      <td><a href="https://cplusplus.github.io/CWG/issues/1215.html">1215</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>C++11</td>      <td>Definition of POD struct</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1216">      <td><a href="https://cplusplus.github.io/CWG/issues/1216.html">1216</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>C++11</td>      <td>Exceptions “allowed” by a <I>noexcept-specification</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1217">      <td><a href="https://cplusplus.github.io/CWG/issues/1217.html">1217</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.delete">dcl.fct.def.delete</a>]</td>      <td>NAD</td>      <td>Are deleted functions implicitly <TT>noexcept</TT>?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1218">      <td><a href="https://cplusplus.github.io/CWG/issues/1218.html">1218</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>C++11</td>      <td>What is the “currently-handled exception” in a multi-threaded program?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1219">      <td><a href="https://cplusplus.github.io/CWG/issues/1219.html">1219</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++11</td>      <td>Non-static data member initializers in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1220">      <td><a href="https://cplusplus.github.io/CWG/issues/1220.html">1220</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>C++11</td>      <td>Looking up <I>conversion-type-id</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1221">      <td><a href="https://cplusplus.github.io/CWG/issues/1221.html">1221</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>open</td>      <td>Partial ordering and reference collapsing</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1222">      <td><a href="https://cplusplus.github.io/CWG/issues/1222.html">1222</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>NAD</td>      <td>Unnecessary restriction on <TT>auto</TT> array types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1223">      <td><a href="https://cplusplus.github.io/CWG/issues/1223.html">1223</a></td> +    <td>[<a href="https://wg21.link/stmt.ambig">stmt.ambig</a>]</td>      <td>CD7</td>      <td>Syntactic disambiguation and <I>trailing-return-type</I>s</td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr id="1224">      <td><a href="https://cplusplus.github.io/CWG/issues/1224.html">1224</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> defaulted copy constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1225">      <td><a href="https://cplusplus.github.io/CWG/issues/1225.html">1225</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> constructors and virtual bases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1226">      <td><a href="https://cplusplus.github.io/CWG/issues/1226.html">1226</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD3</td>      <td>Converting a <I>braced-init-list</I> default argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1227">      <td><a href="https://cplusplus.github.io/CWG/issues/1227.html">1227</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD3</td>      <td>Mixing immediate and non-immediate contexts in deduction failure</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="1228">      <td><a href="https://cplusplus.github.io/CWG/issues/1228.html">1228</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>NAD</td>      <td>Copy-list-initialization and <TT>explicit</TT> constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1229">      <td><a href="https://cplusplus.github.io/CWG/issues/1229.html">1229</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>C++11</td>      <td>Overload resolution with empty <I>braced-init-list</I> argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1230">      <td><a href="https://cplusplus.github.io/CWG/issues/1230.html">1230</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>dup</td>      <td>Confusing description of ambiguity of destructor name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1231">      <td><a href="https://cplusplus.github.io/CWG/issues/1231.html">1231</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>C++11</td>      <td>Variadic templates requiring an empty pack expansion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1232">      <td><a href="https://cplusplus.github.io/CWG/issues/1232.html">1232</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>C++11</td>      <td>Creation of array temporaries using a <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1233">      <td><a href="https://cplusplus.github.io/CWG/issues/1233.html">1233</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>C++11</td>      <td>Pack expansions and dependent calls</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1234">      <td><a href="https://cplusplus.github.io/CWG/issues/1234.html">1234</a></td> +    <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>      <td>C++11</td>      <td><I>abstract-declarator</I> does not permit <TT>...</TT> after <I>ptr-operator</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1235">      <td><a href="https://cplusplus.github.io/CWG/issues/1235.html">1235</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>C++11</td>      <td>“Unused” ellipsis and default arguments in partial ordering</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1236">      <td><a href="https://cplusplus.github.io/CWG/issues/1236.html">1236</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>C++11</td>      <td>Inconsistently-interrelated examples</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1237">      <td><a href="https://cplusplus.github.io/CWG/issues/1237.html">1237</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>C++11</td>      <td>Deprecated implicit copy assignment in example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1238">      <td><a href="https://cplusplus.github.io/CWG/issues/1238.html">1238</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>C++11</td>      <td>Overloading ambiguity binding reference to function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1239">      <td><a href="https://cplusplus.github.io/CWG/issues/1239.html">1239</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>C++11</td>      <td>Hexadecimal floating-point literals vs user-defined literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1240">      <td><a href="https://cplusplus.github.io/CWG/issues/1240.html">1240</a></td> +    <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>      <td>C++11</td>      <td><TT>constexpr</TT> defaulted constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1241">      <td><a href="https://cplusplus.github.io/CWG/issues/1241.html">1241</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>C++11</td>      <td>Which members does a destructor destroy?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1242">      <td><a href="https://cplusplus.github.io/CWG/issues/1242.html">1242</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>C++11</td>      <td>Initializing variant class members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1243">      <td><a href="https://cplusplus.github.io/CWG/issues/1243.html">1243</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>C++11</td>      <td>Misleading footnote regarding multiple-declarator declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1244">      <td><a href="https://cplusplus.github.io/CWG/issues/1244.html">1244</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>C++11</td>      <td>Equivalence of alias templates and class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1245">      <td><a href="https://cplusplus.github.io/CWG/issues/1245.html">1245</a></td> +    <td>[<a href="https://wg21.link/temp.mem.func">temp.mem.func</a>]</td>      <td>C++11</td>      <td>Matching declarations involving <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1246">      <td><a href="https://cplusplus.github.io/CWG/issues/1246.html">1246</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>C++11</td>      <td>Non-deduced non-final parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1247">      <td><a href="https://cplusplus.github.io/CWG/issues/1247.html">1247</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD4</td>      <td>Restriction on alias name appearing in <I>type-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1248">      <td><a href="https://cplusplus.github.io/CWG/issues/1248.html">1248</a></td> +    <td>[<a href="https://wg21.link/diff.iso">diff.iso</a>]</td>      <td>open</td>      <td>Updating Annex C to C99 and C23</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1249">      <td><a href="https://cplusplus.github.io/CWG/issues/1249.html">1249</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD6</td>      <td>Cv-qualification of nested lambda capture</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1250">      <td><a href="https://cplusplus.github.io/CWG/issues/1250.html">1250</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>CD3</td>      <td>Cv-qualification of incomplete virtual function return types</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1251">      <td><a href="https://cplusplus.github.io/CWG/issues/1251.html">1251</a></td> +    <td>[<a href="https://wg21.link/diff.conv">diff.conv</a>]</td>      <td>CD3</td>      <td>C compatibility: casting to unqualified <TT>void*</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1252">      <td><a href="https://cplusplus.github.io/CWG/issues/1252.html">1252</a></td> +    <td>[<a href="https://wg21.link/over.load">over.load</a>]</td>      <td>CD6</td>      <td>Overloading member function templates based on dependent return type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1253">      <td><a href="https://cplusplus.github.io/CWG/issues/1253.html">1253</a></td> +    <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>      <td>C++17</td>      <td>Generic non-template members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1254">      <td><a href="https://cplusplus.github.io/CWG/issues/1254.html">1254</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>NAD</td>      <td>odr-use vs template arguments and constexpr functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1255">      <td><a href="https://cplusplus.github.io/CWG/issues/1255.html">1255</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>drafting</td>      <td>Definition problems with <TT>constexpr</TT> functions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1256">      <td><a href="https://cplusplus.github.io/CWG/issues/1256.html">1256</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Unevaluated operands are not necessarily constant expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1257">      <td><a href="https://cplusplus.github.io/CWG/issues/1257.html">1257</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>open</td>      <td>Instantiation via non-dependent references in uninstantiated templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1258">      <td><a href="https://cplusplus.github.io/CWG/issues/1258.html">1258</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>CD5</td>      <td>“Instantiation context” differs from dependent lookup rules</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1259">      <td><a href="https://cplusplus.github.io/CWG/issues/1259.html">1259</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>NAD</td>      <td>Deleting a POD via a pointer to base</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1260">      <td><a href="https://cplusplus.github.io/CWG/issues/1260.html">1260</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD3</td>      <td>Incorrect use of term “overloaded” in description of odr-use</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1261">      <td><a href="https://cplusplus.github.io/CWG/issues/1261.html">1261</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD3</td>      <td>Explicit handling of cv-qualification with non-class prvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1262">      <td><a href="https://cplusplus.github.io/CWG/issues/1262.html">1262</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD3</td>      <td>Default template arguments and deduction failure</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1263">      <td><a href="https://cplusplus.github.io/CWG/issues/1263.html">1263</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>NAD</td>      <td>Mismatch between rvalue reference binding and overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1264">      <td><a href="https://cplusplus.github.io/CWG/issues/1264.html">1264</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Use of <TT>this</TT> in <TT>constexpr</TT> constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1265">      <td><a href="https://cplusplus.github.io/CWG/issues/1265.html">1265</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD3</td>      <td>Mixed use of the <TT>auto</TT> specifier</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr class="open" id="1266">      <td><a href="https://cplusplus.github.io/CWG/issues/1266.html">1266</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>open</td>      <td><I>user-defined-integer-literal</I> overflow</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1267">      <td><a href="https://cplusplus.github.io/CWG/issues/1267.html">1267</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD3</td>      <td>Rvalue reference types in <I>exception-specification</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1268">      <td><a href="https://cplusplus.github.io/CWG/issues/1268.html">1268</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD3</td>      <td><TT>reinterpret_cast</TT> of an xvalue operand</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1269">      <td><a href="https://cplusplus.github.io/CWG/issues/1269.html">1269</a></td> +    <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>      <td>CD3</td>      <td><TT>dynamic_cast</TT> of an xvalue operand</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1270">      <td><a href="https://cplusplus.github.io/CWG/issues/1270.html">1270</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Brace elision in array temporary initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1271">      <td><a href="https://cplusplus.github.io/CWG/issues/1271.html">1271</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD5</td>      <td>Imprecise wording regarding dependent types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1272">      <td><a href="https://cplusplus.github.io/CWG/issues/1272.html">1272</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>NAD</td>      <td>Implicit definition of static data member of const literal type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1273">      <td><a href="https://cplusplus.github.io/CWG/issues/1273.html">1273</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>NAD</td>      <td>Accessibility and function signatures</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1274">      <td><a href="https://cplusplus.github.io/CWG/issues/1274.html">1274</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>CD4</td>      <td>Common nonterminal for <I>expression</I> and <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1275">      <td><a href="https://cplusplus.github.io/CWG/issues/1275.html">1275</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD3</td>      <td>Incorrect comment in example of template parameter pack restriction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1276">      <td><a href="https://cplusplus.github.io/CWG/issues/1276.html">1276</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>NAD</td>      <td>Reference to <TT>stdint.h</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1277">      <td><a href="https://cplusplus.github.io/CWG/issues/1277.html">1277</a></td> +    <td>[<a href="https://wg21.link/cstdint.syn">cstdint.syn</a>]</td>      <td>NAD</td>      <td>Lax definition of <TT>intmax_t</TT> and <TT>uintmax_t</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1278">      <td><a href="https://cplusplus.github.io/CWG/issues/1278.html">1278</a></td> +    <td>[<a href="https://wg21.link/over.call.func">over.call.func</a>]</td>      <td>drafting</td>      <td>Incorrect treatment of contrived object</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1279">      <td><a href="https://cplusplus.github.io/CWG/issues/1279.html">1279</a></td> +    <td>[<a href="https://wg21.link/diff.cpp03">diff.cpp03</a>]</td>      <td>open</td>      <td>Additional differences between C++ 2003 and C++ 2011</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1280">      <td><a href="https://cplusplus.github.io/CWG/issues/1280.html">1280</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>NAD</td>      <td>Object reallocation and reference members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1281">      <td><a href="https://cplusplus.github.io/CWG/issues/1281.html">1281</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>NAD</td>      <td>Virtual and dependent base classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1282">      <td><a href="https://cplusplus.github.io/CWG/issues/1282.html">1282</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD3</td>      <td>Underspecified destructor <I>exception-specification</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1283">      <td><a href="https://cplusplus.github.io/CWG/issues/1283.html">1283</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>open</td>      <td>Static data members of classes with typedef name for linkage purposes</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1284">      <td><a href="https://cplusplus.github.io/CWG/issues/1284.html">1284</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD4</td>      <td>Should the lifetime of an array be independent of that of its elements?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1285">      <td><a href="https://cplusplus.github.io/CWG/issues/1285.html">1285</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>NAD</td>      <td>Trivial destructors and object lifetime</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1286">      <td><a href="https://cplusplus.github.io/CWG/issues/1286.html">1286</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>open</td>      <td>Equivalence of alias templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1287">      <td><a href="https://cplusplus.github.io/CWG/issues/1287.html">1287</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>C++14</td>      <td>Direct initialization vs “implicit” conversion in reference binding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1288">      <td><a href="https://cplusplus.github.io/CWG/issues/1288.html">1288</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Reference list initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1289">      <td><a href="https://cplusplus.github.io/CWG/issues/1289.html">1289</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>NAD</td>      <td>Can an alias template name the current instantiation?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1290">      <td><a href="https://cplusplus.github.io/CWG/issues/1290.html">1290</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Lifetime of the underlying array of an <TT>initializer_list</TT> member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1291">      <td><a href="https://cplusplus.github.io/CWG/issues/1291.html">1291</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD6</td>      <td>Looking up a <I>conversion-type-id</I></td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="1292">      <td><a href="https://cplusplus.github.io/CWG/issues/1292.html">1292</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD4</td>      <td>Dependent calls with <I>braced-init-list</I>s containing a pack expansion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1293">      <td><a href="https://cplusplus.github.io/CWG/issues/1293.html">1293</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>String literals in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1294">      <td><a href="https://cplusplus.github.io/CWG/issues/1294.html">1294</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>open</td>      <td>Side effects in dynamic/static initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1295">      <td><a href="https://cplusplus.github.io/CWG/issues/1295.html">1295</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD3</td>      <td>Binding a reference to an rvalue bit-field</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="1296">      <td><a href="https://cplusplus.github.io/CWG/issues/1296.html">1296</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD3</td>      <td>Ill-formed template declarations (not just definitions)</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1297">      <td><a href="https://cplusplus.github.io/CWG/issues/1297.html">1297</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD3</td>      <td>Misplaced function <I>attribute-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1298">      <td><a href="https://cplusplus.github.io/CWG/issues/1298.html">1298</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD3</td>      <td>Incorrect example in overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1299">      <td><a href="https://cplusplus.github.io/CWG/issues/1299.html">1299</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD5</td>      <td>“Temporary objects” vs “temporary expressions”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1300">      <td><a href="https://cplusplus.github.io/CWG/issues/1300.html">1300</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>dup</td>      <td><TT>T()</TT> for array types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1301">      <td><a href="https://cplusplus.github.io/CWG/issues/1301.html">1301</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD3</td>      <td>Value initialization of union</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1302">      <td><a href="https://cplusplus.github.io/CWG/issues/1302.html">1302</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD3</td>      <td><TT>noexcept</TT> applied to expression of type <TT>void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1303">      <td><a href="https://cplusplus.github.io/CWG/issues/1303.html">1303</a></td> +    <td>[<a href="https://wg21.link/temp">temp</a>]</td>      <td>NAD</td>      <td>C language linkage for template with internal linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1304">      <td><a href="https://cplusplus.github.io/CWG/issues/1304.html">1304</a></td> +    <td>[<a href="https://wg21.link/dcl.init.string">dcl.init.string</a>]</td>      <td>drafting</td>      <td>Omitted array bound with string initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1305">      <td><a href="https://cplusplus.github.io/CWG/issues/1305.html">1305</a></td> +    <td>[<a href="https://wg21.link/expr.alignof">expr.alignof</a>]</td>      <td>CD3</td>      <td><TT>alignof</TT> applied to array of unknown size</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="1306">      <td><a href="https://cplusplus.github.io/CWG/issues/1306.html">1306</a></td> +    <td>[<a href="https://wg21.link/class.this">class.this</a>]</td>      <td>CD3</td>      <td>Modifying an object within a <TT>const</TT> member function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1307">      <td><a href="https://cplusplus.github.io/CWG/issues/1307.html">1307</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>C++14</td>      <td>Overload resolution based on size of array <I>initializer-list</I></td>      <td class="full" align="center">Clang 14</td>    </tr>    <tr id="1308">      <td><a href="https://cplusplus.github.io/CWG/issues/1308.html">1308</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD3</td>      <td>Completeness of class type within an <I>exception-specification</I></td>      <td class="full-superseded" align="center">Superseded by <a href="#1330">1330</a></td>    </tr>    <tr id="1309">      <td><a href="https://cplusplus.github.io/CWG/issues/1309.html">1309</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD4</td>      <td>Incorrect note regarding lookup of a member of the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1310">      <td><a href="https://cplusplus.github.io/CWG/issues/1310.html">1310</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>CD3</td>      <td>What is an “acceptable lookup result?”</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr id="1311">      <td><a href="https://cplusplus.github.io/CWG/issues/1311.html">1311</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Volatile lvalues in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1312">      <td><a href="https://cplusplus.github.io/CWG/issues/1312.html">1312</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Simulated <TT>reinterpret_cast</TT> in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1313">      <td><a href="https://cplusplus.github.io/CWG/issues/1313.html">1313</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Undefined pointer arithmetic in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1314">      <td><a href="https://cplusplus.github.io/CWG/issues/1314.html">1314</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>NAD</td>      <td>Pointer arithmetic within standard-layout objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1315">      <td><a href="https://cplusplus.github.io/CWG/issues/1315.html">1315</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>CD4</td>      <td>Restrictions on non-type template arguments in partial specializations</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="1316">      <td><a href="https://cplusplus.github.io/CWG/issues/1316.html">1316</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>NAD</td>      <td><TT>constexpr</TT> function requirements and class scope</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1317">      <td><a href="https://cplusplus.github.io/CWG/issues/1317.html">1317</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>NAD</td>      <td>Unnamed scoped enumerations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1318">      <td><a href="https://cplusplus.github.io/CWG/issues/1318.html">1318</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD3</td>      <td>Syntactic ambiguities with <TT>final</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1319">      <td><a href="https://cplusplus.github.io/CWG/issues/1319.html">1319</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>NAD</td>      <td>Error in pack expansion example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1320">      <td><a href="https://cplusplus.github.io/CWG/issues/1320.html">1320</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD3</td>      <td>Converting scoped enumerations to <TT>bool</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1321">      <td><a href="https://cplusplus.github.io/CWG/issues/1321.html">1321</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>CD3</td>      <td>Equivalency of dependent calls</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1322">      <td><a href="https://cplusplus.github.io/CWG/issues/1322.html">1322</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>drafting</td>      <td>Function parameter type decay in templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1323">      <td><a href="https://cplusplus.github.io/CWG/issues/1323.html">1323</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>NAD</td>      <td>Nonexistent nonterminal in <I>alignment-specifier</I> grammar</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1324">      <td><a href="https://cplusplus.github.io/CWG/issues/1324.html">1324</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD3</td>      <td>Value initialization and defaulted constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1325">      <td><a href="https://cplusplus.github.io/CWG/issues/1325.html">1325</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>NAD</td>      <td>Omitted declarator in <TT>friend</TT> declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1326">      <td><a href="https://cplusplus.github.io/CWG/issues/1326.html">1326</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>dup</td>      <td>Deducing an array bound from an <I>initializer-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1327">      <td><a href="https://cplusplus.github.io/CWG/issues/1327.html">1327</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD3</td>      <td><I>virt-specifier</I> in a defaulted definition</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1328">      <td><a href="https://cplusplus.github.io/CWG/issues/1328.html">1328</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD3</td>      <td>Conflict in reference binding vs overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1329">      <td><a href="https://cplusplus.github.io/CWG/issues/1329.html">1329</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>CD3</td>      <td>Recursive deduction substitutions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1330">      <td><a href="https://cplusplus.github.io/CWG/issues/1330.html">1330</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD3</td>      <td>Delayed instantiation of <TT>noexcept</TT> specifiers</td>      <td class="full" align="center">Clang 4 (C++11 onwards)</td>    </tr>    <tr id="1331">      <td><a href="https://cplusplus.github.io/CWG/issues/1331.html">1331</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD5</td>      <td><TT>const</TT> mismatch with defaulted copy constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1332">      <td><a href="https://cplusplus.github.io/CWG/issues/1332.html">1332</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>CD5</td>      <td>Handling of invalid universal-character-names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1333">      <td><a href="https://cplusplus.github.io/CWG/issues/1333.html">1333</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD3</td>      <td>Omission of <TT>const</TT> in a defaulted copy constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1334">      <td><a href="https://cplusplus.github.io/CWG/issues/1334.html">1334</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>NAD</td>      <td>Layout compatibility and cv-qualification</td>      <td class="full-superseded" align="center">Superseded by <a href="#1719">1719</a></td>    </tr>    <tr id="1335">      <td><a href="https://cplusplus.github.io/CWG/issues/1335.html">1335</a></td> +    <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>      <td>CD6</td>      <td>Stringizing, extended characters, and universal-character-names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1336">      <td><a href="https://cplusplus.github.io/CWG/issues/1336.html">1336</a></td> +    <td>[<a href="https://wg21.link/class.conv.ctor">class.conv.ctor</a>]</td>      <td>CD3</td>      <td>Definition of “converting constructor”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1337">      <td><a href="https://cplusplus.github.io/CWG/issues/1337.html">1337</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>dup</td>      <td>Partial ordering and non-deduced parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1338">      <td><a href="https://cplusplus.github.io/CWG/issues/1338.html">1338</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>CD4</td>      <td>Aliasing and allocation functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1339">      <td><a href="https://cplusplus.github.io/CWG/issues/1339.html">1339</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>NAD</td>      <td>Parenthesized <I>braced-init-list</I> and arrays</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1340">      <td><a href="https://cplusplus.github.io/CWG/issues/1340.html">1340</a></td> +    <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>      <td>CD3</td>      <td>Complete type in member pointer expressions</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="1341">      <td><a href="https://cplusplus.github.io/CWG/issues/1341.html">1341</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>NAD</td>      <td>Bit-field initializers</td>      <td class="na" align="center">Superseded by <a href="https://wg21.link/P0683R1">P0683R1</a></td>    </tr>    <tr id="1342">      <td><a href="https://cplusplus.github.io/CWG/issues/1342.html">1342</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD6</td>      <td>Order of initialization with multiple declarators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1343">      <td><a href="https://cplusplus.github.io/CWG/issues/1343.html">1343</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>C++17</td>      <td>Sequencing of non-class initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1344">      <td><a href="https://cplusplus.github.io/CWG/issues/1344.html">1344</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++14</td>      <td>Adding new special member functions to a class via default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1345">      <td><a href="https://cplusplus.github.io/CWG/issues/1345.html">1345</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD3</td>      <td>Initialization of anonymous union class members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1346">      <td><a href="https://cplusplus.github.io/CWG/issues/1346.html">1346</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD3</td>      <td><I>expression-list</I> initializers and the <TT>auto</TT> specifier</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1347">      <td><a href="https://cplusplus.github.io/CWG/issues/1347.html">1347</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD3</td>      <td>Consistency of <TT>auto</TT> in multiple-declarator declarations</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr class="open" id="1348">      <td><a href="https://cplusplus.github.io/CWG/issues/1348.html">1348</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>drafting</td>      <td>Use of <TT>auto</TT> in a <I>trailing-return-type</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="1349">      <td><a href="https://cplusplus.github.io/CWG/issues/1349.html">1349</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>dup</td>      <td>Consistency of alias template redeclarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1350">      <td><a href="https://cplusplus.github.io/CWG/issues/1350.html">1350</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD3</td>      <td>Incorrect exception specification for inherited constructors</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1351">      <td><a href="https://cplusplus.github.io/CWG/issues/1351.html">1351</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Problems with implicitly-declared <I>exception-specification</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1352">      <td><a href="https://cplusplus.github.io/CWG/issues/1352.html">1352</a></td> +    <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>      <td>CD3</td>      <td>Inconsistent class scope and completeness rules</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="1353">      <td><a href="https://cplusplus.github.io/CWG/issues/1353.html">1353</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD7</td>      <td>Array and variant members and deleted special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1354">      <td><a href="https://cplusplus.github.io/CWG/issues/1354.html">1354</a></td> +    <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>      <td>CD3</td>      <td>Destructor exceptions for temporaries in noexcept expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1355">      <td><a href="https://cplusplus.github.io/CWG/issues/1355.html">1355</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD3</td>      <td>Aggregates and “user-provided” constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1356">      <td><a href="https://cplusplus.github.io/CWG/issues/1356.html">1356</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Exception specifications of copy assignment operators with virtual bases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1357">      <td><a href="https://cplusplus.github.io/CWG/issues/1357.html">1357</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD3</td>      <td><I>brace-or-equal-initializer</I>s for function and typedef members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1358">      <td><a href="https://cplusplus.github.io/CWG/issues/1358.html">1358</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD3</td>      <td>Unintentionally ill-formed <TT>constexpr</TT> function template instances</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1359">      <td><a href="https://cplusplus.github.io/CWG/issues/1359.html">1359</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD3</td>      <td><TT>constexpr</TT> union constructors</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1360">      <td><a href="https://cplusplus.github.io/CWG/issues/1360.html">1360</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD6</td>      <td><TT>constexpr</TT> defaulted default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1361">      <td><a href="https://cplusplus.github.io/CWG/issues/1361.html">1361</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD3</td>      <td>Requirement on <I>brace-or-equal-initializer</I>s of literal types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1362">      <td><a href="https://cplusplus.github.io/CWG/issues/1362.html">1362</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD3</td>      <td>Complete type required for implicit conversion to <TT>T&</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1363">      <td><a href="https://cplusplus.github.io/CWG/issues/1363.html">1363</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD3</td>      <td>Triviality vs multiple default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1364">      <td><a href="https://cplusplus.github.io/CWG/issues/1364.html">1364</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td><TT>constexpr</TT> function parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1365">      <td><a href="https://cplusplus.github.io/CWG/issues/1365.html">1365</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Calling undefined <TT>constexpr</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1366">      <td><a href="https://cplusplus.github.io/CWG/issues/1366.html">1366</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD3</td>      <td>Deleted <TT>constexpr</TT> constructors and virtual base classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1367">      <td><a href="https://cplusplus.github.io/CWG/issues/1367.html">1367</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Use of <TT>this</TT> in a constant expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1368">      <td><a href="https://cplusplus.github.io/CWG/issues/1368.html">1368</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD3</td>      <td>Value initialization and defaulted constructors (part 2)</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1369">      <td><a href="https://cplusplus.github.io/CWG/issues/1369.html">1369</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD3</td>      <td>Function invocation substitution of <TT>this</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1370">      <td><a href="https://cplusplus.github.io/CWG/issues/1370.html">1370</a></td> +    <td>[<a href="https://wg21.link/cpp.replace">cpp.replace</a>]</td>      <td>CD3</td>      <td><I>identifier-list</I> cannot contain ellipsis</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1371">      <td><a href="https://cplusplus.github.io/CWG/issues/1371.html">1371</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>NAD</td>      <td>Deduction from <TT>T&&</TT> in return types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1372">      <td><a href="https://cplusplus.github.io/CWG/issues/1372.html">1372</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD3</td>      <td>Cross-references incorrect in conversion function template argument deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1373">      <td><a href="https://cplusplus.github.io/CWG/issues/1373.html">1373</a></td> +    <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>      <td>dup</td>      <td>Overload resolution changes matching reference-binding changes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1374">      <td><a href="https://cplusplus.github.io/CWG/issues/1374.html">1374</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD3</td>      <td>Qualification conversion vs difference in reference binding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1375">      <td><a href="https://cplusplus.github.io/CWG/issues/1375.html">1375</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>CD3</td>      <td>Reference to anonymous union?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1376">      <td><a href="https://cplusplus.github.io/CWG/issues/1376.html">1376</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>C++14</td>      <td><TT>static_cast</TT> of temporary to rvalue reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1377">      <td><a href="https://cplusplus.github.io/CWG/issues/1377.html">1377</a></td> +    <td>[<a href="https://wg21.link/diff.cpp03">diff.cpp03</a>]</td>      <td>dup</td>      <td>Access declarations not mentioned in Annex C</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1378">      <td><a href="https://cplusplus.github.io/CWG/issues/1378.html">1378</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>CD5</td>      <td>When is an instantiation required?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1379">      <td><a href="https://cplusplus.github.io/CWG/issues/1379.html">1379</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Is <TT>std::initializer_list</TT> an aggregate?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1380">      <td><a href="https://cplusplus.github.io/CWG/issues/1380.html">1380</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD3</td>      <td>Type definitions in <I>template-parameter</I> <I>parameter-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1381">      <td><a href="https://cplusplus.github.io/CWG/issues/1381.html">1381</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD3</td>      <td>Implicitly-declared special member functions and default <TT>nothrow</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1382">      <td><a href="https://cplusplus.github.io/CWG/issues/1382.html">1382</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD3</td>      <td>Dead code for constructor names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1383">      <td><a href="https://cplusplus.github.io/CWG/issues/1383.html">1383</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>CD3</td>      <td>Clarifying discarded-value expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1384">      <td><a href="https://cplusplus.github.io/CWG/issues/1384.html">1384</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td><TT>reinterpret_cast</TT> in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1385">      <td><a href="https://cplusplus.github.io/CWG/issues/1385.html">1385</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>CD3</td>      <td>Syntactic forms of conversion functions for surrogate call functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1386">      <td><a href="https://cplusplus.github.io/CWG/issues/1386.html">1386</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>NAD</td>      <td>Explicitly-specified partial argument list with multiple parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1387">      <td><a href="https://cplusplus.github.io/CWG/issues/1387.html">1387</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD3</td>      <td>Missing non-deduced context for <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1388">      <td><a href="https://cplusplus.github.io/CWG/issues/1388.html">1388</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD3</td>      <td>Missing non-deduced context following a function parameter pack</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="1389">      <td><a href="https://cplusplus.github.io/CWG/issues/1389.html">1389</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>NAD</td>      <td>Recursive reference in <I>trailing-return-type</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1390">      <td><a href="https://cplusplus.github.io/CWG/issues/1390.html">1390</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>drafting</td>      <td>Dependency of alias template specializations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1391">      <td><a href="https://cplusplus.github.io/CWG/issues/1391.html">1391</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>CD4</td>      <td>Conversions to parameter types with non-deduced template arguments</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="1392">      <td><a href="https://cplusplus.github.io/CWG/issues/1392.html">1392</a></td> +    <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>      <td>CD3</td>      <td>Explicit conversion functions for references and non-references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1393">      <td><a href="https://cplusplus.github.io/CWG/issues/1393.html">1393</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>C++17</td>      <td>Pack expansions in <I>using-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1394">      <td><a href="https://cplusplus.github.io/CWG/issues/1394.html">1394</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD3</td>      <td>Incomplete types as parameters of deleted functions</td>      <td class="full" align="center">Clang 15</td>    </tr>    <tr id="1395">      <td><a href="https://cplusplus.github.io/CWG/issues/1395.html">1395</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>C++17</td>      <td>Partial ordering of variadic templates reconsidered</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="1396">      <td><a href="https://cplusplus.github.io/CWG/issues/1396.html">1396</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>C++23</td>      <td>Deferred instantiation and checking of non-static data member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1397">      <td><a href="https://cplusplus.github.io/CWG/issues/1397.html">1397</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD4</td>      <td>Class completeness in non-static data member initializers</td>      <td class="full" align="center">Clang 3.2</td>    </tr>    <tr id="1398">      <td><a href="https://cplusplus.github.io/CWG/issues/1398.html">1398</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>CD3</td>      <td>Non-type template parameters of type <TT>std::nullptr_t</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1399">      <td><a href="https://cplusplus.github.io/CWG/issues/1399.html">1399</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD3</td>      <td>Deduction with multiple function parameter packs</td>      <td class="full" align="center">Duplicate of <a href="#1388">1388</a></td>    </tr>    <tr id="1400">      <td><a href="https://cplusplus.github.io/CWG/issues/1400.html">1400</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>NAD</td>      <td>Function pointer equality</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1401">      <td><a href="https://cplusplus.github.io/CWG/issues/1401.html">1401</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD3</td>      <td>Similar types and reference compatibility</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1402">      <td><a href="https://cplusplus.github.io/CWG/issues/1402.html">1402</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD3</td>      <td>Move functions too often deleted</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1403">      <td><a href="https://cplusplus.github.io/CWG/issues/1403.html">1403</a></td> +    <td>[<a href="https://wg21.link/lex.comment">lex.comment</a>]</td>      <td>CD6</td>      <td>Universal-character-names in comments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1404">      <td><a href="https://cplusplus.github.io/CWG/issues/1404.html">1404</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>open</td>      <td>Object reallocation in unions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1405">      <td><a href="https://cplusplus.github.io/CWG/issues/1405.html">1405</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD3</td>      <td><TT>constexpr</TT> and mutable members of literal types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1406">      <td><a href="https://cplusplus.github.io/CWG/issues/1406.html">1406</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>CD3</td>      <td><I>ref-qualifier</I>s and added parameters of non-static member function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1407">      <td><a href="https://cplusplus.github.io/CWG/issues/1407.html">1407</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Integral to <TT>bool</TT> conversion in converted constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1408">      <td><a href="https://cplusplus.github.io/CWG/issues/1408.html">1408</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD3</td>      <td>What is “the same aggregate initialization?”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1409">      <td><a href="https://cplusplus.github.io/CWG/issues/1409.html">1409</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>CD3</td>      <td>What is the second standard conversion sequence of a list-initialization sequence?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1410">      <td><a href="https://cplusplus.github.io/CWG/issues/1410.html">1410</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD3</td>      <td>Reference overload tiebreakers should apply to rvalue references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1411">      <td><a href="https://cplusplus.github.io/CWG/issues/1411.html">1411</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD3</td>      <td>More on global scope <TT>::</TT> in <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1412">      <td><a href="https://cplusplus.github.io/CWG/issues/1412.html">1412</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD3</td>      <td>Problems in specifying pointer conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1413">      <td><a href="https://cplusplus.github.io/CWG/issues/1413.html">1413</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD3</td>      <td>Missing cases of value-dependency</td>      <td class="full" align="center">Clang 12</td>    </tr>    <tr class="open" id="1414">      <td><a href="https://cplusplus.github.io/CWG/issues/1414.html">1414</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>drafting</td>      <td>Binding an rvalue reference to a reference-unrelated lvalue</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1415">      <td><a href="https://cplusplus.github.io/CWG/issues/1415.html">1415</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD3</td>      <td>Missing prohibition of block-scope definition of <TT>extern</TT> object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1416">      <td><a href="https://cplusplus.github.io/CWG/issues/1416.html">1416</a></td> +    <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>      <td>CD3</td>      <td>Function cv-qualifiers and <TT>typeid</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1417">      <td><a href="https://cplusplus.github.io/CWG/issues/1417.html">1417</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>C++14</td>      <td>Pointers/references to functions with cv-qualifiers or <I>ref-qualifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1418">      <td><a href="https://cplusplus.github.io/CWG/issues/1418.html">1418</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Type of <TT>initializer_list</TT> backing array</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1419">      <td><a href="https://cplusplus.github.io/CWG/issues/1419.html">1419</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Evaluation order in aggregate initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1420">      <td><a href="https://cplusplus.github.io/CWG/issues/1420.html">1420</a></td> +    <td>[<a href="https://wg21.link/class.abstract">class.abstract</a>]</td>      <td>NAD</td>      <td>Abstract final classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1421">      <td><a href="https://cplusplus.github.io/CWG/issues/1421.html">1421</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Full expressions and aggregate initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1422">      <td><a href="https://cplusplus.github.io/CWG/issues/1422.html">1422</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>dup</td>      <td>Type of character literals containing universal-character-names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1423">      <td><a href="https://cplusplus.github.io/CWG/issues/1423.html">1423</a></td> +    <td>[<a href="https://wg21.link/conv.fctptr">conv.fctptr</a>]</td>      <td>CD3</td>      <td>Convertibility of <TT>nullptr</TT> to <TT>bool</TT></td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="1424">      <td><a href="https://cplusplus.github.io/CWG/issues/1424.html">1424</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>C++14</td>      <td>When must sub-object destructors be accessible?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1425">      <td><a href="https://cplusplus.github.io/CWG/issues/1425.html">1425</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD3</td>      <td>Base-class subobjects of standard-layout structs</td>      <td class="na" align="center">N/A (ABI constraint)</td>    </tr>    <tr id="1426">      <td><a href="https://cplusplus.github.io/CWG/issues/1426.html">1426</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD5</td>      <td>Allowing additional parameter types in defaulted functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1427">      <td><a href="https://cplusplus.github.io/CWG/issues/1427.html">1427</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>NAD</td>      <td>Default constructor and deleted or inaccessible destructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1428">      <td><a href="https://cplusplus.github.io/CWG/issues/1428.html">1428</a></td> +    <td>[<a href="https://wg21.link/basic.type.qualifier">basic.type.qualifier</a>]</td>      <td>CD3</td>      <td>Dynamic const objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1429">      <td><a href="https://cplusplus.github.io/CWG/issues/1429.html">1429</a></td> +    <td>[<a href="https://wg21.link/basic.scope.temp">basic.scope.temp</a>]</td>      <td>NAD</td>      <td>Scope of a member template's template parameter</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1430">      <td><a href="https://cplusplus.github.io/CWG/issues/1430.html">1430</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>open</td>      <td>Pack expansion into fixed alias template parameter list</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1431">      <td><a href="https://cplusplus.github.io/CWG/issues/1431.html">1431</a></td> +    <td>[<a href="https://wg21.link/except">except</a>]</td>      <td>CD3</td>      <td>Exceptions from other than <I>throw-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1432">      <td><a href="https://cplusplus.github.io/CWG/issues/1432.html">1432</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>open</td>      <td>Newly-ambiguous variadic template expansions</td>      <td align="center"> @@ -8419,912 +9809,1064 @@ and <I>POD class</I></td>    </tr>    <tr id="1433">      <td><a href="https://cplusplus.github.io/CWG/issues/1433.html">1433</a></td> +    <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>      <td>NAD</td>      <td><I>trailing-return-type</I> and point of declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1434">      <td><a href="https://cplusplus.github.io/CWG/issues/1434.html">1434</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>NAD</td>      <td>Parenthesized <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1435">      <td><a href="https://cplusplus.github.io/CWG/issues/1435.html">1435</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>CD3</td>      <td><I>template-id</I> as the declarator for a class template constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1436">      <td><a href="https://cplusplus.github.io/CWG/issues/1436.html">1436</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>open</td>      <td>Interaction of constant expression changes with preprocessor expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1437">      <td><a href="https://cplusplus.github.io/CWG/issues/1437.html">1437</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD3</td>      <td><TT>alignas</TT> in <I>alias-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1438">      <td><a href="https://cplusplus.github.io/CWG/issues/1438.html">1438</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>      <td>CD3</td>      <td>Non-dereference use of invalid pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1439">      <td><a href="https://cplusplus.github.io/CWG/issues/1439.html">1439</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>CD3</td>      <td>Lookup and friend template declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1440">      <td><a href="https://cplusplus.github.io/CWG/issues/1440.html">1440</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD3</td>      <td>Acceptable <I>decltype-specifier</I>s used as <I>nested-name-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1441">      <td><a href="https://cplusplus.github.io/CWG/issues/1441.html">1441</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>C++14</td>      <td>Unclear wording for signal handler restrictions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1442">      <td><a href="https://cplusplus.github.io/CWG/issues/1442.html">1442</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>CD3</td>      <td>Argument-dependent lookup in the range-based <TT>for</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1443">      <td><a href="https://cplusplus.github.io/CWG/issues/1443.html">1443</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>NAD</td>      <td>Default arguments and non-static data members</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="1444">      <td><a href="https://cplusplus.github.io/CWG/issues/1444.html">1444</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>drafting</td>      <td>Type adjustments of non-type template parameters</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1445">      <td><a href="https://cplusplus.github.io/CWG/issues/1445.html">1445</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>dup</td>      <td>Argument-dependent lookup of <TT>begin</TT> and <TT>end</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1446">      <td><a href="https://cplusplus.github.io/CWG/issues/1446.html">1446</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>CD4</td>      <td>Member function with no <I>ref-qualifier</I> and non-member function with rvalue reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1447">      <td><a href="https://cplusplus.github.io/CWG/issues/1447.html">1447</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD3</td>      <td><TT>static_cast</TT> of bit-field lvalue to rvalue reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1448">      <td><a href="https://cplusplus.github.io/CWG/issues/1448.html">1448</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>NAD</td>      <td>Integral values of type <TT>bool</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1449">      <td><a href="https://cplusplus.github.io/CWG/issues/1449.html">1449</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Narrowing conversion of negative value to unsigned type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1450">      <td><a href="https://cplusplus.github.io/CWG/issues/1450.html">1450</a></td> +    <td>[<a href="https://wg21.link/expr.mul">expr.mul</a>]</td>      <td>CD3</td>      <td><TT>INT_MIN % -1</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1451">      <td><a href="https://cplusplus.github.io/CWG/issues/1451.html">1451</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>CD4</td>      <td>Objects with no linkage in non-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1452">      <td><a href="https://cplusplus.github.io/CWG/issues/1452.html">1452</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Value-initialized objects may be constants</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1453">      <td><a href="https://cplusplus.github.io/CWG/issues/1453.html">1453</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD3</td>      <td>Volatile members in literal classes?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1454">      <td><a href="https://cplusplus.github.io/CWG/issues/1454.html">1454</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Passing constants through <TT>constexpr</TT> functions via references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1455">      <td><a href="https://cplusplus.github.io/CWG/issues/1455.html">1455</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Lvalue converted constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1456">      <td><a href="https://cplusplus.github.io/CWG/issues/1456.html">1456</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Address constant expression designating the one-past-the-end address</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1457">      <td><a href="https://cplusplus.github.io/CWG/issues/1457.html">1457</a></td> +    <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>      <td>CD3</td>      <td>Undefined behavior in left-shift</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1458">      <td><a href="https://cplusplus.github.io/CWG/issues/1458.html">1458</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>CD3</td>      <td>Address of incomplete type vs <TT>operator&()</TT></td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr class="open" id="1459">      <td><a href="https://cplusplus.github.io/CWG/issues/1459.html">1459</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>open</td>      <td>Reference-binding tiebreakers in overload resolution</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1460">      <td><a href="https://cplusplus.github.io/CWG/issues/1460.html">1460</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>C++14</td>      <td>What is an empty union?</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1461">      <td><a href="https://cplusplus.github.io/CWG/issues/1461.html">1461</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Narrowing conversions to bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1462">      <td><a href="https://cplusplus.github.io/CWG/issues/1462.html">1462</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD3</td>      <td>Deduction failure vs “ill-formed, no diagnostic required”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1463">      <td><a href="https://cplusplus.github.io/CWG/issues/1463.html">1463</a></td> +    <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>      <td>drafting</td>      <td><TT>extern "C"</TT> alias templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1464">      <td><a href="https://cplusplus.github.io/CWG/issues/1464.html">1464</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD3</td>      <td>Negative array bound in a <I>new-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1465">      <td><a href="https://cplusplus.github.io/CWG/issues/1465.html">1465</a></td> +    <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>      <td>CD4</td>      <td><TT>noexcept</TT> and <TT>std::bad_array_new_length</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1466">      <td><a href="https://cplusplus.github.io/CWG/issues/1466.html">1466</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>C++14</td>      <td>Visible sequences of side effects are redundant</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1467">      <td><a href="https://cplusplus.github.io/CWG/issues/1467.html">1467</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD4</td>      <td>List-initialization of aggregate from same-type object</td>      <td class="full" align="center">Clang 3.7 (C++11 onwards)</td>    </tr>    <tr id="1468">      <td><a href="https://cplusplus.github.io/CWG/issues/1468.html">1468</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD5</td>      <td><TT>typeid</TT>, overload resolution, and implicit lambda capture</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1469">      <td><a href="https://cplusplus.github.io/CWG/issues/1469.html">1469</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD5</td>      <td>Omitted bound in array <I>new-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1470">      <td><a href="https://cplusplus.github.io/CWG/issues/1470.html">1470</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>NAD</td>      <td>Thread migration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1471">      <td><a href="https://cplusplus.github.io/CWG/issues/1471.html">1471</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD3</td>      <td>Nested type of non-dependent base</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1472">      <td><a href="https://cplusplus.github.io/CWG/issues/1472.html">1472</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD3</td>      <td>odr-use of reference variables</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1473">      <td><a href="https://cplusplus.github.io/CWG/issues/1473.html">1473</a></td> +    <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>      <td>CD3</td>      <td>Syntax of <I>literal-operator-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1474">      <td><a href="https://cplusplus.github.io/CWG/issues/1474.html">1474</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>NAD</td>      <td>User-defined literals and <TT><inttypes.h></TT> format macros</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1475">      <td><a href="https://cplusplus.github.io/CWG/issues/1475.html">1475</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.depend">dcl.attr.depend</a>]</td>      <td>CD3</td>      <td>Errors in <TT>[[carries_dependency]]</TT> example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1476">      <td><a href="https://cplusplus.github.io/CWG/issues/1476.html">1476</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>CD3</td>      <td>Definition of user-defined type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1477">      <td><a href="https://cplusplus.github.io/CWG/issues/1477.html">1477</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>CD3</td>      <td>Definition of a <TT>friend</TT> outside its namespace</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="1478">      <td><a href="https://cplusplus.github.io/CWG/issues/1478.html">1478</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>CD6</td>      <td><TT>template</TT> keyword for dependent template template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1479">      <td><a href="https://cplusplus.github.io/CWG/issues/1479.html">1479</a></td> +    <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>      <td>CD3</td>      <td>Literal operators and default arguments</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1480">      <td><a href="https://cplusplus.github.io/CWG/issues/1480.html">1480</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Constant initialization via non-constant temporary</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1481">      <td><a href="https://cplusplus.github.io/CWG/issues/1481.html">1481</a></td> +    <td>[<a href="https://wg21.link/over.inc">over.inc</a>]</td>      <td>CD3</td>      <td>Increment/decrement operators with reference parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1482">      <td><a href="https://cplusplus.github.io/CWG/issues/1482.html">1482</a></td> +    <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>      <td>CD3</td>      <td>Point of declaration of enumeration</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="1483">      <td><a href="https://cplusplus.github.io/CWG/issues/1483.html">1483</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>NAD</td>      <td>Non-dependent <I>static_assert-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1484">      <td><a href="https://cplusplus.github.io/CWG/issues/1484.html">1484</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>CD4</td>      <td>Unused local classes of function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1485">      <td><a href="https://cplusplus.github.io/CWG/issues/1485.html">1485</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>drafting</td>      <td>Out-of-class definition of member unscoped opaque enumeration</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1486">      <td><a href="https://cplusplus.github.io/CWG/issues/1486.html">1486</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.funcaddr">temp.deduct.funcaddr</a>]</td>      <td>drafting</td>      <td>Base-derived conversion in member pointer deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1487">      <td><a href="https://cplusplus.github.io/CWG/issues/1487.html">1487</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD3</td>      <td>When are inheriting constructors declared?</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr class="open" id="1488">      <td><a href="https://cplusplus.github.io/CWG/issues/1488.html">1488</a></td> +    <td>[<a href="https://wg21.link/dcl.name">dcl.name</a>]</td>      <td>drafting</td>      <td><I>abstract-pack-declarator</I>s in <I>type-id</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1489">      <td><a href="https://cplusplus.github.io/CWG/issues/1489.html">1489</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD3</td>      <td>Is value-initialization of an array constant initialization?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1490">      <td><a href="https://cplusplus.github.io/CWG/issues/1490.html">1490</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD4</td>      <td>List-initialization from a string literal</td>      <td class="full" align="center">Clang 3.7 (C++11 onwards)</td>    </tr>    <tr id="1491">      <td><a href="https://cplusplus.github.io/CWG/issues/1491.html">1491</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD3</td>      <td>Move construction and rvalue reference members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1492">      <td><a href="https://cplusplus.github.io/CWG/issues/1492.html">1492</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD4</td>      <td>Exception specifications on template destructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1493">      <td><a href="https://cplusplus.github.io/CWG/issues/1493.html">1493</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++14</td>      <td>Criteria for move-construction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1494">      <td><a href="https://cplusplus.github.io/CWG/issues/1494.html">1494</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Temporary initialization for reference binding in list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1495">      <td><a href="https://cplusplus.github.io/CWG/issues/1495.html">1495</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>CD3</td>      <td>Partial specialization of variadic class template</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="1496">      <td><a href="https://cplusplus.github.io/CWG/issues/1496.html">1496</a></td> +    <td>[<a href="https://wg21.link/class.name">class.name</a>]</td>      <td>CD4</td>      <td>Triviality with deleted and missing default constructors</td>      <td class="none" align="center">No</td>    </tr>    <tr id="1497">      <td><a href="https://cplusplus.github.io/CWG/issues/1497.html">1497</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>NAD</td>      <td>Aggregate initialization with parenthesized string literal</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1498">      <td><a href="https://cplusplus.github.io/CWG/issues/1498.html">1498</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>dup</td>      <td>Lifetime of temporaries in range-based <TT>for</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1499">      <td><a href="https://cplusplus.github.io/CWG/issues/1499.html">1499</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>CD7</td>      <td>Missing case for deleted move assignment operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1500">      <td><a href="https://cplusplus.github.io/CWG/issues/1500.html">1500</a></td> +    <td>[<a href="https://wg21.link/temp.dep.candidate">temp.dep.candidate</a>]</td>      <td>CD6</td>      <td>Name lookup of dependent conversion function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1501">      <td><a href="https://cplusplus.github.io/CWG/issues/1501.html">1501</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Nested braces in list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1502">      <td><a href="https://cplusplus.github.io/CWG/issues/1502.html">1502</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD3</td>      <td>Value initialization of unions with member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1503">      <td><a href="https://cplusplus.github.io/CWG/issues/1503.html">1503</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD3</td>      <td>Exceptions during copy to exception object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1504">      <td><a href="https://cplusplus.github.io/CWG/issues/1504.html">1504</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>CD3</td>      <td>Pointer arithmetic after derived-base conversion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1505">      <td><a href="https://cplusplus.github.io/CWG/issues/1505.html">1505</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>dup</td>      <td>Direct binding of reference to temporary in list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1506">      <td><a href="https://cplusplus.github.io/CWG/issues/1506.html">1506</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Value category of <TT>initializer_list</TT> object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1507">      <td><a href="https://cplusplus.github.io/CWG/issues/1507.html">1507</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD3</td>      <td>Value initialization with trivial inaccessible default constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1508">      <td><a href="https://cplusplus.github.io/CWG/issues/1508.html">1508</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>C++14</td>      <td>Template initializer-list constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1509">      <td><a href="https://cplusplus.github.io/CWG/issues/1509.html">1509</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>C++14</td>      <td>Definition of “non-template function”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1510">      <td><a href="https://cplusplus.github.io/CWG/issues/1510.html">1510</a></td> +    <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>      <td>CD3</td>      <td>cv-qualified references via <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1511">      <td><a href="https://cplusplus.github.io/CWG/issues/1511.html">1511</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD3</td>      <td><TT>const volatile</TT> variables and the one-definition rule</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1512">      <td><a href="https://cplusplus.github.io/CWG/issues/1512.html">1512</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD3</td>      <td>Pointer comparison vs qualification conversions</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr class="open" id="1513">      <td><a href="https://cplusplus.github.io/CWG/issues/1513.html">1513</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>drafting</td>      <td><TT>initializer_list</TT> deduction failure</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1514">      <td><a href="https://cplusplus.github.io/CWG/issues/1514.html">1514</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>C++14</td>      <td>Ambiguity between enumeration definition and zero-length bit-field</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="1515">      <td><a href="https://cplusplus.github.io/CWG/issues/1515.html">1515</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD3</td>      <td>Modulo 2<SUP><I>n</I></SUP> arithmetic for implicitly-unsigned types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1516">      <td><a href="https://cplusplus.github.io/CWG/issues/1516.html">1516</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD3</td>      <td>Definition of “virtual function call”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1517">      <td><a href="https://cplusplus.github.io/CWG/issues/1517.html">1517</a></td> +    <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>      <td>open</td>      <td>Unclear/missing description of behavior during construction/destruction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1518">      <td><a href="https://cplusplus.github.io/CWG/issues/1518.html">1518</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD4</td>      <td>Explicit default constructors and copy-list-initialization</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="1519">      <td><a href="https://cplusplus.github.io/CWG/issues/1519.html">1519</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>NAD</td>      <td>Conflicting default and variadic constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1520">      <td><a href="https://cplusplus.github.io/CWG/issues/1520.html">1520</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>NAD</td>      <td>Alias template specialization vs pack expansion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1521">      <td><a href="https://cplusplus.github.io/CWG/issues/1521.html">1521</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>dup</td>      <td><TT>T{</TT><I>expr</I><TT>}</TT> with reference types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1522">      <td><a href="https://cplusplus.github.io/CWG/issues/1522.html">1522</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Access checking for <TT>initializer_list</TT> array initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1523">      <td><a href="https://cplusplus.github.io/CWG/issues/1523.html">1523</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>CD5</td>      <td>Point of declaration in range-based <TT>for</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1524">      <td><a href="https://cplusplus.github.io/CWG/issues/1524.html">1524</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>drafting</td>      <td>Incompletely-defined class template base</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1525">      <td><a href="https://cplusplus.github.io/CWG/issues/1525.html">1525</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>NAD</td>      <td>Array bound inference in temporary array</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1526">      <td><a href="https://cplusplus.github.io/CWG/issues/1526.html">1526</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>dup</td>      <td>Dependent-class lookup in the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1527">      <td><a href="https://cplusplus.github.io/CWG/issues/1527.html">1527</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>CD3</td>      <td>Assignment from <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1528">      <td><a href="https://cplusplus.github.io/CWG/issues/1528.html">1528</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD3</td>      <td>Repeated <I>cv-qualifier</I>s in declarators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1529">      <td><a href="https://cplusplus.github.io/CWG/issues/1529.html">1529</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>drafting</td>      <td>Nomenclature for variable vs reference non-static data member</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1530">      <td><a href="https://cplusplus.github.io/CWG/issues/1530.html">1530</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>drafting</td>      <td>Member access in out-of-lifetime objects</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1531">      <td><a href="https://cplusplus.github.io/CWG/issues/1531.html">1531</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>CD3</td>      <td>Definition of “access” (verb)</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1532">      <td><a href="https://cplusplus.github.io/CWG/issues/1532.html">1532</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD3</td>      <td>Explicit instantiation and member templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1533">      <td><a href="https://cplusplus.github.io/CWG/issues/1533.html">1533</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>CD3</td>      <td>Function pack expansion for member initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1534">      <td><a href="https://cplusplus.github.io/CWG/issues/1534.html">1534</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>dup</td>      <td>cv-qualification of prvalue of type “array of class”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1535">      <td><a href="https://cplusplus.github.io/CWG/issues/1535.html">1535</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td><TT>typeid</TT> in core constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1536">      <td><a href="https://cplusplus.github.io/CWG/issues/1536.html">1536</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>drafting</td>      <td>Overload resolution with temporary from initializer list</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1537">      <td><a href="https://cplusplus.github.io/CWG/issues/1537.html">1537</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD3</td>      <td>Optional compile-time evaluation of constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1538">      <td><a href="https://cplusplus.github.io/CWG/issues/1538.html">1538</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>CD3</td>      <td>C-style cast in <I>braced-init-list</I> assignment</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1539">      <td><a href="https://cplusplus.github.io/CWG/issues/1539.html">1539</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD3</td>      <td>Definition of “character type”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1540">      <td><a href="https://cplusplus.github.io/CWG/issues/1540.html">1540</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Use of address constants in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1541">      <td><a href="https://cplusplus.github.io/CWG/issues/1541.html">1541</a></td> +    <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>      <td>CD3</td>      <td><I>cv</I> <TT>void</TT> return types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1542">      <td><a href="https://cplusplus.github.io/CWG/issues/1542.html">1542</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>open</td>      <td>Compound assignment of <I>braced-init-list</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="1543">      <td><a href="https://cplusplus.github.io/CWG/issues/1543.html">1543</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>CD3</td>      <td>Implicit conversion sequence for empty initializer list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1544">      <td><a href="https://cplusplus.github.io/CWG/issues/1544.html">1544</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD3</td>      <td>Linkage of member of unnamed namespace</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1545">      <td><a href="https://cplusplus.github.io/CWG/issues/1545.html">1545</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>NAD</td>      <td><TT>friend</TT> function templates defined in class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1546">      <td><a href="https://cplusplus.github.io/CWG/issues/1546.html">1546</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>NAD</td>      <td>Errors in function template default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1547">      <td><a href="https://cplusplus.github.io/CWG/issues/1547.html">1547</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>NAD</td>      <td><TT>typename</TT> keyword in <I>alias-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1548">      <td><a href="https://cplusplus.github.io/CWG/issues/1548.html">1548</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>open</td>      <td>Copy/move construction and conversion functions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1549">      <td><a href="https://cplusplus.github.io/CWG/issues/1549.html">1549</a></td> +    <td>[<a href="https://wg21.link/over.binary">over.binary</a>]</td>      <td>open</td>      <td>Overloaded comma operator with <TT>void</TT> operand</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1550">      <td><a href="https://cplusplus.github.io/CWG/issues/1550.html">1550</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD3</td>      <td>Parenthesized <I>throw-expression</I> operand of <I>conditional-expression</I></td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="1551">      <td><a href="https://cplusplus.github.io/CWG/issues/1551.html">1551</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>C++14</td>      <td>Wording problems in <I>using-declaration</I> specification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1552">      <td><a href="https://cplusplus.github.io/CWG/issues/1552.html">1552</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD4</td>      <td><I>exception-specification</I>s and defaulted special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1553">      <td><a href="https://cplusplus.github.io/CWG/issues/1553.html">1553</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>CD3</td>      <td><TT>sizeof</TT> and xvalue bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1554">      <td><a href="https://cplusplus.github.io/CWG/issues/1554.html">1554</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>drafting</td>      <td>Access and alias templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1555">      <td><a href="https://cplusplus.github.io/CWG/issues/1555.html">1555</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>NAD</td>      <td>Language linkage and function type compatibility</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1556">      <td><a href="https://cplusplus.github.io/CWG/issues/1556.html">1556</a></td> +    <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>      <td>CD3</td>      <td>Constructors and explicit conversion functions in direct initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1557">      <td><a href="https://cplusplus.github.io/CWG/issues/1557.html">1557</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD3</td>      <td>Language linkage of converted lambda function pointer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1558">      <td><a href="https://cplusplus.github.io/CWG/issues/1558.html">1558</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>CD4</td>      <td>Unused arguments in alias template specializations</td>      <td class="full" align="center">Clang 12</td>    </tr>    <tr id="1559">      <td><a href="https://cplusplus.github.io/CWG/issues/1559.html">1559</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD3</td>      <td>String too long in initializer list of <I>new-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1560">      <td><a href="https://cplusplus.github.io/CWG/issues/1560.html">1560</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD3</td>      <td>Gratuitous lvalue-to-rvalue conversion in <I>conditional-expression</I> with <I>throw-expression</I> operand</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1561">      <td><a href="https://cplusplus.github.io/CWG/issues/1561.html">1561</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD4</td>      <td>Aggregates with empty base classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1562">      <td><a href="https://cplusplus.github.io/CWG/issues/1562.html">1562</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>C++14</td>      <td>Non-static data member initializers and union <I>ctor-initializer</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1563">      <td><a href="https://cplusplus.github.io/CWG/issues/1563.html">1563</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>CD3</td>      <td>List-initialization and overloaded function disambiguation</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1564">      <td><a href="https://cplusplus.github.io/CWG/issues/1564.html">1564</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>NAD</td>      <td>Template argument deduction from an initializer list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1565">      <td><a href="https://cplusplus.github.io/CWG/issues/1565.html">1565</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Copy elision and lifetime of <TT>initializer_list</TT> underlying array</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1566">      <td><a href="https://cplusplus.github.io/CWG/issues/1566.html">1566</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>NAD</td>      <td>Should <TT>new std::initializer_list<T></TT> be ill-formed?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1567">      <td><a href="https://cplusplus.github.io/CWG/issues/1567.html">1567</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>C++14</td>      <td>Inheriting constructors and copy/move constructors</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="1568">      <td><a href="https://cplusplus.github.io/CWG/issues/1568.html">1568</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>dup</td>      <td>Temporary lifetime extension with intervening cast</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1569">      <td><a href="https://cplusplus.github.io/CWG/issues/1569.html">1569</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>C++14</td>      <td>Deducing a function parameter pack before ellipsis</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1570">      <td><a href="https://cplusplus.github.io/CWG/issues/1570.html">1570</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++14</td>      <td>Address of subobject as non-type template argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1571">      <td><a href="https://cplusplus.github.io/CWG/issues/1571.html">1571</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD4</td>      <td>cv-qualification for indirect reference binding via conversion function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1572">      <td><a href="https://cplusplus.github.io/CWG/issues/1572.html">1572</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD4</td>      <td>Incorrect example for rvalue reference binding via conversion function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1573">      <td><a href="https://cplusplus.github.io/CWG/issues/1573.html">1573</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>Inherited constructor characteristics</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1574">      <td><a href="https://cplusplus.github.io/CWG/issues/1574.html">1574</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>NAD</td>      <td>Explicitly-defaulted <TT>constexpr</TT> functions in wrapper templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1575">      <td><a href="https://cplusplus.github.io/CWG/issues/1575.html">1575</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.safety">basic.stc.dynamic.safety</a>]</td>      <td>C++14</td>      <td>Incorrect definition of “strict pointer safety”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1576">      <td><a href="https://cplusplus.github.io/CWG/issues/1576.html">1576</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>C++14</td>      <td>Discarded-value volatile xvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1577">      <td><a href="https://cplusplus.github.io/CWG/issues/1577.html">1577</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>NAD</td>      <td>Unnecessary restrictions on partial specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1578">      <td><a href="https://cplusplus.github.io/CWG/issues/1578.html">1578</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>NAD</td>      <td>Value-initialization of aggregates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1579">      <td><a href="https://cplusplus.github.io/CWG/issues/1579.html">1579</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++14</td>      <td>Return by converting move constructor</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr class="open" id="1580">      <td><a href="https://cplusplus.github.io/CWG/issues/1580.html">1580</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>drafting</td>      <td>Default arguments in explicit instantiations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1581">      <td><a href="https://cplusplus.github.io/CWG/issues/1581.html">1581</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>When are <TT>constexpr</TT> member functions defined?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1582">      <td><a href="https://cplusplus.github.io/CWG/issues/1582.html">1582</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>drafting</td>      <td>Template default arguments and deduction failure</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1583">      <td><a href="https://cplusplus.github.io/CWG/issues/1583.html">1583</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>C++14</td>      <td>Incorrect example of unspecified behavior</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1584">      <td><a href="https://cplusplus.github.io/CWG/issues/1584.html">1584</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>drafting</td>      <td>Deducing function types from cv-qualified types</td>      <td align="center"> @@ -9335,1836 +10877,2142 @@ and <I>POD class</I></td>    </tr>    <tr id="1585">      <td><a href="https://cplusplus.github.io/CWG/issues/1585.html">1585</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>NAD</td>      <td>Value category of member access of rvalue reference member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1586">      <td><a href="https://cplusplus.github.io/CWG/issues/1586.html">1586</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>NAD</td>      <td>Naming a destructor via <TT>decltype</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1587">      <td><a href="https://cplusplus.github.io/CWG/issues/1587.html">1587</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++14</td>      <td><TT>constexpr</TT> initialization and nested anonymous unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1588">      <td><a href="https://cplusplus.github.io/CWG/issues/1588.html">1588</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD3</td>      <td>Deducing cv-qualified <TT>auto</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1589">      <td><a href="https://cplusplus.github.io/CWG/issues/1589.html">1589</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD4</td>      <td>Ambiguous ranking of list-initialization sequences</td>      <td class="full" align="center">Clang 3.7 (C++11 onwards)</td>    </tr>    <tr id="1590">      <td><a href="https://cplusplus.github.io/CWG/issues/1590.html">1590</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD4</td>      <td>Bypassing non-copy/move constructor copying</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1591">      <td><a href="https://cplusplus.github.io/CWG/issues/1591.html">1591</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD4</td>      <td>Deducing array bound and element type from initializer list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1592">      <td><a href="https://cplusplus.github.io/CWG/issues/1592.html">1592</a></td> +    <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>      <td>C++14</td>      <td>When do template parameters match?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1593">      <td><a href="https://cplusplus.github.io/CWG/issues/1593.html">1593</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++14</td>      <td>“Parameter type” of special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1594">      <td><a href="https://cplusplus.github.io/CWG/issues/1594.html">1594</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>drafting</td>      <td>Lazy declaration of special members vs overload errors</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1595">      <td><a href="https://cplusplus.github.io/CWG/issues/1595.html">1595</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++14</td>      <td>Constructors “involved in” subobject initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1596">      <td><a href="https://cplusplus.github.io/CWG/issues/1596.html">1596</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD4</td>      <td>Non-array objects as <TT>array[1]</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1597">      <td><a href="https://cplusplus.github.io/CWG/issues/1597.html">1597</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD3</td>      <td>Misleading <TT>constexpr</TT> example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1598">      <td><a href="https://cplusplus.github.io/CWG/issues/1598.html">1598</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>C++14</td>      <td>Criterion for equality of pointers to members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1599">      <td><a href="https://cplusplus.github.io/CWG/issues/1599.html">1599</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD4</td>      <td>Lifetime of <TT>initializer_list</TT> underlying array</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1600">      <td><a href="https://cplusplus.github.io/CWG/issues/1600.html">1600</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD4</td>      <td>Erroneous reference initialization in example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1601">      <td><a href="https://cplusplus.github.io/CWG/issues/1601.html">1601</a></td> +    <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>      <td>C++14</td>      <td>Promotion of enumeration with fixed underlying type</td>      <td class="full" align="center">Clang 10</td>    </tr>    <tr class="open" id="1602">      <td><a href="https://cplusplus.github.io/CWG/issues/1602.html">1602</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>review</td>      <td>Linkage of specialization vs linkage of template arguments</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1603">      <td><a href="https://cplusplus.github.io/CWG/issues/1603.html">1603</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD4</td>      <td>Errors resulting from giving unnamed namespaces internal linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1604">      <td><a href="https://cplusplus.github.io/CWG/issues/1604.html">1604</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>C++14</td>      <td>Double temporaries in reference initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1605">      <td><a href="https://cplusplus.github.io/CWG/issues/1605.html">1605</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD3</td>      <td>Misleading parenthetical comment for explicit destructor call</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1606">      <td><a href="https://cplusplus.github.io/CWG/issues/1606.html">1606</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>NAD</td>      <td><TT>sizeof</TT> closure class</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1607">      <td><a href="https://cplusplus.github.io/CWG/issues/1607.html">1607</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>C++14</td>      <td>Lambdas in template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1608">      <td><a href="https://cplusplus.github.io/CWG/issues/1608.html">1608</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>C++14</td>      <td>Operator lookup in trailing return type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1609">      <td><a href="https://cplusplus.github.io/CWG/issues/1609.html">1609</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>open</td>      <td>Default arguments and function parameter packs</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1610">      <td><a href="https://cplusplus.github.io/CWG/issues/1610.html">1610</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>drafting</td>      <td>Cv-qualification in deduction of reference to array</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1611">      <td><a href="https://cplusplus.github.io/CWG/issues/1611.html">1611</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>C++14</td>      <td>Deleted default constructor for abstract class</td>      <td class="full" align="center">Duplicate of <a href="#1658">1658</a></td>    </tr>    <tr id="1612">      <td><a href="https://cplusplus.github.io/CWG/issues/1612.html">1612</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++14</td>      <td>Implicit lambda capture and anonymous unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1613">      <td><a href="https://cplusplus.github.io/CWG/issues/1613.html">1613</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++14</td>      <td>Constant expressions and lambda capture</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1614">      <td><a href="https://cplusplus.github.io/CWG/issues/1614.html">1614</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD4</td>      <td>Address of pure virtual function vs odr-use</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1615">      <td><a href="https://cplusplus.github.io/CWG/issues/1615.html">1615</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>CD4</td>      <td>Alignment of types, variables, and members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1616">      <td><a href="https://cplusplus.github.io/CWG/issues/1616.html">1616</a></td> +    <td>[<a href="https://wg21.link/stmt.ambig">stmt.ambig</a>]</td>      <td>CD6</td>      <td>Disambiguation parsing and template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1617">      <td><a href="https://cplusplus.github.io/CWG/issues/1617.html">1617</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>open</td>      <td><TT>alignas</TT> and non-defining declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1618">      <td><a href="https://cplusplus.github.io/CWG/issues/1618.html">1618</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>C++14</td>      <td>Gratuitously-unsigned underlying enum type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1619">      <td><a href="https://cplusplus.github.io/CWG/issues/1619.html">1619</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>open</td>      <td>Definition of current instantiation</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1620">      <td><a href="https://cplusplus.github.io/CWG/issues/1620.html">1620</a></td> +    <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>      <td>open</td>      <td>User-defined literals and extended integer types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1621">      <td><a href="https://cplusplus.github.io/CWG/issues/1621.html">1621</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>C++20</td>      <td>Member initializers in anonymous unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1622">      <td><a href="https://cplusplus.github.io/CWG/issues/1622.html">1622</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++17</td>      <td>Empty aggregate initializer for union</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1623">      <td><a href="https://cplusplus.github.io/CWG/issues/1623.html">1623</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>drafting</td>      <td>Deleted default union constructor and member initializers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1624">      <td><a href="https://cplusplus.github.io/CWG/issues/1624.html">1624</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>NAD</td>      <td>Destruction of union members with member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1625">      <td><a href="https://cplusplus.github.io/CWG/issues/1625.html">1625</a></td> +    <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>      <td>open</td>      <td>Adding spaces between tokens in stringizing</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1626">      <td><a href="https://cplusplus.github.io/CWG/issues/1626.html">1626</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>dup</td>      <td><TT>constexpr</TT> member functions in <I>brace-or-equal-initializer</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1627">      <td><a href="https://cplusplus.github.io/CWG/issues/1627.html">1627</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>NAD</td>      <td>Agreement of dependent <TT>alignas</TT> specifiers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1628">      <td><a href="https://cplusplus.github.io/CWG/issues/1628.html">1628</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Deallocation function templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1629">      <td><a href="https://cplusplus.github.io/CWG/issues/1629.html">1629</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>C++14</td>      <td>Can a closure class be a literal type?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1630">      <td><a href="https://cplusplus.github.io/CWG/issues/1630.html">1630</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD4</td>      <td>Multiple default constructor templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1631">      <td><a href="https://cplusplus.github.io/CWG/issues/1631.html">1631</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>CD4</td>      <td>Incorrect overload resolution for single-element <I>initializer-list</I></td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="1632">      <td><a href="https://cplusplus.github.io/CWG/issues/1632.html">1632</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD5</td>      <td>Lambda capture in member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1633">      <td><a href="https://cplusplus.github.io/CWG/issues/1633.html">1633</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD4</td>      <td>Copy-initialization in member initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1634">      <td><a href="https://cplusplus.github.io/CWG/issues/1634.html">1634</a></td> +    <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>      <td>open</td>      <td>Temporary storage duration</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1635">      <td><a href="https://cplusplus.github.io/CWG/issues/1635.html">1635</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>drafting</td>      <td>How similar are template default arguments to function default arguments?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1636">      <td><a href="https://cplusplus.github.io/CWG/issues/1636.html">1636</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD5</td>      <td>Bits required for negative enumerator values</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1637">      <td><a href="https://cplusplus.github.io/CWG/issues/1637.html">1637</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>NAD</td>      <td>Recursion in <TT>constexpr</TT> template default constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1638">      <td><a href="https://cplusplus.github.io/CWG/issues/1638.html">1638</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD4</td>      <td>Declaring an explicit specialization of a scoped enumeration</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1639">      <td><a href="https://cplusplus.github.io/CWG/issues/1639.html">1639</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td><I>exception-specification</I>s and pointer/pointer-to-member expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1640">      <td><a href="https://cplusplus.github.io/CWG/issues/1640.html">1640</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>CD5</td>      <td>Array of abstract instance of class template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1641">      <td><a href="https://cplusplus.github.io/CWG/issues/1641.html">1641</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>NAD</td>      <td>Assignment in member initializer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1642">      <td><a href="https://cplusplus.github.io/CWG/issues/1642.html">1642</a></td> +    <td>[<a href="https://wg21.link/expr.compound">expr.compound</a>]</td>      <td>CD7</td>      <td>Missing requirements for prvalue operands</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1643">      <td><a href="https://cplusplus.github.io/CWG/issues/1643.html">1643</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>NAD</td>      <td>Default arguments for template parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1644">      <td><a href="https://cplusplus.github.io/CWG/issues/1644.html">1644</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>NAD</td>      <td>Equivalent <I>exception-specification</I>s in function template declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1645">      <td><a href="https://cplusplus.github.io/CWG/issues/1645.html">1645</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>Identical inheriting constructors via default arguments</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1646">      <td><a href="https://cplusplus.github.io/CWG/issues/1646.html">1646</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD5</td>      <td><I>decltype-specifier</I>s, abstract classes, and deduction failure</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1647">      <td><a href="https://cplusplus.github.io/CWG/issues/1647.html">1647</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>drafting</td>      <td>Type agreement of non-type template arguments in partial specializations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1648">      <td><a href="https://cplusplus.github.io/CWG/issues/1648.html">1648</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>C++14</td>      <td><TT>thread_local</TT> vs block extern declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1649">      <td><a href="https://cplusplus.github.io/CWG/issues/1649.html">1649</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>C++14</td>      <td>Error in the syntax of <I>mem-initializer-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1650">      <td><a href="https://cplusplus.github.io/CWG/issues/1650.html">1650</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>NAD</td>      <td>Class prvalues in reference initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1651">      <td><a href="https://cplusplus.github.io/CWG/issues/1651.html">1651</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>NAD</td>      <td>Lifetime extension of temporary via reference to subobject</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1652">      <td><a href="https://cplusplus.github.io/CWG/issues/1652.html">1652</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>CD4</td>      <td>Object addresses in <TT>constexpr</TT> expressions</td>      <td class="full" align="center">Clang 3.6</td>    </tr>    <tr id="1653">      <td><a href="https://cplusplus.github.io/CWG/issues/1653.html">1653</a></td> +    <td>[<a href="https://wg21.link/expr.pre.incr">expr.pre.incr</a>]</td>      <td>CD4</td>      <td>Removing deprecated increment of <TT>bool</TT></td>      <td class="full" align="center">Clang 4 (C++17 onwards)</td>    </tr>    <tr id="1654">      <td><a href="https://cplusplus.github.io/CWG/issues/1654.html">1654</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>dup</td>      <td>Literal types and <TT>constexpr</TT> defaulted constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1655">      <td><a href="https://cplusplus.github.io/CWG/issues/1655.html">1655</a></td> +    <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>      <td>open</td>      <td>Line endings in raw string literals</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1656">      <td><a href="https://cplusplus.github.io/CWG/issues/1656.html">1656</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD6</td>      <td>Encoding of numerically-escaped characters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1657">      <td><a href="https://cplusplus.github.io/CWG/issues/1657.html">1657</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD4</td>      <td>Attributes for namespaces and enumerators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1658">      <td><a href="https://cplusplus.github.io/CWG/issues/1658.html">1658</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>C++14</td>      <td>Deleted default constructor for abstract class via destructor</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr class="open" id="1659">      <td><a href="https://cplusplus.github.io/CWG/issues/1659.html">1659</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>open</td>      <td>Initialization order of thread_local template static data members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1660">      <td><a href="https://cplusplus.github.io/CWG/issues/1660.html">1660</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>C++14</td>      <td><I>member-declaration</I> requirements and unnamed bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1661">      <td><a href="https://cplusplus.github.io/CWG/issues/1661.html">1661</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>NAD</td>      <td>Preservation of infinite loops</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1662">      <td><a href="https://cplusplus.github.io/CWG/issues/1662.html">1662</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++14</td>      <td>Capturing function parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1663">      <td><a href="https://cplusplus.github.io/CWG/issues/1663.html">1663</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>NAD</td>      <td>Capturing an empty pack expansion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1664">      <td><a href="https://cplusplus.github.io/CWG/issues/1664.html">1664</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>C++14</td>      <td>Argument-dependent lookup of lambdas used in default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1665">      <td><a href="https://cplusplus.github.io/CWG/issues/1665.html">1665</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>drafting</td>      <td>Declaration matching in explicit instantiations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1666">      <td><a href="https://cplusplus.github.io/CWG/issues/1666.html">1666</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++14</td>      <td>Address constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1667">      <td><a href="https://cplusplus.github.io/CWG/issues/1667.html">1667</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>NAD</td>      <td>Function exiting via exception called by destructor during unwinding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1668">      <td><a href="https://cplusplus.github.io/CWG/issues/1668.html">1668</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>drafting</td>      <td>Parameter type determination still not clear enough</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1669">      <td><a href="https://cplusplus.github.io/CWG/issues/1669.html">1669</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>C++14</td>      <td><TT>auto</TT> return type for <TT>main</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1670">      <td><a href="https://cplusplus.github.io/CWG/issues/1670.html">1670</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>review</td>      <td><TT>auto</TT> as <I>conversion-type-id</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="1671">      <td><a href="https://cplusplus.github.io/CWG/issues/1671.html">1671</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>NAD</td>      <td>Unclear rules for deduction with cv-qualification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1672">      <td><a href="https://cplusplus.github.io/CWG/issues/1672.html">1672</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD4</td>      <td>Layout compatibility with multiple empty bases</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="1673">      <td><a href="https://cplusplus.github.io/CWG/issues/1673.html">1673</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>C++14</td>      <td>Clarifying overload resolution for the second step of copy-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1674">      <td><a href="https://cplusplus.github.io/CWG/issues/1674.html">1674</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>C++14</td>      <td>Return type deduction for address of function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1675">      <td><a href="https://cplusplus.github.io/CWG/issues/1675.html">1675</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>NAD</td>      <td>Size limit for automatic array object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1676">      <td><a href="https://cplusplus.github.io/CWG/issues/1676.html">1676</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>drafting</td>      <td><TT>auto</TT> return type for allocation and deallocation functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1677">      <td><a href="https://cplusplus.github.io/CWG/issues/1677.html">1677</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>C++17</td>      <td>Constant initialization via aggregate initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1678">      <td><a href="https://cplusplus.github.io/CWG/issues/1678.html">1678</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>NAD</td>      <td>Naming the type of an array of runtime bound</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1679">      <td><a href="https://cplusplus.github.io/CWG/issues/1679.html">1679</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>NAD</td>      <td>Range-based <TT>for</TT> and array of runtime bound</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1680">      <td><a href="https://cplusplus.github.io/CWG/issues/1680.html">1680</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>drafting</td>      <td>Including <TT><initializer_list></TT> for range-based <TT>for</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="1681">      <td><a href="https://cplusplus.github.io/CWG/issues/1681.html">1681</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++14</td>      <td><I>init-capture</I>s and nested lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1682">      <td><a href="https://cplusplus.github.io/CWG/issues/1682.html">1682</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>open</td>      <td>Overly-restrictive rules on function templates as allocation functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1683">      <td><a href="https://cplusplus.github.io/CWG/issues/1683.html">1683</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Incorrect example after <TT>constexpr</TT> changes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1684">      <td><a href="https://cplusplus.github.io/CWG/issues/1684.html">1684</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++14</td>      <td>Static <TT>constexpr</TT> member functions for non-literal classes</td>      <td class="full" align="center">Clang 3.6</td>    </tr>    <tr id="1685">      <td><a href="https://cplusplus.github.io/CWG/issues/1685.html">1685</a></td> +    <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>      <td>NAD</td>      <td>Value category of <TT>noexcept</TT> expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1686">      <td><a href="https://cplusplus.github.io/CWG/issues/1686.html">1686</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD4</td>      <td>Which variables are “explicitly declared <TT>const</TT>?”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1687">      <td><a href="https://cplusplus.github.io/CWG/issues/1687.html">1687</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>C++14</td>      <td>Conversions of operands of built-in operators</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="1688">      <td><a href="https://cplusplus.github.io/CWG/issues/1688.html">1688</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>NAD</td>      <td>Volatile <TT>constexpr</TT> variables</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1689">      <td><a href="https://cplusplus.github.io/CWG/issues/1689.html">1689</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>C++14</td>      <td>Syntactic nonterminal for operand of <TT>alignas</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1690">      <td><a href="https://cplusplus.github.io/CWG/issues/1690.html">1690</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>C++14</td>      <td>Associated namespace for local type</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="1691">      <td><a href="https://cplusplus.github.io/CWG/issues/1691.html">1691</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>C++14</td>      <td>Argument-dependent lookup and opaque enumerations</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="1692">      <td><a href="https://cplusplus.github.io/CWG/issues/1692.html">1692</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>C++14</td>      <td>Associated namespaces of doubly-nested classes</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="1693">      <td><a href="https://cplusplus.github.io/CWG/issues/1693.html">1693</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>C++14</td>      <td>Superfluous semicolons in class definitions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1694">      <td><a href="https://cplusplus.github.io/CWG/issues/1694.html">1694</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Restriction on reference to temporary as a constant expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1695">      <td><a href="https://cplusplus.github.io/CWG/issues/1695.html">1695</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>NAD</td>      <td>Lifetime extension via <I>init-capture</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1696">      <td><a href="https://cplusplus.github.io/CWG/issues/1696.html">1696</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD4</td>      <td>Temporary lifetime and non-static data member initializers</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="1697">      <td><a href="https://cplusplus.github.io/CWG/issues/1697.html">1697</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD4</td>      <td>Lifetime extension and copy elision</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1698">      <td><a href="https://cplusplus.github.io/CWG/issues/1698.html">1698</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD7</td>      <td>Files ending in <TT>\</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1699">      <td><a href="https://cplusplus.github.io/CWG/issues/1699.html">1699</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>open</td>      <td>Does befriending a class befriend its friends?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1700">      <td><a href="https://cplusplus.github.io/CWG/issues/1700.html">1700</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>NAD</td>      <td>Does the special rvalue-reference deduction apply to alias templates?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1701">      <td><a href="https://cplusplus.github.io/CWG/issues/1701.html">1701</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>open</td>      <td>Array vs sequence in object representation</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1702">      <td><a href="https://cplusplus.github.io/CWG/issues/1702.html">1702</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>drafting</td>      <td>Rephrasing the definition of “anonymous union”</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1703">      <td><a href="https://cplusplus.github.io/CWG/issues/1703.html">1703</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td>Language linkage of names of functions with internal linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1704">      <td><a href="https://cplusplus.github.io/CWG/issues/1704.html">1704</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD5</td>      <td>Type checking in explicit instantiation of variable templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1705">      <td><a href="https://cplusplus.github.io/CWG/issues/1705.html">1705</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>CD4</td>      <td>Unclear specification of “more specialized”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1706">      <td><a href="https://cplusplus.github.io/CWG/issues/1706.html">1706</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>drafting</td>      <td><TT>alignas</TT> pack expansion syntax</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1707">      <td><a href="https://cplusplus.github.io/CWG/issues/1707.html">1707</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>C++14</td>      <td><TT>template</TT> in <I>elaborated-type-specifier</I> without <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1708">      <td><a href="https://cplusplus.github.io/CWG/issues/1708.html">1708</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD4</td>      <td>overly-strict requirements for names with C language linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1709">      <td><a href="https://cplusplus.github.io/CWG/issues/1709.html">1709</a></td> +    <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>      <td>open</td>      <td>Stringizing raw string literals containing newline</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1710">      <td><a href="https://cplusplus.github.io/CWG/issues/1710.html">1710</a></td> +    <td>[<a href="https://wg21.link/class.derived">class.derived</a>]</td>      <td>C++17</td>      <td>Missing <TT>template</TT> keyword in <I>class-or-decltype</I></td>      <td class="none" align="center">No</td>    </tr>    <tr id="1711">      <td><a href="https://cplusplus.github.io/CWG/issues/1711.html">1711</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>CD6</td>      <td>Missing specification of variable template partial specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1712">      <td><a href="https://cplusplus.github.io/CWG/issues/1712.html">1712</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD4</td>      <td><TT>constexpr</TT> variable template declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1713">      <td><a href="https://cplusplus.github.io/CWG/issues/1713.html">1713</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>dup</td>      <td>Linkage of variable template specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1714">      <td><a href="https://cplusplus.github.io/CWG/issues/1714.html">1714</a></td> +    <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>      <td>NAD</td>      <td>odr-use of <TT>this</TT> from a local class</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1715">      <td><a href="https://cplusplus.github.io/CWG/issues/1715.html">1715</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>Access and inherited constructor templates</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1716">      <td><a href="https://cplusplus.github.io/CWG/issues/1716.html">1716</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>C++14</td>      <td>When are default arguments evaluated?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1717">      <td><a href="https://cplusplus.github.io/CWG/issues/1717.html">1717</a></td> +    <td>[<a href="https://wg21.link/lex.icon">lex.icon</a>]</td>      <td>C++14</td>      <td>Missing specification of type of binary literal</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1718">      <td><a href="https://cplusplus.github.io/CWG/issues/1718.html">1718</a></td> +    <td>[<a href="https://wg21.link/cpp.replace">cpp.replace</a>]</td>      <td>open</td>      <td>Macro invocation spanning end-of-file</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1719">      <td><a href="https://cplusplus.github.io/CWG/issues/1719.html">1719</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD4</td>      <td>Layout compatibility and cv-qualification revisited</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="1720">      <td><a href="https://cplusplus.github.io/CWG/issues/1720.html">1720</a></td> +    <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>      <td>NAD</td>      <td>Macro invocation in <TT>#include</TT> directive</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1721">      <td><a href="https://cplusplus.github.io/CWG/issues/1721.html">1721</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>review</td>      <td>Diagnosing ODR violations for static data members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1722">      <td><a href="https://cplusplus.github.io/CWG/issues/1722.html">1722</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD4</td>      <td>Should lambda to function pointer conversion function be <TT>noexcept</TT>?</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr class="open" id="1723">      <td><a href="https://cplusplus.github.io/CWG/issues/1723.html">1723</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>open</td>      <td>Multicharacter user-defined character literals</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1724">      <td><a href="https://cplusplus.github.io/CWG/issues/1724.html">1724</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD6</td>      <td>Unclear rules for deduction failure</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1725">      <td><a href="https://cplusplus.github.io/CWG/issues/1725.html">1725</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>NAD</td>      <td>Trailing return type with nested function declarator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1726">      <td><a href="https://cplusplus.github.io/CWG/issues/1726.html">1726</a></td> +    <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>      <td>CD6</td>      <td>Declarator operators and conversion function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1727">      <td><a href="https://cplusplus.github.io/CWG/issues/1727.html">1727</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Type of a specialization of a variable template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1728">      <td><a href="https://cplusplus.github.io/CWG/issues/1728.html">1728</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD5</td>      <td>Type of an explicit instantiation of a variable template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1729">      <td><a href="https://cplusplus.github.io/CWG/issues/1729.html">1729</a></td> +    <td>[<a href="https://wg21.link/temp.decls">temp.decls</a>]</td>      <td>CD6</td>      <td>Matching declarations and definitions of variable templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1730">      <td><a href="https://cplusplus.github.io/CWG/issues/1730.html">1730</a></td> +    <td>[<a href="https://wg21.link/temp.decls">temp.decls</a>]</td>      <td>drafting</td>      <td>Can a variable template have an unnamed type?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1731">      <td><a href="https://cplusplus.github.io/CWG/issues/1731.html">1731</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td><TT>is_trivially_</TT><I>X</I> and definitions of special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1732">      <td><a href="https://cplusplus.github.io/CWG/issues/1732.html">1732</a></td> +    <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>      <td>C++14</td>      <td>Defining types in <I>condition</I>s and range-based <TT>for</TT> statements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1733">      <td><a href="https://cplusplus.github.io/CWG/issues/1733.html">1733</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD6</td>      <td>Return type and value for <TT>operator=</TT> with <I>ref-qualifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1734">      <td><a href="https://cplusplus.github.io/CWG/issues/1734.html">1734</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD4</td>      <td>Nontrivial deleted copy functions</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="1735">      <td><a href="https://cplusplus.github.io/CWG/issues/1735.html">1735</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>open</td>      <td>Out-of-range literals in <I>user-defined-literal</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1736">      <td><a href="https://cplusplus.github.io/CWG/issues/1736.html">1736</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>Inheriting constructor templates in a local class</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1737">      <td><a href="https://cplusplus.github.io/CWG/issues/1737.html">1737</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++14</td>      <td>Type dependence of call to a member of the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1738">      <td><a href="https://cplusplus.github.io/CWG/issues/1738.html">1738</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>C++14</td>      <td>Explicit instantiation/specialization of inheriting constructor templates</td>      <td class="na" align="center">Superseded by <a href="https://wg21.link/P0136R1">P0136R1</a></td>    </tr>    <tr id="1739">      <td><a href="https://cplusplus.github.io/CWG/issues/1739.html">1739</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>C++14</td>      <td>Conversion of floating point to enumeration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1740">      <td><a href="https://cplusplus.github.io/CWG/issues/1740.html">1740</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>C++14</td>      <td>Disambiguation of <TT>noexcept</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1741">      <td><a href="https://cplusplus.github.io/CWG/issues/1741.html">1741</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++14</td>      <td>odr-use of class object in lvalue-to-rvalue conversion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1742">      <td><a href="https://cplusplus.github.io/CWG/issues/1742.html">1742</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD5</td>      <td><I>using-declaration</I>s and scoped enumerators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1743">      <td><a href="https://cplusplus.github.io/CWG/issues/1743.html">1743</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>NAD</td>      <td><I>init-capture</I>s in nested lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1744">      <td><a href="https://cplusplus.github.io/CWG/issues/1744.html">1744</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD4</td>      <td>Unordered initialization for variable template specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1745">      <td><a href="https://cplusplus.github.io/CWG/issues/1745.html">1745</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>NAD</td>      <td><TT>thread_local constexpr</TT> variable</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1746">      <td><a href="https://cplusplus.github.io/CWG/issues/1746.html">1746</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++14</td>      <td>Are volatile scalar types trivially copyable?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1747">      <td><a href="https://cplusplus.github.io/CWG/issues/1747.html">1747</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>C++14</td>      <td>Constant initialization of reference to function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1748">      <td><a href="https://cplusplus.github.io/CWG/issues/1748.html">1748</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD4</td>      <td>Placement new with a null pointer</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="1749">      <td><a href="https://cplusplus.github.io/CWG/issues/1749.html">1749</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>NAD</td>      <td>Confusing definition for constant initializer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1750">      <td><a href="https://cplusplus.github.io/CWG/issues/1750.html">1750</a></td> +    <td>[<a href="https://wg21.link/over.match.copy">over.match.copy</a>]</td>      <td>CD4</td>      <td>“Argument” vs “parameter”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1751">      <td><a href="https://cplusplus.github.io/CWG/issues/1751.html">1751</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD4</td>      <td>Non-trivial operations vs non-trivial initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1752">      <td><a href="https://cplusplus.github.io/CWG/issues/1752.html">1752</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD4</td>      <td>Right-recursion in <I>mem-initializer-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1753">      <td><a href="https://cplusplus.github.io/CWG/issues/1753.html">1753</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.qual">basic.lookup.qual</a>]</td>      <td>CD4</td>      <td><I>decltype-specifier</I> in <I>nested-name-specifier</I> of destructor</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="1754">      <td><a href="https://cplusplus.github.io/CWG/issues/1754.html">1754</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>NAD</td>      <td>Declaration of partial specialization of static data member template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1755">      <td><a href="https://cplusplus.github.io/CWG/issues/1755.html">1755</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.member">temp.spec.partial.member</a>]</td>      <td>drafting</td>      <td>Out-of-class partial specializations of member templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1756">      <td><a href="https://cplusplus.github.io/CWG/issues/1756.html">1756</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD4</td>      <td>Direct-list-initialization of a non-class object</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="1757">      <td><a href="https://cplusplus.github.io/CWG/issues/1757.html">1757</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Const integral subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1758">      <td><a href="https://cplusplus.github.io/CWG/issues/1758.html">1758</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>CD4</td>      <td>Explicit conversion in copy/move list initialization</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="1759">      <td><a href="https://cplusplus.github.io/CWG/issues/1759.html">1759</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>C++14</td>      <td>UTF-8 code units in plain <TT>char</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1760">      <td><a href="https://cplusplus.github.io/CWG/issues/1760.html">1760</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++14</td>      <td>Access of member corresponding to <I>init-capture</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1761">      <td><a href="https://cplusplus.github.io/CWG/issues/1761.html">1761</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>NAD</td>      <td>Runtime check on size of automatic array</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1762">      <td><a href="https://cplusplus.github.io/CWG/issues/1762.html">1762</a></td> +    <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>      <td>C++14</td>      <td>Reserved identifier used in <I>literal-operator-id</I> example</td>      <td class="full" align="center">Clang 14</td>    </tr>    <tr class="open" id="1763">      <td><a href="https://cplusplus.github.io/CWG/issues/1763.html">1763</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>open</td>      <td>Length mismatch in template type deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1764">      <td><a href="https://cplusplus.github.io/CWG/issues/1764.html">1764</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>C++14</td>      <td>Hiding of function from using-declaration by signature</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1765">      <td><a href="https://cplusplus.github.io/CWG/issues/1765.html">1765</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>C++14</td>      <td>Overflow of enumeration used as enumerator value</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1766">      <td><a href="https://cplusplus.github.io/CWG/issues/1766.html">1766</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD4</td>      <td>Values outside the range of the values of an enumeration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1767">      <td><a href="https://cplusplus.github.io/CWG/issues/1767.html">1767</a></td> +    <td>[<a href="https://wg21.link/stmt.switch">stmt.switch</a>]</td>      <td>C++14</td>      <td>Scoped enumeration in a <TT>switch</TT> statement</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1768">      <td><a href="https://cplusplus.github.io/CWG/issues/1768.html">1768</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>NAD</td>      <td>Zero-element array of runtime bound</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1769">      <td><a href="https://cplusplus.github.io/CWG/issues/1769.html">1769</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>C++14</td>      <td>Catching a base class of the exception object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1770">      <td><a href="https://cplusplus.github.io/CWG/issues/1770.html">1770</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>C++14</td>      <td>Type matching of non-type template parameters and arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1771">      <td><a href="https://cplusplus.github.io/CWG/issues/1771.html">1771</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.qual">basic.lookup.qual</a>]</td>      <td>CD6</td>      <td>Restricted lookup in <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1772">      <td><a href="https://cplusplus.github.io/CWG/issues/1772.html">1772</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>C++14</td>      <td><TT>__func__</TT> in a lambda body</td>      <td class="full" align="center">Clang 14</td>    </tr>    <tr id="1773">      <td><a href="https://cplusplus.github.io/CWG/issues/1773.html">1773</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>C++14</td>      <td>Out-of-lifetime lvalue-to-rvalue conversion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1774">      <td><a href="https://cplusplus.github.io/CWG/issues/1774.html">1774</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>CD4</td>      <td>Discrepancy between subobject destruction and stack unwinding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1775">      <td><a href="https://cplusplus.github.io/CWG/issues/1775.html">1775</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>C++14</td>      <td>Undefined behavior of line splice in raw string literal</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1776">      <td><a href="https://cplusplus.github.io/CWG/issues/1776.html">1776</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD4</td>      <td>Replacement of class objects containing reference members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1777">      <td><a href="https://cplusplus.github.io/CWG/issues/1777.html">1777</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Empty pack expansion in <I>dynamic-exception-specification</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1778">      <td><a href="https://cplusplus.github.io/CWG/issues/1778.html">1778</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>C++14</td>      <td><I>exception-specification</I> in explicitly-defaulted functions</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="1779">      <td><a href="https://cplusplus.github.io/CWG/issues/1779.html">1779</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>CD4</td>      <td>Type dependency of <TT>__func__</TT></td>      <td class="full" align="center">Clang 14</td>    </tr>    <tr id="1780">      <td><a href="https://cplusplus.github.io/CWG/issues/1780.html">1780</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD4</td>      <td>Explicit instantiation/specialization of generic lambda <TT>operator()</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1781">      <td><a href="https://cplusplus.github.io/CWG/issues/1781.html">1781</a></td> +    <td>[<a href="https://wg21.link/over.match.conv">over.match.conv</a>]</td>      <td>CD5</td>      <td>Converting from <TT>nullptr_t</TT> to <TT>bool</TT> in overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1782">      <td><a href="https://cplusplus.github.io/CWG/issues/1782.html">1782</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>CD4</td>      <td>Form of initialization for <TT>nullptr_t</TT> to <TT>bool</TT> conversion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1783">      <td><a href="https://cplusplus.github.io/CWG/issues/1783.html">1783</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>NAD</td>      <td>Why are virtual destructors non-trivial?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1784">      <td><a href="https://cplusplus.github.io/CWG/issues/1784.html">1784</a></td> +    <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>      <td>C++17</td>      <td>Concurrent execution during static local initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1785">      <td><a href="https://cplusplus.github.io/CWG/issues/1785.html">1785</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>NAD</td>      <td>Conflicting diagnostic requirements for template definitions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1786">      <td><a href="https://cplusplus.github.io/CWG/issues/1786.html">1786</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>C++14</td>      <td>Effect of merging allocations on memory leakage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1787">      <td><a href="https://cplusplus.github.io/CWG/issues/1787.html">1787</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>C++14</td>      <td>Uninitialized <TT>unsigned char</TT> values</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1788">      <td><a href="https://cplusplus.github.io/CWG/issues/1788.html">1788</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD4</td>      <td>Sized deallocation of array of non-class type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1789">      <td><a href="https://cplusplus.github.io/CWG/issues/1789.html">1789</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>open</td>      <td>Array reference vs array decay in overload resolution</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1790">      <td><a href="https://cplusplus.github.io/CWG/issues/1790.html">1790</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>open</td>      <td>Ellipsis following function parameter pack</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1791">      <td><a href="https://cplusplus.github.io/CWG/issues/1791.html">1791</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>CD4</td>      <td>Incorrect restrictions on <I>cv-qualifier-seq</I> and <I>ref-qualifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1792">      <td><a href="https://cplusplus.github.io/CWG/issues/1792.html">1792</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Incorrect example of explicit specialization of member enumeration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1793">      <td><a href="https://cplusplus.github.io/CWG/issues/1793.html">1793</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD4</td>      <td><TT>thread_local</TT> in explicit specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1794">      <td><a href="https://cplusplus.github.io/CWG/issues/1794.html">1794</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>C++17</td>      <td><TT>template</TT> keyword and alias templates</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="1795">      <td><a href="https://cplusplus.github.io/CWG/issues/1795.html">1795</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD4</td>      <td>Disambiguating <I>original-namespace-definition</I> and <I>extension-namespace-definition</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1796">      <td><a href="https://cplusplus.github.io/CWG/issues/1796.html">1796</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>CD4</td>      <td>Is all-bits-zero for null characters a meaningful requirement?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1797">      <td><a href="https://cplusplus.github.io/CWG/issues/1797.html">1797</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD4</td>      <td>Are all bit patterns of <TT>unsigned char</TT> distinct numbers?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1798">      <td><a href="https://cplusplus.github.io/CWG/issues/1798.html">1798</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td><I>exception-specification</I>s of template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1799">      <td><a href="https://cplusplus.github.io/CWG/issues/1799.html">1799</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD4</td>      <td><TT>mutable</TT> and non-explicit const qualification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1800">      <td><a href="https://cplusplus.github.io/CWG/issues/1800.html">1800</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>CD4</td>      <td>Pointer to member of nested anonymous union</td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="1801">      <td><a href="https://cplusplus.github.io/CWG/issues/1801.html">1801</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>CD4</td>      <td>Kind of expression referring to member of anonymous union</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="1802">      <td><a href="https://cplusplus.github.io/CWG/issues/1802.html">1802</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD4</td>      <td><TT>char16_t</TT> string literals and surrogate pairs</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1803">      <td><a href="https://cplusplus.github.io/CWG/issues/1803.html">1803</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD5</td>      <td><I>opaque-enum-declaration</I> as <I>member-declaration</I></td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="1804">      <td><a href="https://cplusplus.github.io/CWG/issues/1804.html">1804</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD4</td>      <td>Partial specialization and friendship</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="1805">      <td><a href="https://cplusplus.github.io/CWG/issues/1805.html">1805</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD4</td>      <td>Conversions of array operands in <I>conditional-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1806">      <td><a href="https://cplusplus.github.io/CWG/issues/1806.html">1806</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>CD4</td>      <td>Virtual bases and move-assignment</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1807">      <td><a href="https://cplusplus.github.io/CWG/issues/1807.html">1807</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>CD4</td>      <td>Order of destruction of array elements after an exception</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr class="open" id="1808">      <td><a href="https://cplusplus.github.io/CWG/issues/1808.html">1808</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>drafting</td>      <td>Constructor templates vs default constructors</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1809">      <td><a href="https://cplusplus.github.io/CWG/issues/1809.html">1809</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD4</td>      <td>Narrowing and template argument deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1810">      <td><a href="https://cplusplus.github.io/CWG/issues/1810.html">1810</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>CD4</td>      <td>Invalid <I>ud-suffix</I>es</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1811">      <td><a href="https://cplusplus.github.io/CWG/issues/1811.html">1811</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD4</td>      <td>Lookup of deallocation function in a virtual destructor definition</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1812">      <td><a href="https://cplusplus.github.io/CWG/issues/1812.html">1812</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>C++17</td>      <td>Omission of <TT>template</TT> in a <I>typename-specifier</I></td>      <td class="none" align="center">No</td>    </tr>    <tr id="1813">      <td><a href="https://cplusplus.github.io/CWG/issues/1813.html">1813</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD4</td>      <td>Direct vs indirect bases in standard-layout classes</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="1814">      <td><a href="https://cplusplus.github.io/CWG/issues/1814.html">1814</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD4</td>      <td>Default arguments in <I>lambda-expression</I>s</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1815">      <td><a href="https://cplusplus.github.io/CWG/issues/1815.html">1815</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD4</td>      <td>Lifetime extension in aggregate initialization</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="1816">      <td><a href="https://cplusplus.github.io/CWG/issues/1816.html">1816</a></td> +    <td>[<a href="https://wg21.link/conv.integral">conv.integral</a>]</td>      <td>CD4</td>      <td>Unclear specification of bit-field values</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1817">      <td><a href="https://cplusplus.github.io/CWG/issues/1817.html">1817</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>open</td>      <td>Linkage specifications and nested scopes</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1818">      <td><a href="https://cplusplus.github.io/CWG/issues/1818.html">1818</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD6</td>      <td>Visibility and inherited language linkage</td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="1819">      <td><a href="https://cplusplus.github.io/CWG/issues/1819.html">1819</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>CD4</td>      <td>Acceptable scopes for definition of partial specialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1820">      <td><a href="https://cplusplus.github.io/CWG/issues/1820.html">1820</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD6</td>      <td>Qualified typedef names</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1821">      <td><a href="https://cplusplus.github.io/CWG/issues/1821.html">1821</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD6</td>      <td>Qualified redeclarations in a class <I>member-specification</I></td>      <td class="full" align="center">Clang 2.9</td>    </tr>    <tr id="1822">      <td><a href="https://cplusplus.github.io/CWG/issues/1822.html">1822</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD6</td>      <td>Lookup of parameter names in <I>lambda-expression</I>s</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="1823">      <td><a href="https://cplusplus.github.io/CWG/issues/1823.html">1823</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.spec">dcl.fct.spec</a>]</td>      <td>CD4</td>      <td>String literal uniqueness in inline functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1824">      <td><a href="https://cplusplus.github.io/CWG/issues/1824.html">1824</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD4</td>      <td>Completeness of return type vs point of instantiation</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="1825">      <td><a href="https://cplusplus.github.io/CWG/issues/1825.html">1825</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>C++17</td>      <td>Partial ordering between variadic and non-variadic function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1826">      <td><a href="https://cplusplus.github.io/CWG/issues/1826.html">1826</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td><TT>const</TT> floating-point in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1827">      <td><a href="https://cplusplus.github.io/CWG/issues/1827.html">1827</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>drafting</td>      <td>Reference binding with ambiguous conversions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1828">      <td><a href="https://cplusplus.github.io/CWG/issues/1828.html">1828</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.qual">basic.lookup.qual</a>]</td>      <td>CD6</td>      <td><I>nested-name-specifier</I> ambiguity</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1829">      <td><a href="https://cplusplus.github.io/CWG/issues/1829.html">1829</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD6</td>      <td>Dependent unnamed types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1830">      <td><a href="https://cplusplus.github.io/CWG/issues/1830.html">1830</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>CD4</td>      <td>Repeated specifiers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1831">      <td><a href="https://cplusplus.github.io/CWG/issues/1831.html">1831</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Explicitly vs implicitly deleted move constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1832">      <td><a href="https://cplusplus.github.io/CWG/issues/1832.html">1832</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD4</td>      <td>Casting to incomplete enumeration</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="1833">      <td><a href="https://cplusplus.github.io/CWG/issues/1833.html">1833</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td>      <td><TT>friend</TT> declarations naming implicitly-declared member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1834">      <td><a href="https://cplusplus.github.io/CWG/issues/1834.html">1834</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD4</td>      <td>Constant initialization binding a reference to an xvalue</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1835">      <td><a href="https://cplusplus.github.io/CWG/issues/1835.html">1835</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD6</td>      <td>Dependent member lookup before <TT><</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1836">      <td><a href="https://cplusplus.github.io/CWG/issues/1836.html">1836</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD5</td>      <td>Use of class type being defined in <I>trailing-return-type</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1837">      <td><a href="https://cplusplus.github.io/CWG/issues/1837.html">1837</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD6</td>      <td>Use of <TT>this</TT> in <TT>friend</TT> and local class declarations</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="1838">      <td><a href="https://cplusplus.github.io/CWG/issues/1838.html">1838</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>CD4</td>      <td>Definition via <I>unqualified-id</I> and <I>using-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1839">      <td><a href="https://cplusplus.github.io/CWG/issues/1839.html">1839</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD6</td>      <td>Lookup of block-scope <TT>extern</TT> declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1840">      <td><a href="https://cplusplus.github.io/CWG/issues/1840.html">1840</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>drafting</td>      <td>Non-deleted explicit specialization of deleted function template</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1841">      <td><a href="https://cplusplus.github.io/CWG/issues/1841.html">1841</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>CD6</td>      <td><TT><</TT> following template injected-class-name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1842">      <td><a href="https://cplusplus.github.io/CWG/issues/1842.html">1842</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>open</td>      <td>Unevaluated operands and “carries a dependency”</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1843">      <td><a href="https://cplusplus.github.io/CWG/issues/1843.html">1843</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD4</td>      <td>Bit-field in conditional operator with <TT>throw</TT> operand</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1844">      <td><a href="https://cplusplus.github.io/CWG/issues/1844.html">1844</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>open</td>      <td>Defining “immediate context”</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1845">      <td><a href="https://cplusplus.github.io/CWG/issues/1845.html">1845</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>review</td>      <td>Point of instantiation of a variable template specialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1846">      <td><a href="https://cplusplus.github.io/CWG/issues/1846.html">1846</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD4</td>      <td>Declaring explicitly-defaulted implicitly-deleted functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1847">      <td><a href="https://cplusplus.github.io/CWG/issues/1847.html">1847</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD4</td>      <td>Clarifying compatibility during partial ordering</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1848">      <td><a href="https://cplusplus.github.io/CWG/issues/1848.html">1848</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD4</td>      <td>Parenthesized constructor and destructor declarators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1849">      <td><a href="https://cplusplus.github.io/CWG/issues/1849.html">1849</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD6</td>      <td>Variable templates and the ODR</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1850">      <td><a href="https://cplusplus.github.io/CWG/issues/1850.html">1850</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD4</td>      <td>Differences between definition context and point of instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1851">      <td><a href="https://cplusplus.github.io/CWG/issues/1851.html">1851</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD4</td>      <td><TT>decltype(auto)</TT> in <I>new-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1852">      <td><a href="https://cplusplus.github.io/CWG/issues/1852.html">1852</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD4</td>      <td>Wording issues regarding <TT>decltype(auto)</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1853">      <td><a href="https://cplusplus.github.io/CWG/issues/1853.html">1853</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>dup</td>      <td>Defining “allocated storage”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1854">      <td><a href="https://cplusplus.github.io/CWG/issues/1854.html">1854</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>drafting</td>      <td>Disallowing use of implicitly-deleted functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1855">      <td><a href="https://cplusplus.github.io/CWG/issues/1855.html">1855</a></td> +    <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>      <td>dup</td>      <td>Out-of-lifetime access to nonstatic data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1856">      <td><a href="https://cplusplus.github.io/CWG/issues/1856.html">1856</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>open</td>      <td>Indirect nested classes of class templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1857">      <td><a href="https://cplusplus.github.io/CWG/issues/1857.html">1857</a></td> +    <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>      <td>CD5</td>      <td>Additional questions about bits</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1858">      <td><a href="https://cplusplus.github.io/CWG/issues/1858.html">1858</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>CD4</td>      <td>Comparing pointers to union members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1859">      <td><a href="https://cplusplus.github.io/CWG/issues/1859.html">1859</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD5</td>      <td>UTF-16 in <TT>char16_t</TT> string literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1860">      <td><a href="https://cplusplus.github.io/CWG/issues/1860.html">1860</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>C++17</td>      <td>What is a “direct member?”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1861">      <td><a href="https://cplusplus.github.io/CWG/issues/1861.html">1861</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD4</td>      <td>Values of a bit-field</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1862">      <td><a href="https://cplusplus.github.io/CWG/issues/1862.html">1862</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD5</td>      <td>Determining “corresponding members” for friendship</td>      <td class="none" align="center">No</td>    </tr>    <tr id="1863">      <td><a href="https://cplusplus.github.io/CWG/issues/1863.html">1863</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD4</td>      <td>Requirements on thrown object type to support <TT>std::current_exception()</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1864">      <td><a href="https://cplusplus.github.io/CWG/issues/1864.html">1864</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>List-initialization of array objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1865">      <td><a href="https://cplusplus.github.io/CWG/issues/1865.html">1865</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>CD4</td>      <td>Pointer arithmetic and multi-level qualification conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1866">      <td><a href="https://cplusplus.github.io/CWG/issues/1866.html">1866</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>CD4</td>      <td>Initializing variant members with non-trivial destructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1867">      <td><a href="https://cplusplus.github.io/CWG/issues/1867.html">1867</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>NAD</td>      <td>Function/expression ambiguity with qualified parameter name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1868">      <td><a href="https://cplusplus.github.io/CWG/issues/1868.html">1868</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>open</td>      <td>Meaning of “placeholder type”</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1869">      <td><a href="https://cplusplus.github.io/CWG/issues/1869.html">1869</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>NAD</td>      <td><TT>thread_local</TT> vs <I>linkage-specification</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1870">      <td><a href="https://cplusplus.github.io/CWG/issues/1870.html">1870</a></td> +    <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>      <td>CD4</td>      <td>Contradictory wording about definitions vs explicit specialization/instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1871">      <td><a href="https://cplusplus.github.io/CWG/issues/1871.html">1871</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>NAD</td>      <td>Non-identifier characters in <I>ud-suffix</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1872">      <td><a href="https://cplusplus.github.io/CWG/issues/1872.html">1872</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD4</td>      <td>Instantiations of <TT>constexpr</TT> templates that cannot appear in constant expressions</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="1873">      <td><a href="https://cplusplus.github.io/CWG/issues/1873.html">1873</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>CD4</td>      <td>Protected member access from derived class friends</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1874">      <td><a href="https://cplusplus.github.io/CWG/issues/1874.html">1874</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD4</td>      <td>Type vs non-type template parameters with <TT>class</TT> keyword</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1875">      <td><a href="https://cplusplus.github.io/CWG/issues/1875.html">1875</a></td> +    <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>      <td>CD4</td>      <td>Reordering declarations in class scope</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1876">      <td><a href="https://cplusplus.github.io/CWG/issues/1876.html">1876</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Preventing explicit specialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1877">      <td><a href="https://cplusplus.github.io/CWG/issues/1877.html">1877</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD4</td>      <td>Return type deduction from <TT>return</TT> with no operand</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1878">      <td><a href="https://cplusplus.github.io/CWG/issues/1878.html">1878</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD4</td>      <td><TT>operator auto</TT> template</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="1879">      <td><a href="https://cplusplus.github.io/CWG/issues/1879.html">1879</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>NAD</td>      <td>Inadequate definition of alignment requirement</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1880">      <td><a href="https://cplusplus.github.io/CWG/issues/1880.html">1880</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD4</td>      <td>When are parameter objects destroyed?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1881">      <td><a href="https://cplusplus.github.io/CWG/issues/1881.html">1881</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD4</td>      <td>Standard-layout classes and unnamed bit-fields</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="1882">      <td><a href="https://cplusplus.github.io/CWG/issues/1882.html">1882</a></td> +    <td>[<a href="https://wg21.link/global.names">global.names</a>]</td>      <td>CD4</td>      <td>Reserved names without library use</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1883">      <td><a href="https://cplusplus.github.io/CWG/issues/1883.html">1883</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>review</td>      <td>Protected access to constructors in <I>mem-initializer</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1884">      <td><a href="https://cplusplus.github.io/CWG/issues/1884.html">1884</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD6</td>      <td>Unclear requirements for same-named external-linkage entities</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="1885">      <td><a href="https://cplusplus.github.io/CWG/issues/1885.html">1885</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD4</td>      <td>Return value of a function is underspecified</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1886">      <td><a href="https://cplusplus.github.io/CWG/issues/1886.html">1886</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD4</td>      <td>Language linkage for <TT>main()</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1887">      <td><a href="https://cplusplus.github.io/CWG/issues/1887.html">1887</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD4</td>      <td>Problems with <TT>::</TT> as <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1888">      <td><a href="https://cplusplus.github.io/CWG/issues/1888.html">1888</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD4</td>      <td>Implicitly-declared default constructors and <TT>explicit</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1889">      <td><a href="https://cplusplus.github.io/CWG/issues/1889.html">1889</a></td> +    <td>[<a href="https://wg21.link/cpp.pragma">cpp.pragma</a>]</td>      <td>open</td>      <td>Unclear effect of <TT>#pragma</TT> on conformance</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1890">      <td><a href="https://cplusplus.github.io/CWG/issues/1890.html">1890</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>drafting</td>      <td>Member type depending on definition of member function</td>      <td align="center"> @@ -11175,2670 +13023,3115 @@ and <I>POD class</I></td>    </tr>    <tr id="1891">      <td><a href="https://cplusplus.github.io/CWG/issues/1891.html">1891</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD4</td>      <td>Move constructor/assignment for closure class</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="1892">      <td><a href="https://cplusplus.github.io/CWG/issues/1892.html">1892</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD4</td>      <td>Use of <TT>auto</TT> in function type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1893">      <td><a href="https://cplusplus.github.io/CWG/issues/1893.html">1893</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>CD5</td>      <td>Function-style cast with <I>braced-init-list</I>s and empty pack expansions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1894">      <td><a href="https://cplusplus.github.io/CWG/issues/1894.html">1894</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD6</td>      <td><I>typedef-name</I>s and <I>using-declaration</I>s</td>      <td class="full" align="center">Clang 3.8</td>    </tr>    <tr id="1895">      <td><a href="https://cplusplus.github.io/CWG/issues/1895.html">1895</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD4</td>      <td>Deleted conversions in conditional operator operands</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1896">      <td><a href="https://cplusplus.github.io/CWG/issues/1896.html">1896</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>CD6</td>      <td>Repeated alias templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1897">      <td><a href="https://cplusplus.github.io/CWG/issues/1897.html">1897</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>review</td>      <td>ODR vs alternative tokens</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1898">      <td><a href="https://cplusplus.github.io/CWG/issues/1898.html">1898</a></td> +    <td>[<a href="https://wg21.link/over.dcl">over.dcl</a>]</td>      <td>CD6</td>      <td>Use of “equivalent” in overload resolution</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="1899">      <td><a href="https://cplusplus.github.io/CWG/issues/1899.html">1899</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD4</td>      <td>Value-dependent constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1900">      <td><a href="https://cplusplus.github.io/CWG/issues/1900.html">1900</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>CD6</td>      <td>Do <TT>friend</TT> declarations count as “previous declarations”?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="1901">      <td><a href="https://cplusplus.github.io/CWG/issues/1901.html">1901</a></td> +    <td>[<a href="https://wg21.link/lex.token">lex.token</a>]</td>      <td>open</td>      <td><I>punctuator</I> referenced but not defined</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1902">      <td><a href="https://cplusplus.github.io/CWG/issues/1902.html">1902</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>CD4</td>      <td>What makes a conversion “otherwise ill-formed”?</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="1903">      <td><a href="https://cplusplus.github.io/CWG/issues/1903.html">1903</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD4</td>      <td>What declarations are introduced by a non-member <I>using-declaration</I>?</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="1904">      <td><a href="https://cplusplus.github.io/CWG/issues/1904.html">1904</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>NAD</td>      <td>Default template arguments for members of class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1905">      <td><a href="https://cplusplus.github.io/CWG/issues/1905.html">1905</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>NAD</td>      <td>Dependent types and injected-class-names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1906">      <td><a href="https://cplusplus.github.io/CWG/issues/1906.html">1906</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>NAD</td>      <td>Name lookup in member <TT>friend</TT> declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1907">      <td><a href="https://cplusplus.github.io/CWG/issues/1907.html">1907</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD6</td>      <td><I>using-declaration</I>s and default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1908">      <td><a href="https://cplusplus.github.io/CWG/issues/1908.html">1908</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.classref">basic.lookup.classref</a>]</td>      <td>CD6</td>      <td>Dual destructor lookup and <I>template-id</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1909">      <td><a href="https://cplusplus.github.io/CWG/issues/1909.html">1909</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD4</td>      <td>Member class template with the same name as the class</td>      <td class="full" align="center">Clang 3.7</td>    </tr>    <tr id="1910">      <td><a href="https://cplusplus.github.io/CWG/issues/1910.html">1910</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>CD5</td>      <td>“Shall” requirement applied to runtime behavior</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1911">      <td><a href="https://cplusplus.github.io/CWG/issues/1911.html">1911</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD4</td>      <td><TT>constexpr</TT> constructor with non-literal base class</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1912">      <td><a href="https://cplusplus.github.io/CWG/issues/1912.html">1912</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD5</td>      <td><I>exception-specification</I> of defaulted function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1913">      <td><a href="https://cplusplus.github.io/CWG/issues/1913.html">1913</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD5</td>      <td><TT>decltype((x))</TT> in <I>lambda-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1914">      <td><a href="https://cplusplus.github.io/CWG/issues/1914.html">1914</a></td> +    <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>      <td>extension</td>      <td>Duplicate standard attributes</td>      <td align="center">Extension</td>    </tr>    <tr class="open" id="1915">      <td><a href="https://cplusplus.github.io/CWG/issues/1915.html">1915</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>open</td>      <td>Potentially-invoked destructors in non-throwing constructors</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1916">      <td><a href="https://cplusplus.github.io/CWG/issues/1916.html">1916</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD4</td>      <td>“Same cv-unqualified type”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1917">      <td><a href="https://cplusplus.github.io/CWG/issues/1917.html">1917</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>NAD</td>      <td>decltype-qualified enumeration names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1918">      <td><a href="https://cplusplus.github.io/CWG/issues/1918.html">1918</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD5</td>      <td><TT>friend</TT> templates with dependent scopes</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="1919">      <td><a href="https://cplusplus.github.io/CWG/issues/1919.html">1919</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>open</td>      <td>Overload resolution for <TT>!</TT> with explicit conversion operator</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1920">      <td><a href="https://cplusplus.github.io/CWG/issues/1920.html">1920</a></td> +    <td>[<a href="https://wg21.link/expr.pseudo">expr.pseudo</a>]</td>      <td>CD4</td>      <td>Qualification mismatch in <I>pseudo-destructor-name</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1921">      <td><a href="https://cplusplus.github.io/CWG/issues/1921.html">1921</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td><TT>constexpr</TT> constructors and point of initialization of <TT>const</TT> variables</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1922">      <td><a href="https://cplusplus.github.io/CWG/issues/1922.html">1922</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>CD4</td>      <td>Injected class template names and default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1923">      <td><a href="https://cplusplus.github.io/CWG/issues/1923.html">1923</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>NAD</td>      <td>Lvalues of type <TT>void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1924">      <td><a href="https://cplusplus.github.io/CWG/issues/1924.html">1924</a></td> +    <td>[<a href="https://wg21.link/lex.literal">lex.literal</a>]</td>      <td>review</td>      <td>Definition of “literal” and kinds of literals</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1925">      <td><a href="https://cplusplus.github.io/CWG/issues/1925.html">1925</a></td> +    <td>[<a href="https://wg21.link/expr.comma">expr.comma</a>]</td>      <td>CD4</td>      <td>Bit-field prvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1926">      <td><a href="https://cplusplus.github.io/CWG/issues/1926.html">1926</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD4</td>      <td>Potential results of subscript operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1927">      <td><a href="https://cplusplus.github.io/CWG/issues/1927.html">1927</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>dup</td>      <td>Lifetime of temporaries in <I>init-capture</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1928">      <td><a href="https://cplusplus.github.io/CWG/issues/1928.html">1928</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Triviality of deleted special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1929">      <td><a href="https://cplusplus.github.io/CWG/issues/1929.html">1929</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>CD4</td>      <td><TT>template</TT> keyword following namespace <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1930">      <td><a href="https://cplusplus.github.io/CWG/issues/1930.html">1930</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>CD4</td>      <td><I>init-declarator-list</I> vs <I>member-declarator-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1931">      <td><a href="https://cplusplus.github.io/CWG/issues/1931.html">1931</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD5</td>      <td>Default-constructible and copy-assignable closure types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1932">      <td><a href="https://cplusplus.github.io/CWG/issues/1932.html">1932</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD4</td>      <td>Bit-field results of conditional operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1933">      <td><a href="https://cplusplus.github.io/CWG/issues/1933.html">1933</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>NAD</td>      <td>Implementation limit for <I>initializer-list</I> elements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1934">      <td><a href="https://cplusplus.github.io/CWG/issues/1934.html">1934</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td>Relaxing <I>exception-specification</I> compatibility requirements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1935">      <td><a href="https://cplusplus.github.io/CWG/issues/1935.html">1935</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD5</td>      <td>Reuse of placement arguments in deallocation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1936">      <td><a href="https://cplusplus.github.io/CWG/issues/1936.html">1936</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD6</td>      <td>Dependent <I>qualified-id</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1937">      <td><a href="https://cplusplus.github.io/CWG/issues/1937.html">1937</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD5</td>      <td>Incomplete specification of function pointer from lambda</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1938">      <td><a href="https://cplusplus.github.io/CWG/issues/1938.html">1938</a></td> +    <td>[<a href="https://wg21.link/intro.compliance">intro.compliance</a>]</td>      <td>CD5</td>      <td>Should hosted/freestanding be implementation-defined?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1939">      <td><a href="https://cplusplus.github.io/CWG/issues/1939.html">1939</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>open</td>      <td>Argument conversions to nondeduced parameter types revisited</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1940">      <td><a href="https://cplusplus.github.io/CWG/issues/1940.html">1940</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>CD4</td>      <td><TT>static_assert</TT> in anonymous unions</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1941">      <td><a href="https://cplusplus.github.io/CWG/issues/1941.html">1941</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>SFINAE and inherited constructor default arguments</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1942">      <td><a href="https://cplusplus.github.io/CWG/issues/1942.html">1942</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>CD4</td>      <td>Incorrect reference to <I>trailing-return-type</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1943">      <td><a href="https://cplusplus.github.io/CWG/issues/1943.html">1943</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD5</td>      <td>Unspecified meaning of “bit”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1944">      <td><a href="https://cplusplus.github.io/CWG/issues/1944.html">1944</a></td> +    <td>[<a href="https://wg21.link/diff">diff</a>]</td>      <td>open</td>      <td>New C incompatibilities</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1945">      <td><a href="https://cplusplus.github.io/CWG/issues/1945.html">1945</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD5</td>      <td>Friend declarations naming members of class templates in non-templates</td>      <td class="none" align="center">No</td>    </tr>    <tr id="1946">      <td><a href="https://cplusplus.github.io/CWG/issues/1946.html">1946</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td><I>exception-specification</I>s vs pointer dereference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1947">      <td><a href="https://cplusplus.github.io/CWG/issues/1947.html">1947</a></td> +    <td>[<a href="https://wg21.link/lex.icon">lex.icon</a>]</td>      <td>NAD</td>      <td>Digit separators following non-octal prefix</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1948">      <td><a href="https://cplusplus.github.io/CWG/issues/1948.html">1948</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic">basic.stc.dynamic</a>]</td>      <td>NAD</td>      <td><I>exception-specification</I> of replacement global <TT>new</TT></td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr id="1949">      <td><a href="https://cplusplus.github.io/CWG/issues/1949.html">1949</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD4</td>      <td>“sequenced after” instead of “sequenced before”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1950">      <td><a href="https://cplusplus.github.io/CWG/issues/1950.html">1950</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>NAD</td>      <td>Restructuring description of ranks of conversion sequences</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1951">      <td><a href="https://cplusplus.github.io/CWG/issues/1951.html">1951</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD4</td>      <td>Cv-qualification and literal types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1952">      <td><a href="https://cplusplus.github.io/CWG/issues/1952.html">1952</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Constant expressions and library undefined behavior</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1953">      <td><a href="https://cplusplus.github.io/CWG/issues/1953.html">1953</a></td> +    <td>[<a href="https://wg21.link/intro.memory">intro.memory</a>]</td>      <td>CD7</td>      <td>Data races and common initial sequence</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1954">      <td><a href="https://cplusplus.github.io/CWG/issues/1954.html">1954</a></td> +    <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>      <td>CD7</td>      <td><TT>typeid</TT> null dereference check in subexpressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1955">      <td><a href="https://cplusplus.github.io/CWG/issues/1955.html">1955</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD4</td>      <td><TT>#elif</TT> with invalid controlling expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1956">      <td><a href="https://cplusplus.github.io/CWG/issues/1956.html">1956</a></td> +    <td>[<a href="https://wg21.link/basic.stc.auto">basic.stc.auto</a>]</td>      <td>CD4</td>      <td>Reuse of storage of automatic variables</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1957">      <td><a href="https://cplusplus.github.io/CWG/issues/1957.html">1957</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>NAD</td>      <td><TT>decltype(auto)</TT> with direct-list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1958">      <td><a href="https://cplusplus.github.io/CWG/issues/1958.html">1958</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD4</td>      <td><TT>decltype(auto)</TT> with parenthesized initializer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1959">      <td><a href="https://cplusplus.github.io/CWG/issues/1959.html">1959</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>Inadvertently inherited copy constructor</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1960">      <td><a href="https://cplusplus.github.io/CWG/issues/1960.html">1960</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>NAD</td>      <td>Visibility of entity named in class-scope <I>using-declaration</I></td>      <td class="none" align="center">No</td>    </tr>    <tr id="1961">      <td><a href="https://cplusplus.github.io/CWG/issues/1961.html">1961</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>C++17</td>      <td>Potentially-concurrent actions within a signal handler</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1962">      <td><a href="https://cplusplus.github.io/CWG/issues/1962.html">1962</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>open</td>      <td>Type of <TT>__func__</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="1963">      <td><a href="https://cplusplus.github.io/CWG/issues/1963.html">1963</a></td> +    <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>      <td>CD4</td>      <td>Implementation-defined identifier characters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1964">      <td><a href="https://cplusplus.github.io/CWG/issues/1964.html">1964</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>NAD</td>      <td><I>opaque-enum-declaration</I> in <I>alias-declaration</I>?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1965">      <td><a href="https://cplusplus.github.io/CWG/issues/1965.html">1965</a></td> +    <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>      <td>CD7</td>      <td>Explicit casts to reference types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1966">      <td><a href="https://cplusplus.github.io/CWG/issues/1966.html">1966</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD4</td>      <td>Colon following enumeration <I>elaborated-type-specifier</I></td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="1967">      <td><a href="https://cplusplus.github.io/CWG/issues/1967.html">1967</a></td> +    <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>      <td>CD4</td>      <td>Temporary lifetime and move-elision</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1968">      <td><a href="https://cplusplus.github.io/CWG/issues/1968.html">1968</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Address of <TT>typeid</TT> in constant expressions</td>      <td class="none" align="center">No</td>    </tr>    <tr id="1969">      <td><a href="https://cplusplus.github.io/CWG/issues/1969.html">1969</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD6</td>      <td>Missing exclusion of <TT>~S</TT> as an ordinary function name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1970">      <td><a href="https://cplusplus.github.io/CWG/issues/1970.html">1970</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>NAD</td>      <td>Ambiguity resolution for <TT>(T())*x</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1971">      <td><a href="https://cplusplus.github.io/CWG/issues/1971.html">1971</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>CD4</td>      <td>Unclear disambiguation of destructor and <TT>operator~</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1972">      <td><a href="https://cplusplus.github.io/CWG/issues/1972.html">1972</a></td> +    <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>      <td>CD6</td>      <td>Identifier character restrictions in non-<I>identifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1973">      <td><a href="https://cplusplus.github.io/CWG/issues/1973.html">1973</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD7</td>      <td>Which <I>parameter-declaration-clause</I> in a <I>lambda-expression</I>?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1974">      <td><a href="https://cplusplus.github.io/CWG/issues/1974.html">1974</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>NAD</td>      <td>Redundant specification of non-type <I>typename-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1975">      <td><a href="https://cplusplus.github.io/CWG/issues/1975.html">1975</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Permissible declarations for <I>exception-specification</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1976">      <td><a href="https://cplusplus.github.io/CWG/issues/1976.html">1976</a></td> +    <td>[<a href="https://wg21.link/namespace.alias">namespace.alias</a>]</td>      <td>NAD</td>      <td>Ambiguity of <I>namespace-alias</I>es</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1977">      <td><a href="https://cplusplus.github.io/CWG/issues/1977.html">1977</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>open</td>      <td>Contradictory results of failed destructor lookup</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1978">      <td><a href="https://cplusplus.github.io/CWG/issues/1978.html">1978</a></td> +    <td>[<a href="https://wg21.link/class.conv.ctor">class.conv.ctor</a>]</td>      <td>CD4</td>      <td>Redundant description of explicit constructor use</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1979">      <td><a href="https://cplusplus.github.io/CWG/issues/1979.html">1979</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>drafting</td>      <td>Alias template specialization in template member definition</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="1980">      <td><a href="https://cplusplus.github.io/CWG/issues/1980.html">1980</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>drafting</td>      <td>Equivalent but not functionally-equivalent redeclarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1981">      <td><a href="https://cplusplus.github.io/CWG/issues/1981.html">1981</a></td> +    <td>[<a href="https://wg21.link/conv">conv</a>]</td>      <td>CD4</td>      <td>Implicit contextual conversions and <TT>explicit</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1982">      <td><a href="https://cplusplus.github.io/CWG/issues/1982.html">1982</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>NAD</td>      <td>Deduction extending parameter pack</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1983">      <td><a href="https://cplusplus.github.io/CWG/issues/1983.html">1983</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD5</td>      <td>Inappropriate use of <I>virt-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1984">      <td><a href="https://cplusplus.github.io/CWG/issues/1984.html">1984</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>NAD</td>      <td>Lossless narrowing conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1985">      <td><a href="https://cplusplus.github.io/CWG/issues/1985.html">1985</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>NAD</td>      <td>Unknown bound array member with <I>brace-or-equal-initializer</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1986">      <td><a href="https://cplusplus.github.io/CWG/issues/1986.html">1986</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>drafting</td>      <td>odr-use and delayed initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1987">      <td><a href="https://cplusplus.github.io/CWG/issues/1987.html">1987</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>NAD</td>      <td><TT>constexpr</TT> static data members across translation units</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1988">      <td><a href="https://cplusplus.github.io/CWG/issues/1988.html">1988</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD4</td>      <td>Ambiguity between dependent and non-dependent bases in implicit member access</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1989">      <td><a href="https://cplusplus.github.io/CWG/issues/1989.html">1989</a></td> +    <td>[<a href="https://wg21.link/over.oper">over.oper</a>]</td>      <td>drafting</td>      <td>Insufficient restrictions on parameters of postfix operators</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1990">      <td><a href="https://cplusplus.github.io/CWG/issues/1990.html">1990</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>CD4</td>      <td>Ambiguity due to optional <I>decl-specifier-seq</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1991">      <td><a href="https://cplusplus.github.io/CWG/issues/1991.html">1991</a></td> +    <td>[<a href="https://wg21.link/class.inhctor">class.inhctor</a>]</td>      <td>CD4</td>      <td>Inheriting constructors vs default arguments</td>      <td class="full" align="center">Clang 3.9</td>    </tr>    <tr id="1992">      <td><a href="https://cplusplus.github.io/CWG/issues/1992.html">1992</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD4</td>      <td><TT>new (std::nothrow) int[N]</TT> can throw</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1993">      <td><a href="https://cplusplus.github.io/CWG/issues/1993.html">1993</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>open</td>      <td>Use of <TT>template<></TT> defining member of explicit specialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1994">      <td><a href="https://cplusplus.github.io/CWG/issues/1994.html">1994</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>dup</td>      <td>Confusing wording regarding multiple <TT>template<></TT> prefixes</td>      <td class="unknown" align="center">Duplicate of <a href="#529">529</a></td>    </tr>    <tr id="1995">      <td><a href="https://cplusplus.github.io/CWG/issues/1995.html">1995</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td><I>exception-specification</I>s and non-type template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="1996">      <td><a href="https://cplusplus.github.io/CWG/issues/1996.html">1996</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>drafting</td>      <td>Reference list-initialization ignores conversion functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="1997">      <td><a href="https://cplusplus.github.io/CWG/issues/1997.html">1997</a></td> +    <td>[<a href="https://wg21.link/basic.indet">basic.indet</a>]</td>      <td>CD7</td>      <td>Placement new and previous initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1998">      <td><a href="https://cplusplus.github.io/CWG/issues/1998.html">1998</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>NAD</td>      <td>Additional sources of xvalue expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="1999">      <td><a href="https://cplusplus.github.io/CWG/issues/1999.html">1999</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD4</td>      <td>Representation of source characters as universal-character-names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2000">      <td><a href="https://cplusplus.github.io/CWG/issues/2000.html">2000</a></td> +    <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>      <td>CD4</td>      <td><I>header-name</I> outside <TT>#include</TT> directive</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2001">      <td><a href="https://cplusplus.github.io/CWG/issues/2001.html">2001</a></td> +    <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>      <td>CD4</td>      <td><I>non-directive</I> is underspecified</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2002">      <td><a href="https://cplusplus.github.io/CWG/issues/2002.html">2002</a></td> +    <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>      <td>open</td>      <td>White space within preprocessing directives</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2003">      <td><a href="https://cplusplus.github.io/CWG/issues/2003.html">2003</a></td> +    <td>[<a href="https://wg21.link/cpp.replace">cpp.replace</a>]</td>      <td>drafting</td>      <td>Zero-argument macros incorrectly specified</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2004">      <td><a href="https://cplusplus.github.io/CWG/issues/2004.html">2004</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Unions with mutable members in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2005">      <td><a href="https://cplusplus.github.io/CWG/issues/2005.html">2005</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Incorrect <TT>constexpr</TT> reference initialization requirements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2006">      <td><a href="https://cplusplus.github.io/CWG/issues/2006.html">2006</a></td> +    <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>      <td>CD4</td>      <td>Cv-qualified <TT>void</TT> types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2007">      <td><a href="https://cplusplus.github.io/CWG/issues/2007.html">2007</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>CD6</td>      <td>Argument-dependent lookup for <TT>operator=</TT></td>      <td class="full" align="center">Clang 3.4</td>    </tr>    <tr id="2008">      <td><a href="https://cplusplus.github.io/CWG/issues/2008.html">2008</a></td> +    <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>      <td>CD4</td>      <td>Default <I>template-argument</I>s underspecified</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2009">      <td><a href="https://cplusplus.github.io/CWG/issues/2009.html">2009</a></td> +    <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>      <td>CD6</td>      <td>Unclear specification of class scope</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="2010">      <td><a href="https://cplusplus.github.io/CWG/issues/2010.html">2010</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td><I>exception-specification</I>s and conversion operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2011">      <td><a href="https://cplusplus.github.io/CWG/issues/2011.html">2011</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++17</td>      <td>Unclear effect of reference capture of reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2012">      <td><a href="https://cplusplus.github.io/CWG/issues/2012.html">2012</a></td> +    <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>      <td>CD4</td>      <td>Lifetime of references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2013">      <td><a href="https://cplusplus.github.io/CWG/issues/2013.html">2013</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>drafting</td>      <td>Pointer subtraction in large array</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2014">      <td><a href="https://cplusplus.github.io/CWG/issues/2014.html">2014</a></td> +    <td>[<a href="https://wg21.link/new.delete.array">new.delete.array</a>]</td>      <td>NAD</td>      <td>Unneeded deallocation signatures</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2015">      <td><a href="https://cplusplus.github.io/CWG/issues/2015.html">2015</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.delete">dcl.fct.def.delete</a>]</td>      <td>CD4</td>      <td>odr-use of deleted virtual functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2016">      <td><a href="https://cplusplus.github.io/CWG/issues/2016.html">2016</a></td> +    <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>      <td>CD4</td>      <td>Confusing wording in description of conversion function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2017">      <td><a href="https://cplusplus.github.io/CWG/issues/2017.html">2017</a></td> +    <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>      <td>CD4</td>      <td>Flowing off end is not equivalent to no-expression return</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2018">      <td><a href="https://cplusplus.github.io/CWG/issues/2018.html">2018</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>dup</td>      <td>Qualification conversion vs reference binding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2019">      <td><a href="https://cplusplus.github.io/CWG/issues/2019.html">2019</a></td> +    <td>[<a href="https://wg21.link/basic.stc.general">basic.stc.general</a>]</td>      <td>CD4</td>      <td>Member references omitted from description of storage duration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2020">      <td><a href="https://cplusplus.github.io/CWG/issues/2020.html">2020</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>Inadequate description of odr-use of implicitly-invoked functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2021">      <td><a href="https://cplusplus.github.io/CWG/issues/2021.html">2021</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>dup</td>      <td>Function template redeclaration via alias template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2022">      <td><a href="https://cplusplus.github.io/CWG/issues/2022.html">2022</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Copy elision in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2023">      <td><a href="https://cplusplus.github.io/CWG/issues/2023.html">2023</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>drafting</td>      <td>Composite reference result type of conditional operator</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2024">      <td><a href="https://cplusplus.github.io/CWG/issues/2024.html">2024</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD4</td>      <td>Dependent types and unexpanded parameter packs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2025">      <td><a href="https://cplusplus.github.io/CWG/issues/2025.html">2025</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>dup</td>      <td>Declaration matching via alias templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2026">      <td><a href="https://cplusplus.github.io/CWG/issues/2026.html">2026</a></td> +    <td>[<a href="https://wg21.link/basic.start">basic.start</a>]</td>      <td>CD4</td>      <td>Zero-initialization and <TT>constexpr</TT></td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="2027">      <td><a href="https://cplusplus.github.io/CWG/issues/2027.html">2027</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>CD4</td>      <td>Unclear requirements for multiple <TT>alignas</TT> specifiers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2028">      <td><a href="https://cplusplus.github.io/CWG/issues/2028.html">2028</a></td> +    <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>      <td>drafting</td>      <td>Converting constructors in rvalue reference initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2029">      <td><a href="https://cplusplus.github.io/CWG/issues/2029.html">2029</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>dup</td>      <td>Abstract class return type in <TT>decltype</TT> operand</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2030">      <td><a href="https://cplusplus.github.io/CWG/issues/2030.html">2030</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>NAD</td>      <td>Access of injected-class-name with template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2031">      <td><a href="https://cplusplus.github.io/CWG/issues/2031.html">2031</a></td> +    <td>[<a href="https://wg21.link/diff.cpp03.expr">diff.cpp03.expr</a>]</td>      <td>CD4</td>      <td>Missing incompatibility for <TT>&&</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2032">      <td><a href="https://cplusplus.github.io/CWG/issues/2032.html">2032</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD4</td>      <td>Default <I>template-argument</I>s of variable templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2033">      <td><a href="https://cplusplus.github.io/CWG/issues/2033.html">2033</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>CD4</td>      <td>Redundant restriction on partial specialization argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2034">      <td><a href="https://cplusplus.github.io/CWG/issues/2034.html">2034</a></td> +    <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>      <td>NAD</td>      <td>Deprecating <TT>uncaught_exception()</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2035">      <td><a href="https://cplusplus.github.io/CWG/issues/2035.html">2035</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.match">temp.spec.partial.match</a>]</td>      <td>CD3</td>      <td>Multi-section example is confusing</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2036">      <td><a href="https://cplusplus.github.io/CWG/issues/2036.html">2036</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>NAD</td>      <td>Refactoring <I>parameters-and-qualifiers</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2037">      <td><a href="https://cplusplus.github.io/CWG/issues/2037.html">2037</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>drafting</td>      <td>Alias templates and template declaration matching</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2038">      <td><a href="https://cplusplus.github.io/CWG/issues/2038.html">2038</a></td> +    <td>[<a href="https://wg21.link/diff.cpp14">diff.cpp14</a>]</td>      <td>CD4</td>      <td>Document C++14 incompatibility of new braced deduction rule</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2039">      <td><a href="https://cplusplus.github.io/CWG/issues/2039.html">2039</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Constant conversions to <TT>bool</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2040">      <td><a href="https://cplusplus.github.io/CWG/issues/2040.html">2040</a></td> +    <td>[<a href="https://wg21.link/dcl.decl">dcl.decl</a>]</td>      <td>CD4</td>      <td><I>trailing-return-type</I> no longer ambiguous</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2041">      <td><a href="https://cplusplus.github.io/CWG/issues/2041.html">2041</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD4</td>      <td>Namespace for explicit class template specialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2042">      <td><a href="https://cplusplus.github.io/CWG/issues/2042.html">2042</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>review</td>      <td>Exceptions and deallocation functions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2043">      <td><a href="https://cplusplus.github.io/CWG/issues/2043.html">2043</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>drafting</td>      <td>Generalized template arguments and array-to-pointer decay</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2044">      <td><a href="https://cplusplus.github.io/CWG/issues/2044.html">2044</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD4</td>      <td><TT>decltype(auto)</TT> and <TT>void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2045">      <td><a href="https://cplusplus.github.io/CWG/issues/2045.html">2045</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>CD5</td>      <td>“Identical” template parameter lists</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2046">      <td><a href="https://cplusplus.github.io/CWG/issues/2046.html">2046</a></td> +    <td>[<a href="https://wg21.link/intro.multithread">intro.multithread</a>]</td>      <td>C++17</td>      <td>Incomplete thread specifications</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2047">      <td><a href="https://cplusplus.github.io/CWG/issues/2047.html">2047</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD4</td>      <td>Coordinating “throws anything” specifications</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2048">      <td><a href="https://cplusplus.github.io/CWG/issues/2048.html">2048</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>open</td>      <td>C-style casts that cast away constness vs <TT>static_cast</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2049">      <td><a href="https://cplusplus.github.io/CWG/issues/2049.html">2049</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>CD7</td>      <td>List initializer in non-type template default argument</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2050">      <td><a href="https://cplusplus.github.io/CWG/issues/2050.html">2050</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>NAD</td>      <td>Consolidate specification of linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2051">      <td><a href="https://cplusplus.github.io/CWG/issues/2051.html">2051</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD5</td>      <td>Simplifying alias rules</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2052">      <td><a href="https://cplusplus.github.io/CWG/issues/2052.html">2052</a></td> +    <td>[<a href="https://wg21.link/over.oper">over.oper</a>]</td>      <td>CD4</td>      <td>Template argument deduction vs overloaded operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2053">      <td><a href="https://cplusplus.github.io/CWG/issues/2053.html">2053</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>C++20</td>      <td><TT>auto</TT> in non-generic lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2054">      <td><a href="https://cplusplus.github.io/CWG/issues/2054.html">2054</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD7</td>      <td>Missing description of class SFINAE</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2055">      <td><a href="https://cplusplus.github.io/CWG/issues/2055.html">2055</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>drafting</td>      <td>Explicitly-specified non-deduced parameter packs</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2056">      <td><a href="https://cplusplus.github.io/CWG/issues/2056.html">2056</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>open</td>      <td>Member function calls in partially-initialized class objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2057">      <td><a href="https://cplusplus.github.io/CWG/issues/2057.html">2057</a></td> +    <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>      <td>drafting</td>      <td>Template template arguments with default arguments</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2058">      <td><a href="https://cplusplus.github.io/CWG/issues/2058.html">2058</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD6</td>      <td>More errors from internal-linkage namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2059">      <td><a href="https://cplusplus.github.io/CWG/issues/2059.html">2059</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD5</td>      <td>Linkage and deduced return types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2060">      <td><a href="https://cplusplus.github.io/CWG/issues/2060.html">2060</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>NAD</td>      <td>Deduced return type for explicit specialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2061">      <td><a href="https://cplusplus.github.io/CWG/issues/2061.html">2061</a></td> +    <td>[<a href="https://wg21.link/namespace.def">namespace.def</a>]</td>      <td>CD4</td>      <td>Inline namespace after simplifications</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="2062">      <td><a href="https://cplusplus.github.io/CWG/issues/2062.html">2062</a></td> +    <td>[<a href="https://wg21.link/temp.class">temp.class</a>]</td>      <td>CD6</td>      <td>Class template redeclaration requirements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2063">      <td><a href="https://cplusplus.github.io/CWG/issues/2063.html">2063</a></td> +    <td>[<a href="https://wg21.link/basic.scope.declarative">basic.scope.declarative</a>]</td>      <td>CD4</td>      <td>Type/nontype hiding in class scope</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2064">      <td><a href="https://cplusplus.github.io/CWG/issues/2064.html">2064</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>CD4</td>      <td>Conflicting specifications for dependent <I>decltype-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2065">      <td><a href="https://cplusplus.github.io/CWG/issues/2065.html">2065</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD6</td>      <td>Current instantiation of a partial specialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2066">      <td><a href="https://cplusplus.github.io/CWG/issues/2066.html">2066</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD4</td>      <td>Does type-dependent imply value-dependent?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2067">      <td><a href="https://cplusplus.github.io/CWG/issues/2067.html">2067</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>open</td>      <td>Generated variadic templates requiring empty pack</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2068">      <td><a href="https://cplusplus.github.io/CWG/issues/2068.html">2068</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD4</td>      <td>When can/must a defaulted virtual destructor be defined?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2069">      <td><a href="https://cplusplus.github.io/CWG/issues/2069.html">2069</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD4</td>      <td>Do destructors have names?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2070">      <td><a href="https://cplusplus.github.io/CWG/issues/2070.html">2070</a></td> +    <td>[<a href="https://wg21.link/class.qual">class.qual</a>]</td>      <td>CD6</td>      <td><I>using-declaration</I> with dependent <I>nested-name-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2071">      <td><a href="https://cplusplus.github.io/CWG/issues/2071.html">2071</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD4</td>      <td><TT>typedef</TT> with no declarator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2072">      <td><a href="https://cplusplus.github.io/CWG/issues/2072.html">2072</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>C++23</td>      <td>Default argument instantiation for member functions of templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2073">      <td><a href="https://cplusplus.github.io/CWG/issues/2073.html">2073</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>open</td>      <td>Allocating memory for exception objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2074">      <td><a href="https://cplusplus.github.io/CWG/issues/2074.html">2074</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>drafting</td>      <td>Type-dependence of local class of function template</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2075">      <td><a href="https://cplusplus.github.io/CWG/issues/2075.html">2075</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>CD4</td>      <td>Passing short initializer lists to array reference parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2076">      <td><a href="https://cplusplus.github.io/CWG/issues/2076.html">2076</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>CD4</td>      <td>List-initialization of arguments for constructor parameters</td>      <td class="full" align="center">Clang 13</td>    </tr>    <tr class="open" id="2077">      <td><a href="https://cplusplus.github.io/CWG/issues/2077.html">2077</a></td> +    <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>      <td>drafting</td>      <td>Overload resolution and invalid rvalue-reference initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2078">      <td><a href="https://cplusplus.github.io/CWG/issues/2078.html">2078</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>NAD</td>      <td>Name lookup of <I>mem-initilizer-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2079">      <td><a href="https://cplusplus.github.io/CWG/issues/2079.html">2079</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>CD4</td>      <td><TT>[[</TT> appearing in a <I>balanced-token-seq</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2080">      <td><a href="https://cplusplus.github.io/CWG/issues/2080.html">2080</a></td> +    <td>[<a href="https://wg21.link/class.union">class.union</a>]</td>      <td>CD5</td>      <td>Example with empty anonymous union member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2081">      <td><a href="https://cplusplus.github.io/CWG/issues/2081.html">2081</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD5</td>      <td>Deduced return type in redeclaration or specialization of function template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2082">      <td><a href="https://cplusplus.github.io/CWG/issues/2082.html">2082</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD4</td>      <td>Referring to parameters in unevaluated operands of default arguments</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="2083">      <td><a href="https://cplusplus.github.io/CWG/issues/2083.html">2083</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>Incorrect cases of odr-use</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="2084">      <td><a href="https://cplusplus.github.io/CWG/issues/2084.html">2084</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD4</td>      <td>NSDMIs and deleted union default constructors</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> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD4</td>      <td>Invalid example of adding special member function via default argument</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2086">      <td><a href="https://cplusplus.github.io/CWG/issues/2086.html">2086</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>drafting</td>      <td>Reference odr-use vs implicit capture</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2087">      <td><a href="https://cplusplus.github.io/CWG/issues/2087.html">2087</a></td> +    <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>      <td>NAD</td>      <td>Left shift of negative value by zero bits</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2088">      <td><a href="https://cplusplus.github.io/CWG/issues/2088.html">2088</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>CD5</td>      <td>Late tiebreakers in partial ordering</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2089">      <td><a href="https://cplusplus.github.io/CWG/issues/2089.html">2089</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>drafting</td>      <td>Restricting selection of builtin overloaded operators</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2090">      <td><a href="https://cplusplus.github.io/CWG/issues/2090.html">2090</a></td> +    <td>[<a href="https://wg21.link/temp.dep.temp">temp.dep.temp</a>]</td>      <td>open</td>      <td>Dependency via non-dependent base class</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2091">      <td><a href="https://cplusplus.github.io/CWG/issues/2091.html">2091</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD4</td>      <td>Deducing reference non-type template arguments</td>      <td class="full" align="center">Clang 10</td>    </tr>    <tr id="2092">      <td><a href="https://cplusplus.github.io/CWG/issues/2092.html">2092</a></td> +    <td>[<a href="https://wg21.link/temp.over">temp.over</a>]</td>      <td>CD5</td>      <td>Deduction failure and overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2093">      <td><a href="https://cplusplus.github.io/CWG/issues/2093.html">2093</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>CD4</td>      <td>Qualification conversion for pointer-to-member handler matching</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2094">      <td><a href="https://cplusplus.github.io/CWG/issues/2094.html">2094</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++17</td>      <td>Trivial copy/move constructor for class with volatile member</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr id="2095">      <td><a href="https://cplusplus.github.io/CWG/issues/2095.html">2095</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD4</td>      <td>Capturing rvalue references to functions by copy</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2096">      <td><a href="https://cplusplus.github.io/CWG/issues/2096.html">2096</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>CD4</td>      <td>Constraints on literal unions</td>      <td class="full" align="center">Duplicate of <a href="#2598">2598</a></td>    </tr>    <tr class="open" id="2097">      <td><a href="https://cplusplus.github.io/CWG/issues/2097.html">2097</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda">expr.prim.lambda</a>]</td>      <td>extension</td>      <td>Lambdas and <TT>noreturn</TT> attribute</td>      <td align="center">Extension</td>    </tr>    <tr id="2098">      <td><a href="https://cplusplus.github.io/CWG/issues/2098.html">2098</a></td> +    <td>[<a href="https://wg21.link/except.uncaught">except.uncaught</a>]</td>      <td>CD4</td>      <td>Is <TT>uncaught_exceptions()</TT> per-thread?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2099">      <td><a href="https://cplusplus.github.io/CWG/issues/2099.html">2099</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>CD4</td>      <td>Inferring the bound of an array static data member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2100">      <td><a href="https://cplusplus.github.io/CWG/issues/2100.html">2100</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>C++17</td>      <td>Value-dependent address of static data member of class template</td>      <td class="full" align="center">Clang 12</td>    </tr>    <tr id="2101">      <td><a href="https://cplusplus.github.io/CWG/issues/2101.html">2101</a></td> +    <td>[<a href="https://wg21.link/temp.dep">temp.dep</a>]</td>      <td>CD4</td>      <td>Incorrect description of type- and value-dependence</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2102">      <td><a href="https://cplusplus.github.io/CWG/issues/2102.html">2102</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD7</td>      <td>Constructor checking in <I>new-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2103">      <td><a href="https://cplusplus.github.io/CWG/issues/2103.html">2103</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>Lvalue-to-rvalue conversion is irrelevant in odr-use of a reference</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="2104">      <td><a href="https://cplusplus.github.io/CWG/issues/2104.html">2104</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD4</td>      <td>Internal-linkage <TT>constexpr</TT> references and ODR requirements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2105">      <td><a href="https://cplusplus.github.io/CWG/issues/2105.html">2105</a></td> +    <td>[<a href="https://wg21.link/temp.arg">temp.arg</a>]</td>      <td>open</td>      <td>When do the arguments for a parameter pack end?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2106">      <td><a href="https://cplusplus.github.io/CWG/issues/2106.html">2106</a></td> +    <td>[<a href="https://wg21.link/temp.arg.type">temp.arg.type</a>]</td>      <td>CD4</td>      <td>Unclear restrictions on use of function-type template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2107">      <td><a href="https://cplusplus.github.io/CWG/issues/2107.html">2107</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD4</td>      <td>Lifetime of temporaries for default arguments in array copying</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2108">      <td><a href="https://cplusplus.github.io/CWG/issues/2108.html">2108</a></td> +    <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>      <td>drafting</td>      <td>Conversions to non-class prvalues in reference initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2109">      <td><a href="https://cplusplus.github.io/CWG/issues/2109.html">2109</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD4</td>      <td>Value dependence underspecified</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2110">      <td><a href="https://cplusplus.github.io/CWG/issues/2110.html">2110</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>drafting</td>      <td>Overload resolution for base class conversion and reference/non-reference</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2111">      <td><a href="https://cplusplus.github.io/CWG/issues/2111.html">2111</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>NAD</td>      <td>Array temporaries in reference binding</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2112">      <td><a href="https://cplusplus.github.io/CWG/issues/2112.html">2112</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD5</td>      <td><TT>new auto{x}</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2113">      <td><a href="https://cplusplus.github.io/CWG/issues/2113.html">2113</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning">dcl.meaning</a>]</td>      <td>CD4</td>      <td>Incompete specification of types for declarators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2114">      <td><a href="https://cplusplus.github.io/CWG/issues/2114.html">2114</a></td> +    <td>[<a href="https://wg21.link/diff.cpp11.dcl.decl">diff.cpp11.dcl.decl</a>]</td>      <td>CD3</td>      <td>Missing description of incompatibility from aggregate NSDMIs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2115">      <td><a href="https://cplusplus.github.io/CWG/issues/2115.html">2115</a></td> +    <td>[<a href="https://wg21.link/stmt.jump">stmt.jump</a>]</td>      <td>open</td>      <td>Order of implicit destruction vs release of automatic storage</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2116">      <td><a href="https://cplusplus.github.io/CWG/issues/2116.html">2116</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++17</td>      <td>Direct or copy initialization for omitted aggregate initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2117">      <td><a href="https://cplusplus.github.io/CWG/issues/2117.html">2117</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>NAD</td>      <td>Explicit specializations and <TT>constexpr</TT> function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2118">      <td><a href="https://cplusplus.github.io/CWG/issues/2118.html">2118</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>open</td>      <td>Stateful metaprogramming via friend injection</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2119">      <td><a href="https://cplusplus.github.io/CWG/issues/2119.html">2119</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>NAD</td>      <td>Disambiguation of multi-level covariant return type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2120">      <td><a href="https://cplusplus.github.io/CWG/issues/2120.html">2120</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD4</td>      <td>Array as first non-static data member in standard-layout class</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="2121">      <td><a href="https://cplusplus.github.io/CWG/issues/2121.html">2121</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.general">expr.prim.lambda.general</a>]</td>      <td>CD6</td>      <td>More flexible lambda syntax</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2122">      <td><a href="https://cplusplus.github.io/CWG/issues/2122.html">2122</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD4</td>      <td>Glvalues of <TT>void</TT> type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2123">      <td><a href="https://cplusplus.github.io/CWG/issues/2123.html">2123</a></td> +    <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>      <td>open</td>      <td>Omitted constant initialization of local static variables</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2124">      <td><a href="https://cplusplus.github.io/CWG/issues/2124.html">2124</a></td> +    <td>[<a href="https://wg21.link/defns.signature.member.templ">defns.signature.member.templ</a>]</td>      <td>CD4</td>      <td>Signature of constructor template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2125">      <td><a href="https://cplusplus.github.io/CWG/issues/2125.html">2125</a></td> +    <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>      <td>NAD</td>      <td>Copy elision and comma operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2126">      <td><a href="https://cplusplus.github.io/CWG/issues/2126.html">2126</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++20</td>      <td>Lifetime-extended temporaries in constant expressions</td>      <td class="full" align="center">Clang 12</td>    </tr>    <tr class="open" id="2127">      <td><a href="https://cplusplus.github.io/CWG/issues/2127.html">2127</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>drafting</td>      <td>Partial specialization and nullptr</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2128">      <td><a href="https://cplusplus.github.io/CWG/issues/2128.html">2128</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>open</td>      <td>Imprecise rule for reference member initializer</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2129">      <td><a href="https://cplusplus.github.io/CWG/issues/2129.html">2129</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Non-object prvalues and constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2130">      <td><a href="https://cplusplus.github.io/CWG/issues/2130.html">2130</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD4</td>      <td>Over-aligned types in <I>new-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2131">      <td><a href="https://cplusplus.github.io/CWG/issues/2131.html">2131</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>drafting</td>      <td>Ambiguity with <I>opaque-enum-declaration</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2132">      <td><a href="https://cplusplus.github.io/CWG/issues/2132.html">2132</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>NAD</td>      <td>Deprecated default generated copy constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2133">      <td><a href="https://cplusplus.github.io/CWG/issues/2133.html">2133</a></td> +    <td>[<a href="https://wg21.link/conv.fctptr">conv.fctptr</a>]</td>      <td>CD5</td>      <td>Converting <TT>std::nullptr_t</TT> to <TT>bool</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2134">      <td><a href="https://cplusplus.github.io/CWG/issues/2134.html">2134</a></td> +    <td>[<a href="https://wg21.link/expr.prim.general">expr.prim.general</a>]</td>      <td>NAD</td>      <td>Objectless references to non-static member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2135">      <td><a href="https://cplusplus.github.io/CWG/issues/2135.html">2135</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>NAD</td>      <td><I>mem-initializer</I>s for virtual bases of abstract classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2136">      <td><a href="https://cplusplus.github.io/CWG/issues/2136.html">2136</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>NAD</td>      <td>Argument-dependent lookup and initializer lists</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2137">      <td><a href="https://cplusplus.github.io/CWG/issues/2137.html">2137</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD4</td>      <td>List-initialization from object of same type</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2138">      <td><a href="https://cplusplus.github.io/CWG/issues/2138.html">2138</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>NAD</td>      <td>Explicit member specialization vs implicit instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2139">      <td><a href="https://cplusplus.github.io/CWG/issues/2139.html">2139</a></td> +    <td>[<a href="https://wg21.link/conv.fpint">conv.fpint</a>]</td>      <td>NAD</td>      <td>Floating-point requirements for integer representation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2140">      <td><a href="https://cplusplus.github.io/CWG/issues/2140.html">2140</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>CD4</td>      <td>Lvalue-to-rvalue conversion of <TT>std::nullptr_t</TT></td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2141">      <td><a href="https://cplusplus.github.io/CWG/issues/2141.html">2141</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD4</td>      <td>Ambiguity in <I>new-expression</I> with <I>elaborated-type-specifier</I></td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr id="2142">      <td><a href="https://cplusplus.github.io/CWG/issues/2142.html">2142</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>NAD</td>      <td>Missing definition of associated classes and namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2143">      <td><a href="https://cplusplus.github.io/CWG/issues/2143.html">2143</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>C++17</td>      <td>Value-dependency via injected-class-name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2144">      <td><a href="https://cplusplus.github.io/CWG/issues/2144.html">2144</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>CD7</td>      <td>Function/variable declaration ambiguity</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2145">      <td><a href="https://cplusplus.github.io/CWG/issues/2145.html">2145</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>CD4</td>      <td>Parenthesized declarator in function definition</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2146">      <td><a href="https://cplusplus.github.io/CWG/issues/2146.html">2146</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>CD4</td>      <td>Scalar object vs memory location in definition of “unsequenced”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2147">      <td><a href="https://cplusplus.github.io/CWG/issues/2147.html">2147</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD4</td>      <td>Initializer-list arguments and pack deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2148">      <td><a href="https://cplusplus.github.io/CWG/issues/2148.html">2148</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>drafting</td>      <td>Thread storage duration and order of initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2149">      <td><a href="https://cplusplus.github.io/CWG/issues/2149.html">2149</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD7</td>      <td>Brace elision and array length deduction</td>      <td class="full" align="center">Clang 3.1</td>    </tr>    <tr id="2150">      <td><a href="https://cplusplus.github.io/CWG/issues/2150.html">2150</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD3</td>      <td>Initializer list array lifetime</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2151">      <td><a href="https://cplusplus.github.io/CWG/issues/2151.html">2151</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>CD4</td>      <td>Exception object is not created</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2152">      <td><a href="https://cplusplus.github.io/CWG/issues/2152.html">2152</a></td> +    <td>[<a href="https://wg21.link/lex.ext">lex.ext</a>]</td>      <td>NAD</td>      <td>Can an alternative token be used as a <I>ud-suffix</I>?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2153">      <td><a href="https://cplusplus.github.io/CWG/issues/2153.html">2153</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD4</td>      <td><I>pure-specifier</I> in friend declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2154">      <td><a href="https://cplusplus.github.io/CWG/issues/2154.html">2154</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD4</td>      <td>Ambiguity of <I>pure-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2155">      <td><a href="https://cplusplus.github.io/CWG/issues/2155.html">2155</a></td> +    <td>[<a href="https://wg21.link/namespace.memdef">namespace.memdef</a>]</td>      <td>C++17</td>      <td>Defining classes and enumerations via <I>using-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2156">      <td><a href="https://cplusplus.github.io/CWG/issues/2156.html">2156</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>CD4</td>      <td>Definition of enumeration declared by <I>using-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2157">      <td><a href="https://cplusplus.github.io/CWG/issues/2157.html">2157</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>CD4</td>      <td>Further disambiguation of enumeration <I>elaborated-type-specifier</I></td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr class="open" id="2158">      <td><a href="https://cplusplus.github.io/CWG/issues/2158.html">2158</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>drafting</td>      <td>Polymorphic behavior during destruction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2159">      <td><a href="https://cplusplus.github.io/CWG/issues/2159.html">2159</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>NAD</td>      <td>Lambda capture and local <TT>thread_local</TT> variables</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2160">      <td><a href="https://cplusplus.github.io/CWG/issues/2160.html">2160</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>open</td>      <td>Issues with partial ordering</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2161">      <td><a href="https://cplusplus.github.io/CWG/issues/2161.html">2161</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>NAD</td>      <td>Explicit instantiation declaration and “preceding initialization”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2162">      <td><a href="https://cplusplus.github.io/CWG/issues/2162.html">2162</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD3</td>      <td>Capturing <TT>this</TT> by reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2163">      <td><a href="https://cplusplus.github.io/CWG/issues/2163.html">2163</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD4</td>      <td>Labels in <TT>constexpr</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2164">      <td><a href="https://cplusplus.github.io/CWG/issues/2164.html">2164</a></td> +    <td>[<a href="https://wg21.link/basic.scope.hiding">basic.scope.hiding</a>]</td>      <td>CD5</td>      <td>Name hiding and <I>using-directive</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2165">      <td><a href="https://cplusplus.github.io/CWG/issues/2165.html">2165</a></td> +    <td>[<a href="https://wg21.link/basic.scope.declarative">basic.scope.declarative</a>]</td>      <td>CD6</td>      <td>Namespaces, declarative regions, and translation units</td>      <td class="na" align="center">N/A</td>    </tr>    <tr class="open" id="2166">      <td><a href="https://cplusplus.github.io/CWG/issues/2166.html">2166</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>drafting</td>      <td>Unclear meaning of “undefined <TT>constexpr</TT> function”</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2167">      <td><a href="https://cplusplus.github.io/CWG/issues/2167.html">2167</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD4</td>      <td>Non-member references with lifetimes within the current evaluation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2168">      <td><a href="https://cplusplus.github.io/CWG/issues/2168.html">2168</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>review</td>      <td>Narrowing conversions and +/- infinity</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2169">      <td><a href="https://cplusplus.github.io/CWG/issues/2169.html">2169</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>open</td>      <td>Narrowing conversions and overload resolution</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2170">      <td><a href="https://cplusplus.github.io/CWG/issues/2170.html">2170</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>Unclear definition of odr-use for arrays</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2171">      <td><a href="https://cplusplus.github.io/CWG/issues/2171.html">2171</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD4</td>      <td>Triviality of copy constructor with less-qualified parameter</td>      <td class="full" align="center">Clang 15</td>    </tr>    <tr class="open" id="2172">      <td><a href="https://cplusplus.github.io/CWG/issues/2172.html">2172</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>drafting</td>      <td>Multiple exceptions with one exception object</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2173">      <td><a href="https://cplusplus.github.io/CWG/issues/2173.html">2173</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>open</td>      <td>Partial specialization with non-deduced contexts</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2174">      <td><a href="https://cplusplus.github.io/CWG/issues/2174.html">2174</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>C++17</td>      <td>Unclear rules for friend definitions in templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2175">      <td><a href="https://cplusplus.github.io/CWG/issues/2175.html">2175</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>CD4</td>      <td>Ambiguity with attribute in conversion operator declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2176">      <td><a href="https://cplusplus.github.io/CWG/issues/2176.html">2176</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD4</td>      <td>Destroying the returned object when a destructor throws</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2177">      <td><a href="https://cplusplus.github.io/CWG/issues/2177.html">2177</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD5</td>      <td>Placement <TT>operator delete</TT> and parameter copies</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2178">      <td><a href="https://cplusplus.github.io/CWG/issues/2178.html">2178</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>NAD</td>      <td>Substitution of dependent template arguments in default template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2179">      <td><a href="https://cplusplus.github.io/CWG/issues/2179.html">2179</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>drafting</td>      <td>Required diagnostic for partial specialization after first use</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2180">      <td><a href="https://cplusplus.github.io/CWG/issues/2180.html">2180</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>CD4</td>      <td>Virtual bases in destructors and defaulted assignment operators</td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="2181">      <td><a href="https://cplusplus.github.io/CWG/issues/2181.html">2181</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>C++20</td>      <td>Normative requirements in an informative Annex</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2182">      <td><a href="https://cplusplus.github.io/CWG/issues/2182.html">2182</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>drafting</td>      <td>Pointer arithmetic in array-like containers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2183">      <td><a href="https://cplusplus.github.io/CWG/issues/2183.html">2183</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td>Problems in description of potential exceptions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2184">      <td><a href="https://cplusplus.github.io/CWG/issues/2184.html">2184</a></td> +    <td>[<a href="https://wg21.link/diff.expr">diff.expr</a>]</td>      <td>CD4</td>      <td>Missing C compatibility entry for decrement of <TT>bool</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2185">      <td><a href="https://cplusplus.github.io/CWG/issues/2185.html">2185</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD6</td>      <td>Cv-qualified numeric types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2186">      <td><a href="https://cplusplus.github.io/CWG/issues/2186.html">2186</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++20</td>      <td>Unclear point that “preceding initialization” must precede</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2187">      <td><a href="https://cplusplus.github.io/CWG/issues/2187.html">2187</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>drafting</td>      <td>Protected members and access via <I>qualified-id</I></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2188">      <td><a href="https://cplusplus.github.io/CWG/issues/2188.html">2188</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>open</td>      <td><I>empty-declaration</I> grammar ambiguity</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2189">      <td><a href="https://cplusplus.github.io/CWG/issues/2189.html">2189</a></td> +    <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>      <td>open</td>      <td>Surrogate call template</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2190">      <td><a href="https://cplusplus.github.io/CWG/issues/2190.html">2190</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>open</td>      <td>Insufficient specification of <TT>__has_include</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2191">      <td><a href="https://cplusplus.github.io/CWG/issues/2191.html">2191</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>C++17</td>      <td>Incorrect result for <TT>noexcept(typeid(v))</TT></td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr class="open" id="2192">      <td><a href="https://cplusplus.github.io/CWG/issues/2192.html">2192</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Constant expressions and order-of-eval undefined behavior</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2193">      <td><a href="https://cplusplus.github.io/CWG/issues/2193.html">2193</a></td> +    <td>[<a href="https://wg21.link/numeric.limits.members">numeric.limits.members</a>]</td>      <td>NAD</td>      <td><TT>numeric_limits<int>::radix</TT> and <TT>digits</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2194">      <td><a href="https://cplusplus.github.io/CWG/issues/2194.html">2194</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>drafting</td>      <td>Impossible case in list initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2195">      <td><a href="https://cplusplus.github.io/CWG/issues/2195.html">2195</a></td> +    <td>[<a href="https://wg21.link/dcl.type.cv">dcl.type.cv</a>]</td>      <td>open</td>      <td>Unsolicited reading of trailing volatile members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2196">      <td><a href="https://cplusplus.github.io/CWG/issues/2196.html">2196</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>C++17</td>      <td>Zero-initialization with virtual base classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2197">      <td><a href="https://cplusplus.github.io/CWG/issues/2197.html">2197</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>C++17</td>      <td>Overload resolution and deleted special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2198">      <td><a href="https://cplusplus.github.io/CWG/issues/2198.html">2198</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>C++17</td>      <td>Linkage of enumerators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2199">      <td><a href="https://cplusplus.github.io/CWG/issues/2199.html">2199</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD6</td>      <td>Typedefs and tags</td>      <td class="full" align="center">Clang 3.8</td>    </tr>    <tr id="2200">      <td><a href="https://cplusplus.github.io/CWG/issues/2200.html">2200</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>NAD</td>      <td>Conversions in template argument deduction</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2201">      <td><a href="https://cplusplus.github.io/CWG/issues/2201.html">2201</a></td> +    <td>[<a href="https://wg21.link/basic.type.qualifier">basic.type.qualifier</a>]</td>      <td>C++17</td>      <td>Cv-qualification of array types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2202">      <td><a href="https://cplusplus.github.io/CWG/issues/2202.html">2202</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>drafting</td>      <td>When does default argument instantiation occur?</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2203">      <td><a href="https://cplusplus.github.io/CWG/issues/2203.html">2203</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>drafting</td>      <td>Defaulted copy/move constructors and UDCs</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2204">      <td><a href="https://cplusplus.github.io/CWG/issues/2204.html">2204</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>NAD</td>      <td>Naming delegated constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2205">      <td><a href="https://cplusplus.github.io/CWG/issues/2205.html">2205</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>C++17</td>      <td>Restrictions on use of <TT>alignas</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2206">      <td><a href="https://cplusplus.github.io/CWG/issues/2206.html">2206</a></td> +    <td>[<a href="https://wg21.link/expr">expr</a>]</td>      <td>C++17</td>      <td>Composite type of object and function pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2207">      <td><a href="https://cplusplus.github.io/CWG/issues/2207.html">2207</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>CD5</td>      <td>Alignment of allocation function return value</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2208">      <td><a href="https://cplusplus.github.io/CWG/issues/2208.html">2208</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>NAD</td>      <td><I>static_assert-declaration</I> does not declare a member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2209">      <td><a href="https://cplusplus.github.io/CWG/issues/2209.html">2209</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>NAD</td>      <td>Destruction of constructed array elements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2210">      <td><a href="https://cplusplus.github.io/CWG/issues/2210.html">2210</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>NAD</td>      <td>Principal/target constructor confusion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2211">      <td><a href="https://cplusplus.github.io/CWG/issues/2211.html">2211</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++17</td>      <td>Hiding by lambda captures and parameters</td>      <td class="full" align="center">Clang 8</td>    </tr>    <tr id="2212">      <td><a href="https://cplusplus.github.io/CWG/issues/2212.html">2212</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>CD5</td>      <td>Typedef changing linkage after use</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2213">      <td><a href="https://cplusplus.github.io/CWG/issues/2213.html">2213</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>CD6</td>      <td>Forward declaration of partial specializations</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="2214">      <td><a href="https://cplusplus.github.io/CWG/issues/2214.html">2214</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>C++17</td>      <td>Missing requirement on representation of integer values</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2215">      <td><a href="https://cplusplus.github.io/CWG/issues/2215.html">2215</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>C++17</td>      <td>Redundant description of language linkage in function call</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2216">      <td><a href="https://cplusplus.github.io/CWG/issues/2216.html">2216</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>NAD</td>      <td>Exception specifications in unevaluated contexts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2217">      <td><a href="https://cplusplus.github.io/CWG/issues/2217.html">2217</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>NAD</td>      <td><TT>constexpr</TT> constructors for non-literal types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2218">      <td><a href="https://cplusplus.github.io/CWG/issues/2218.html">2218</a></td> +    <td>[<a href="https://wg21.link/basic.lookup">basic.lookup</a>]</td>      <td>C++17</td>      <td>Ambiguity and namespace aliases</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2219">      <td><a href="https://cplusplus.github.io/CWG/issues/2219.html">2219</a></td> +    <td>[<a href="https://wg21.link/except.handle">except.handle</a>]</td>      <td>drafting</td>      <td>Dynamically-unreachable handlers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2220">      <td><a href="https://cplusplus.github.io/CWG/issues/2220.html">2220</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>C++17</td>      <td>Hiding index variable in range-based <TT>for</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2221">      <td><a href="https://cplusplus.github.io/CWG/issues/2221.html">2221</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD6</td>      <td>Copying volatile objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2222">      <td><a href="https://cplusplus.github.io/CWG/issues/2222.html">2222</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>drafting</td>      <td>Additional contexts where instantiation is not required</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2223">      <td><a href="https://cplusplus.github.io/CWG/issues/2223.html">2223</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>drafting</td>      <td>Multiple <TT>alignas</TT> specifiers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2224">      <td><a href="https://cplusplus.github.io/CWG/issues/2224.html">2224</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>C++17</td>      <td>Member subobjects and base-class casts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2225">      <td><a href="https://cplusplus.github.io/CWG/issues/2225.html">2225</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>NAD</td>      <td><TT>reinterpret_cast</TT> to same floating-point type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2226">      <td><a href="https://cplusplus.github.io/CWG/issues/2226.html">2226</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD5</td>      <td>Xvalues vs lvalues in conditional expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2227">      <td><a href="https://cplusplus.github.io/CWG/issues/2227.html">2227</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD5</td>      <td>Destructor access and default member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2228">      <td><a href="https://cplusplus.github.io/CWG/issues/2228.html">2228</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>review</td>      <td>Ambiguity resolution for cast to function type</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2229">      <td><a href="https://cplusplus.github.io/CWG/issues/2229.html">2229</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD5</td>      <td>Volatile unnamed bit-fields</td>      <td class="full" align="center">Clang 7</td>    </tr>    <tr id="2230">      <td><a href="https://cplusplus.github.io/CWG/issues/2230.html">2230</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>NAD</td>      <td>Linkage of <TT>extern "C"</TT> function in unnamed namespace</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2231">      <td><a href="https://cplusplus.github.io/CWG/issues/2231.html">2231</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>NAD</td>      <td>Class member access to static data member template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2232">      <td><a href="https://cplusplus.github.io/CWG/issues/2232.html">2232</a></td> +    <td>[<a href="https://wg21.link/dcl.stc">dcl.stc</a>]</td>      <td>open</td>      <td><TT>thread_local</TT> anonymous unions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2233">      <td><a href="https://cplusplus.github.io/CWG/issues/2233.html">2233</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD5</td>      <td>Function parameter packs following default arguments</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="2234">      <td><a href="https://cplusplus.github.io/CWG/issues/2234.html">2234</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD5</td>      <td>Missing rules for <I>simple-template-id</I> as <I>class-name</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2235">      <td><a href="https://cplusplus.github.io/CWG/issues/2235.html">2235</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>CD5</td>      <td>Partial ordering and non-dependent types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2236">      <td><a href="https://cplusplus.github.io/CWG/issues/2236.html">2236</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>drafting</td>      <td>When is an alias template specialization dependent?</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2237">      <td><a href="https://cplusplus.github.io/CWG/issues/2237.html">2237</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD5</td>      <td>Can a <I>template-id</I> name a constructor?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2238">      <td><a href="https://cplusplus.github.io/CWG/issues/2238.html">2238</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.allocation">basic.stc.dynamic.allocation</a>]</td>      <td>NAD</td>      <td>Contradictory alignment requirements for allocation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2239">      <td><a href="https://cplusplus.github.io/CWG/issues/2239.html">2239</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>NAD</td>      <td>Sized deallocation with a trivial destructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2240">      <td><a href="https://cplusplus.github.io/CWG/issues/2240.html">2240</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>NAD</td>      <td><TT>this</TT> is not odr-used in a constant expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2241">      <td><a href="https://cplusplus.github.io/CWG/issues/2241.html">2241</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD5</td>      <td>Overload resolution is not invoked with a single function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2242">      <td><a href="https://cplusplus.github.io/CWG/issues/2242.html">2242</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++23</td>      <td>ODR violation with constant initialization possibly omitted</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2243">      <td><a href="https://cplusplus.github.io/CWG/issues/2243.html">2243</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>drafting</td>      <td>Incorrect use of implicit conversion sequence</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2244">      <td><a href="https://cplusplus.github.io/CWG/issues/2244.html">2244</a></td> +    <td>[<a href="https://wg21.link/class.protected">class.protected</a>]</td>      <td>open</td>      <td>Base class access in aggregate initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2245">      <td><a href="https://cplusplus.github.io/CWG/issues/2245.html">2245</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>drafting</td>      <td>Point of instantiation of incomplete class template</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2246">      <td><a href="https://cplusplus.github.io/CWG/issues/2246.html">2246</a></td> +    <td>[<a href="https://wg21.link/class.access.base">class.access.base</a>]</td>      <td>drafting</td>      <td>Access of indirect virtual base class constructors</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2247">      <td><a href="https://cplusplus.github.io/CWG/issues/2247.html">2247</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++17</td>      <td>Lambda capture and variable argument list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2248">      <td><a href="https://cplusplus.github.io/CWG/issues/2248.html">2248</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>C++17</td>      <td>Problems with sized delete</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2249">      <td><a href="https://cplusplus.github.io/CWG/issues/2249.html">2249</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.unqual">expr.prim.id.unqual</a>]</td>      <td>CD5</td>      <td><I>identifier</I>s and <I>id-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2250">      <td><a href="https://cplusplus.github.io/CWG/issues/2250.html">2250</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>open</td>      <td>Implicit instantiation, destruction, and TUs</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2251">      <td><a href="https://cplusplus.github.io/CWG/issues/2251.html">2251</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>C++17</td>      <td>Unreachable enumeration list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2252">      <td><a href="https://cplusplus.github.io/CWG/issues/2252.html">2252</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD7</td>      <td>Enumeration list-initialization from the same type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2253">      <td><a href="https://cplusplus.github.io/CWG/issues/2253.html">2253</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD5</td>      <td>Unnamed bit-fields and zero-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2254">      <td><a href="https://cplusplus.github.io/CWG/issues/2254.html">2254</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD5</td>      <td>Standard-layout classes and bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2255">      <td><a href="https://cplusplus.github.io/CWG/issues/2255.html">2255</a></td> +    <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>      <td>CD5</td>      <td>Instantiated static data member templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2256">      <td><a href="https://cplusplus.github.io/CWG/issues/2256.html">2256</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD5</td>      <td>Lifetime of trivially-destructible objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2257">      <td><a href="https://cplusplus.github.io/CWG/issues/2257.html">2257</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD5</td>      <td>Lifetime extension of references vs exceptions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2258">      <td><a href="https://cplusplus.github.io/CWG/issues/2258.html">2258</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Storage deallocation during period of destruction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2259">      <td><a href="https://cplusplus.github.io/CWG/issues/2259.html">2259</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>C++17</td>      <td>Unclear context describing ambiguity</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2260">      <td><a href="https://cplusplus.github.io/CWG/issues/2260.html">2260</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>CD5</td>      <td>Explicit specializations of deleted member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2261">      <td><a href="https://cplusplus.github.io/CWG/issues/2261.html">2261</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>extension</td>      <td>Explicit instantiation of in-class <TT>friend</TT> definition</td>      <td align="center">Extension</td>    </tr>    <tr id="2262">      <td><a href="https://cplusplus.github.io/CWG/issues/2262.html">2262</a></td> +    <td>[<a href="https://wg21.link/dcl.asm">dcl.asm</a>]</td>      <td>C++17</td>      <td>Attributes for <I>asm-definition</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2263">      <td><a href="https://cplusplus.github.io/CWG/issues/2263.html">2263</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>drafting</td>      <td>Default argument instantiation for <TT>friend</TT>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2264">      <td><a href="https://cplusplus.github.io/CWG/issues/2264.html">2264</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>drafting</td>      <td>Memberwise copying with indeterminate value</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2265">      <td><a href="https://cplusplus.github.io/CWG/issues/2265.html">2265</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>drafting</td>      <td>Delayed pack expansion and member redeclarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2266">      <td><a href="https://cplusplus.github.io/CWG/issues/2266.html">2266</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD5</td>      <td>Has dependent type vs is type-dependent</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2267">      <td><a href="https://cplusplus.github.io/CWG/issues/2267.html">2267</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD5</td>      <td>Copy-initialization of temporary in reference direct-initialization</td>      <td class="none" align="center">No</td>    </tr>    <tr id="2268">      <td><a href="https://cplusplus.github.io/CWG/issues/2268.html">2268</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++17</td>      <td>Unions with mutable members in constant expressions revisited</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2269">      <td><a href="https://cplusplus.github.io/CWG/issues/2269.html">2269</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>dup</td>      <td>Additional recursive references in aggregate DMIs</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2270">      <td><a href="https://cplusplus.github.io/CWG/issues/2270.html">2270</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>NAD</td>      <td>Non-inline functions and explicit instantiation declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2271">      <td><a href="https://cplusplus.github.io/CWG/issues/2271.html">2271</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>C++17</td>      <td>Aliasing <TT>this</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2272">      <td><a href="https://cplusplus.github.io/CWG/issues/2272.html">2272</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++17</td>      <td>Implicit initialization of aggregate members of reference type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2273">      <td><a href="https://cplusplus.github.io/CWG/issues/2273.html">2273</a></td> +    <td>[<a href="https://wg21.link/class.ctor">class.ctor</a>]</td>      <td>CD5</td>      <td>Inheriting constructors vs implicit default constructor</td>      <td class="full" align="center">Clang 3.3</td>    </tr>    <tr id="2274">      <td><a href="https://cplusplus.github.io/CWG/issues/2274.html">2274</a></td> +    <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>      <td>NAD</td>      <td>Generic lambda capture vs constexpr if</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2275">      <td><a href="https://cplusplus.github.io/CWG/issues/2275.html">2275</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>drafting</td>      <td>Type-dependence of function template</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2276">      <td><a href="https://cplusplus.github.io/CWG/issues/2276.html">2276</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>C++17</td>      <td>Dependent <TT>noexcept</TT> and function type-dependence</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2277">      <td><a href="https://cplusplus.github.io/CWG/issues/2277.html">2277</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD5</td>      <td>Ambiguity inheriting constructors with default arguments</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="2278">      <td><a href="https://cplusplus.github.io/CWG/issues/2278.html">2278</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD5</td>      <td>Copy elision in constant expressions reconsidered</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2279">      <td><a href="https://cplusplus.github.io/CWG/issues/2279.html">2279</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>NAD</td>      <td>Multiple <I>attribute-specifier</I>s in one <I>attribute-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2280">      <td><a href="https://cplusplus.github.io/CWG/issues/2280.html">2280</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>C++20</td>      <td>Matching a usual deallocation function with placement new</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2281">      <td><a href="https://cplusplus.github.io/CWG/issues/2281.html">2281</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>drafting</td>      <td>Consistency of aligned <TT>operator delete</TT> replacement</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2282">      <td><a href="https://cplusplus.github.io/CWG/issues/2282.html">2282</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>C++20</td>      <td>Consistency with mismatched aligned/non-over-aligned allocation/deallocation functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2283">      <td><a href="https://cplusplus.github.io/CWG/issues/2283.html">2283</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD7</td>      <td>Missing complete type requirements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2284">      <td><a href="https://cplusplus.github.io/CWG/issues/2284.html">2284</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>open</td>      <td>Sequencing of <I>braced-init-list</I> arguments</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2285">      <td><a href="https://cplusplus.github.io/CWG/issues/2285.html">2285</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD5</td>      <td>Issues with structured bindings</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="2286">      <td><a href="https://cplusplus.github.io/CWG/issues/2286.html">2286</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>NAD</td>      <td>Assignment evaluation order</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2287">      <td><a href="https://cplusplus.github.io/CWG/issues/2287.html">2287</a></td> +    <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>      <td>CD5</td>      <td>Pointer-interconvertibility in non-standard-layout unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2288">      <td><a href="https://cplusplus.github.io/CWG/issues/2288.html">2288</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>NAD</td>      <td>Contradictory optionality in <I>simple-declaration</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2289">      <td><a href="https://cplusplus.github.io/CWG/issues/2289.html">2289</a></td> +    <td>[<a href="https://wg21.link/basic.scope.declarative">basic.scope.declarative</a>]</td>      <td>CD5</td>      <td>Uniqueness of structured binding names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2290">      <td><a href="https://cplusplus.github.io/CWG/issues/2290.html">2290</a></td> +    <td>[<a href="https://wg21.link/over.match.funcs">over.match.funcs</a>]</td>      <td>CD5</td>      <td>Unclear specification for overload resolution and deleted special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2291">      <td><a href="https://cplusplus.github.io/CWG/issues/2291.html">2291</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>dup</td>      <td>Implicit conversion sequences in non-call contexts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2292">      <td><a href="https://cplusplus.github.io/CWG/issues/2292.html">2292</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>CD5</td>      <td><I>simple-template-id</I> is ambiguous between <I>class-name</I> and <I>type-name</I></td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2293">      <td><a href="https://cplusplus.github.io/CWG/issues/2293.html">2293</a></td> +    <td>[<a href="https://wg21.link/class">class</a>]</td>      <td>CD5</td>      <td>Requirements for <I>simple-template-id</I> used as a <I>class-name</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2294">      <td><a href="https://cplusplus.github.io/CWG/issues/2294.html">2294</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>CD5</td>      <td>Dependent <TT>auto</TT> static data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2295">      <td><a href="https://cplusplus.github.io/CWG/issues/2295.html">2295</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD5</td>      <td>Aggregates with deleted defaulted constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2296">      <td><a href="https://cplusplus.github.io/CWG/issues/2296.html">2296</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>open</td>      <td>Are default argument instantiation failures in the “immediate context”?</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2297">      <td><a href="https://cplusplus.github.io/CWG/issues/2297.html">2297</a></td> +    <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>      <td>open</td>      <td>Unclear specification of atomic operations</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2298">      <td><a href="https://cplusplus.github.io/CWG/issues/2298.html">2298</a></td> +    <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>      <td>open</td>      <td>Actions and expression evaluation</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2299">      <td><a href="https://cplusplus.github.io/CWG/issues/2299.html">2299</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD5</td>      <td><TT>constexpr</TT> vararg functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2300">      <td><a href="https://cplusplus.github.io/CWG/issues/2300.html">2300</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>Lambdas in multiple definitions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2301">      <td><a href="https://cplusplus.github.io/CWG/issues/2301.html">2301</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Value-initialization and constexpr constructor evaluation</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2302">      <td><a href="https://cplusplus.github.io/CWG/issues/2302.html">2302</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>NAD</td>      <td>Address comparison between different member subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2303">      <td><a href="https://cplusplus.github.io/CWG/issues/2303.html">2303</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>CD5</td>      <td>Partial ordering and recursive variadic inheritance</td>      <td class="full" align="center">Clang 12</td>    </tr>    <tr id="2304">      <td><a href="https://cplusplus.github.io/CWG/issues/2304.html">2304</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>NAD</td>      <td>Incomplete type vs overload resolution</td>      <td class="full" align="center">Clang 2.8</td>    </tr>    <tr id="2305">      <td><a href="https://cplusplus.github.io/CWG/issues/2305.html">2305</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD5</td>      <td>Explicit instantiation of constexpr or inline variable template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2306">      <td><a href="https://cplusplus.github.io/CWG/issues/2306.html">2306</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>NAD</td>      <td>Nested friend templates of class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2307">      <td><a href="https://cplusplus.github.io/CWG/issues/2307.html">2307</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD5</td>      <td>Unclear definition of “equivalent to a nontype template parameter”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2308">      <td><a href="https://cplusplus.github.io/CWG/issues/2308.html">2308</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>NAD</td>      <td>Structured bindings and lambda capture</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2309">      <td><a href="https://cplusplus.github.io/CWG/issues/2309.html">2309</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD5</td>      <td>Restrictions on nested statements within <TT>constexpr</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2310">      <td><a href="https://cplusplus.github.io/CWG/issues/2310.html">2310</a></td> +    <td>[<a href="https://wg21.link/conv.ptr">conv.ptr</a>]</td>      <td>CD5</td>      <td>Type completeness and derived-to-base pointer conversions</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr class="open" id="2311">      <td><a href="https://cplusplus.github.io/CWG/issues/2311.html">2311</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>open</td>      <td>Missed case for guaranteed copy elision</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2312">      <td><a href="https://cplusplus.github.io/CWG/issues/2312.html">2312</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD6</td>      <td>Structured bindings and <TT>mutable</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2313">      <td><a href="https://cplusplus.github.io/CWG/issues/2313.html">2313</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD5</td>      <td>Redeclaration of structured binding reference variables</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2314">      <td><a href="https://cplusplus.github.io/CWG/issues/2314.html">2314</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>dup</td>      <td>Structured bindings and lambda capture</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2315">      <td><a href="https://cplusplus.github.io/CWG/issues/2315.html">2315</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD5</td>      <td>What is the “corresponding special member” of a variant member?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2316">      <td><a href="https://cplusplus.github.io/CWG/issues/2316.html">2316</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>drafting</td>      <td>Simplifying class conversions in conditional expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2317">      <td><a href="https://cplusplus.github.io/CWG/issues/2317.html">2317</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>CD5</td>      <td>Self-referential default member initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2318">      <td><a href="https://cplusplus.github.io/CWG/issues/2318.html">2318</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD5</td>      <td>Nondeduced contexts in deduction from a <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2319">      <td><a href="https://cplusplus.github.io/CWG/issues/2319.html">2319</a></td> +    <td>[<a href="https://wg21.link/over.best.ics">over.best.ics</a>]</td>      <td>drafting</td>      <td>Nested brace initialization from same type</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2320">      <td><a href="https://cplusplus.github.io/CWG/issues/2320.html">2320</a></td> +    <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>      <td>extension</td>      <td><TT>constexpr if</TT> and boolean conversions</td>      <td align="center">Extension</td>    </tr>    <tr id="2321">      <td><a href="https://cplusplus.github.io/CWG/issues/2321.html">2321</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD5</td>      <td>Conditional operator and cv-qualified class prvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2322">      <td><a href="https://cplusplus.github.io/CWG/issues/2322.html">2322</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD5</td>      <td>Substitution failure and lexical order</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2323">      <td><a href="https://cplusplus.github.io/CWG/issues/2323.html">2323</a></td> +    <td>[<a href="https://wg21.link/basic.types">basic.types</a>]</td>      <td>C++20</td>      <td>Expunge POD</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2324">      <td><a href="https://cplusplus.github.io/CWG/issues/2324.html">2324</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>drafting</td>      <td>Size of base class subobject</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2325">      <td><a href="https://cplusplus.github.io/CWG/issues/2325.html">2325</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>drafting</td>      <td><TT>std::launder</TT> and reuse of character buffers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2326">      <td><a href="https://cplusplus.github.io/CWG/issues/2326.html">2326</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>dup</td>      <td>Type deduction with initializer list containing ambiguous functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2327">      <td><a href="https://cplusplus.github.io/CWG/issues/2327.html">2327</a></td> +    <td>[<a href="https://wg21.link/dcl.init">dcl.init</a>]</td>      <td>drafting</td>      <td>Copy elision for direct-initialization with a conversion function</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2328">      <td><a href="https://cplusplus.github.io/CWG/issues/2328.html">2328</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>drafting</td>      <td>Unclear presentation style of template argument deduction rules</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2329">      <td><a href="https://cplusplus.github.io/CWG/issues/2329.html">2329</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>open</td>      <td>Virtual base classes and generated assignment operators</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2330">      <td><a href="https://cplusplus.github.io/CWG/issues/2330.html">2330</a></td> +    <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>      <td>CD5</td>      <td>Missing references to variable templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2331">      <td><a href="https://cplusplus.github.io/CWG/issues/2331.html">2331</a></td> +    <td>[<a href="https://wg21.link/basic.scope.class">basic.scope.class</a>]</td>      <td>CD6</td>      <td>Redundancy in description of class scope</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="2332">      <td><a href="https://cplusplus.github.io/CWG/issues/2332.html">2332</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>CD5</td>      <td><I>template-name</I> as <I>simple-type-name</I> vs injected-class-name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2333">      <td><a href="https://cplusplus.github.io/CWG/issues/2333.html">2333</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD6</td>      <td>Escape sequences in UTF-8 character literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2334">      <td><a href="https://cplusplus.github.io/CWG/issues/2334.html">2334</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>open</td>      <td>Creation of objects by <TT>typeid</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2335">      <td><a href="https://cplusplus.github.io/CWG/issues/2335.html">2335</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>drafting</td>      <td>Deduced return types vs member types</td>      <td align="center"> @@ -13849,1308 +16142,1526 @@ and <I>POD class</I></td>    </tr>    <tr id="2336">      <td><a href="https://cplusplus.github.io/CWG/issues/2336.html">2336</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>CD5</td>      <td>Destructor characteristics vs potentially-constructed subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2337">      <td><a href="https://cplusplus.github.io/CWG/issues/2337.html">2337</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>open</td>      <td>Incorrect implication of logic ladder for conversion sequence tiebreakers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2338">      <td><a href="https://cplusplus.github.io/CWG/issues/2338.html">2338</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD5</td>      <td>Undefined behavior converting to short enums with fixed underlying types</td>      <td class="full" align="center">Clang 12</td>    </tr>    <tr id="2339">      <td><a href="https://cplusplus.github.io/CWG/issues/2339.html">2339</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD5</td>      <td>Underspecified template arguments in structured bindings</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2340">      <td><a href="https://cplusplus.github.io/CWG/issues/2340.html">2340</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>open</td>      <td>Reference collapsing and structured bindings</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2341">      <td><a href="https://cplusplus.github.io/CWG/issues/2341.html">2341</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>CD5</td>      <td>Structured bindings with static storage duration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2342">      <td><a href="https://cplusplus.github.io/CWG/issues/2342.html">2342</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD5</td>      <td>Reference <TT>reinterpret_cast</TT> and pointer-interconvertibility</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2343">      <td><a href="https://cplusplus.github.io/CWG/issues/2343.html">2343</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>C++20</td>      <td><TT>void*</TT> non-type template parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2344">      <td><a href="https://cplusplus.github.io/CWG/issues/2344.html">2344</a></td> +    <td>[<a href="https://wg21.link/stmt.select">stmt.select</a>]</td>      <td>NAD</td>      <td>Redeclaration of names in <I>init-statement</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2345">      <td><a href="https://cplusplus.github.io/CWG/issues/2345.html">2345</a></td> +    <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>      <td>CD5</td>      <td>Jumping across initializers in <I>init-statement</I>s and <I>condition</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2346">      <td><a href="https://cplusplus.github.io/CWG/issues/2346.html">2346</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD5</td>      <td>Local variables in default arguments</td>      <td class="full" align="center">Clang 11</td>    </tr>    <tr id="2347">      <td><a href="https://cplusplus.github.io/CWG/issues/2347.html">2347</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>C++20</td>      <td>Passing short scoped enumerations to ellipsis</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2348">      <td><a href="https://cplusplus.github.io/CWG/issues/2348.html">2348</a></td> +    <td>[<a href="https://wg21.link/stmt.if">stmt.if</a>]</td>      <td>NAD</td>      <td>Non-templated <TT>constexpr if</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2349">      <td><a href="https://cplusplus.github.io/CWG/issues/2349.html">2349</a></td> +    <td>[<a href="https://wg21.link/stmt">stmt</a>]</td>      <td>NAD</td>      <td>Class/enumeration names vs conditions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2350">      <td><a href="https://cplusplus.github.io/CWG/issues/2350.html">2350</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>NAD</td>      <td>Forwarding references and deduction guides</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2351">      <td><a href="https://cplusplus.github.io/CWG/issues/2351.html">2351</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>CD5</td>      <td><TT>void{}</TT></td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2352">      <td><a href="https://cplusplus.github.io/CWG/issues/2352.html">2352</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD5</td>      <td>Similar types and reference binding</td>      <td class="full" align="center">Clang 10</td>    </tr>    <tr id="2353">      <td><a href="https://cplusplus.github.io/CWG/issues/2353.html">2353</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td>Potential results of a member access expression for a static data member</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2354">      <td><a href="https://cplusplus.github.io/CWG/issues/2354.html">2354</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>CD5</td>      <td>Extended alignment and object representation</td>      <td class="full" align="center">Clang 15</td>    </tr>    <tr id="2355">      <td><a href="https://cplusplus.github.io/CWG/issues/2355.html">2355</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>CD6</td>      <td>Deducing <I>noexcept-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2356">      <td><a href="https://cplusplus.github.io/CWG/issues/2356.html">2356</a></td> +    <td>[<a href="https://wg21.link/over.match.funcs">over.match.funcs</a>]</td>      <td>CD5</td>      <td>Base class copy and move constructors should not be inherited</td>      <td class="full" align="center">Clang 4</td>    </tr>    <tr id="2357">      <td><a href="https://cplusplus.github.io/CWG/issues/2357.html">2357</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>NAD</td>      <td>Lookup in member function declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2358">      <td><a href="https://cplusplus.github.io/CWG/issues/2358.html">2358</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>CD5</td>      <td>Explicit capture of value</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="2359">      <td><a href="https://cplusplus.github.io/CWG/issues/2359.html">2359</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>CD5</td>      <td>Unintended copy initialization with designated initializers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2360">      <td><a href="https://cplusplus.github.io/CWG/issues/2360.html">2360</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.unused">dcl.attr.unused</a>]</td>      <td>CD5</td>      <td><TT>[[maybe_unused]]</TT> and structured bindings</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2361">      <td><a href="https://cplusplus.github.io/CWG/issues/2361.html">2361</a></td> +    <td>[<a href="https://wg21.link/csetjmp.syn">csetjmp.syn</a>]</td>      <td>open</td>      <td>Unclear description of <TT>longjmp</TT> undefined behavior</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2362">      <td><a href="https://cplusplus.github.io/CWG/issues/2362.html">2362</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>open</td>      <td><TT>__func__</TT> should be <TT>constexpr</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2363">      <td><a href="https://cplusplus.github.io/CWG/issues/2363.html">2363</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>NAD</td>      <td>Opaque enumeration friend declarations</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="2364">      <td><a href="https://cplusplus.github.io/CWG/issues/2364.html">2364</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>NAD</td>      <td>Constant expressions, aggregate initialization, and modifications</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2365">      <td><a href="https://cplusplus.github.io/CWG/issues/2365.html">2365</a></td> +    <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>      <td>CD5</td>      <td>Confusing specification for <TT>dynamic_cast</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2366">      <td><a href="https://cplusplus.github.io/CWG/issues/2366.html">2366</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>CD5</td>      <td>Can default initialization be constant initialization?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2367">      <td><a href="https://cplusplus.github.io/CWG/issues/2367.html">2367</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>NAD</td>      <td>Lambdas in default arguments vs the ODR</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2368">      <td><a href="https://cplusplus.github.io/CWG/issues/2368.html">2368</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD5</td>      <td>Differences in relational and three-way constant comparisons</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2369">      <td><a href="https://cplusplus.github.io/CWG/issues/2369.html">2369</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>CD6</td>      <td>Ordering between constraints and substitution</td>      <td class="partial" align="center">Partial</td>    </tr>    <tr id="2370">      <td><a href="https://cplusplus.github.io/CWG/issues/2370.html">2370</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.unqual">basic.lookup.unqual</a>]</td>      <td>CD6</td>      <td><TT>friend</TT> declarations of namespace-scope functions</td>      <td class="none" align="center">No</td>    </tr>    <tr id="2371">      <td><a href="https://cplusplus.github.io/CWG/issues/2371.html">2371</a></td> +    <td>[<a href="https://wg21.link/basic.def">basic.def</a>]</td>      <td>CD5</td>      <td>Use of the English term “attributes” is confusing</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2372">      <td><a href="https://cplusplus.github.io/CWG/issues/2372.html">2372</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD5</td>      <td>Incorrect matching rules for block-scope <TT>extern</TT> declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2373">      <td><a href="https://cplusplus.github.io/CWG/issues/2373.html">2373</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>CD5</td>      <td>Incorrect handling of static member function templates in partial ordering</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2374">      <td><a href="https://cplusplus.github.io/CWG/issues/2374.html">2374</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>C++20</td>      <td>Overly permissive specification of <TT>enum</TT> direct-list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2375">      <td><a href="https://cplusplus.github.io/CWG/issues/2375.html">2375</a></td> +    <td>[<a href="https://wg21.link/class.static.data">class.static.data</a>]</td>      <td>NAD</td>      <td>Multiple redeclarations of <TT>constexpr</TT> static data members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2376">      <td><a href="https://cplusplus.github.io/CWG/issues/2376.html">2376</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>CD5</td>      <td>Class template argument deduction with array declarator</td>      <td class="full" align="center">Clang 21</td>    </tr>    <tr id="2377">      <td><a href="https://cplusplus.github.io/CWG/issues/2377.html">2377</a></td> +    <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>      <td>NAD</td>      <td>Explicit copy constructor vs function viability</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2378">      <td><a href="https://cplusplus.github.io/CWG/issues/2378.html">2378</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++20</td>      <td>Inconsistent grammar for reference <I>init-capture</I> of pack</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2379">      <td><a href="https://cplusplus.github.io/CWG/issues/2379.html">2379</a></td> +    <td>[<a href="https://wg21.link/temp.friend">temp.friend</a>]</td>      <td>CD5</td>      <td>Missing prohibition against <TT>constexpr</TT> in <TT>friend</TT> declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2380">      <td><a href="https://cplusplus.github.io/CWG/issues/2380.html">2380</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD5</td>      <td><I>capture-default</I> makes too many references odr-usable</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2381">      <td><a href="https://cplusplus.github.io/CWG/issues/2381.html">2381</a></td> +    <td>[<a href="https://wg21.link/expr.type">expr.type</a>]</td>      <td>CD5</td>      <td>Composite pointer type of pointers to plain and noexcept member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2382">      <td><a href="https://cplusplus.github.io/CWG/issues/2382.html">2382</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD5</td>      <td>Array allocation overhead for non-allocating placement <TT>new</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2383">      <td><a href="https://cplusplus.github.io/CWG/issues/2383.html">2383</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>NAD</td>      <td>Variadic member functions of variadic class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2384">      <td><a href="https://cplusplus.github.io/CWG/issues/2384.html">2384</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>CD5</td>      <td>Conversion function templates and qualification conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2385">      <td><a href="https://cplusplus.github.io/CWG/issues/2385.html">2385</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>      <td>CD5</td>      <td>Lookup for <I>conversion-function-id</I>s</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="2386">      <td><a href="https://cplusplus.github.io/CWG/issues/2386.html">2386</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD5</td>      <td><T>tuple_size</T> requirements for structured binding</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2387">      <td><a href="https://cplusplus.github.io/CWG/issues/2387.html">2387</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD5</td>      <td>Linkage of const-qualified variable template</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2388">      <td><a href="https://cplusplus.github.io/CWG/issues/2388.html">2388</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>NAD</td>      <td>Applicability of <I>contract-attribute-specifier</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2389">      <td><a href="https://cplusplus.github.io/CWG/issues/2389.html">2389</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>CD6</td>      <td>Agreement of deduced and explicitly-specified variable types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2390">      <td><a href="https://cplusplus.github.io/CWG/issues/2390.html">2390</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD5</td>      <td>Is the argument of <TT>__has_cpp_attribute</TT> macro-expanded?</td>      <td class="full" align="center">Clang 14</td>    </tr>    <tr id="2391">      <td><a href="https://cplusplus.github.io/CWG/issues/2391.html">2391</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>dup</td>      <td>Additional template parameters following pack expansion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2392">      <td><a href="https://cplusplus.github.io/CWG/issues/2392.html">2392</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td><I>new-expression</I> size check and constant evaluation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2393">      <td><a href="https://cplusplus.github.io/CWG/issues/2393.html">2393</a></td> +    <td>[<a href="https://wg21.link/expr.pseudo">expr.pseudo</a>]</td>      <td>NAD</td>      <td>Pseudo-destructors and object lifetime</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2394">      <td><a href="https://cplusplus.github.io/CWG/issues/2394.html">2394</a></td> +    <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>      <td>CD5</td>      <td>Const-default-constructible for members</td>      <td class="full" align="center">Clang 15</td>    </tr>    <tr class="open" id="2395">      <td><a href="https://cplusplus.github.io/CWG/issues/2395.html">2395</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>drafting</td>      <td>Parameters following a pack expansion</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2396">      <td><a href="https://cplusplus.github.io/CWG/issues/2396.html">2396</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>      <td>CD6</td>      <td>Lookup of names in complex <I>conversion-type-id</I>s</td>      <td class="none" align="center">No</td>    </tr>    <tr id="2397">      <td><a href="https://cplusplus.github.io/CWG/issues/2397.html">2397</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>CD6</td>      <td><TT>auto</TT> specifier for pointers and references to arrays</td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr class="open" id="2398">      <td><a href="https://cplusplus.github.io/CWG/issues/2398.html">2398</a></td> +    <td>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</a>]</td>      <td>drafting</td>      <td>Template template parameter matching and deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2399">      <td><a href="https://cplusplus.github.io/CWG/issues/2399.html">2399</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>CD5</td>      <td>Unclear referent of “expression” in <I>assignment-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2400">      <td><a href="https://cplusplus.github.io/CWG/issues/2400.html">2400</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD5</td>      <td>Constexpr virtual functions and temporary objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2401">      <td><a href="https://cplusplus.github.io/CWG/issues/2401.html">2401</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>C++20</td>      <td>Array decay vs prohibition of subobject non-type arguments</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> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD6</td>      <td>When is the restriction to a single <I>c-char</I> in a Unicode literal enforced?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2403">      <td><a href="https://cplusplus.github.io/CWG/issues/2403.html">2403</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>drafting</td>      <td>Temporary materialization and base/member initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2404">      <td><a href="https://cplusplus.github.io/CWG/issues/2404.html">2404</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>CD5</td>      <td><TT>[[no_unique_address]]</TT> and allocation order</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2405">      <td><a href="https://cplusplus.github.io/CWG/issues/2405.html">2405</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>CD6</td>      <td>Additional type-dependent expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2406">      <td><a href="https://cplusplus.github.io/CWG/issues/2406.html">2406</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.fallthrough">dcl.attr.fallthrough</a>]</td>      <td>CD5</td>      <td><TT>[[fallthrough]]</TT> attribute and iteration statements</td>      <td class="full" align="center">Clang 5</td>    </tr>    <tr id="2407">      <td><a href="https://cplusplus.github.io/CWG/issues/2407.html">2407</a></td> +    <td>[<a href="https://wg21.link/diff">diff</a>]</td>      <td>C++23</td>      <td>Missing entry in Annex C for defaulted comparison operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2408">      <td><a href="https://cplusplus.github.io/CWG/issues/2408.html">2408</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>NAD</td>      <td>Temporaries and previously-initialized elements in aggregate initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2409">      <td><a href="https://cplusplus.github.io/CWG/issues/2409.html">2409</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>drafting</td>      <td>Explicit specializations of constexpr static data members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2410">      <td><a href="https://cplusplus.github.io/CWG/issues/2410.html">2410</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++23</td>      <td>Implicit calls of immediate functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2411">      <td><a href="https://cplusplus.github.io/CWG/issues/2411.html">2411</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>C++20</td>      <td>Comparison of pointers to members in template non-type arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2412">      <td><a href="https://cplusplus.github.io/CWG/issues/2412.html">2412</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>review</td>      <td>SFINAE vs undeduced placeholder type</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2413">      <td><a href="https://cplusplus.github.io/CWG/issues/2413.html">2413</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD6</td>      <td><TT>typename</TT> in <I>conversion-function-id</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2414">      <td><a href="https://cplusplus.github.io/CWG/issues/2414.html">2414</a></td> +    <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>      <td>C++20</td>      <td>Unclear results if both member and friend <TT>operator<=></TT> are declared</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2415">      <td><a href="https://cplusplus.github.io/CWG/issues/2415.html">2415</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>NAD</td>      <td><I>using-declaration</I>s vs copy assignment operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2416">      <td><a href="https://cplusplus.github.io/CWG/issues/2416.html">2416</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++20</td>      <td>Explicit specializations vs <TT>constexpr</TT> and <TT>consteval</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2417">      <td><a href="https://cplusplus.github.io/CWG/issues/2417.html">2417</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>open</td>      <td>Explicit instantiation and exception specifications</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2418">      <td><a href="https://cplusplus.github.io/CWG/issues/2418.html">2418</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD5</td>      <td>Missing cases in definition of “usable in constant expressions”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2419">      <td><a href="https://cplusplus.github.io/CWG/issues/2419.html">2419</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>C++20</td>      <td>Loss of generality treating pointers to objects as one-element arrays</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2420">      <td><a href="https://cplusplus.github.io/CWG/issues/2420.html">2420</a></td> +    <td>[<a href="https://wg21.link/except.spec">except.spec</a>]</td>      <td>dup</td>      <td>Exception specifications in explicit instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2421">      <td><a href="https://cplusplus.github.io/CWG/issues/2421.html">2421</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>drafting</td>      <td>Explicit instantiation of constrained member functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2422">      <td><a href="https://cplusplus.github.io/CWG/issues/2422.html">2422</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>      <td>C++20</td>      <td>Incorrect grammar for <I>deduction-guide</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2423">      <td><a href="https://cplusplus.github.io/CWG/issues/2423.html">2423</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>NAD</td>      <td>Typedefs, names, and entities</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2424">      <td><a href="https://cplusplus.github.io/CWG/issues/2424.html">2424</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++20</td>      <td><TT>constexpr</TT> initialization requirements for variant members</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2425">      <td><a href="https://cplusplus.github.io/CWG/issues/2425.html">2425</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>open</td>      <td>Confusing wording for deduction from a type</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2426">      <td><a href="https://cplusplus.github.io/CWG/issues/2426.html">2426</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>C++20</td>      <td>Reference to destructor that cannot be invoked</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2427">      <td><a href="https://cplusplus.github.io/CWG/issues/2427.html">2427</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>C++20</td>      <td>Deprecation of volatile operands and unevaluated contexts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2428">      <td><a href="https://cplusplus.github.io/CWG/issues/2428.html">2428</a></td> +    <td>[<a href="https://wg21.link/temp.concept">temp.concept</a>]</td>      <td>C++23</td>      <td>Deprecating a concept</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="2429">      <td><a href="https://cplusplus.github.io/CWG/issues/2429.html">2429</a></td> +    <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>      <td>C++20</td>      <td>Initialization of <TT>thread_local</TT> variables referenced by lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2430">      <td><a href="https://cplusplus.github.io/CWG/issues/2430.html">2430</a></td> +    <td>[<a href="https://wg21.link/class.mem">class.mem</a>]</td>      <td>C++20</td>      <td>Completeness of return and parameter types of member functions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="2431">      <td><a href="https://cplusplus.github.io/CWG/issues/2431.html">2431</a></td> +    <td>[<a href="https://wg21.link/basic.exec">basic.exec</a>]</td>      <td>C++20</td>      <td>Full-expressions and temporaries bound to references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2432">      <td><a href="https://cplusplus.github.io/CWG/issues/2432.html">2432</a></td> +    <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>      <td>C++20</td>      <td>Return types for defaulted <TT><=></TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2433">      <td><a href="https://cplusplus.github.io/CWG/issues/2433.html">2433</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++20</td>      <td>Variable templates in the ODR</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2434">      <td><a href="https://cplusplus.github.io/CWG/issues/2434.html">2434</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>review</td>      <td>Mandatory copy elision vs non-class objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2435">      <td><a href="https://cplusplus.github.io/CWG/issues/2435.html">2435</a></td> +    <td>[<a href="https://wg21.link/temp.spec">temp.spec</a>]</td>      <td>open</td>      <td>Alias template specializations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2436">      <td><a href="https://cplusplus.github.io/CWG/issues/2436.html">2436</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>C++20</td>      <td>Copy semantics of coroutine parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2437">      <td><a href="https://cplusplus.github.io/CWG/issues/2437.html">2437</a></td> +    <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>      <td>C++20</td>      <td>Conversion of <TT>std::strong_ordering</TT> in a defaulted <TT>operator<=></TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2438">      <td><a href="https://cplusplus.github.io/CWG/issues/2438.html">2438</a></td> +    <td>[<a href="https://wg21.link/conv.qual">conv.qual</a>]</td>      <td>open</td>      <td>Problems in the specification of qualification conversions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2439">      <td><a href="https://cplusplus.github.io/CWG/issues/2439.html">2439</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++20</td>      <td>Undefined term in definition of “usable in constant expressions”</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2440">      <td><a href="https://cplusplus.github.io/CWG/issues/2440.html">2440</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Allocation in core constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2441">      <td><a href="https://cplusplus.github.io/CWG/issues/2441.html">2441</a></td> +    <td>[<a href="https://wg21.link/dcl.inline">dcl.inline</a>]</td>      <td>C++20</td>      <td>Inline function parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2442">      <td><a href="https://cplusplus.github.io/CWG/issues/2442.html">2442</a></td> +    <td>[<a href="https://wg21.link/over.match.viable">over.match.viable</a>]</td>      <td>C++20</td>      <td>Incorrect requirement for default arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2443">      <td><a href="https://cplusplus.github.io/CWG/issues/2443.html">2443</a></td> +    <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>      <td>C++23</td>      <td>Meaningless template exports</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2444">      <td><a href="https://cplusplus.github.io/CWG/issues/2444.html">2444</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>drafting</td>      <td>Constant expressions in initialization odr-use</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2445">      <td><a href="https://cplusplus.github.io/CWG/issues/2445.html">2445</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>C++20</td>      <td>Partial ordering with rewritten candidates</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="2446">      <td><a href="https://cplusplus.github.io/CWG/issues/2446.html">2446</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>C++20</td>      <td>Questionable type-dependency of <I>concept-id</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2447">      <td><a href="https://cplusplus.github.io/CWG/issues/2447.html">2447</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto">dcl.spec.auto</a>]</td>      <td>C++20</td>      <td>Unintended description of abbreviated function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2448">      <td><a href="https://cplusplus.github.io/CWG/issues/2448.html">2448</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD6</td>      <td>Cv-qualification of arithmetic types and deprecation of volatile</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2449">      <td><a href="https://cplusplus.github.io/CWG/issues/2449.html">2449</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>extension</td>      <td>Thunks as an implementation technique for pointers to virtual functions</td>      <td align="center">Extension</td>    </tr>    <tr id="2450">      <td><a href="https://cplusplus.github.io/CWG/issues/2450.html">2450</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>CD7</td>      <td><I>braced-init-list</I> as a <I>template-argument</I></td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2451">      <td><a href="https://cplusplus.github.io/CWG/issues/2451.html">2451</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>C++23</td>      <td><I>promise</I><TT>.unhandled_exception()</TT> and final suspend point</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2452">      <td><a href="https://cplusplus.github.io/CWG/issues/2452.html">2452</a></td> +    <td>[<a href="https://wg21.link/stmt.return.coroutine">stmt.return.coroutine</a>]</td>      <td>CD6</td>      <td>Flowing off the end of a coroutine</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2453">      <td><a href="https://cplusplus.github.io/CWG/issues/2453.html">2453</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto.general">dcl.spec.auto.general</a>]</td>      <td>NAD</td>      <td>Deduced return types and coroutine lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2454">      <td><a href="https://cplusplus.github.io/CWG/issues/2454.html">2454</a></td> +    <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>      <td>NAD</td>      <td>Tail recursion and coroutine symmetric transfer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2455">      <td><a href="https://cplusplus.github.io/CWG/issues/2455.html">2455</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD6</td>      <td>Concatenation of string literals vs translation phases 5 and 6</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2456">      <td><a href="https://cplusplus.github.io/CWG/issues/2456.html">2456</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Viable user-defined conversions in converted constant expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2457">      <td><a href="https://cplusplus.github.io/CWG/issues/2457.html">2457</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD6</td>      <td>Unexpanded parameter packs don't make a function type dependent</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2458">      <td><a href="https://cplusplus.github.io/CWG/issues/2458.html">2458</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD6</td>      <td>Value category of expressions denoting non-static member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2459">      <td><a href="https://cplusplus.github.io/CWG/issues/2459.html">2459</a></td> +    <td>[<a href="https://wg21.link/temp.arg.nontype">temp.arg.nontype</a>]</td>      <td>CD7</td>      <td>Template parameter initialization</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2460">      <td><a href="https://cplusplus.github.io/CWG/issues/2460.html">2460</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>CD6</td>      <td>C language linkage and constrained non-template friends</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2461">      <td><a href="https://cplusplus.github.io/CWG/issues/2461.html">2461</a></td> +    <td>[<a href="https://wg21.link/temp.res">temp.res</a>]</td>      <td>CD6</td>      <td>Diagnosing non-<TT>bool</TT> type constraints</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2462">      <td><a href="https://cplusplus.github.io/CWG/issues/2462.html">2462</a></td> +    <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>      <td>open</td>      <td>Problems with the omission of the <TT>typename</TT> keyword</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2463">      <td><a href="https://cplusplus.github.io/CWG/issues/2463.html">2463</a></td> +    <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>      <td>open</td>      <td>Trivial copyability and unions with non-trivial members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2464">      <td><a href="https://cplusplus.github.io/CWG/issues/2464.html">2464</a></td> +    <td>[<a href="https://wg21.link/ptr.launder">ptr.launder</a>]</td>      <td>CD6</td>      <td>Constexpr launder and unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2465">      <td><a href="https://cplusplus.github.io/CWG/issues/2465.html">2465</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>CD6</td>      <td>Coroutine parameters passed to a promise constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2466">      <td><a href="https://cplusplus.github.io/CWG/issues/2466.html">2466</a></td> +    <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>      <td>CD6</td>      <td><TT>co_await</TT> should be a single evaluation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2467">      <td><a href="https://cplusplus.github.io/CWG/issues/2467.html">2467</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>drafting</td>      <td>CTAD for alias templates and the deducible check</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2468">      <td><a href="https://cplusplus.github.io/CWG/issues/2468.html">2468</a></td> +    <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>      <td>open</td>      <td>Omission of the <TT>typename</TT> keyword in a member template parameter list</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2469">      <td><a href="https://cplusplus.github.io/CWG/issues/2469.html">2469</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>drafting</td>      <td>Implicit object creation vs constant expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2470">      <td><a href="https://cplusplus.github.io/CWG/issues/2470.html">2470</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>CD6</td>      <td>Multiple array objects providing storage for one object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2471">      <td><a href="https://cplusplus.github.io/CWG/issues/2471.html">2471</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>drafting</td>      <td>Nested class template argument deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2472">      <td><a href="https://cplusplus.github.io/CWG/issues/2472.html">2472</a></td> +    <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>      <td>NAD</td>      <td>Value categories in <I>await-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2473">      <td><a href="https://cplusplus.github.io/CWG/issues/2473.html">2473</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.dtor">expr.prim.id.dtor</a>]</td>      <td>open</td>      <td>Parentheses in pseudo-destructor calls</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2474">      <td><a href="https://cplusplus.github.io/CWG/issues/2474.html">2474</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD6</td>      <td>Cv-qualification and deletion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2475">      <td><a href="https://cplusplus.github.io/CWG/issues/2475.html">2475</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>C++23</td>      <td>Object declarations of type <I>cv</I> <TT>void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2476">      <td><a href="https://cplusplus.github.io/CWG/issues/2476.html">2476</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto.general">dcl.spec.auto.general</a>]</td>      <td>CD7</td>      <td><I>placeholder-type-specifier</I>s and function declarators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2477">      <td><a href="https://cplusplus.github.io/CWG/issues/2477.html">2477</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>CD6</td>      <td>Defaulted vs deleted copy constructors/assignment operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2478">      <td><a href="https://cplusplus.github.io/CWG/issues/2478.html">2478</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++23</td>      <td>Properties of explicit specializations of implicitly-instantiated class templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2479">      <td><a href="https://cplusplus.github.io/CWG/issues/2479.html">2479</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD6</td>      <td>Missing specifications for <TT>consteval</TT> and <TT>constinit</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2480">      <td><a href="https://cplusplus.github.io/CWG/issues/2480.html">2480</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.general">basic.lookup.general</a>]</td>      <td>drafting</td>      <td>Lookup for enumerators in modules</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2481">      <td><a href="https://cplusplus.github.io/CWG/issues/2481.html">2481</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD6</td>      <td>Cv-qualification of temporary to which a reference is bound</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2482">      <td><a href="https://cplusplus.github.io/CWG/issues/2482.html">2482</a></td> +    <td>[<a href="https://wg21.link/bit.cast">bit.cast</a>]</td>      <td>CD6</td>      <td><TT>bit_cast</TT> and indeterminate values</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2483">      <td><a href="https://cplusplus.github.io/CWG/issues/2483.html">2483</a></td> +    <td>[<a href="https://wg21.link/dcl.link">dcl.link</a>]</td>      <td>C++23</td>      <td>Language linkage of static member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2484">      <td><a href="https://cplusplus.github.io/CWG/issues/2484.html">2484</a></td> +    <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>      <td>CD6</td>      <td><TT>char8_t</TT> and <TT>char16_t</TT> in integral promotions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2485">      <td><a href="https://cplusplus.github.io/CWG/issues/2485.html">2485</a></td> +    <td>[<a href="https://wg21.link/conv.prom">conv.prom</a>]</td>      <td>CD7</td>      <td>Bit-fields in integral promotions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2486">      <td><a href="https://cplusplus.github.io/CWG/issues/2486.html">2486</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD6</td>      <td>Call to <TT>noexcept</TT> function via <TT>noexcept(false)</TT> pointer/lvalue</td>      <td class="full" align="center">Clang 4 (C++17 onwards)</td>    </tr>    <tr class="open" id="2487">      <td><a href="https://cplusplus.github.io/CWG/issues/2487.html">2487</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>drafting</td>      <td>Type dependence of function-style cast to incomplete array type</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2488">      <td><a href="https://cplusplus.github.io/CWG/issues/2488.html">2488</a></td> +    <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>      <td>open</td>      <td>Overloading virtual functions and functions with trailing <I>requires-clause</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2489">      <td><a href="https://cplusplus.github.io/CWG/issues/2489.html">2489</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>C++23</td>      <td>Storage provided by array of <TT>char</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2490">      <td><a href="https://cplusplus.github.io/CWG/issues/2490.html">2490</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD6</td>      <td>Restrictions on destruction in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2491">      <td><a href="https://cplusplus.github.io/CWG/issues/2491.html">2491</a></td> +    <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>      <td>CD6</td>      <td>Export of typedef after its first declaration</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2492">      <td><a href="https://cplusplus.github.io/CWG/issues/2492.html">2492</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>open</td>      <td>Comparing user-defined conversion sequences in list-initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2493">      <td><a href="https://cplusplus.github.io/CWG/issues/2493.html">2493</a></td> +    <td>[<a href="https://wg21.link/dcl.spec.auto.general">dcl.spec.auto.general</a>]</td>      <td>dup</td>      <td><TT>auto</TT> as a <I>conversion-type-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2494">      <td><a href="https://cplusplus.github.io/CWG/issues/2494.html">2494</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD6</td>      <td>Multiple definitions of non-odr-used entities</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2495">      <td><a href="https://cplusplus.github.io/CWG/issues/2495.html">2495</a></td> +    <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>      <td>open</td>      <td>Glvalue result of a function call</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2496">      <td><a href="https://cplusplus.github.io/CWG/issues/2496.html">2496</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>CD6</td>      <td><I>ref-qualifier</I>s and virtual overriding</td>      <td class="full" align="center">Clang 21</td>    </tr>    <tr class="open" id="2497">      <td><a href="https://cplusplus.github.io/CWG/issues/2497.html">2497</a></td> +    <td>[<a href="https://wg21.link/temp.point">temp.point</a>]</td>      <td>drafting</td>      <td>Points of instantiation for constexpr function templates</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2498">      <td><a href="https://cplusplus.github.io/CWG/issues/2498.html">2498</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>      <td>open</td>      <td>Partial specialization failure and the immediate context</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2499">      <td><a href="https://cplusplus.github.io/CWG/issues/2499.html">2499</a></td> +    <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>      <td>CD6</td>      <td>Inconsistency in definition of pointer-interconvertibility</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2500">      <td><a href="https://cplusplus.github.io/CWG/issues/2500.html">2500</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>extension</td>      <td><TT>noexcept(false)</TT> functions and <TT>noexcept</TT> expressions</td>      <td align="center">Extension</td>    </tr>    <tr class="open" id="2501">      <td><a href="https://cplusplus.github.io/CWG/issues/2501.html">2501</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>drafting</td>      <td>Explicit instantiation and trailing <I>requires-clause</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2502">      <td><a href="https://cplusplus.github.io/CWG/issues/2502.html">2502</a></td> +    <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>      <td>CD6</td>      <td>Unintended declaration conflicts in nested statement scopes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2503">      <td><a href="https://cplusplus.github.io/CWG/issues/2503.html">2503</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id">expr.prim.id</a>]</td>      <td>drafting</td>      <td>Unclear relationship among name, qualified name, and unqualified name</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2504">      <td><a href="https://cplusplus.github.io/CWG/issues/2504.html">2504</a></td> +    <td>[<a href="https://wg21.link/class.inhctor.init">class.inhctor.init</a>]</td>      <td>CD7</td>      <td>Inheriting constructors from virtual base classes</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="2505">      <td><a href="https://cplusplus.github.io/CWG/issues/2505.html">2505</a></td> +    <td>[<a href="https://wg21.link/namespace.unnamed">namespace.unnamed</a>]</td>      <td>drafting</td>      <td>Nested unnamed namespace of inline unnamed namespace</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2506">      <td><a href="https://cplusplus.github.io/CWG/issues/2506.html">2506</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD6</td>      <td>Structured bindings and array cv-qualifiers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2507">      <td><a href="https://cplusplus.github.io/CWG/issues/2507.html">2507</a></td> +    <td>[<a href="https://wg21.link/over.oper.general">over.oper.general</a>]</td>      <td>CD6</td>      <td>Default arguments for <TT>operator[]</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2508">      <td><a href="https://cplusplus.github.io/CWG/issues/2508.html">2508</a></td> +    <td>[<a href="https://wg21.link/temp.local">temp.local</a>]</td>      <td>C++23</td>      <td>Restrictions on uses of template parameter names</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2509">      <td><a href="https://cplusplus.github.io/CWG/issues/2509.html">2509</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.general">expr.prim.lambda.general</a>]</td>      <td>CD6</td>      <td><I>decl-specifier-seq</I> in <I>lambda-specifiers</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2510">      <td><a href="https://cplusplus.github.io/CWG/issues/2510.html">2510</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>NAD</td>      <td><I>noexcept-specifier</I> of friend function vs class completeness</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2511">      <td><a href="https://cplusplus.github.io/CWG/issues/2511.html">2511</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>CD6</td>      <td>cv-qualified bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2512">      <td><a href="https://cplusplus.github.io/CWG/issues/2512.html">2512</a></td> +    <td>[<a href="https://wg21.link/expr.typeid">expr.typeid</a>]</td>      <td>NAD</td>      <td><TT>typeid</TT> and incomplete class types</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr class="open" id="2513">      <td><a href="https://cplusplus.github.io/CWG/issues/2513.html">2513</a></td> +    <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>      <td>open</td>      <td>Ambiguity with <I>requires-clause</I> and <I>operator-function-id</I></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2514">      <td><a href="https://cplusplus.github.io/CWG/issues/2514.html">2514</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Modifying const subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2515">      <td><a href="https://cplusplus.github.io/CWG/issues/2515.html">2515</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>open</td>      <td>Result of a function call</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2516">      <td><a href="https://cplusplus.github.io/CWG/issues/2516.html">2516</a></td> +    <td>[<a href="https://wg21.link/basic.scope.pdecl">basic.scope.pdecl</a>]</td>      <td>C++23</td>      <td>Locus of <I>enum-specifier</I> or <I>opaque-enum-declaration</I></td>      <td class="full" align="center">Clang 3.0</td>    </tr>    <tr id="2517">      <td><a href="https://cplusplus.github.io/CWG/issues/2517.html">2517</a></td> +    <td>[<a href="https://wg21.link/expr.prim.req.nested">expr.prim.req.nested</a>]</td>      <td>C++23</td>      <td>Useless restriction on use of parameter in <I>constraint-expression</I></td>      <td class="full" align="center">Clang 21</td>    </tr>    <tr id="2518">      <td><a href="https://cplusplus.github.io/CWG/issues/2518.html">2518</a></td> +    <td>[<a href="https://wg21.link/intro.compliance.general">intro.compliance.general</a>]</td>      <td>C++23</td>      <td>Conformance requirements and <TT>#error</TT>/<TT>#warning</TT></td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr id="2519">      <td><a href="https://cplusplus.github.io/CWG/issues/2519.html">2519</a></td> +    <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>      <td>CD7</td>      <td>Object representation of a bit-field</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2520">      <td><a href="https://cplusplus.github.io/CWG/issues/2520.html">2520</a></td> +    <td>[<a href="https://wg21.link/defns.signature.templ">defns.signature.templ</a>]</td>      <td>C++23</td>      <td>Template signature and default template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2521">      <td><a href="https://cplusplus.github.io/CWG/issues/2521.html">2521</a></td> +    <td>[<a href="https://wg21.link/over.literal">over.literal</a>]</td>      <td>C++23</td>      <td>User-defined literals and reserved identifiers</td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr class="open" id="2522">      <td><a href="https://cplusplus.github.io/CWG/issues/2522.html">2522</a></td> +    <td>[<a href="https://wg21.link/cpp.concat">cpp.concat</a>]</td>      <td>open</td>      <td>Removing placemarker tokens and retention of whitespace</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2523">      <td><a href="https://cplusplus.github.io/CWG/issues/2523.html">2523</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Undefined behavior via omitted destructor call in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2524">      <td><a href="https://cplusplus.github.io/CWG/issues/2524.html">2524</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>NAD</td>      <td>Distinguishing user-defined conversion sequences by <I>ref-qualifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2525">      <td><a href="https://cplusplus.github.io/CWG/issues/2525.html">2525</a></td> +    <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>      <td>open</td>      <td>Incorrect definition of implicit conversion sequence</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2526">      <td><a href="https://cplusplus.github.io/CWG/issues/2526.html">2526</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>C++23</td>      <td>Relational comparison of <TT>void*</TT> pointers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2527">      <td><a href="https://cplusplus.github.io/CWG/issues/2527.html">2527</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.nouniqueaddr">dcl.attr.nouniqueaddr</a>]</td>      <td>NAD</td>      <td>Non-class potentially-overlapping objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2528">      <td><a href="https://cplusplus.github.io/CWG/issues/2528.html">2528</a></td> +    <td>[<a href="https://wg21.link/expr.arith.conv">expr.arith.conv</a>]</td>      <td>C++23</td>      <td>Three-way comparison and the usual arithmetic conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2529">      <td><a href="https://cplusplus.github.io/CWG/issues/2529.html">2529</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Constant destruction of constexpr references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2530">      <td><a href="https://cplusplus.github.io/CWG/issues/2530.html">2530</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++23</td>      <td>Multiple definitions of enumerators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2531">      <td><a href="https://cplusplus.github.io/CWG/issues/2531.html">2531</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>CD7</td>      <td>Static data members redeclared as constexpr</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2532">      <td><a href="https://cplusplus.github.io/CWG/issues/2532.html">2532</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Kind of pointer value returned by <TT>new T[0]</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2533">      <td><a href="https://cplusplus.github.io/CWG/issues/2533.html">2533</a></td> +    <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>      <td>CD7</td>      <td>Storage duration of implicitly created objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2534">      <td><a href="https://cplusplus.github.io/CWG/issues/2534.html">2534</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD6</td>      <td>Value category of pseudo-destructor expression</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2535">      <td><a href="https://cplusplus.github.io/CWG/issues/2535.html">2535</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD6</td>      <td>Type punning in class member access</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2536">      <td><a href="https://cplusplus.github.io/CWG/issues/2536.html">2536</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Partially initialized variables during constant initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2537">      <td><a href="https://cplusplus.github.io/CWG/issues/2537.html">2537</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>drafting</td>      <td>Overbroad grammar for <I>parameter-declaration</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2538">      <td><a href="https://cplusplus.github.io/CWG/issues/2538.html">2538</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>C++23</td>      <td>Can standard attributes be syntactically ignored?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2539">      <td><a href="https://cplusplus.github.io/CWG/issues/2539.html">2539</a></td> +    <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>      <td>C++23</td>      <td>Three-way comparison requiring strong ordering for floating-point types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2540">      <td><a href="https://cplusplus.github.io/CWG/issues/2540.html">2540</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>CD6</td>      <td>Unspecified interpretation of <I>numeric-escape-sequence</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2541">      <td><a href="https://cplusplus.github.io/CWG/issues/2541.html">2541</a></td> +    <td>[<a href="https://wg21.link/module.unit">module.unit</a>]</td>      <td>open</td>      <td>Linkage specifications, module purview, and module attachment</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2542">      <td><a href="https://cplusplus.github.io/CWG/issues/2542.html">2542</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD7</td>      <td>Is a closure type a structural type?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2543">      <td><a href="https://cplusplus.github.io/CWG/issues/2543.html">2543</a></td> +    <td>[<a href="https://wg21.link/dcl.constinit">dcl.constinit</a>]</td>      <td>C++23</td>      <td><TT>constinit</TT> and optimized dynamic initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2544">      <td><a href="https://cplusplus.github.io/CWG/issues/2544.html">2544</a></td> +    <td>[<a href="https://wg21.link/basic.compound">basic.compound</a>]</td>      <td>open</td>      <td>Address of past-the-end of a potentially-overlapping subobject</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2545">      <td><a href="https://cplusplus.github.io/CWG/issues/2545.html">2545</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Transparently replacing objects in constant expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2546">      <td><a href="https://cplusplus.github.io/CWG/issues/2546.html">2546</a></td> +    <td>[<a href="https://wg21.link/class.compare.secondary">class.compare.secondary</a>]</td>      <td>CD7</td>      <td>Defaulted secondary comparison operators defined as deleted</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2547">      <td><a href="https://cplusplus.github.io/CWG/issues/2547.html">2547</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD7</td>      <td>Defaulted comparison operator function for non-classes</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2548">      <td><a href="https://cplusplus.github.io/CWG/issues/2548.html">2548</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>NAD</td>      <td>Array prvalues and additive operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2549">      <td><a href="https://cplusplus.github.io/CWG/issues/2549.html">2549</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>      <td>CD7</td>      <td>Implicitly moving the operand of a <I>throw-expression</I> in unevaluated contexts</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2550">      <td><a href="https://cplusplus.github.io/CWG/issues/2550.html">2550</a></td> +    <td>[<a href="https://wg21.link/dcl.ref">dcl.ref</a>]</td>      <td>CD7</td>      <td>Type "reference to <I>cv</I> <TT>void</TT>" outside of a declarator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2551">      <td><a href="https://cplusplus.github.io/CWG/issues/2551.html">2551</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>review</td>      <td>"Refers to allocated storage" has no meaning</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2552">      <td><a href="https://cplusplus.github.io/CWG/issues/2552.html">2552</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Constant evaluation of non-defining variable declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2553">      <td><a href="https://cplusplus.github.io/CWG/issues/2553.html">2553</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>review</td>      <td>Restrictions on explicit object member functions</td>      <td align="center"> @@ -15161,6 +17672,7 @@ and <I>POD class</I></td>    </tr>    <tr class="open" id="2554">      <td><a href="https://cplusplus.github.io/CWG/issues/2554.html">2554</a></td> +    <td>[<a href="https://wg21.link/class.virtual">class.virtual</a>]</td>      <td>review</td>      <td>Overriding virtual functions, also with explicit object parameters</td>      <td align="center"> @@ -15171,66 +17683,77 @@ 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>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>tentatively ready</td>      <td>Ineffective redeclaration prevention for <I>using-declarator</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2556">      <td><a href="https://cplusplus.github.io/CWG/issues/2556.html">2556</a></td> +    <td>[<a href="https://wg21.link/stmt.return.coroutine">stmt.return.coroutine</a>]</td>      <td>CD7</td>      <td>Unusable <TT>promise::return_void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2557">      <td><a href="https://cplusplus.github.io/CWG/issues/2557.html">2557</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>review</td>      <td>Class member access referring to an unrelated class</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2558">      <td><a href="https://cplusplus.github.io/CWG/issues/2558.html">2558</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Uninitialized subobjects as a result of an immediate invocation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2559">      <td><a href="https://cplusplus.github.io/CWG/issues/2559.html">2559</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Defaulted consteval functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2560">      <td><a href="https://cplusplus.github.io/CWG/issues/2560.html">2560</a></td> +    <td>[<a href="https://wg21.link/expr.prim.req.general">expr.prim.req.general</a>]</td>      <td>CD7</td>      <td>Parameter type determination in a <I>requirement-parameter-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2561">      <td><a href="https://cplusplus.github.io/CWG/issues/2561.html">2561</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD7</td>      <td>Conversion to function pointer for lambda with explicit object parameter</td>      <td class="none" align="center">No</td>    </tr>    <tr class="open" id="2562">      <td><a href="https://cplusplus.github.io/CWG/issues/2562.html">2562</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>open</td>      <td>Exceptions thrown during coroutine startup</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2563">      <td><a href="https://cplusplus.github.io/CWG/issues/2563.html">2563</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>review</td>      <td>Initialization of coroutine result object</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2564">      <td><a href="https://cplusplus.github.io/CWG/issues/2564.html">2564</a></td> +    <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>      <td>drafting</td>      <td>Conversion to function pointer with an explicit object parameter</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2565">      <td><a href="https://cplusplus.github.io/CWG/issues/2565.html">2565</a></td> +    <td>[<a href="https://wg21.link/expr.prim.req.general">expr.prim.req.general</a>]</td>      <td>open</td>      <td>Invalid types in the <I>parameter-declaration-clause</I> of a <I>requires-expression</I></td>      <td align="center"> @@ -15241,1231 +17764,1435 @@ and <I>POD class</I></td>    </tr>    <tr class="open" id="2566">      <td><a href="https://cplusplus.github.io/CWG/issues/2566.html">2566</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>review</td>      <td>Matching deallocation for uncaught exception</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2567">      <td><a href="https://cplusplus.github.io/CWG/issues/2567.html">2567</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>NAD</td>      <td>Operator lookup ambiguity</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2568">      <td><a href="https://cplusplus.github.io/CWG/issues/2568.html">2568</a></td> +    <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>      <td>CD7</td>      <td>Access checking during synthesis of defaulted comparison operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2569">      <td><a href="https://cplusplus.github.io/CWG/issues/2569.html">2569</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.unqual">expr.prim.id.unqual</a>]</td>      <td>CD6</td>      <td>Use of <code>decltype(capture)</code> in a lambda's <I>parameter-declaration-clause</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2570">      <td><a href="https://cplusplus.github.io/CWG/issues/2570.html">2570</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD7</td>      <td>Clarify constexpr for defaulted functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2571">      <td><a href="https://cplusplus.github.io/CWG/issues/2571.html">2571</a></td> +    <td>[<a href="https://wg21.link/expr.sub">expr.sub</a>]</td>      <td>CD6</td>      <td>Evaluation order for subscripting</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2572">      <td><a href="https://cplusplus.github.io/CWG/issues/2572.html">2572</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>review</td>      <td>Address of overloaded function with no target</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2573">      <td><a href="https://cplusplus.github.io/CWG/issues/2573.html">2573</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD7</td>      <td>Undefined behavior when splicing results in a <I>universal-character-name</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2574">      <td><a href="https://cplusplus.github.io/CWG/issues/2574.html">2574</a></td> +    <td>[<a href="https://wg21.link/lex.pptoken">lex.pptoken</a>]</td>      <td>CD7</td>      <td>Undefined behavior when lexing unmatched quotes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2575">      <td><a href="https://cplusplus.github.io/CWG/issues/2575.html">2575</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>open</td>      <td>Undefined behavior when macro-replacing "defined" operator</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2576">      <td><a href="https://cplusplus.github.io/CWG/issues/2576.html">2576</a></td> +    <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>      <td>open</td>      <td>Undefined behavior with macro-expanded <TT>#include</TT> directives</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2577">      <td><a href="https://cplusplus.github.io/CWG/issues/2577.html">2577</a></td> +    <td>[<a href="https://wg21.link/cpp.replace.general">cpp.replace.general</a>]</td>      <td>open</td>      <td>Undefined behavior for preprocessing directives in macro arguments</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2578">      <td><a href="https://cplusplus.github.io/CWG/issues/2578.html">2578</a></td> +    <td>[<a href="https://wg21.link/cpp.stringize">cpp.stringize</a>]</td>      <td>CD7</td>      <td>Undefined behavior when creating an invalid string literal via stringizing</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2579">      <td><a href="https://cplusplus.github.io/CWG/issues/2579.html">2579</a></td> +    <td>[<a href="https://wg21.link/cpp.concat">cpp.concat</a>]</td>      <td>CD7</td>      <td>Undefined behavior when token pasting does not create a preprocessing token</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2580">      <td><a href="https://cplusplus.github.io/CWG/issues/2580.html">2580</a></td> +    <td>[<a href="https://wg21.link/cpp.line">cpp.line</a>]</td>      <td>CD7</td>      <td>Undefined behavior with <TT>#line</TT></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> +    <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>      <td>open</td>      <td>Undefined behavior for predefined macros</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2582">      <td><a href="https://cplusplus.github.io/CWG/issues/2582.html">2582</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>CD6</td>      <td>Differing member lookup from nested classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2583">      <td><a href="https://cplusplus.github.io/CWG/issues/2583.html">2583</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>C++23</td>      <td>Common initial sequence should consider over-alignment</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr class="open" id="2584">      <td><a href="https://cplusplus.github.io/CWG/issues/2584.html">2584</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>open</td>      <td>Equivalent types in function template declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2585">      <td><a href="https://cplusplus.github.io/CWG/issues/2585.html">2585</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>CD6</td>      <td>Name lookup for coroutine allocation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2586">      <td><a href="https://cplusplus.github.io/CWG/issues/2586.html">2586</a></td> +    <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>      <td>CD6</td>      <td>Explicit object parameter for assignment and comparison</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr class="open" id="2587">      <td><a href="https://cplusplus.github.io/CWG/issues/2587.html">2587</a></td> +    <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>      <td>review</td>      <td>Visible side effects and initial value of an object</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2588">      <td><a href="https://cplusplus.github.io/CWG/issues/2588.html">2588</a></td> +    <td>[<a href="https://wg21.link/class.friend">class.friend</a>]</td>      <td>CD7</td>      <td>friend declarations and module linkage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2589">      <td><a href="https://cplusplus.github.io/CWG/issues/2589.html">2589</a></td> +    <td>[<a href="https://wg21.link/temp.constr.atomic">temp.constr.atomic</a>]</td>      <td>review</td>      <td>Context of access checks during constraint satisfaction checking</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2590">      <td><a href="https://cplusplus.github.io/CWG/issues/2590.html">2590</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>C++23</td>      <td>Underlying type should determine size and alignment requirements of an enum</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2591">      <td><a href="https://cplusplus.github.io/CWG/issues/2591.html">2591</a></td> +    <td>[<a href="https://wg21.link/class.union.general">class.union.general</a>]</td>      <td>CD7</td>      <td>Implicit change of active union member for anonymous union in union</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2592">      <td><a href="https://cplusplus.github.io/CWG/issues/2592.html">2592</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Missing definition for placement allocation/deallocation function</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2593">      <td><a href="https://cplusplus.github.io/CWG/issues/2593.html">2593</a></td> +    <td>[<a href="https://wg21.link/expr.mptr.oper">expr.mptr.oper</a>]</td>      <td>review</td>      <td>Insufficient base class restriction for pointer-to-member expression</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2594">      <td><a href="https://cplusplus.github.io/CWG/issues/2594.html">2594</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD6</td>      <td>Disallowing a global function template <TT>main</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2595">      <td><a href="https://cplusplus.github.io/CWG/issues/2595.html">2595</a></td> +    <td>[<a href="https://wg21.link/special">special</a>]</td>      <td>CD7</td>      <td>"More constrained" for eligible special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2596">      <td><a href="https://cplusplus.github.io/CWG/issues/2596.html">2596</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>drafting</td>      <td>Instantiation of constrained non-template friends</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2597">      <td><a href="https://cplusplus.github.io/CWG/issues/2597.html">2597</a></td> +    <td>[<a href="https://wg21.link/module.unit">module.unit</a>]</td>      <td>CD6</td>      <td>Replaceable allocation and deallocation functions in the global module</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2598">      <td><a href="https://cplusplus.github.io/CWG/issues/2598.html">2598</a></td> +    <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>      <td>C++23</td>      <td>Unions should not require a non-static data member of literal type</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2599">      <td><a href="https://cplusplus.github.io/CWG/issues/2599.html">2599</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>C++23</td>      <td>What does initializing a parameter include?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2600">      <td><a href="https://cplusplus.github.io/CWG/issues/2600.html">2600</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>CD7</td>      <td>Type dependency of placeholder types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2601">      <td><a href="https://cplusplus.github.io/CWG/issues/2601.html">2601</a></td> +    <td>[<a href="https://wg21.link/except.ctor">except.ctor</a>]</td>      <td>C++23</td>      <td>Tracking of created and destroyed subobjects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2602">      <td><a href="https://cplusplus.github.io/CWG/issues/2602.html">2602</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>C++23</td>      <td>consteval defaulted functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2603">      <td><a href="https://cplusplus.github.io/CWG/issues/2603.html">2603</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>C++23</td>      <td>Holistic functional equivalence for function templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2604">      <td><a href="https://cplusplus.github.io/CWG/issues/2604.html">2604</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>C++23</td>      <td>Attributes for an explicit specialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2605">      <td><a href="https://cplusplus.github.io/CWG/issues/2605.html">2605</a></td> +    <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>      <td>C++23</td>      <td>Implicit-lifetime aggregates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2606">      <td><a href="https://cplusplus.github.io/CWG/issues/2606.html">2606</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD6</td>      <td><TT>static_cast</TT> from "pointer to void" does not handle similar types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2607">      <td><a href="https://cplusplus.github.io/CWG/issues/2607.html">2607</a></td> +    <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>      <td>drafting</td>      <td>Visibility of enumerator names</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2608">      <td><a href="https://cplusplus.github.io/CWG/issues/2608.html">2608</a></td> +    <td>[<a href="https://wg21.link/temp.arg.explicit">temp.arg.explicit</a>]</td>      <td>CD6</td>      <td>Omitting an empty template argument list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2609">      <td><a href="https://cplusplus.github.io/CWG/issues/2609.html">2609</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>open</td>      <td>Padding in class types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2610">      <td><a href="https://cplusplus.github.io/CWG/issues/2610.html">2610</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++23</td>      <td>Indirect private base classes in aggregates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2611">      <td><a href="https://cplusplus.github.io/CWG/issues/2611.html">2611</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>C++23</td>      <td>Missing parentheses in expansion of fold-expression could cause syntactic reinterpretation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2612">      <td><a href="https://cplusplus.github.io/CWG/issues/2612.html">2612</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>C++23</td>      <td>Incorrect comment in example</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2613">      <td><a href="https://cplusplus.github.io/CWG/issues/2613.html">2613</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>C++23</td>      <td>Incomplete definition of resumer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2614">      <td><a href="https://cplusplus.github.io/CWG/issues/2614.html">2614</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>C++23</td>      <td>Unspecified results for class member access</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2615">      <td><a href="https://cplusplus.github.io/CWG/issues/2615.html">2615</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>C++23</td>      <td>Missing <TT>__has_cpp_attribute(assume)</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2616">      <td><a href="https://cplusplus.github.io/CWG/issues/2616.html">2616</a></td> +    <td>[<a href="https://wg21.link/stmt">stmt</a>]</td>      <td>C++23</td>      <td>Imprecise restrictions on <TT>break</TT> and <TT>continue</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2617">      <td><a href="https://cplusplus.github.io/CWG/issues/2617.html">2617</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>review</td>      <td>Default template arguments for template members of non-template classes</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2618">      <td><a href="https://cplusplus.github.io/CWG/issues/2618.html">2618</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>      <td>C++23</td>      <td>Substitution during deduction should exclude exception specifications</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2619">      <td><a href="https://cplusplus.github.io/CWG/issues/2619.html">2619</a></td> +    <td>[<a href="https://wg21.link/dcl.init.aggr">dcl.init.aggr</a>]</td>      <td>C++23</td>      <td>Kind of initialization for a <I>designated-initializer-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2620">      <td><a href="https://cplusplus.github.io/CWG/issues/2620.html">2620</a></td> +    <td>[<a href="https://wg21.link/dcl.ambig.res">dcl.ambig.res</a>]</td>      <td>C++23</td>      <td>Nonsensical disambiguation rule</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2621">      <td><a href="https://cplusplus.github.io/CWG/issues/2621.html">2621</a></td> +    <td>[<a href="https://wg21.link/enum.udecl">enum.udecl</a>]</td>      <td>C++23</td>      <td>Kind of lookup for <TT>using enum</TT> declarations</td>      <td class="full-superseded" align="center">Superseded by <a href="#2877">2877</a></td>    </tr>    <tr id="2622">      <td><a href="https://cplusplus.github.io/CWG/issues/2622.html">2622</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>C++23</td>      <td>Compounding types from function and pointer-to-member types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2623">      <td><a href="https://cplusplus.github.io/CWG/issues/2623.html">2623</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>drafting</td>      <td>Invoking destroying <TT>operator delete</TT> for constructor failure</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2624">      <td><a href="https://cplusplus.github.io/CWG/issues/2624.html">2624</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>C++23</td>      <td>Array delete expression with no array cookie</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2625">      <td><a href="https://cplusplus.github.io/CWG/issues/2625.html">2625</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>C++23</td>      <td>Deletion of pointer to out-of-lifetime object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2626">      <td><a href="https://cplusplus.github.io/CWG/issues/2626.html">2626</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>C++23</td>      <td>Rephrase ones' complement using base-2 representation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2627">      <td><a href="https://cplusplus.github.io/CWG/issues/2627.html">2627</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>C++23</td>      <td>Bit-fields and narrowing conversions</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2628">      <td><a href="https://cplusplus.github.io/CWG/issues/2628.html">2628</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>CD7</td>      <td>Implicit deduction guides should propagate constraints</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2629">      <td><a href="https://cplusplus.github.io/CWG/issues/2629.html">2629</a></td> +    <td>[<a href="https://wg21.link/stmt.switch">stmt.switch</a>]</td>      <td>C++23</td>      <td>Variables of floating-point type as <TT>switch</TT> conditions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2630">      <td><a href="https://cplusplus.github.io/CWG/issues/2630.html">2630</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>C++23</td>      <td>Syntactic specification of class completeness</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2631">      <td><a href="https://cplusplus.github.io/CWG/issues/2631.html">2631</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Immediate function evaluations in default arguments</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr class="open" id="2632">      <td><a href="https://cplusplus.github.io/CWG/issues/2632.html">2632</a></td> +    <td>[<a href="https://wg21.link/intro.defs">intro.defs</a>]</td>      <td>drafting</td>      <td>'user-declared' is not defined</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2633">      <td><a href="https://cplusplus.github.io/CWG/issues/2633.html">2633</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>typeid of constexpr-unknown dynamic type</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2634">      <td><a href="https://cplusplus.github.io/CWG/issues/2634.html">2634</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>CD7</td>      <td>Avoid circularity in specification of scope for friend class declarations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2635">      <td><a href="https://cplusplus.github.io/CWG/issues/2635.html">2635</a></td> +    <td>[<a href="https://wg21.link/dcl.pre">dcl.pre</a>]</td>      <td>C++23</td>      <td>Constrained structured bindings</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="2636">      <td><a href="https://cplusplus.github.io/CWG/issues/2636.html">2636</a></td> +    <td>[<a href="https://wg21.link/ub">ub</a>]</td>      <td>C++23</td>      <td>Update Annex E based on Unicode 15.0 UAX #31</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="2637">      <td><a href="https://cplusplus.github.io/CWG/issues/2637.html">2637</a></td> +    <td>[<a href="https://wg21.link/class.pre">class.pre</a>]</td>      <td>CD7</td>      <td>Injected-class-name as a <I>simple-template-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2638">      <td><a href="https://cplusplus.github.io/CWG/issues/2638.html">2638</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD7</td>      <td>Improve the example for initializing by initializer list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2639">      <td><a href="https://cplusplus.github.io/CWG/issues/2639.html">2639</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>C++23</td>      <td>new-lines after phase 1</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2640">      <td><a href="https://cplusplus.github.io/CWG/issues/2640.html">2640</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>C++23</td>      <td>Allow more characters in an n-char sequence</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="2641">      <td><a href="https://cplusplus.github.io/CWG/issues/2641.html">2641</a></td> +    <td>[<a href="https://wg21.link/lex.literal">lex.literal</a>]</td>      <td>C++23</td>      <td>Redundant specification of value category of literals</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2642">      <td><a href="https://cplusplus.github.io/CWG/issues/2642.html">2642</a></td> +    <td>[<a href="https://wg21.link/class.member.lookup">class.member.lookup</a>]</td>      <td>C++23</td>      <td>Inconsistent use of T and C</td>      <td class="na" align="center">N/A</td>    </tr>    <tr id="2643">      <td><a href="https://cplusplus.github.io/CWG/issues/2643.html">2643</a></td> +    <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>      <td>C++23</td>      <td>Completing a pointer to array of unknown bound</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2644">      <td><a href="https://cplusplus.github.io/CWG/issues/2644.html">2644</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>C++23</td>      <td>Incorrect comment in example</td>      <td class="full" align="center">Clang 8</td>    </tr>    <tr id="2645">      <td><a href="https://cplusplus.github.io/CWG/issues/2645.html">2645</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>C++23</td>      <td>Unused term "default argument promotions"</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2646">      <td><a href="https://cplusplus.github.io/CWG/issues/2646.html">2646</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>C++23</td>      <td>Defaulted special member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2647">      <td><a href="https://cplusplus.github.io/CWG/issues/2647.html">2647</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Fix for "needed for constant evaluation"</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2648">      <td><a href="https://cplusplus.github.io/CWG/issues/2648.html">2648</a></td> +    <td>[<a href="https://wg21.link/over.call">over.call</a>]</td>      <td>C++23</td>      <td>Correspondence of surrogate call function and conversion function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2649">      <td><a href="https://cplusplus.github.io/CWG/issues/2649.html">2649</a></td> +    <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>      <td>C++23</td>      <td>Incorrect note about implicit conversion sequence</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2650">      <td><a href="https://cplusplus.github.io/CWG/issues/2650.html">2650</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>      <td>C++23</td>      <td>Incorrect example for ill-formed non-type template arguments</td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr id="2651">      <td><a href="https://cplusplus.github.io/CWG/issues/2651.html">2651</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.conv">temp.deduct.conv</a>]</td>      <td>C++23</td>      <td>Conversion function templates and "noexcept"</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2652">      <td><a href="https://cplusplus.github.io/CWG/issues/2652.html">2652</a></td> +    <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>      <td>C++23</td>      <td>Overbroad definition of <TT>__STDCPP_BFLOAT16_T__</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2653">      <td><a href="https://cplusplus.github.io/CWG/issues/2653.html">2653</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>C++23</td>      <td>Can an explicit object parameter have a default argument?</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2654">      <td><a href="https://cplusplus.github.io/CWG/issues/2654.html">2654</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>C++23</td>      <td>Un-deprecation of compound volatile assignments</td>      <td class="full" align="center">Clang 16</td>    </tr>    <tr id="2655">      <td><a href="https://cplusplus.github.io/CWG/issues/2655.html">2655</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>NAD</td>      <td>Instantiation of default arguments in <I>lambda-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2656">      <td><a href="https://cplusplus.github.io/CWG/issues/2656.html">2656</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>drafting</td>      <td>Converting consteval lambda to function pointer in non-immediate context</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2657">      <td><a href="https://cplusplus.github.io/CWG/issues/2657.html">2657</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD7</td>      <td>Cv-qualification adjustment when binding reference to temporary</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2658">      <td><a href="https://cplusplus.github.io/CWG/issues/2658.html">2658</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>C++23</td>      <td>Trivial copying of unions in core constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2659">      <td><a href="https://cplusplus.github.io/CWG/issues/2659.html">2659</a></td> +    <td>[<a href="https://wg21.link/cpp.predefined">cpp.predefined</a>]</td>      <td>C++23</td>      <td>Missing feature-test macro for lifetime extension in range-for loop</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2660">      <td><a href="https://cplusplus.github.io/CWG/issues/2660.html">2660</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>open</td>      <td>Confusing term "this parameter"</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2661">      <td><a href="https://cplusplus.github.io/CWG/issues/2661.html">2661</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>CD7</td>      <td>Missing disambiguation rule for <I>pure-specifier</I> vs. <I>brace-or-equal-initializer</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2662">      <td><a href="https://cplusplus.github.io/CWG/issues/2662.html">2662</a></td> +    <td>[<a href="https://wg21.link/class.access.general">class.access.general</a>]</td>      <td>C++23</td>      <td>Example for member access control vs. overload resolution</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2663">      <td><a href="https://cplusplus.github.io/CWG/issues/2663.html">2663</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>CD7</td>      <td>Example for member redeclarations with <I>using-declaration</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2664">      <td><a href="https://cplusplus.github.io/CWG/issues/2664.html">2664</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>C++23</td>      <td>Deduction failure in CTAD for alias templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2665">      <td><a href="https://cplusplus.github.io/CWG/issues/2665.html">2665</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>NAD</td>      <td>Replacing a subobject with a complete object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2666">      <td><a href="https://cplusplus.github.io/CWG/issues/2666.html">2666</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>open</td>      <td>Lifetime extension through <TT>static_cast</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2667">      <td><a href="https://cplusplus.github.io/CWG/issues/2667.html">2667</a></td> +    <td>[<a href="https://wg21.link/cpp.import">cpp.import</a>]</td>      <td>C++23</td>      <td>Named module imports do not import macros</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2668">      <td><a href="https://cplusplus.github.io/CWG/issues/2668.html">2668</a></td> +    <td>[<a href="https://wg21.link/expr.await">expr.await</a>]</td>      <td>CD7</td>      <td><TT>co_await</TT> in a <I>lambda-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2669">      <td><a href="https://cplusplus.github.io/CWG/issues/2669.html">2669</a></td> +    <td>[<a href="https://wg21.link/class.base.init">class.base.init</a>]</td>      <td>open</td>      <td>Lifetime extension for aggregate initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2670">      <td><a href="https://cplusplus.github.io/CWG/issues/2670.html">2670</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>open</td>      <td>Programs and translation units</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2671">      <td><a href="https://cplusplus.github.io/CWG/issues/2671.html">2671</a></td> +    <td>[<a href="https://wg21.link/dcl.meaning.general">dcl.meaning.general</a>]</td>      <td>open</td>      <td>friend named by a <I>template-id</I></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2672">      <td><a href="https://cplusplus.github.io/CWG/issues/2672.html">2672</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>      <td>CD7</td>      <td>Lambda body SFINAE is still required, contrary to intent and note</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2673">      <td><a href="https://cplusplus.github.io/CWG/issues/2673.html">2673</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>C++23</td>      <td>User-declared spaceship vs. built-in operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2674">      <td><a href="https://cplusplus.github.io/CWG/issues/2674.html">2674</a></td> +    <td>[<a href="https://wg21.link/class.ctor.general">class.ctor.general</a>]</td>      <td>C++23</td>      <td>Prohibit explicit object parameters for constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2675">      <td><a href="https://cplusplus.github.io/CWG/issues/2675.html">2675</a></td> +    <td>[<a href="https://wg21.link/class.union.general">class.union.general</a>]</td>      <td>open</td>      <td><TT>start_lifetime_as</TT>, placement-new, and active union members</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2676">      <td><a href="https://cplusplus.github.io/CWG/issues/2676.html">2676</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Replacing a complete object having base subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2677">      <td><a href="https://cplusplus.github.io/CWG/issues/2677.html">2677</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>review</td>      <td>Replacing union subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2678">      <td><a href="https://cplusplus.github.io/CWG/issues/2678.html">2678</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>C++23</td>      <td><TT>std::source_location::current</TT> is unimplementable</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2679">      <td><a href="https://cplusplus.github.io/CWG/issues/2679.html">2679</a></td> +    <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>      <td>open</td>      <td>Implicit conversion sequence with a null pointer constant</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2680">      <td><a href="https://cplusplus.github.io/CWG/issues/2680.html">2680</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>open</td>      <td>Class template argument deduction for aggregates with designated initializers</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2681">      <td><a href="https://cplusplus.github.io/CWG/issues/2681.html">2681</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>C++23</td>      <td>Deducing member array type from string literal</td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr id="2682">      <td><a href="https://cplusplus.github.io/CWG/issues/2682.html">2682</a></td> +    <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>      <td>C++23</td>      <td>Templated function vs. function template</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2683">      <td><a href="https://cplusplus.github.io/CWG/issues/2683.html">2683</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>CD7</td>      <td>Default arguments for member functions of templated nested classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2684">      <td><a href="https://cplusplus.github.io/CWG/issues/2684.html">2684</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>open</td>      <td>thread_local dynamic initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2685">      <td><a href="https://cplusplus.github.io/CWG/issues/2685.html">2685</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>C++23</td>      <td>Aggregate CTAD, string, and brace elision</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2686">      <td><a href="https://cplusplus.github.io/CWG/issues/2686.html">2686</a></td> +    <td>[<a href="https://wg21.link/temp.constr.constr">temp.constr.constr</a>]</td>      <td>open</td>      <td>Pack expansion into a non-pack parameter of a concept</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2687">      <td><a href="https://cplusplus.github.io/CWG/issues/2687.html">2687</a></td> +    <td>[<a href="https://wg21.link/over.match.call.general">over.match.call.general</a>]</td>      <td>C++23</td>      <td>Calling an explicit object member function via an address-of-overload-set</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr class="open" id="2688">      <td><a href="https://cplusplus.github.io/CWG/issues/2688.html">2688</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>open</td>      <td>Calling explicit object member functions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2689">      <td><a href="https://cplusplus.github.io/CWG/issues/2689.html">2689</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD7</td>      <td>Are cv-qualified <TT>std::nullptr_t</TT> fundamental types?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2690">      <td><a href="https://cplusplus.github.io/CWG/issues/2690.html">2690</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>C++23</td>      <td>Semantics of defaulted move assignment operator for unions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2691">      <td><a href="https://cplusplus.github.io/CWG/issues/2691.html">2691</a></td> +    <td>[<a href="https://wg21.link/lex.ccon">lex.ccon</a>]</td>      <td>C++23</td>      <td><I>hexadecimal-escape-sequence</I> is too greedy</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2692">      <td><a href="https://cplusplus.github.io/CWG/issues/2692.html">2692</a></td> +    <td>[<a href="https://wg21.link/over.match.call.general">over.match.call.general</a>]</td>      <td>C++23</td>      <td>Static and explicit object member functions with the same parameter-type-lists</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr class="open" id="2693">      <td><a href="https://cplusplus.github.io/CWG/issues/2693.html">2693</a></td> +    <td>[<a href="https://wg21.link/cpp.line">cpp.line</a>]</td>      <td>open</td>      <td>Escape sequences for the <I>string-literal</I> of <TT>#line</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2694">      <td><a href="https://cplusplus.github.io/CWG/issues/2694.html">2694</a></td> +    <td>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</a>]</td>      <td>open</td>      <td><I>string-literal</I>s of the <TT>_Pragma</TT> operator</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2695">      <td><a href="https://cplusplus.github.io/CWG/issues/2695.html">2695</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>C++23</td>      <td>Semantic ignorability of attributes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2696">      <td><a href="https://cplusplus.github.io/CWG/issues/2696.html">2696</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>dup</td>      <td>Relational comparisons of pointers to <TT>void</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2697">      <td><a href="https://cplusplus.github.io/CWG/issues/2697.html">2697</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>      <td>CD7</td>      <td>Deduction guides using abbreviated function syntax</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2698">      <td><a href="https://cplusplus.github.io/CWG/issues/2698.html">2698</a></td> +    <td>[<a href="https://wg21.link/lex.icon">lex.icon</a>]</td>      <td>CD7</td>      <td>Using extended integer types with <TT>z</TT> suffix</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2699">      <td><a href="https://cplusplus.github.io/CWG/issues/2699.html">2699</a></td> +    <td>[<a href="https://wg21.link/expr.throw">expr.throw</a>]</td>      <td>CD7</td>      <td>Inconsistency of <I>throw-expression</I> specification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2700">      <td><a href="https://cplusplus.github.io/CWG/issues/2700.html">2700</a></td> +    <td>[<a href="https://wg21.link/intro.compliance.general">intro.compliance.general</a>]</td>      <td>CD7</td>      <td><TT>#error</TT> disallows existing implementation practice</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2701">      <td><a href="https://cplusplus.github.io/CWG/issues/2701.html">2701</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>open</td>      <td>Default arguments in multiple scopes / inheritance of array bounds in the same scope</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2702">      <td><a href="https://cplusplus.github.io/CWG/issues/2702.html">2702</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Constant destruction of reference members</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2703">      <td><a href="https://cplusplus.github.io/CWG/issues/2703.html">2703</a></td> +    <td>[<a href="https://wg21.link/class.spaceship">class.spaceship</a>]</td>      <td>CD7</td>      <td>Three-way comparison requiring strong ordering for floating-point types, take 2</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2704">      <td><a href="https://cplusplus.github.io/CWG/issues/2704.html">2704</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>open</td>      <td>Clarify meaning of "bind directly"</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2705">      <td><a href="https://cplusplus.github.io/CWG/issues/2705.html">2705</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>open</td>      <td>Accessing ambiguous subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2706">      <td><a href="https://cplusplus.github.io/CWG/issues/2706.html">2706</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>open</td>      <td>Repeated structured binding declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2707">      <td><a href="https://cplusplus.github.io/CWG/issues/2707.html">2707</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>      <td>CD7</td>      <td>Deduction guides cannot have a trailing <I>requires-clause</I></td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2708">      <td><a href="https://cplusplus.github.io/CWG/issues/2708.html">2708</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>CD7</td>      <td>Parenthesized initialization of arrays</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2709">      <td><a href="https://cplusplus.github.io/CWG/issues/2709.html">2709</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>NAD</td>      <td>Parenthesized initialization of reference-to-aggregate</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2710">      <td><a href="https://cplusplus.github.io/CWG/issues/2710.html">2710</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Loops in constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2711">      <td><a href="https://cplusplus.github.io/CWG/issues/2711.html">2711</a></td> +    <td>[<a href="https://wg21.link/expr.throw">expr.throw</a>]</td>      <td>CD7</td>      <td>Source for copy-initializing the exception object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2712">      <td><a href="https://cplusplus.github.io/CWG/issues/2712.html">2712</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>CD7</td>      <td>Simplify restrictions on built-in assignment operator candidates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2713">      <td><a href="https://cplusplus.github.io/CWG/issues/2713.html">2713</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD7</td>      <td>Initialization of reference-to-aggregate from designated initializer list</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2714">      <td><a href="https://cplusplus.github.io/CWG/issues/2714.html">2714</a></td> +    <td>[<a href="https://wg21.link/over.match.class.deduct">over.match.class.deduct</a>]</td>      <td>CD7</td>      <td>Implicit deduction guides omit properties from the parameter-declaration-clause of a constructor</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2715">      <td><a href="https://cplusplus.github.io/CWG/issues/2715.html">2715</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>CD7</td>      <td>"calling function" for parameter initialization may not exist</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2716">      <td><a href="https://cplusplus.github.io/CWG/issues/2716.html">2716</a></td> +    <td>[<a href="https://wg21.link/class.conv.fct">class.conv.fct</a>]</td>      <td>CD7</td>      <td>Rule about self-or-base conversion is normatively redundant</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2717">      <td><a href="https://cplusplus.github.io/CWG/issues/2717.html">2717</a></td> +    <td>[<a href="https://wg21.link/temp.variadic">temp.variadic</a>]</td>      <td>CD7</td>      <td>Pack expansion for <I>alignment-specifier</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2718">      <td><a href="https://cplusplus.github.io/CWG/issues/2718.html">2718</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD7</td>      <td>Type completeness for derived-to-base conversions</td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="2719">      <td><a href="https://cplusplus.github.io/CWG/issues/2719.html">2719</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>CD7</td>      <td>Creating objects in misaligned storage</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2720">      <td><a href="https://cplusplus.github.io/CWG/issues/2720.html">2720</a></td> +    <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>      <td>CD7</td>      <td>Template validity rules for templated entities and alias templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2721">      <td><a href="https://cplusplus.github.io/CWG/issues/2721.html">2721</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>CD7</td>      <td>When exactly is storage reused?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2722">      <td><a href="https://cplusplus.github.io/CWG/issues/2722.html">2722</a></td> +    <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>      <td>CD7</td>      <td>Temporary materialization conversion for <TT>noexcept</TT> operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2723">      <td><a href="https://cplusplus.github.io/CWG/issues/2723.html">2723</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>CD7</td>      <td>Range of representable values for floating-point types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2724">      <td><a href="https://cplusplus.github.io/CWG/issues/2724.html">2724</a></td> +    <td>[<a href="https://wg21.link/expr.shift">expr.shift</a>]</td>      <td>CD7</td>      <td>Clarify rounding for arithmetic right shift</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2725">      <td><a href="https://cplusplus.github.io/CWG/issues/2725.html">2725</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD7</td>      <td>Overload resolution for non-call of class member access</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2726">      <td><a href="https://cplusplus.github.io/CWG/issues/2726.html">2726</a></td> +    <td>[<a href="https://wg21.link/lex.digraph">lex.digraph</a>]</td>      <td>review</td>      <td>Alternative tokens appearing as <I>attribute-token</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2727">      <td><a href="https://cplusplus.github.io/CWG/issues/2727.html">2727</a></td> +    <td>[<a href="https://wg21.link/module.import">module.import</a>]</td>      <td>open</td>      <td>Importing header units synthesized from source files</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2728">      <td><a href="https://cplusplus.github.io/CWG/issues/2728.html">2728</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD7</td>      <td>Evaluation of conversions in a <I>delete-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2729">      <td><a href="https://cplusplus.github.io/CWG/issues/2729.html">2729</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>CD7</td>      <td>Meaning of <I>new-type-id</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2730">      <td><a href="https://cplusplus.github.io/CWG/issues/2730.html">2730</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>open</td>      <td>Comparison templates on enumeration types</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2731">      <td><a href="https://cplusplus.github.io/CWG/issues/2731.html">2731</a></td> +    <td>[<a href="https://wg21.link/over.ics.user">over.ics.user</a>]</td>      <td>open</td>      <td>List-initialization sequence with a user-defined conversion</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2732">      <td><a href="https://cplusplus.github.io/CWG/issues/2732.html">2732</a></td> +    <td>[<a href="https://wg21.link/module.import">module.import</a>]</td>      <td>CD7</td>      <td>Can importable headers react to preprocessor state from point of import?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2733">      <td><a href="https://cplusplus.github.io/CWG/issues/2733.html">2733</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.unused">dcl.attr.unused</a>]</td>      <td>CD7</td>      <td>Applying <TT>[[maybe_unused]]</TT> to a label</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2734">      <td><a href="https://cplusplus.github.io/CWG/issues/2734.html">2734</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Immediate forward-declared function templates</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2735">      <td><a href="https://cplusplus.github.io/CWG/issues/2735.html">2735</a></td> +    <td>[<a href="https://wg21.link/over.match.best">over.match.best</a>]</td>      <td>open</td>      <td>List-initialization and conversions in overload resolution</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2736">      <td><a href="https://cplusplus.github.io/CWG/issues/2736.html">2736</a></td> +    <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>      <td>open</td>      <td>Standard layout class with empty base class also in first member</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2737">      <td><a href="https://cplusplus.github.io/CWG/issues/2737.html">2737</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.capture">expr.prim.lambda.capture</a>]</td>      <td>review</td>      <td>Temporary lifetime extension for reference init-captures</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2738">      <td><a href="https://cplusplus.github.io/CWG/issues/2738.html">2738</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.unqual">expr.prim.id.unqual</a>]</td>      <td>review</td>      <td>"denotes a destructor" is missing specification</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2739">      <td><a href="https://cplusplus.github.io/CWG/issues/2739.html">2739</a></td> +    <td>[<a href="https://wg21.link/expr.prim.req.nested">expr.prim.req.nested</a>]</td>      <td>open</td>      <td>Nested requirement not a constant expression</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2740">      <td><a href="https://cplusplus.github.io/CWG/issues/2740.html">2740</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Too many objects have constexpr-unknown type</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2741">      <td><a href="https://cplusplus.github.io/CWG/issues/2741.html">2741</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>open</td>      <td>Implicit conversion sequence from empty list to array of unknown bound</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2742">      <td><a href="https://cplusplus.github.io/CWG/issues/2742.html">2742</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>drafting</td>      <td>Guaranteed copy elision for brace-initialization from prvalue</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2743">      <td><a href="https://cplusplus.github.io/CWG/issues/2743.html">2743</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>open</td>      <td>Copying non-trivial objects nested within a union</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2744">      <td><a href="https://cplusplus.github.io/CWG/issues/2744.html">2744</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>open</td>      <td>Multiple objects of the same type at the same address</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2745">      <td><a href="https://cplusplus.github.io/CWG/issues/2745.html">2745</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD7</td>      <td>Dependent odr-use in generic lambdas</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2746">      <td><a href="https://cplusplus.github.io/CWG/issues/2746.html">2746</a></td> +    <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>      <td>CD7</td>      <td>Checking of default template arguments</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2747">      <td><a href="https://cplusplus.github.io/CWG/issues/2747.html">2747</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD7</td>      <td>Cannot depend on an already-deleted splice</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2748">      <td><a href="https://cplusplus.github.io/CWG/issues/2748.html">2748</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD7</td>      <td>Accessing static data members via null pointer</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2749">      <td><a href="https://cplusplus.github.io/CWG/issues/2749.html">2749</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD7</td>      <td>Treatment of "pointer to void" for relational comparisons</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2750">      <td><a href="https://cplusplus.github.io/CWG/issues/2750.html">2750</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>construct_at without constructor call</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2751">      <td><a href="https://cplusplus.github.io/CWG/issues/2751.html">2751</a></td> +    <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>      <td>NAD</td>      <td>Order of destruction for parameters for operator functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2752">      <td><a href="https://cplusplus.github.io/CWG/issues/2752.html">2752</a></td> +    <td>[<a href="https://wg21.link/lex.fcon">lex.fcon</a>]</td>      <td>open</td>      <td>Excess-precision floating-point literals</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2753">      <td><a href="https://cplusplus.github.io/CWG/issues/2753.html">2753</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>CD7</td>      <td>Storage reuse for string literal objects and backing arrays</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2754">      <td><a href="https://cplusplus.github.io/CWG/issues/2754.html">2754</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>CD7</td>      <td>Using *this in explicit object member functions that are coroutines</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2755">      <td><a href="https://cplusplus.github.io/CWG/issues/2755.html">2755</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Incorrect wording applied by P2738R1</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2756">      <td><a href="https://cplusplus.github.io/CWG/issues/2756.html">2756</a></td> +    <td>[<a href="https://wg21.link/class.init">class.init</a>]</td>      <td>review</td>      <td>Completion of initialization by delegating constructor</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2757">      <td><a href="https://cplusplus.github.io/CWG/issues/2757.html">2757</a></td> +    <td>[<a href="https://wg21.link/class.cdtor">class.cdtor</a>]</td>      <td>review</td>      <td>Deleting or deallocating storage of an object during its construction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2758">      <td><a href="https://cplusplus.github.io/CWG/issues/2758.html">2758</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD7</td>      <td>What is "access and ambiguity control"?</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2759">      <td><a href="https://cplusplus.github.io/CWG/issues/2759.html">2759</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>CD7</td>      <td>[[no_unique_address] and common initial sequence</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="2760">      <td><a href="https://cplusplus.github.io/CWG/issues/2760.html">2760</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Defaulted constructor that is an immediate function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2761">      <td><a href="https://cplusplus.github.io/CWG/issues/2761.html">2761</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD7</td>      <td>Implicitly invoking the deleted destructor of an anonymous union member</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2762">      <td><a href="https://cplusplus.github.io/CWG/issues/2762.html">2762</a></td> +    <td>[<a href="https://wg21.link/over.match.funcs.general">over.match.funcs.general</a>]</td>      <td>CD7</td>      <td>Type of implicit object parameter</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2763">      <td><a href="https://cplusplus.github.io/CWG/issues/2763.html">2763</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Ignorability of [[noreturn]] during constant evaluation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2764">      <td><a href="https://cplusplus.github.io/CWG/issues/2764.html">2764</a></td> +    <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>      <td>CD7</td>      <td>Use of placeholders affecting name mangling</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2765">      <td><a href="https://cplusplus.github.io/CWG/issues/2765.html">2765</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>open</td>      <td>Address comparisons between potentially non-unique objects during constant evaluation</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2766">      <td><a href="https://cplusplus.github.io/CWG/issues/2766.html">2766</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>open</td> -    <td>Repeated evaluation of a <I>string-literal</I> may yield different -objects</td> +    <td>Repeated evaluation of a <I>string-literal</I> may yield different objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2767">      <td><a href="https://cplusplus.github.io/CWG/issues/2767.html">2767</a></td> +    <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>      <td>open</td>      <td>Non-defining declarations of anonymous unions</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2768">      <td><a href="https://cplusplus.github.io/CWG/issues/2768.html">2768</a></td> +    <td>[<a href="https://wg21.link/expr.assign">expr.assign</a>]</td>      <td>CD7</td>      <td>Assignment to enumeration variable with a <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2769">      <td><a href="https://cplusplus.github.io/CWG/issues/2769.html">2769</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>      <td>open</td>      <td>Substitution into template parameters and default template arguments should be interleaved</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2770">      <td><a href="https://cplusplus.github.io/CWG/issues/2770.html">2770</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</a>]</td>      <td>open</td>      <td>Trailing <I>requires-clause</I> can refer to function parameters before they are substituted into</td>      <td align="center"> @@ -16476,462 +19203,539 @@ objects</td>    </tr>    <tr id="2771">      <td><a href="https://cplusplus.github.io/CWG/issues/2771.html">2771</a></td> +    <td>[<a href="https://wg21.link/class.mfct.non.static">class.mfct.non.static</a>]</td>      <td>CD7</td>      <td>Transformation for <I>unqualified-id</I>s in address operator</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr id="2772">      <td><a href="https://cplusplus.github.io/CWG/issues/2772.html">2772</a></td> +    <td>[<a href="https://wg21.link/diff.cpp03.dcl.dcl">diff.cpp03.dcl.dcl</a>]</td>      <td>CD7</td>      <td>Missing Annex C entry for linkage effects of <I>linkage-specification</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2773">      <td><a href="https://cplusplus.github.io/CWG/issues/2773.html">2773</a></td> +    <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>      <td>open</td>      <td>Naming anonymous union members as class members</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2774">      <td><a href="https://cplusplus.github.io/CWG/issues/2774.html">2774</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>open</td>      <td>Value-dependence of <I>requires-expression</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2775">      <td><a href="https://cplusplus.github.io/CWG/issues/2775.html">2775</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD7</td>      <td>Unclear argument type for copy of exception object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2776">      <td><a href="https://cplusplus.github.io/CWG/issues/2776.html">2776</a></td> +    <td>[<a href="https://wg21.link/intro.compliance.general">intro.compliance.general</a>]</td>      <td>open</td>      <td>Substitution failure and implementation limits</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2777">      <td><a href="https://cplusplus.github.io/CWG/issues/2777.html">2777</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>CD7</td>      <td>Type of <I>id-expression</I> denoting a template parameter object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2778">      <td><a href="https://cplusplus.github.io/CWG/issues/2778.html">2778</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>review</td>      <td>Trivial destructor does not imply constant destruction</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2779">      <td><a href="https://cplusplus.github.io/CWG/issues/2779.html">2779</a></td> +    <td>[<a href="https://wg21.link/lex.charset">lex.charset</a>]</td>      <td>open</td>      <td>Restrictions on the ordinary literal encoding</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2780">      <td><a href="https://cplusplus.github.io/CWG/issues/2780.html">2780</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD7</td>      <td><TT>reinterpret_cast</TT> to reference to function types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2781">      <td><a href="https://cplusplus.github.io/CWG/issues/2781.html">2781</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>open</td>      <td>Unclear recursion in the one-definition rule</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2782">      <td><a href="https://cplusplus.github.io/CWG/issues/2782.html">2782</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>open</td>      <td>Treatment of closure types in the one-definition rule</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2783">      <td><a href="https://cplusplus.github.io/CWG/issues/2783.html">2783</a></td> +    <td>[<a href="https://wg21.link/module.global.frag">module.global.frag</a>]</td>      <td>CD7</td>      <td>Handling of deduction guides in <I>global-module-fragment</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2784">      <td><a href="https://cplusplus.github.io/CWG/issues/2784.html">2784</a></td> +    <td>[<a href="https://wg21.link/support.types.layout">support.types.layout</a>]</td>      <td>open</td>      <td>Unclear definition of <I>member-designator</I> for <TT>offsetof</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2785">      <td><a href="https://cplusplus.github.io/CWG/issues/2785.html">2785</a></td> +    <td>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</a>]</td>      <td>CD7</td>      <td>Type-dependence of <I>requires-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2786">      <td><a href="https://cplusplus.github.io/CWG/issues/2786.html">2786</a></td> +    <td>[<a href="https://wg21.link/expr.eq">expr.eq</a>]</td>      <td>open</td>      <td>Comparing pointers to complete objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2787">      <td><a href="https://cplusplus.github.io/CWG/issues/2787.html">2787</a></td> +    <td>[<a href="https://wg21.link/special">special</a>]</td>      <td>open</td>      <td>Kind of explicit object copy/move assignment function</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2788">      <td><a href="https://cplusplus.github.io/CWG/issues/2788.html">2788</a></td> +    <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>      <td>open</td>      <td>Correspondence and redeclarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2789">      <td><a href="https://cplusplus.github.io/CWG/issues/2789.html">2789</a></td> +    <td>[<a href="https://wg21.link/over.match.best.general">over.match.best.general</a>]</td>      <td>CD7</td>      <td>Overload resolution with implicit and explicit object member functions</td>      <td class="full" align="center">Clang 18</td>    </tr>    <tr class="open" id="2790">      <td><a href="https://cplusplus.github.io/CWG/issues/2790.html">2790</a></td> +    <td>[<a href="https://wg21.link/over.ics.list">over.ics.list</a>]</td>      <td>open</td>      <td>Aggregate initialization and user-defined conversion sequence</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2791">      <td><a href="https://cplusplus.github.io/CWG/issues/2791.html">2791</a></td> +    <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>      <td>CD7</td>      <td>Unclear phrasing about "returning to the caller"</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2792">      <td><a href="https://cplusplus.github.io/CWG/issues/2792.html">2792</a></td> +    <td>[<a href="https://wg21.link/expr.unary.noexcept">expr.unary.noexcept</a>]</td>      <td>CD7</td>      <td>Clean up specification of <TT>noexcept</TT> operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2793">      <td><a href="https://cplusplus.github.io/CWG/issues/2793.html">2793</a></td> +    <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>      <td>CD7</td>      <td>Block-scope declaration conflicting with parameter name</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2794">      <td><a href="https://cplusplus.github.io/CWG/issues/2794.html">2794</a></td> +    <td>[<a href="https://wg21.link/temp.alias">temp.alias</a>]</td>      <td>open</td>      <td>Uniqueness of lambdas in alias templates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2795">      <td><a href="https://cplusplus.github.io/CWG/issues/2795.html">2795</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>CD7</td>      <td>Overlapping empty subobjects with different cv-qualification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2796">      <td><a href="https://cplusplus.github.io/CWG/issues/2796.html">2796</a></td> +    <td>[<a href="https://wg21.link/expr.rel">expr.rel</a>]</td>      <td>CD7</td>      <td>Function pointer conversions for relational operators</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2797">      <td><a href="https://cplusplus.github.io/CWG/issues/2797.html">2797</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>review</td>      <td>Meaning of "corresponds" for rewritten operator candidates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2798">      <td><a href="https://cplusplus.github.io/CWG/issues/2798.html">2798</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Manifestly constant evaluation of the <TT>static_assert</TT> message</td>      <td class="full" align="center">Clang 17</td>    </tr>    <tr class="open" id="2799">      <td><a href="https://cplusplus.github.io/CWG/issues/2799.html">2799</a></td> +    <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>      <td>drafting</td>      <td>Inheriting default constructors</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2800">      <td><a href="https://cplusplus.github.io/CWG/issues/2800.html">2800</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>review</td>      <td>Instantiating constexpr variables for potential constant evaluation</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2801">      <td><a href="https://cplusplus.github.io/CWG/issues/2801.html">2801</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD7</td>      <td>Reference binding with reference-related types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2802">      <td><a href="https://cplusplus.github.io/CWG/issues/2802.html">2802</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>open</td>      <td>Constrained <TT>auto</TT> and redeclaration with non-abbreviated syntax</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2803">      <td><a href="https://cplusplus.github.io/CWG/issues/2803.html">2803</a></td> +    <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>      <td>CD7</td>      <td>Overload resolution for reference binding of similar types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2804">      <td><a href="https://cplusplus.github.io/CWG/issues/2804.html">2804</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>open</td>      <td>Lookup for determining rewrite targets</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2805">      <td><a href="https://cplusplus.github.io/CWG/issues/2805.html">2805</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>open</td>      <td>Underspecified selection of deallocation function</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2806">      <td><a href="https://cplusplus.github.io/CWG/issues/2806.html">2806</a></td> +    <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>      <td>CD7</td>      <td>Make a <I>type-requirement</I> a type-only context</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2807">      <td><a href="https://cplusplus.github.io/CWG/issues/2807.html">2807</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>CD7</td>      <td>Destructors declared <TT>consteval</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2808">      <td><a href="https://cplusplus.github.io/CWG/issues/2808.html">2808</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>review</td>      <td>Explicit specialization of defaulted special member function</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2809">      <td><a href="https://cplusplus.github.io/CWG/issues/2809.html">2809</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>CD7</td>      <td>An implicit definition does not redeclare a function</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2810">      <td><a href="https://cplusplus.github.io/CWG/issues/2810.html">2810</a></td> +    <td>[<a href="https://wg21.link/temp.res.general">temp.res.general</a>]</td>      <td>CD7</td>      <td>Requiring the absence of diagnostics for templates</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2811">      <td><a href="https://cplusplus.github.io/CWG/issues/2811.html">2811</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>CD7</td>      <td>Clarify "use" of main</td>      <td class="full" align="center">Clang 3.5</td>    </tr>    <tr class="open" id="2812">      <td><a href="https://cplusplus.github.io/CWG/issues/2812.html">2812</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Allocation with explicit alignment</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2813">      <td><a href="https://cplusplus.github.io/CWG/issues/2813.html">2813</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>CD7</td>      <td>Class member access with prvalues</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr id="2814">      <td><a href="https://cplusplus.github.io/CWG/issues/2814.html">2814</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>NAD</td>      <td>Alignment requirement of incomplete class type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2815">      <td><a href="https://cplusplus.github.io/CWG/issues/2815.html">2815</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>CD7</td>      <td>Overload resolution for references/pointers to <TT>noexcept</TT> functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2816">      <td><a href="https://cplusplus.github.io/CWG/issues/2816.html">2816</a></td> +    <td>[<a href="https://wg21.link/intro.progress">intro.progress</a>]</td>      <td>review</td>      <td>Unclear phrasing "may assume ... eventually"</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2817">      <td><a href="https://cplusplus.github.io/CWG/issues/2817.html">2817</a></td> +    <td>[<a href="https://wg21.link/expr.sizeof">expr.sizeof</a>]</td>      <td>open</td>      <td>sizeof(abstract class) is underspecified</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2818">      <td><a href="https://cplusplus.github.io/CWG/issues/2818.html">2818</a></td> +    <td>[<a href="https://wg21.link/lex.name">lex.name</a>]</td>      <td>CD7</td>      <td>Use of predefined reserved identifiers</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2819">      <td><a href="https://cplusplus.github.io/CWG/issues/2819.html">2819</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Cast from null pointer value in a constant expression</td>      <td class="full" align="center">Clang 19 (C++26 onwards)</td>    </tr>    <tr id="2820">      <td><a href="https://cplusplus.github.io/CWG/issues/2820.html">2820</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>CD7</td>      <td>Value-initialization and default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2821">      <td><a href="https://cplusplus.github.io/CWG/issues/2821.html">2821</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>review</td>      <td>Lifetime, zero-initialization, and dynamic initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2822">      <td><a href="https://cplusplus.github.io/CWG/issues/2822.html">2822</a></td> +    <td>[<a href="https://wg21.link/basic.stc.general">basic.stc.general</a>]</td>      <td>CD7</td>      <td>Side-effect-free pointer zap</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2823">      <td><a href="https://cplusplus.github.io/CWG/issues/2823.html">2823</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>CD7</td>      <td>Implicit undefined behavior when dereferencing pointers</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> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>CD7</td>      <td>Copy-initialization of arrays</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2825">      <td><a href="https://cplusplus.github.io/CWG/issues/2825.html">2825</a></td> +    <td>[<a href="https://wg21.link/stmt.ranged">stmt.ranged</a>]</td>      <td>CD7</td>      <td>Range-based for statement using a <I>braced-init-list</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2826">      <td><a href="https://cplusplus.github.io/CWG/issues/2826.html">2826</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>drafting</td>      <td>Missing definition of "temporary expression"</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2827">      <td><a href="https://cplusplus.github.io/CWG/issues/2827.html">2827</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>review</td>      <td>Representation of unsigned integral types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2828">      <td><a href="https://cplusplus.github.io/CWG/issues/2828.html">2828</a></td> +    <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>      <td>CD7</td>      <td>Ambiguous interpretation of C-style cast</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2829">      <td><a href="https://cplusplus.github.io/CWG/issues/2829.html">2829</a></td> +    <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>      <td>open</td>      <td>Redundant case in restricting user-defined conversion sequences</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2830">      <td><a href="https://cplusplus.github.io/CWG/issues/2830.html">2830</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD7</td>      <td>Top-level cv-qualification should be ignored for list-initialization</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2831">      <td><a href="https://cplusplus.github.io/CWG/issues/2831.html">2831</a></td> +    <td>[<a href="https://wg21.link/dcl.decl.general">dcl.decl.general</a>]</td>      <td>CD7</td>      <td>Non-templated function definitions and <I>requires-clause</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2832">      <td><a href="https://cplusplus.github.io/CWG/issues/2832.html">2832</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>open</td>      <td>Invented temporary variables and temporary objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2833">      <td><a href="https://cplusplus.github.io/CWG/issues/2833.html">2833</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>review</td>      <td>Evaluation of odr-use</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2834">      <td><a href="https://cplusplus.github.io/CWG/issues/2834.html">2834</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>review</td>      <td>Partial ordering and explicit object parameters</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2835">      <td><a href="https://cplusplus.github.io/CWG/issues/2835.html">2835</a></td> +    <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>      <td>open</td>      <td>Name-independent declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2836">      <td><a href="https://cplusplus.github.io/CWG/issues/2836.html">2836</a></td> +    <td>[<a href="https://wg21.link/conv.rank">conv.rank</a>]</td>      <td>CD7</td>      <td>Conversion rank of <TT>long double</TT> and extended floating-point types</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2837">      <td><a href="https://cplusplus.github.io/CWG/issues/2837.html">2837</a></td> +    <td>[<a href="https://wg21.link/class.copy.ctor">class.copy.ctor</a>]</td>      <td>open</td>      <td>Instantiating and inheriting by-value copy constructors</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2838">      <td><a href="https://cplusplus.github.io/CWG/issues/2838.html">2838</a></td> +    <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>      <td>open</td>      <td>Declaration conflicts in <I>lambda-expression</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2839">      <td><a href="https://cplusplus.github.io/CWG/issues/2839.html">2839</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>open</td>      <td>Explicit destruction of base classes</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2840">      <td><a href="https://cplusplus.github.io/CWG/issues/2840.html">2840</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>open</td>      <td>Missing requirements for fundamental alignments</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2841">      <td><a href="https://cplusplus.github.io/CWG/issues/2841.html">2841</a></td> +    <td>[<a href="https://wg21.link/class.ctor.general">class.ctor.general</a>]</td>      <td>open</td>      <td>When do const objects start being const?</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2842">      <td><a href="https://cplusplus.github.io/CWG/issues/2842.html">2842</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>open</td>      <td>Preferring an <TT>initializer_list</TT> over a single value</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2843">      <td><a href="https://cplusplus.github.io/CWG/issues/2843.html">2843</a></td> +    <td>[<a href="https://wg21.link/intro.refs">intro.refs</a>]</td>      <td>CD7</td>      <td>Undated reference to Unicode makes C++ a moving target</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2844">      <td><a href="https://cplusplus.github.io/CWG/issues/2844.html">2844</a></td> +    <td>[<a href="https://wg21.link/over.match.oper">over.match.oper</a>]</td>      <td>open</td>      <td>Enumerating a finite set of built-in candidates</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2845">      <td><a href="https://cplusplus.github.io/CWG/issues/2845.html">2845</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD7</td>      <td>Make the closure type of a captureless lambda a structural type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2846">      <td><a href="https://cplusplus.github.io/CWG/issues/2846.html">2846</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD7</td>      <td>Out-of-class definitions of explicit object member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2847">      <td><a href="https://cplusplus.github.io/CWG/issues/2847.html">2847</a></td> +    <td>[<a href="https://wg21.link/temp.expl.spec">temp.expl.spec</a>]</td>      <td>review</td>      <td>Constrained explicit specializations of function templates at class scope</td>      <td align="center"> @@ -16942,228 +19746,266 @@ objects</td>    </tr>    <tr id="2848">      <td><a href="https://cplusplus.github.io/CWG/issues/2848.html">2848</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>CD7</td>      <td>Omitting an empty template argument list for explicit instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2849">      <td><a href="https://cplusplus.github.io/CWG/issues/2849.html">2849</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD7</td>      <td>Parameter objects are not temporary objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2850">      <td><a href="https://cplusplus.github.io/CWG/issues/2850.html">2850</a></td> +    <td>[<a href="https://wg21.link/basic.stc">basic.stc</a>]</td>      <td>CD7</td>      <td>Unclear storage duration for function parameter objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2851">      <td><a href="https://cplusplus.github.io/CWG/issues/2851.html">2851</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Allow floating-point conversions in converted constant expressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2852">      <td><a href="https://cplusplus.github.io/CWG/issues/2852.html">2852</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>open</td>      <td>Complete-class contexts and class-scope lambdas</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2853">      <td><a href="https://cplusplus.github.io/CWG/issues/2853.html">2853</a></td> +    <td>[<a href="https://wg21.link/expr.add">expr.add</a>]</td>      <td>CD7</td>      <td>Pointer arithmetic with pointer to hypothetical element</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2854">      <td><a href="https://cplusplus.github.io/CWG/issues/2854.html">2854</a></td> +    <td>[<a href="https://wg21.link/except.throw">except.throw</a>]</td>      <td>CD7</td>      <td>Storage duration of exception objects</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2855">      <td><a href="https://cplusplus.github.io/CWG/issues/2855.html">2855</a></td> +    <td>[<a href="https://wg21.link/expr.post.incr">expr.post.incr</a>]</td>      <td>CD7</td>      <td>Undefined behavior in postfix increment</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2856">      <td><a href="https://cplusplus.github.io/CWG/issues/2856.html">2856</a></td> +    <td>[<a href="https://wg21.link/over.match.list">over.match.list</a>]</td>      <td>CD7</td>      <td>Copy-list-initialization with explicit default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2857">      <td><a href="https://cplusplus.github.io/CWG/issues/2857.html">2857</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>CD7</td>      <td>Argument-dependent lookup with incomplete class types</td>      <td class="none" align="center">No</td>    </tr>    <tr id="2858">      <td><a href="https://cplusplus.github.io/CWG/issues/2858.html">2858</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>      <td>CD7</td>      <td>Declarative <I>nested-name-specifier</I>s and <I>pack-index-specifier</I>s</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="2859">      <td><a href="https://cplusplus.github.io/CWG/issues/2859.html">2859</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>CD7</td>      <td>Value-initialization with multiple default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2860">      <td><a href="https://cplusplus.github.io/CWG/issues/2860.html">2860</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>dup</td>      <td>Remove and fix the term "vacuous initialization"</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2861">      <td><a href="https://cplusplus.github.io/CWG/issues/2861.html">2861</a></td> +    <td>[<a href="https://wg21.link/expr.dynamic.cast">expr.dynamic.cast</a>]</td>      <td>CD7</td>      <td><TT>dynamic_cast</TT> on bad pointer value</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2862">      <td><a href="https://cplusplus.github.io/CWG/issues/2862.html">2862</a></td> +    <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>      <td>review</td>      <td>Unclear boundaries of template declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2863">      <td><a href="https://cplusplus.github.io/CWG/issues/2863.html">2863</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>drafting</td>      <td>Unclear synchronization requirements for object lifetime rules</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2864">      <td><a href="https://cplusplus.github.io/CWG/issues/2864.html">2864</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>CD7</td>      <td>Narrowing floating-point conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2865">      <td><a href="https://cplusplus.github.io/CWG/issues/2865.html">2865</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD7</td>      <td>Regression on result of conditional operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2866">      <td><a href="https://cplusplus.github.io/CWG/issues/2866.html">2866</a></td> +    <td>[<a href="https://wg21.link/dcl.attr">dcl.attr</a>]</td>      <td>open</td>      <td>Observing the effects of <TT>[[no_unique_address]]</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr id="2867">      <td><a href="https://cplusplus.github.io/CWG/issues/2867.html">2867</a></td> +    <td>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</a>]</td>      <td>CD7</td>      <td>Order of initialization for structured bindings</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2868">      <td><a href="https://cplusplus.github.io/CWG/issues/2868.html">2868</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>open</td>      <td>Self-references in trivially copyable objects as function return values</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2869">      <td><a href="https://cplusplus.github.io/CWG/issues/2869.html">2869</a></td> +    <td>[<a href="https://wg21.link/expr.prim.this">expr.prim.this</a>]</td>      <td>CD7</td>      <td><TT>this</TT> in local classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2870">      <td><a href="https://cplusplus.github.io/CWG/issues/2870.html">2870</a></td> +    <td>[<a href="https://wg21.link/lex.string">lex.string</a>]</td>      <td>CD7</td>      <td>Combining absent <I>encoding-prefix</I>es</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2871">      <td><a href="https://cplusplus.github.io/CWG/issues/2871.html">2871</a></td> +    <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>      <td>CD7</td>      <td>User-declared constructor templates inhibiting default constructors</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2872">      <td><a href="https://cplusplus.github.io/CWG/issues/2872.html">2872</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>CD7</td>      <td>Linkage and unclear "can be referred to"</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2873">      <td><a href="https://cplusplus.github.io/CWG/issues/2873.html">2873</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>open</td>      <td>Taking the address of a function involving template argument deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2874">      <td><a href="https://cplusplus.github.io/CWG/issues/2874.html">2874</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>CD7</td>      <td>Qualified declarations of partial specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2875">      <td><a href="https://cplusplus.github.io/CWG/issues/2875.html">2875</a></td> +    <td>[<a href="https://wg21.link/diff.expr">diff.expr</a>]</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>    <tr id="2876">      <td><a href="https://cplusplus.github.io/CWG/issues/2876.html">2876</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>CD7</td>      <td>Disambiguation of <TT>T x = delete("text")</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2877">      <td><a href="https://cplusplus.github.io/CWG/issues/2877.html">2877</a></td> +    <td>[<a href="https://wg21.link/enum.udecl">enum.udecl</a>]</td>      <td>CD7</td>      <td>Type-only lookup for <I>using-enum-declarator</I></td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr class="open" id="2878">      <td><a href="https://cplusplus.github.io/CWG/issues/2878.html">2878</a></td> +    <td>[<a href="https://wg21.link/expr.cast">expr.cast</a>]</td>      <td>open</td>      <td>C-style casts to reference types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2879">      <td><a href="https://cplusplus.github.io/CWG/issues/2879.html">2879</a></td> +    <td>[<a href="https://wg21.link/expr.const.cast">expr.const.cast</a>]</td>      <td>CD7</td>      <td>Undesired outcomes with <TT>const_cast</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2880">      <td><a href="https://cplusplus.github.io/CWG/issues/2880.html">2880</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>CD7</td>      <td>Accessibility check for destructor of incomplete class type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2881">      <td><a href="https://cplusplus.github.io/CWG/issues/2881.html">2881</a></td> +    <td>[<a href="https://wg21.link/expr.prim.lambda.closure">expr.prim.lambda.closure</a>]</td>      <td>CD7</td>      <td>Type restrictions for the explicit object parameter of a lambda</td>      <td class="full" align="center">Clang 19</td>    </tr>    <tr id="2882">      <td><a href="https://cplusplus.github.io/CWG/issues/2882.html">2882</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD7</td>      <td>Unclear treatment of conversion to <TT>void</TT></td>      <td class="full" align="center">Clang 2.7</td>    </tr>    <tr id="2883">      <td><a href="https://cplusplus.github.io/CWG/issues/2883.html">2883</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD7</td>      <td>Definition of "odr-usable" ignores lambda scopes</td>      <td class="none" align="center">No</td>    </tr>    <tr id="2884">      <td><a href="https://cplusplus.github.io/CWG/issues/2884.html">2884</a></td> +    <td>[<a href="https://wg21.link/dcl.type.elab">dcl.type.elab</a>]</td>      <td>dup</td>      <td>Qualified declarations of partial specializations</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2885">      <td><a href="https://cplusplus.github.io/CWG/issues/2885.html">2885</a></td> +    <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>      <td>review</td>      <td>Non-eligible trivial default constructors</td>      <td align="center"> @@ -17174,192 +20016,224 @@ objects</td>    </tr>    <tr id="2886">      <td><a href="https://cplusplus.github.io/CWG/issues/2886.html">2886</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>CD7</td>      <td>Temporaries and trivial potentially-throwing special member functions</td>      <td class="full" align="center">Clang 9</td>    </tr>    <tr id="2887">      <td><a href="https://cplusplus.github.io/CWG/issues/2887.html">2887</a></td> +    <td>[<a href="https://wg21.link/diff.cpp03.expr">diff.cpp03.expr</a>]</td>      <td>CD7</td>      <td>Missing compatibility entries for xvalues</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2888">      <td><a href="https://cplusplus.github.io/CWG/issues/2888.html">2888</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.argdep">basic.lookup.argdep</a>]</td>      <td>review</td>      <td>Missing cases for reference and array types for argument-dependent lookup</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2889">      <td><a href="https://cplusplus.github.io/CWG/issues/2889.html">2889</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>open</td>      <td>Requiring an accessible destructor for destroying operator delete</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2890">      <td><a href="https://cplusplus.github.io/CWG/issues/2890.html">2890</a></td> +    <td>[<a href="https://wg21.link/class.local">class.local</a>]</td>      <td>CD7</td>      <td>Defining members of local classes</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2891">      <td><a href="https://cplusplus.github.io/CWG/issues/2891.html">2891</a></td> +    <td>[<a href="https://wg21.link/implimits">implimits</a>]</td>      <td>CD7</td>      <td>Normative status of implementation limits</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2892">      <td><a href="https://cplusplus.github.io/CWG/issues/2892.html">2892</a></td> +    <td>[<a href="https://wg21.link/expr.arith.conv">expr.arith.conv</a>]</td>      <td>CD7</td>      <td>Unclear usual arithmetic conversions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2893">      <td><a href="https://cplusplus.github.io/CWG/issues/2893.html">2893</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>NAD</td>      <td>Instantiations in discarded <TT>if constexpr</TT> substatements</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2894">      <td><a href="https://cplusplus.github.io/CWG/issues/2894.html">2894</a></td> +    <td>[<a href="https://wg21.link/expr.type.conv">expr.type.conv</a>]</td>      <td>CD7</td>      <td>Functional casts create prvalues of reference type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2895">      <td><a href="https://cplusplus.github.io/CWG/issues/2895.html">2895</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>CD7</td>      <td>Initialization should ignore the destination type's cv-qualification</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2896">      <td><a href="https://cplusplus.github.io/CWG/issues/2896.html">2896</a></td> +    <td>[<a href="https://wg21.link/temp.deduct">temp.deduct</a>]</td>      <td>review</td>      <td>Template argument deduction involving exception specifications</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2897">      <td><a href="https://cplusplus.github.io/CWG/issues/2897.html">2897</a></td> +    <td>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</a>]</td>      <td>open</td>      <td>Copying potentially-overlapping union subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2898">      <td><a href="https://cplusplus.github.io/CWG/issues/2898.html">2898</a></td> +    <td>[<a href="https://wg21.link/over.best.ics.general">over.best.ics.general</a>]</td>      <td>CD7</td>      <td>Clarify implicit conversion sequence from <I>cv</I> <TT>T</TT> to <TT>T</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2899">      <td><a href="https://cplusplus.github.io/CWG/issues/2899.html">2899</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>CD7</td>      <td>Bad value representations should cause undefined behavior</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2900">      <td><a href="https://cplusplus.github.io/CWG/issues/2900.html">2900</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>open</td>      <td>Deduction of non-type template arguments with placeholder types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2901">      <td><a href="https://cplusplus.github.io/CWG/issues/2901.html">2901</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>CD7</td>      <td>Unclear semantics for near-match aliased access</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2902">      <td><a href="https://cplusplus.github.io/CWG/issues/2902.html">2902</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.general">expr.prim.id.general</a>]</td>      <td>review</td>      <td>Implicit <TT>this</TT> transformation outside of permitted contexts</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2903">      <td><a href="https://cplusplus.github.io/CWG/issues/2903.html">2903</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>drafting</td>      <td>Can we omit the <TT>template</TT> disambiguator in <I>nested-name-specifier</I>s in type-only contexts?</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2904">      <td><a href="https://cplusplus.github.io/CWG/issues/2904.html">2904</a></td> +    <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>      <td>open</td>      <td>Introducing <I>template-name</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2905">      <td><a href="https://cplusplus.github.io/CWG/issues/2905.html">2905</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>CD7</td>      <td>Value-dependence of <I>noexcept-expression</I></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2906">      <td><a href="https://cplusplus.github.io/CWG/issues/2906.html">2906</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>CD7</td>      <td>Lvalue-to-rvalue conversion of class types for conditional operator</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2907">      <td><a href="https://cplusplus.github.io/CWG/issues/2907.html">2907</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Constant lvalue-to-rvalue conversion on uninitialized <TT>std::nullptr_t</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2908">      <td><a href="https://cplusplus.github.io/CWG/issues/2908.html">2908</a></td> +    <td>[<a href="https://wg21.link/cpp.line">cpp.line</a>]</td>      <td>CD7</td>      <td>Counting physical source lines for <TT>__LINE__</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2909">      <td><a href="https://cplusplus.github.io/CWG/issues/2909.html">2909</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>Subtle difference between constant-initialized and constexpr</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2910">      <td><a href="https://cplusplus.github.io/CWG/issues/2910.html">2910</a></td> +    <td>[<a href="https://wg21.link/basic.def.odr">basic.def.odr</a>]</td>      <td>CD7</td>      <td>Effect of <I>requirement-parameter-list</I>s on odr-usability</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2911">      <td><a href="https://cplusplus.github.io/CWG/issues/2911.html">2911</a></td> +    <td>[<a href="https://wg21.link/expr.prim.req.general">expr.prim.req.general</a>]</td>      <td>CD7</td>      <td>Unclear meaning of expressions "appearing within" subexpressions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2912">      <td><a href="https://cplusplus.github.io/CWG/issues/2912.html">2912</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>open</td>      <td>Too-large value for size in array new</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2913">      <td><a href="https://cplusplus.github.io/CWG/issues/2913.html">2913</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.guide">temp.deduct.guide</a>]</td>      <td>CD7</td>      <td>Grammar for <I>deduction-guide</I> has <I>requires-clause</I> in the wrong position</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr class="open" id="2914">      <td><a href="https://cplusplus.github.io/CWG/issues/2914.html">2914</a></td> +    <td>[<a href="https://wg21.link/basic.start.static">basic.start.static</a>]</td>      <td>review</td>      <td>Unclear order of initialization of static and thread-local variables</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2915">      <td><a href="https://cplusplus.github.io/CWG/issues/2915.html">2915</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>CD7</td>      <td>Explicit object parameters of type <TT>void</TT></td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr class="open" id="2916">      <td><a href="https://cplusplus.github.io/CWG/issues/2916.html">2916</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial">temp.spec.partial</a>]</td>      <td>review</td>      <td>Variable template partial specializations should not be declared <TT>static</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2917">      <td><a href="https://cplusplus.github.io/CWG/issues/2917.html">2917</a></td> +    <td>[<a href="https://wg21.link/temp.pre">temp.pre</a>]</td>      <td>review</td>      <td>Disallow multiple <I>friend-type-specifier</I>s for a friend template</td>      <td align="center"> @@ -17370,528 +20244,616 @@ objects</td>    </tr>    <tr id="2918">      <td><a href="https://cplusplus.github.io/CWG/issues/2918.html">2918</a></td> +    <td>[<a href="https://wg21.link/over.over">over.over</a>]</td>      <td>CD7</td>      <td>Consideration of constraints for address of overloaded function</td>      <td class="full" align="center">Clang 21</td>    </tr>    <tr id="2919">      <td><a href="https://cplusplus.github.io/CWG/issues/2919.html">2919</a></td> +    <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>      <td>CD7</td>      <td>Conversion function candidates for initialization of const lvalue reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2920">      <td><a href="https://cplusplus.github.io/CWG/issues/2920.html">2920</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>open</td>      <td>The <TT>template</TT> keyword for base classes</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2921">      <td><a href="https://cplusplus.github.io/CWG/issues/2921.html">2921</a></td> +    <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>      <td>CD7</td>      <td>Exporting redeclarations of entities not attached to a named module</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2922">      <td><a href="https://cplusplus.github.io/CWG/issues/2922.html">2922</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>CD7</td>      <td>constexpr placement-new is too permissive</td>      <td class="full" align="center">Clang 20</td>    </tr>    <tr class="open" id="2923">      <td><a href="https://cplusplus.github.io/CWG/issues/2923.html">2923</a></td> +    <td>[<a href="https://wg21.link/intro.progress">intro.progress</a>]</td>      <td>tentatively ready</td>      <td>Note about infinite loops and execution steps</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2924">      <td><a href="https://cplusplus.github.io/CWG/issues/2924.html">2924</a></td> +    <td>[<a href="https://wg21.link/defns.undefined">defns.undefined</a>]</td>      <td>CD7</td>      <td>Undefined behavior during constant evaluation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2925">      <td><a href="https://cplusplus.github.io/CWG/issues/2925.html">2925</a></td> +    <td>[<a href="https://wg21.link/expr.delete">expr.delete</a>]</td>      <td>NAD</td>      <td>Deleting a pointer to an incomplete enumeration type</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2926">      <td><a href="https://cplusplus.github.io/CWG/issues/2926.html">2926</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.qual.general">basic.lookup.qual.general</a>]</td>      <td>drafting</td>      <td>Lookup context for dependent qualified names</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2927">      <td><a href="https://cplusplus.github.io/CWG/issues/2927.html">2927</a></td> +    <td>[<a href="https://wg21.link/cpp.pre">cpp.pre</a>]</td>      <td>CD7</td>      <td>Unclear status of translation unit with <TT>module</TT> keyword</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2928">      <td><a href="https://cplusplus.github.io/CWG/issues/2928.html">2928</a></td> +    <td>[<a href="https://wg21.link/basic.start.dynamic">basic.start.dynamic</a>]</td>      <td>open</td>      <td>No ordering for initializing thread-local variables</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2929">      <td><a href="https://cplusplus.github.io/CWG/issues/2929.html">2929</a></td> +    <td>[<a href="https://wg21.link/basic.start.term">basic.start.term</a>]</td>      <td>review</td>      <td>Lifetime of trivially-destructible static or thread-local objects</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2930">      <td><a href="https://cplusplus.github.io/CWG/issues/2930.html">2930</a></td> +    <td>[<a href="https://wg21.link/class.copy.elision">class.copy.elision</a>]</td>      <td>CD7</td>      <td>Unclear term "copy/move operation" in specification of copy elision</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2931">      <td><a href="https://cplusplus.github.io/CWG/issues/2931.html">2931</a></td> +    <td>[<a href="https://wg21.link/over.oper.general">over.oper.general</a>]</td>      <td>CD7</td>      <td>Restrictions on operator functions that are explicit object member functions</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2932">      <td><a href="https://cplusplus.github.io/CWG/issues/2932.html">2932</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>review</td>      <td>Value range of empty enumeration</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2933">      <td><a href="https://cplusplus.github.io/CWG/issues/2933.html">2933</a></td> +    <td>[<a href="https://wg21.link/expr.type">expr.type</a>]</td>      <td>CD7</td>      <td>Dangling references</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2934">      <td><a href="https://cplusplus.github.io/CWG/issues/2934.html">2934</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>open</td>      <td>Unclear semantics of exception escaping from <TT>unhandled_exception</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2935">      <td><a href="https://cplusplus.github.io/CWG/issues/2935.html">2935</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>open</td>      <td>Destroying the coroutine state when initial-await-resume-called is false</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2936">      <td><a href="https://cplusplus.github.io/CWG/issues/2936.html">2936</a></td> +    <td>[<a href="https://wg21.link/temp.dep.type">temp.dep.type</a>]</td>      <td>CD7</td>      <td>Local classes of templated functions should be part of the current instantiation</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2937">      <td><a href="https://cplusplus.github.io/CWG/issues/2937.html">2937</a></td> +    <td>[<a href="https://wg21.link/lex.phases">lex.phases</a>]</td>      <td>CD7</td>      <td>Grammar for <I>preprocessing-file</I> has no normative effect</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2938">      <td><a href="https://cplusplus.github.io/CWG/issues/2938.html">2938</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>open</td>      <td>Inheriting linkage from a previous declaration</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2939">      <td><a href="https://cplusplus.github.io/CWG/issues/2939.html">2939</a></td> +    <td>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</a>]</td>      <td>CD7</td>      <td>Do not allow <TT>reinterpret_cast</TT> from prvalue to rvalue reference</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2940">      <td><a href="https://cplusplus.github.io/CWG/issues/2940.html">2940</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>review</td>      <td>Definition of "object"</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2941">      <td><a href="https://cplusplus.github.io/CWG/issues/2941.html">2941</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>open</td>      <td>Lifetime extension for function-style cast to reference type</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2942">      <td><a href="https://cplusplus.github.io/CWG/issues/2942.html">2942</a></td> +    <td>[<a href="https://wg21.link/dcl.fct">dcl.fct</a>]</td>      <td>open</td>      <td>Packs in a function's parameter-type-list</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2943">      <td><a href="https://cplusplus.github.io/CWG/issues/2943.html">2943</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.nodiscard">dcl.attr.nodiscard</a>]</td>      <td>CD7</td>      <td>Discarding a void return value</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="2944">      <td><a href="https://cplusplus.github.io/CWG/issues/2944.html">2944</a></td> +    <td>[<a href="https://wg21.link/expr.throw">expr.throw</a>]</td>      <td>CD7</td>      <td>Unsequenced <I>throw-expression</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2945">      <td><a href="https://cplusplus.github.io/CWG/issues/2945.html">2945</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>open</td>      <td>Redundant constraints on matching function template declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2946">      <td><a href="https://cplusplus.github.io/CWG/issues/2946.html">2946</a></td> +    <td>[<a href="https://wg21.link/temp.over.link">temp.over.link</a>]</td>      <td>open</td>      <td>Dependent call equivalence in non-ADL cases</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2947">      <td><a href="https://cplusplus.github.io/CWG/issues/2947.html">2947</a></td> +    <td>[<a href="https://wg21.link/cpp.module">cpp.module</a>]</td>      <td>open</td>      <td>Limiting macro expansion in <I>pp-module</I></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2948">      <td><a href="https://cplusplus.github.io/CWG/issues/2948.html">2948</a></td> +    <td>[<a href="https://wg21.link/temp.spec.partial.general">temp.spec.partial.general</a>]</td>      <td>open</td>      <td>Late ambiguity for partial template specialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2949">      <td><a href="https://cplusplus.github.io/CWG/issues/2949.html">2949</a></td> +    <td>[<a href="https://wg21.link/temp.func.order">temp.func.order</a>]</td>      <td>open</td>      <td>Treatment of ellipsis during partial ordering</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2950">      <td><a href="https://cplusplus.github.io/CWG/issues/2950.html">2950</a></td> +    <td>[<a href="https://wg21.link/class.bit">class.bit</a>]</td>      <td>open</td>      <td>Value preservation in enumeration vs. integer bit-fields</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2951">      <td><a href="https://cplusplus.github.io/CWG/issues/2951.html">2951</a></td> +    <td>[<a href="https://wg21.link/temp.decls.general">temp.decls.general</a>]</td>      <td>open</td>      <td>Distinguishing a primary template</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2952">      <td><a href="https://cplusplus.github.io/CWG/issues/2952.html">2952</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Vacuous initialization for subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2953">      <td><a href="https://cplusplus.github.io/CWG/issues/2953.html">2953</a></td> +    <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>      <td>open</td>      <td>Value representation for non-trivially-copyable types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2954">      <td><a href="https://cplusplus.github.io/CWG/issues/2954.html">2954</a></td> +    <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>      <td>NAD</td>      <td>Simultaneous modifications of an atomic object</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2955">      <td><a href="https://cplusplus.github.io/CWG/issues/2955.html">2955</a></td> +    <td>[<a href="https://wg21.link/intro.execution">intro.execution</a>]</td>      <td>open</td>      <td>Unify rules about conflicting unordered accesses</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2956">      <td><a href="https://cplusplus.github.io/CWG/issues/2956.html">2956</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.qual.general">basic.lookup.qual.general</a>]</td>      <td>open</td>      <td>Missing allowance for pseudo-destructors in qualified lookup</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2957">      <td><a href="https://cplusplus.github.io/CWG/issues/2957.html">2957</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>open</td>      <td>Evaluating a reference member should constitute access</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2958">      <td><a href="https://cplusplus.github.io/CWG/issues/2958.html">2958</a></td> +    <td>[<a href="https://wg21.link/over.ics.rank">over.ics.rank</a>]</td>      <td>open</td>      <td>Overload resolution involving lvalue transformation and qualification conversion</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2959">      <td><a href="https://cplusplus.github.io/CWG/issues/2959.html">2959</a></td> +    <td>[<a href="https://wg21.link/expr.ref">expr.ref</a>]</td>      <td>open</td>      <td>Naming enumerators in class member access expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2960">      <td><a href="https://cplusplus.github.io/CWG/issues/2960.html">2960</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Introduce discontiguous object lifetime</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2961">      <td><a href="https://cplusplus.github.io/CWG/issues/2961.html">2961</a></td> +    <td>[<a href="https://wg21.link/temp.constr">temp.constr</a>]</td>      <td>open</td>      <td>Checking of ill-formed types in <I>constraint-expression</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2962">      <td><a href="https://cplusplus.github.io/CWG/issues/2962.html">2962</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Evaluation of destructor call for variable with constant destruction</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2963">      <td><a href="https://cplusplus.github.io/CWG/issues/2963.html">2963</a></td> +    <td>[<a href="https://wg21.link/stmt.ambig">stmt.ambig</a>]</td>      <td>open</td>      <td>Paradoxical variable-or-function declaration</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2964">      <td><a href="https://cplusplus.github.io/CWG/issues/2964.html">2964</a></td> +    <td>[<a href="https://wg21.link/conv.lval">conv.lval</a>]</td>      <td>open</td>      <td>Reading "invalid pointer values"</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2965">      <td><a href="https://cplusplus.github.io/CWG/issues/2965.html">2965</a></td> +    <td>[<a href="https://wg21.link/basic.scope.temp">basic.scope.temp</a>]</td>      <td>open</td>      <td>Generic lambdas do not have a template parameter scope</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2966">      <td><a href="https://cplusplus.github.io/CWG/issues/2966.html">2966</a></td> +    <td>[<a href="https://wg21.link/basic.fundamental">basic.fundamental</a>]</td>      <td>open</td>      <td>Alignment and value representation of <TT>std::nullptr_t</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2967">      <td><a href="https://cplusplus.github.io/CWG/issues/2967.html">2967</a></td> +    <td>[<a href="https://wg21.link/over.match.ref">over.match.ref</a>]</td>      <td>open</td>      <td>Explicit conversion functions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2968">      <td><a href="https://cplusplus.github.io/CWG/issues/2968.html">2968</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.general">basic.lookup.general</a>]</td>      <td>open</td>      <td>Name lookup result for <I>typedef-name</I> vs. <I>class-name</I></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2969">      <td><a href="https://cplusplus.github.io/CWG/issues/2969.html">2969</a></td> +    <td>[<a href="https://wg21.link/basic.scope">basic.scope</a>]</td>      <td>open</td>      <td>Scopes in the <I>function-try-block</I> of a constructor</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2970">      <td><a href="https://cplusplus.github.io/CWG/issues/2970.html">2970</a></td> +    <td>[<a href="https://wg21.link/intro.races">intro.races</a>]</td>      <td>CD7</td>      <td>Races with <TT>volatile sig_atomic_t</TT> bit-fields</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2971">      <td><a href="https://cplusplus.github.io/CWG/issues/2971.html">2971</a></td> +    <td>[<a href="https://wg21.link/module.global.frag">module.global.frag</a>]</td>      <td>open</td>      <td>Specializations for a class are not decl-reachable</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2972">      <td><a href="https://cplusplus.github.io/CWG/issues/2972.html">2972</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</td>      <td>open</td>      <td>Declarative <I>nested-name-specifier</I> naming a partial specialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2973">      <td><a href="https://cplusplus.github.io/CWG/issues/2973.html">2973</a></td> +    <td>[<a href="https://wg21.link/dcl.typedef">dcl.typedef</a>]</td>      <td>open</td>      <td>Does an <I>alias-declaration</I> introduce a name for linkage purposes?</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2974">      <td><a href="https://cplusplus.github.io/CWG/issues/2974.html">2974</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.type">temp.deduct.type</a>]</td>      <td>open</td>      <td>Non-deduced context for <I>qualified-id</I> naming a template</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2975">      <td><a href="https://cplusplus.github.io/CWG/issues/2975.html">2975</a></td> +    <td>[<a href="https://wg21.link/temp.constr.normal">temp.constr.normal</a>]</td>      <td>open</td>      <td>Effect of concept <I>template-head</I> on parameter mappings</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2976">      <td><a href="https://cplusplus.github.io/CWG/issues/2976.html">2976</a></td> +    <td>[<a href="https://wg21.link/stmt.dcl">stmt.dcl</a>]</td>      <td>review</td>      <td>Transferring control out of a function</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2977">      <td><a href="https://cplusplus.github.io/CWG/issues/2977.html">2977</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>review</td>      <td>Initialization with string literals</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2978">      <td><a href="https://cplusplus.github.io/CWG/issues/2978.html">2978</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.call">temp.deduct.call</a>]</td>      <td>open</td>      <td>Deduction involving reference to similar types</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2979">      <td><a href="https://cplusplus.github.io/CWG/issues/2979.html">2979</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>open</td>      <td>Duplicate declarations of enumerations in class scope</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2980">      <td><a href="https://cplusplus.github.io/CWG/issues/2980.html">2980</a></td> +    <td>[<a href="https://wg21.link/temp.names">temp.names</a>]</td>      <td>open</td>      <td>Constraints on template template parameters</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2981">      <td><a href="https://cplusplus.github.io/CWG/issues/2981.html">2981</a></td> +    <td>[<a href="https://wg21.link/expr.arith.conv">expr.arith.conv</a>]</td>      <td>open</td>      <td>Usual arithmetic conversions and result types</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2982">      <td><a href="https://cplusplus.github.io/CWG/issues/2982.html">2982</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.decl">temp.deduct.decl</a>]</td>      <td>CD7</td>      <td>Deduction in <I>type-constraint</I>s</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2983">      <td><a href="https://cplusplus.github.io/CWG/issues/2983.html">2983</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>review</td>      <td>Non-type template parameters are not variables</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2984">      <td><a href="https://cplusplus.github.io/CWG/issues/2984.html">2984</a></td> +    <td>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</a>]</td>      <td>open</td>      <td>Value-dependent structured bindings</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2985">      <td><a href="https://cplusplus.github.io/CWG/issues/2985.html">2985</a></td> +    <td>[<a href="https://wg21.link/dcl.init.ref">dcl.init.ref</a>]</td>      <td>CD7</td>      <td>Unclear rules for reference initialization with conversion</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2986">      <td><a href="https://cplusplus.github.io/CWG/issues/2986.html">2986</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Creating objects within a mutable member of a const object</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2987">      <td><a href="https://cplusplus.github.io/CWG/issues/2987.html">2987</a></td> +    <td>[<a href="https://wg21.link/expr.static.cast">expr.static.cast</a>]</td>      <td>CD7</td>      <td>Remove dilapidated wording from <TT>static_cast</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2988">      <td><a href="https://cplusplus.github.io/CWG/issues/2988.html">2988</a></td> +    <td>[<a href="https://wg21.link/basic.link">basic.link</a>]</td>      <td>open</td>      <td>Is a closure type from a <I>lambda-expression</I> appearing in a <I>concept-definition</I> a TU-local entity?</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2989">      <td><a href="https://cplusplus.github.io/CWG/issues/2989.html">2989</a></td> +    <td>[<a href="https://wg21.link/expr.prim.paren">expr.prim.paren</a>]</td>      <td>open</td>      <td>Remove misleading general allowance for parentheses</td>      <td align="center">Not resolved</td>    </tr>    <tr id="2990">      <td><a href="https://cplusplus.github.io/CWG/issues/2990.html">2990</a></td> +    <td>[<a href="https://wg21.link/module.interface">module.interface</a>]</td>      <td>CD7</td>      <td>Exporting redeclarations of namespaces</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="2991">      <td><a href="https://cplusplus.github.io/CWG/issues/2991.html">2991</a></td> +    <td>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</a>]</td>      <td>open</td>      <td>"array size" is vague</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2992">      <td><a href="https://cplusplus.github.io/CWG/issues/2992.html">2992</a></td> +    <td>[<a href="https://wg21.link/basic.pre">basic.pre</a>]</td>      <td>open</td>      <td>Labels do not have names</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2993">      <td><a href="https://cplusplus.github.io/CWG/issues/2993.html">2993</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.general">dcl.fct.def.general</a>]</td>      <td>open</td>      <td>Body of a destructor</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2994">      <td><a href="https://cplusplus.github.io/CWG/issues/2994.html">2994</a></td> +    <td>[<a href="https://wg21.link/temp.param">temp.param</a>]</td>      <td>open</td>      <td>Allowing template parameters following template parameter packs that are pack expansions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2995">      <td><a href="https://cplusplus.github.io/CWG/issues/2995.html">2995</a></td> +    <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>      <td>open</td>      <td>Meaning of flowing off the end of a function</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2996">      <td><a href="https://cplusplus.github.io/CWG/issues/2996.html">2996</a></td> +    <td>[<a href="https://wg21.link/temp.constr.atomic">temp.constr.atomic</a>]</td>      <td>open</td>      <td>Impenetrable definition of atomic constraint</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2997">      <td><a href="https://cplusplus.github.io/CWG/issues/2997.html">2997</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.default">dcl.fct.def.default</a>]</td>      <td>open</td>      <td>Defaulted functions with deleted definition</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2998">      <td><a href="https://cplusplus.github.io/CWG/issues/2998.html">2998</a></td> +    <td>[<a href="https://wg21.link/temp.deduct.partial">temp.deduct.partial</a>]</td>      <td>open</td>      <td>Missing deduction consistency check for partial ordering</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="2999">      <td><a href="https://cplusplus.github.io/CWG/issues/2999.html">2999</a></td> +    <td>[<a href="https://wg21.link/class.default.ctor">class.default.ctor</a>]</td>      <td>open</td>      <td>Trivial unions changing existing behavior</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3000">      <td><a href="https://cplusplus.github.io/CWG/issues/3000.html">3000</a></td> +    <td>[<a href="https://wg21.link/expr.cond">expr.cond</a>]</td>      <td>review</td>      <td>Handling of cv-qualified class types in conditional operator</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3001">      <td><a href="https://cplusplus.github.io/CWG/issues/3001.html">3001</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</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>    <tr class="open" id="3002">      <td><a href="https://cplusplus.github.io/CWG/issues/3002.html">3002</a></td> +    <td>[<a href="https://wg21.link/temp.dep.temp">temp.dep.temp</a>]</td>      <td>tentatively ready</td>      <td>Template parameter/argument confusion</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3003">      <td><a href="https://cplusplus.github.io/CWG/issues/3003.html">3003</a></td> +    <td>[<a href="https://wg21.link/dcl.type.simple">dcl.type.simple</a>]</td>      <td>review</td>      <td>Naming a deducible template for class template argument deduction</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3004">      <td><a href="https://cplusplus.github.io/CWG/issues/3004.html">3004</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>tentatively ready</td>      <td>Pointer arithmetic on array of unknown bound</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3005">      <td><a href="https://cplusplus.github.io/CWG/issues/3005.html">3005</a></td> +    <td>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</a>]</td>      <td>tentatively ready</td>      <td>Function parameters should never be name-independent</td>      <td align="center"> @@ -17902,570 +20864,665 @@ objects</td>    </tr>    <tr class="open" id="3006">      <td><a href="https://cplusplus.github.io/CWG/issues/3006.html">3006</a></td> +    <td>[<a href="https://wg21.link/temp.explicit">temp.explicit</a>]</td>      <td>review</td>      <td>Vague restrictions for explicit instantiations of class templates</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3007">      <td><a href="https://cplusplus.github.io/CWG/issues/3007.html">3007</a></td> +    <td>[<a href="https://wg21.link/class.compare.default">class.compare.default</a>]</td>      <td>open</td>      <td>Access checking during synthesis of defaulted comparison operator, take 2</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3008">      <td><a href="https://cplusplus.github.io/CWG/issues/3008.html">3008</a></td> +    <td>[<a href="https://wg21.link/diff.dcl">diff.dcl</a>]</td>      <td>tentatively ready</td>      <td>Missing Annex C entry for <TT>void</TT> object declarations</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3009">      <td><a href="https://cplusplus.github.io/CWG/issues/3009.html">3009</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>Unclear rules for constant initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3010">      <td><a href="https://cplusplus.github.io/CWG/issues/3010.html">3010</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td>constexpr placement-new should require transparent replaceability</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3011">      <td><a href="https://cplusplus.github.io/CWG/issues/3011.html">3011</a></td> +    <td>[<a href="https://wg21.link/expr.new">expr.new</a>]</td>      <td>tentatively ready</td>      <td>Parenthesized aggregate initialization for <I>new-expression</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3012">      <td><a href="https://cplusplus.github.io/CWG/issues/3012.html">3012</a></td> +    <td>[<a href="https://wg21.link/dcl.constexpr">dcl.constexpr</a>]</td>      <td>open</td>      <td>Deviating <TT>constexpr</TT> or <TT>consteval</TT> across translation units</td>      <td align="center">Not resolved</td>    </tr>    <tr id="3013">      <td><a href="https://cplusplus.github.io/CWG/issues/3013.html">3013</a></td> +    <td>[<a href="https://wg21.link/cpp.embed.gen">cpp.embed.gen</a>]</td>      <td>CD7</td>      <td>Disallowing macros for <TT>#embed</TT> parameters</td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="3014">      <td><a href="https://cplusplus.github.io/CWG/issues/3014.html">3014</a></td> +    <td>[<a href="https://wg21.link/cpp.embed.gen">cpp.embed.gen</a>]</td>      <td>CD7</td>      <td>Comma-delimited vs. comma-separated output for <TT>#embed</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="3015">      <td><a href="https://cplusplus.github.io/CWG/issues/3015.html">3015</a></td> +    <td>[<a href="https://wg21.link/cpp.include">cpp.include</a>]</td>      <td>CD7</td>      <td>Handling of <I>header-name</I>s for <TT>#include</TT> and <TT>#embed</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr id="3016">      <td><a href="https://cplusplus.github.io/CWG/issues/3016.html">3016</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD7</td>      <td>Satisfying the syntactic requirements of <TT>#include</TT> and <TT>#embed</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="3017">      <td><a href="https://cplusplus.github.io/CWG/issues/3017.html">3017</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>open</td>      <td>Commas in controlling expression of conditional inclusion</td>      <td align="center">Not resolved</td>    </tr>    <tr id="3018">      <td><a href="https://cplusplus.github.io/CWG/issues/3018.html">3018</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD7</td>      <td>Validity of <TT>defined</TT> in <TT>__has_embed</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="3019">      <td><a href="https://cplusplus.github.io/CWG/issues/3019.html">3019</a></td> +    <td>[<a href="https://wg21.link/lex.header">lex.header</a>]</td>      <td>open</td>      <td>Restrictions on character sequences in <I>header-name</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr id="3020">      <td><a href="https://cplusplus.github.io/CWG/issues/3020.html">3020</a></td> +    <td>[<a href="https://wg21.link/cpp.cond">cpp.cond</a>]</td>      <td>CD7</td>      <td>Missing specification for <TT>__has_cpp_attribute(indeterminate)</TT></td>      <td class="unknown" align="center">Unknown</td>    </tr>    <tr class="open" id="3021">      <td><a href="https://cplusplus.github.io/CWG/issues/3021.html">3021</a></td> +    <td>[<a href="https://wg21.link/temp.constr.order">temp.constr.order</a>]</td>      <td>drafting</td>      <td>Subsumption rules for fold expanded constraints</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3022">      <td><a href="https://cplusplus.github.io/CWG/issues/3022.html">3022</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>review</td>      <td>Redundant specification of explicit destructor calls</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3023">      <td><a href="https://cplusplus.github.io/CWG/issues/3023.html">3023</a></td> +    <td>[<a href="https://wg21.link/dcl.init.list">dcl.init.list</a>]</td>      <td>open</td>      <td>Default arguments in list-initialization</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3024">      <td><a href="https://cplusplus.github.io/CWG/issues/3024.html">3024</a></td> +    <td>[<a href="https://wg21.link/dcl.align">dcl.align</a>]</td>      <td>open</td>      <td>Alignment of references</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3025">      <td><a href="https://cplusplus.github.io/CWG/issues/3025.html">3025</a></td> +    <td>[<a href="https://wg21.link/basic.stc.dynamic.deallocation">basic.stc.dynamic.deallocation</a>]</td>      <td>open</td>      <td>Deallocation functions returning void</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3026">      <td><a href="https://cplusplus.github.io/CWG/issues/3026.html">3026</a></td> +    <td>[<a href="https://wg21.link/expr.unary.op">expr.unary.op</a>]</td>      <td>open</td>      <td>Class for pointer-to-member formation</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3027">      <td><a href="https://cplusplus.github.io/CWG/issues/3027.html">3027</a></td> +    <td>[<a href="https://wg21.link/temp.type">temp.type</a>]</td>      <td>open</td>      <td>Equivalence of <I>pack-index-specifier</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3028">      <td><a href="https://cplusplus.github.io/CWG/issues/3028.html">3028</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>open</td>      <td>A <I>using-declarator</I> should bind a name</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3029">      <td><a href="https://cplusplus.github.io/CWG/issues/3029.html">3029</a></td> +    <td>[<a href="https://wg21.link/basic.align">basic.align</a>]</td>      <td>drafting</td>      <td>Confusing note about ordinary character types for aligned memory areas</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3030">      <td><a href="https://cplusplus.github.io/CWG/issues/3030.html">3030</a></td> +    <td>[<a href="https://wg21.link/dcl.array">dcl.array</a>]</td>      <td>open</td>      <td>Initializing array prvalues of unknown bound</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3031">      <td><a href="https://cplusplus.github.io/CWG/issues/3031.html">3031</a></td> +    <td>[<a href="https://wg21.link/over.match.funcs.general">over.match.funcs.general</a>]</td>      <td>open</td>      <td>Finding declarations for conversion operators for access checking</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3032">      <td><a href="https://cplusplus.github.io/CWG/issues/3032.html">3032</a></td> +    <td>[<a href="https://wg21.link/temp.arg.general">temp.arg.general</a>]</td>      <td>tentatively ready</td>      <td>Template argument disambiguation</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3033">      <td><a href="https://cplusplus.github.io/CWG/issues/3033.html">3033</a></td> +    <td>[<a href="https://wg21.link/basic.scope.namespace">basic.scope.namespace</a>]</td>      <td>open</td>      <td>Scope after <I>declarator-id</I> before determining correspondence</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3034">      <td><a href="https://cplusplus.github.io/CWG/issues/3034.html">3034</a></td> +    <td>[<a href="https://wg21.link/temp.inst">temp.inst</a>]</td>      <td>open</td>      <td>Infinite recursion should hit an implementation limit</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3035">      <td><a href="https://cplusplus.github.io/CWG/issues/3035.html">3035</a></td> +    <td>[<a href="https://wg21.link/class.union.anon">class.union.anon</a>]</td>      <td>open</td>      <td>Lambda expressions in anonymous unions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3036">      <td><a href="https://cplusplus.github.io/CWG/issues/3036.html">3036</a></td> +    <td>[<a href="https://wg21.link/basic.extended.fp">basic.extended.fp</a>]</td>      <td>open</td>      <td>Extended floating-point types should not be cv-qualified</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3037">      <td><a href="https://cplusplus.github.io/CWG/issues/3037.html">3037</a></td> +    <td>[<a href="https://wg21.link/namespace.udecl">namespace.udecl</a>]</td>      <td>open</td>      <td>Name lookup results for <I>using-declarator</I>s</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3038">      <td><a href="https://cplusplus.github.io/CWG/issues/3038.html">3038</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.grammar">dcl.attr.grammar</a>]</td>      <td>open</td>      <td>Ignorability of attributes, again</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3039">      <td><a href="https://cplusplus.github.io/CWG/issues/3039.html">3039</a></td> +    <td>[<a href="https://wg21.link/intro.object">intro.object</a>]</td>      <td>open</td>      <td>Undefined behavior from implicit object creation ignores observable checkpoints</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3040">      <td><a href="https://cplusplus.github.io/CWG/issues/3040.html">3040</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.def.coroutine">dcl.fct.def.coroutine</a>]</td>      <td>open</td>      <td>Mishandling of lambda coroutines</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3041">      <td><a href="https://cplusplus.github.io/CWG/issues/3041.html">3041</a></td> +    <td>[<a href="https://wg21.link/class.dtor">class.dtor</a>]</td>      <td>open</td>      <td>Overly aggressive rule for deleting the destructor of a union</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3042">      <td><a href="https://cplusplus.github.io/CWG/issues/3042.html">3042</a></td> +    <td>[<a href="https://wg21.link/basic.lval">basic.lval</a>]</td>      <td>open</td>      <td>Implicit object creation is insufficient to model effective type rule of C</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3043">      <td><a href="https://cplusplus.github.io/CWG/issues/3043.html">3043</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>open</td>      <td>Lifetime extension for temporaries in expansion statements</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3044">      <td><a href="https://cplusplus.github.io/CWG/issues/3044.html">3044</a></td> +    <td>[<a href="https://wg21.link/stmt.expand">stmt.expand</a>]</td>      <td>tentatively ready</td>      <td>Iterating expansion statements woes</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3045">      <td><a href="https://cplusplus.github.io/CWG/issues/3045.html">3045</a></td> +    <td>[<a href="https://wg21.link/basic.scope.block">basic.scope.block</a>]</td>      <td>tentatively ready</td>      <td>Regularizing environment interactions of expansion statement</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3046">      <td><a href="https://cplusplus.github.io/CWG/issues/3046.html">3046</a></td> +    <td>[<a href="https://wg21.link/dcl.enum">dcl.enum</a>]</td>      <td>open</td>      <td>Enumerations as part of the common initial sequence</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3047">      <td><a href="https://cplusplus.github.io/CWG/issues/3047.html">3047</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Calling destructors on out-of-lifetime objects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3048">      <td><a href="https://cplusplus.github.io/CWG/issues/3048.html">3048</a></td> +    <td>[<a href="https://wg21.link/stmt.expand">stmt.expand</a>]</td>      <td>tentatively ready</td>      <td>Empty destructuring expansion statements</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3049">      <td><a href="https://cplusplus.github.io/CWG/issues/3049.html">3049</a></td> +    <td>[<a href="https://wg21.link/class.prop">class.prop</a>]</td>      <td>open</td>      <td>Implicitly deleted move operation should not disable trivial relocation</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3050">      <td><a href="https://cplusplus.github.io/CWG/issues/3050.html">3050</a></td> +    <td>[<a href="https://wg21.link/dcl.attr.deprecated">dcl.attr.deprecated</a>]</td>      <td>open</td>      <td>[[deprecated]] for class template partial specializations</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3051">      <td><a href="https://cplusplus.github.io/CWG/issues/3051.html">3051</a></td> +    <td>[<a href="https://wg21.link/class.mem.general">class.mem.general</a>]</td>      <td>open</td>      <td>Missing specification for types of member subobjects</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3052">      <td><a href="https://cplusplus.github.io/CWG/issues/3052.html">3052</a></td> +    <td>[<a href="https://wg21.link/stmt.return">stmt.return</a>]</td>      <td>open</td>      <td>Unclear handling of checks on discarded <TT>return</TT> statements</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3053">      <td><a href="https://cplusplus.github.io/CWG/issues/3053.html">3053</a></td> +    <td>[<a href="https://wg21.link/cpp.replace.general">cpp.replace.general</a>]</td>      <td>tentatively ready</td>      <td>Allowing <TT>#undef likely</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3054">      <td><a href="https://cplusplus.github.io/CWG/issues/3054.html">3054</a></td> +    <td>[<a href="https://wg21.link/expr.call">expr.call</a>]</td>      <td>open</td>      <td>Use of default arguments depending on shape of <I>postfix-expression</I> in a function call</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3055">      <td><a href="https://cplusplus.github.io/CWG/issues/3055.html">3055</a></td> +    <td>[<a href="https://wg21.link/over.call.object">over.call.object</a>]</td>      <td>open</td>      <td>Misleading body for surrogate call function</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3056">      <td><a href="https://cplusplus.github.io/CWG/issues/3056.html">3056</a></td> +    <td>[<a href="https://wg21.link/expr.prim.req.type">expr.prim.req.type</a>]</td>      <td>open</td>      <td>Missing semicolons in grammar for <I>type-requirement</I></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3057">      <td><a href="https://cplusplus.github.io/CWG/issues/3057.html">3057</a></td> +    <td>[<a href="https://wg21.link/over.ics.ref">over.ics.ref</a>]</td>      <td>open</td>      <td>Ranking of derived-to-base conversions should ignore reference binding</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3058">      <td><a href="https://cplusplus.github.io/CWG/issues/3058.html">3058</a></td> +    <td>[<a href="https://wg21.link/basic.lookup.general">basic.lookup.general</a>]</td>      <td>open</td>      <td>"Program point" is not defined</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3059">      <td><a href="https://cplusplus.github.io/CWG/issues/3059.html">3059</a></td> +    <td>[<a href="https://wg21.link/expr.const">expr.const</a>]</td>      <td>open</td>      <td><TT>throw;</TT> in constant expressions</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3060">      <td><a href="https://cplusplus.github.io/CWG/issues/3060.html">3060</a></td> +    <td>[<a href="https://wg21.link/basic.start.main">basic.start.main</a>]</td>      <td>open</td>      <td>Change in behavior for <TT>noexcept</TT> <TT>main</TT></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3061">      <td><a href="https://cplusplus.github.io/CWG/issues/3061.html">3061</a></td> +    <td>[<a href="https://wg21.link/stmt.expand">stmt.expand</a>]</td>      <td>tentatively ready</td>      <td>Trailing comma in an <I>expansion-init-list</I></td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3062">      <td><a href="https://cplusplus.github.io/CWG/issues/3062.html">3062</a></td> +    <td>[<a href="https://wg21.link/dcl.fct.default">dcl.fct.default</a>]</td>      <td>open</td>      <td>Overlapping specification of default template arguments</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3063">      <td><a href="https://cplusplus.github.io/CWG/issues/3063.html">3063</a></td> +    <td>[<a href="https://wg21.link/class.temporary">class.temporary</a>]</td>      <td>open</td>      <td>Lifetime extension of temporaries past function return</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3064">      <td><a href="https://cplusplus.github.io/CWG/issues/3064.html">3064</a></td> +    <td>[<a href="https://wg21.link/basic.life">basic.life</a>]</td>      <td>open</td>      <td>Mishandling of placement-new in lifetime rules</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3065">      <td><a href="https://cplusplus.github.io/CWG/issues/3065.html">3065</a></td> +    <td>[<a href="https://wg21.link/basic.types.general">basic.types.general</a>]</td>      <td>open</td>      <td>Reachability and completeness of types</td>      <td align="center">Not resolved</td>    </tr>    <tr class="open" id="3066">      <td><a href="https://cplusplus.github.io/CWG/issues/3066.html">3066</a></td> +    <td>[<a href="https://wg21.link/expr.prim.id.qual">expr.prim.id.qual</a>]</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>[<a href="https://wg21.link/conv.array">conv.array</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>[<a href="https://wg21.link/class.access.general">class.access.general</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>[<a href="https://wg21.link/temp.constr.normal">temp.constr.normal</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>[<a href="https://wg21.link/class.copy.assign">class.copy.assign</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>[<a href="https://wg21.link/dcl.struct.bind">dcl.struct.bind</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>[<a href="https://wg21.link/temp.deduct.general">temp.deduct.general</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>[<a href="https://wg21.link/over.match.ref">over.match.ref</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>[<a href="https://wg21.link/cpp.module">cpp.module</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>[<a href="https://wg21.link/cpp.import">cpp.import</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>[<a href="https://wg21.link/cpp.include">cpp.include</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>[<a href="https://wg21.link/cpp.pre">cpp.pre</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>[<a href="https://wg21.link/cpp.include">cpp.include</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>[<a href="https://wg21.link/class.union.anon">class.union.anon</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>[<a href="https://wg21.link/temp.arg.template">temp.arg.template</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>[<a href="https://wg21.link/expr.ref">expr.ref</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>[<a href="https://wg21.link/expr.reinterpret.cast">expr.reinterpret.cast</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>[<a href="https://wg21.link/stmt.pre">stmt.pre</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>[<a href="https://wg21.link/stmt.cont">stmt.cont</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>[<a href="https://wg21.link/stmt.pre">stmt.pre</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>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</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>[<a href="https://wg21.link/cpp.pragma.op">cpp.pragma.op</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>[<a href="https://wg21.link/cpp.replace.general">cpp.replace.general</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>[<a href="https://wg21.link/dcl.init.general">dcl.init.general</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>[<a href="https://wg21.link/module.interface">module.interface</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>[<a href="https://wg21.link/basic.link">basic.link</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>[<a href="https://wg21.link/dcl.attr.annotation">dcl.attr.annotation</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>[<a href="https://wg21.link/expr.prim.splice">expr.prim.splice</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>[<a href="https://wg21.link/lex.phases">lex.phases</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>[<a href="https://wg21.link/temp.dep.expr">temp.dep.expr</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>[<a href="https://wg21.link/temp.dep.constexpr">temp.dep.constexpr</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>[<a href="https://wg21.link/basic.scope.scope">basic.scope.scope</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>[<a href="https://wg21.link/temp.names">temp.names</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>[<a href="https://wg21.link/temp.inst">temp.inst</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>[<a href="https://wg21.link/basic.start.term">basic.start.term</a>]</td>      <td>open</td>      <td>Destruction order for objects with static storage duration</td>      <td align="center">Not resolved</td> diff --git a/clang/www/make_cxx_dr_status b/clang/www/make_cxx_dr_status index 485a9a5..3ba12e1 100755 --- a/clang/www/make_cxx_dr_status +++ b/clang/www/make_cxx_dr_status @@ -10,26 +10,36 @@ output = os.path.join(clang_www_dir, 'cxx_dr_status.html')  dr_test_dir = os.path.join(clang_www_dir, '../test/CXX/drs')  class DR: -  def __init__(self, section, issue, url, status, title): -    self.section, self.issue, self.url, self.status, self.title = \ -        section, issue, url, status, title +  def __init__(self, *, section_number, section_name, section_link, number, url, status, liaison, title): +    self.section_number, self.section_name, self.section_link, self.number, self.url, self.status, self.liaison, self.title = \ +        section_number, section_name, section_link, number, url, status, liaison, title    def __repr__(self): -    return '%s (%s): %s' % (self.issue, self.status, self.title) - -def parse(dr): -  try: -    section, issue_link, status, liaison, title = [ -        col.split('>', 1)[1].split('</TD>')[0] -        for col in dr.split('</TR>', 1)[0].split('<TD')[1:] -    ] -  except Exception as ex: -    print(f"Parse error: {ex}\n{dr}", file=sys.stderr) -    sys.exit(1) -  _, url, issue = issue_link.split('"', 2) -  url = url.strip() -  issue = int(issue.split('>', 1)[1].split('<', 1)[0]) -  title = title.replace('<issue_title>', '').replace('</issue_title>', '').replace('\r\n', '\n').strip() -  return DR(section, issue, url, status, title) +    return '%s (%s): %s' % (self.number, self.status, self.title) + +  pattern = re.compile(''' +<TD.*>(?P<section_number>.*) <A href="(?P<section_link>.*)">(?P<section_name>.*)</A> +</TD> +<TD.*><A HREF="(?P<url>.*)">(?P<number>.*)</A></TD> +<TD.*>(?P<status>.*)</TD> +<TD.*>(?P<liaison>.*)</TD> +<TD.*><issue_title>(?P<title>[\\w\\W]*)</issue_title></TD> +</TR>''') + +  @classmethod +  def parse_from_html(cls, html_string): +    match = cls.pattern.match(html_string) +    if match is None: +        print(f"Parse error: {html_string}", file=sys.stderr) +        exit(1) +    return cls( +      section_number=match.group('section_number'), +      section_name=match.group('section_name'), +      section_link=match.group('section_link'), +      number=int(match.group('number')), +      url=match.group('url'), +      status=match.group('status'), +      liaison=match.group('liaison'), +      title=match.group('title').replace('\n', ' ').strip())  def collect_tests():    status_re = re.compile(r'\bcwg([0-9]+): (.*)') @@ -68,8 +78,8 @@ def get_issues(path):       print(ex, file=sys.stderr)       sys.exit(1) -  return sorted((parse(dr) for dr in buffer.split('<TR>')[2:]), -                key = lambda dr: dr.issue) +  return sorted((DR.parse_from_html(dr) for dr in buffer.split('<TR>')[2:]), +                key = lambda dr: dr.number)  issue_list_path  = None @@ -127,9 +137,10 @@ out_html.append('''\  <p>This page tracks which C++ defect reports are implemented within Clang.</p> -<table width="689" border="1" cellspacing="0"> +<table width="892" border="1" cellspacing="0">    <tr>      <th>Number</th> +    <th>Section</th>      <th>Status</th>      <th>Issue title</th>      <th>Available in Clang?</th> @@ -149,7 +160,7 @@ def availability(issue):      unresolved_status = unresolved_status_match.group(1)      proposed_resolution_match = re.search(r' (open|drafting|review|tentatively ready|ready) (\d{4}-\d{2}(?:-\d{2})?|P\d{4}R\d+)$', status)      if proposed_resolution_match is None: -      raise AvailabilityError('error: issue {}: \'{}\' status should be followed by a paper number (P1234R5) or proposed resolution in YYYY-MM-DD format'.format(dr.issue, unresolved_status)) +      raise AvailabilityError('error: issue {}: \'{}\' status should be followed by a paper number (P1234R5) or proposed resolution in YYYY-MM-DD format'.format(dr.number, unresolved_status))      proposed_resolution = proposed_resolution_match.group(2)      status = status[:-1-len(proposed_resolution)]      status = status[:-1-len(unresolved_status)] @@ -236,7 +247,7 @@ def availability(issue):      avail = 'Duplicate of <a href="#%s">%s</a>' % (dup, dup)      _, avail_style, _, _ = availability(dup)    else: -    raise AvailabilityError('error: unknown status %s for issue %s' % (status, dr.issue)) +    raise AvailabilityError('error: unknown status %s for issue %s' % (status, dr.number))    return (avail + avail_suffix, avail_style, unresolved_status, details)  count = {} @@ -254,7 +265,7 @@ for dr in drs:    elif dr.status in ('open', 'drafting', 'review', 'tentatively ready', 'ready'):      row_style = ' class="open"'      try: -      avail, avail_style, unresolved_status, details = availability(dr.issue) +      avail, avail_style, unresolved_status, details = availability(dr.number)      except AvailabilityError as e:        availability_error_occurred = True        print(e.args[0]) @@ -267,12 +278,12 @@ for dr in drs:        if unresolved_status != dr.status:          availability_error_occurred = True          print("error: issue %s is marked '%s', which differs from CWG index status '%s'" \ -             % (dr.issue, unresolved_status, dr.status)) +             % (dr.number, unresolved_status, dr.status))          continue    else:      row_style = ''      try: -      avail, avail_style, unresolved_status, details = availability(dr.issue) +      avail, avail_style, unresolved_status, details = availability(dr.number)      except AvailabilityError as e:        availability_error_occurred = True        print(e.args[0]) @@ -281,7 +292,7 @@ for dr in drs:      if unresolved_status:        availability_error_occurred = True        print("error: issue %s is marked '%s', even though it is resolved in CWG index" \ -           % (dr.issue, unresolved_status)) +           % (dr.number, unresolved_status))        continue    if not avail.startswith('Sup') and not avail.startswith('Dup'): @@ -297,8 +308,9 @@ for dr in drs:          {details}        </details>'''    out_html.append(f''' -  <tr{row_style} id="{dr.issue}"> -    <td><a href="https://cplusplus.github.io/CWG/issues/{dr.issue}.html">{dr.issue}</a></td> +  <tr{row_style} id="{dr.number}"> +    <td><a href="https://cplusplus.github.io/CWG/issues/{dr.number}.html">{dr.number}</a></td> +    <td>[<a href="{dr.section_link}">{dr.section_name}</a>]</td>      <td>{dr.status}</td>      <td>{dr.title}</td>      <td{avail_style} align="center">{avail}</td> diff --git a/compiler-rt/lib/scudo/standalone/allocator_config.def b/compiler-rt/lib/scudo/standalone/allocator_config.def index 7485308..0aea7b8 100644 --- a/compiler-rt/lib/scudo/standalone/allocator_config.def +++ b/compiler-rt/lib/scudo/standalone/allocator_config.def @@ -57,6 +57,10 @@ BASE_OPTIONAL(const bool, MaySupportMemoryTagging, false)  // Disable the quarantine code.  BASE_OPTIONAL(const bool, QuarantineDisabled, false) +// If set to true, malloc_usable_size returns the exact size of the allocation. +// If set to false, return the total available size in the allocation. +BASE_OPTIONAL(const bool, ExactUsableSize, true) +  // PRIMARY_REQUIRED_TYPE(NAME)  //  // SizeClassMap to use with the Primary. diff --git a/compiler-rt/lib/scudo/standalone/combined.h b/compiler-rt/lib/scudo/standalone/combined.h index 329ec45..ffe9554 100644 --- a/compiler-rt/lib/scudo/standalone/combined.h +++ b/compiler-rt/lib/scudo/standalone/combined.h @@ -706,19 +706,26 @@ public:          if (!getChunkFromBlock(Block, &Chunk, &Header) &&              !getChunkFromBlock(addHeaderTag(Block), &Chunk, &Header))            return; -      } else { -        if (!getChunkFromBlock(addHeaderTag(Block), &Chunk, &Header)) -          return; +      } else if (!getChunkFromBlock(addHeaderTag(Block), &Chunk, &Header)) { +        return;        } -      if (Header.State == Chunk::State::Allocated) { -        uptr TaggedChunk = Chunk; -        if (allocatorSupportsMemoryTagging<AllocatorConfig>()) -          TaggedChunk = untagPointer(TaggedChunk); -        if (useMemoryTagging<AllocatorConfig>(Primary.Options.load())) -          TaggedChunk = loadTag(Chunk); -        Callback(TaggedChunk, getSize(reinterpret_cast<void *>(Chunk), &Header), -                 Arg); + +      if (Header.State != Chunk::State::Allocated) +        return; + +      uptr TaggedChunk = Chunk; +      if (allocatorSupportsMemoryTagging<AllocatorConfig>()) +        TaggedChunk = untagPointer(TaggedChunk); +      uptr Size; +      if (UNLIKELY(useMemoryTagging<AllocatorConfig>(Primary.Options.load()))) { +        TaggedChunk = loadTag(Chunk); +        Size = getSize(reinterpret_cast<void *>(Chunk), &Header); +      } else if (AllocatorConfig::getExactUsableSize()) { +        Size = getSize(reinterpret_cast<void *>(Chunk), &Header); +      } else { +        Size = getUsableSize(reinterpret_cast<void *>(Chunk), &Header);        } +      Callback(TaggedChunk, Size, Arg);      };      Primary.iterateOverBlocks(Lambda);      Secondary.iterateOverBlocks(Lambda); @@ -759,16 +766,50 @@ public:      return false;    } -  // Return the usable size for a given chunk. Technically we lie, as we just -  // report the actual size of a chunk. This is done to counteract code actively -  // writing past the end of a chunk (like sqlite3) when the usable size allows -  // for it, which then forces realloc to copy the usable size of a chunk as -  // opposed to its actual size. +  ALWAYS_INLINE uptr getUsableSize(const void *Ptr, +                                   Chunk::UnpackedHeader *Header) { +    void *BlockBegin = getBlockBegin(Ptr, Header); +    if (LIKELY(Header->ClassId)) { +      return SizeClassMap::getSizeByClassId(Header->ClassId) - +             (reinterpret_cast<uptr>(Ptr) - reinterpret_cast<uptr>(BlockBegin)); +    } + +    uptr UntaggedPtr = reinterpret_cast<uptr>(Ptr); +    if (allocatorSupportsMemoryTagging<AllocatorConfig>()) { +      UntaggedPtr = untagPointer(UntaggedPtr); +      BlockBegin = untagPointer(BlockBegin); +    } +    return SecondaryT::getBlockEnd(BlockBegin) - UntaggedPtr; +  } + +  // Return the usable size for a given chunk. If MTE is enabled or if the +  // ExactUsableSize config parameter is true, we report the exact size of +  // the original allocation size. Otherwise, we will return the total +  // actual usable size.    uptr getUsableSize(const void *Ptr) {      if (UNLIKELY(!Ptr))        return 0; -    return getAllocSize(Ptr); +    if (AllocatorConfig::getExactUsableSize() || +        UNLIKELY(useMemoryTagging<AllocatorConfig>(Primary.Options.load()))) +      return getAllocSize(Ptr); + +    initThreadMaybe(); + +#ifdef GWP_ASAN_HOOKS +    if (UNLIKELY(GuardedAlloc.pointerIsMine(Ptr))) +      return GuardedAlloc.getSize(Ptr); +#endif // GWP_ASAN_HOOKS + +    Ptr = getHeaderTaggedPointer(const_cast<void *>(Ptr)); +    Chunk::UnpackedHeader Header; +    Chunk::loadHeader(Cookie, Ptr, &Header); + +    // Getting the alloc size of a chunk only makes sense if it's allocated. +    if (UNLIKELY(Header.State != Chunk::State::Allocated)) +      reportInvalidChunkState(AllocatorAction::Sizing, Ptr); + +    return getUsableSize(Ptr, &Header);    }    uptr getAllocSize(const void *Ptr) { @@ -951,6 +992,19 @@ public:                           MemorySize, 2, 16);    } +  uptr getBlockBeginTestOnly(const void *Ptr) { +    Chunk::UnpackedHeader Header; +    Chunk::loadHeader(Cookie, Ptr, &Header); +    DCHECK(Header.State == Chunk::State::Allocated); + +    if (allocatorSupportsMemoryTagging<AllocatorConfig>()) +      Ptr = untagPointer(const_cast<void *>(Ptr)); +    void *Begin = getBlockBegin(Ptr, &Header); +    if (allocatorSupportsMemoryTagging<AllocatorConfig>()) +      Begin = untagPointer(Begin); +    return reinterpret_cast<uptr>(Begin); +  } +  private:    typedef typename PrimaryT::SizeClassMap SizeClassMap; diff --git a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp index 5fdfd1e..4837ac9 100644 --- a/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp +++ b/compiler-rt/lib/scudo/standalone/tests/combined_test.cpp @@ -1152,6 +1152,248 @@ TEST(ScudoCombinedTest, QuarantineDisabled) {    EXPECT_EQ(Stats.find("Stats: Quarantine"), std::string::npos);  } +struct UsableSizeClassConfig { +  static const scudo::uptr NumBits = 1; +  static const scudo::uptr MinSizeLog = 10; +  static const scudo::uptr MidSizeLog = 10; +  static const scudo::uptr MaxSizeLog = 13; +  static const scudo::u16 MaxNumCachedHint = 8; +  static const scudo::uptr MaxBytesCachedLog = 12; +  static const scudo::uptr SizeDelta = 0; +}; + +struct TestExactUsableSizeConfig { +  static const bool MaySupportMemoryTagging = false; +  static const bool QuarantineDisabled = true; + +  template <class A> using TSDRegistryT = scudo::TSDRegistrySharedT<A, 1U, 1U>; + +  struct Primary { +    // In order to properly test the usable size, this Primary config has +    // four real size classes: 1024, 2048, 4096, 8192. +    using SizeClassMap = scudo::FixedSizeClassMap<UsableSizeClassConfig>; +    static const scudo::uptr RegionSizeLog = 21U; +    static const scudo::s32 MinReleaseToOsIntervalMs = INT32_MIN; +    static const scudo::s32 MaxReleaseToOsIntervalMs = INT32_MAX; +    typedef scudo::uptr CompactPtrT; +    static const scudo::uptr CompactPtrScale = 0; +    static const bool EnableRandomOffset = true; +    static const scudo::uptr MapSizeIncrement = 1UL << 18; +    static const scudo::uptr GroupSizeLog = 18; +  }; +  template <typename Config> +  using PrimaryT = scudo::SizeClassAllocator64<Config>; + +  struct Secondary { +    template <typename Config> +    using CacheT = scudo::MapAllocatorNoCache<Config>; +  }; + +  template <typename Config> using SecondaryT = scudo::MapAllocator<Config>; +}; + +template <class AllocatorT> void VerifyExactUsableSize(AllocatorT &Allocator) { +  // Scan through all sizes up to 10000 then some larger sizes. +  for (scudo::uptr Size = 1; Size < 10000; Size++) { +    void *P = Allocator.allocate(Size, Origin); +    EXPECT_EQ(Size, Allocator.getUsableSize(P)) +        << "Failed usable size at allocation size " << Size; +    Allocator.deallocate(P, Origin); +  } + +  // Verify that aligned allocations also return the exact size allocated. +  const scudo::uptr AllocSize = 313; +  for (scudo::uptr Align = 1; Align <= 8; Align++) { +    void *P = Allocator.allocate(AllocSize, Origin, 1U << Align); +    EXPECT_EQ(AllocSize, Allocator.getUsableSize(P)) +        << "Failed usable size at allocation size " << AllocSize << " at align " +        << 1 << Align; +    Allocator.deallocate(P, Origin); +  } + +  // Verify an explicitly large allocations. +  const scudo::uptr LargeAllocSize = 1000000; +  void *P = Allocator.allocate(LargeAllocSize, Origin); +  EXPECT_EQ(LargeAllocSize, Allocator.getUsableSize(P)); +  Allocator.deallocate(P, Origin); + +  // Now do it for aligned allocations for large allocations. +  for (scudo::uptr Align = 1; Align <= 8; Align++) { +    void *P = Allocator.allocate(LargeAllocSize, Origin, 1U << Align); +    EXPECT_EQ(LargeAllocSize, Allocator.getUsableSize(P)) +        << "Failed usable size at allocation size " << AllocSize << " at align " +        << 1 << Align; +    Allocator.deallocate(P, Origin); +  } +} + +template <class AllocatorT> +void VerifyIterateOverUsableSize(AllocatorT &Allocator) { +  // This will not verify if the size is the exact size or the size of the +  // size class. Instead verify that the size matches the usable size and +  // assume the other tests have verified getUsableSize. +  std::unordered_map<void *, size_t> Pointers; +  Pointers.insert({Allocator.allocate(128, Origin), 0U}); +  Pointers.insert({Allocator.allocate(128, Origin, 32), 0U}); +  Pointers.insert({Allocator.allocate(2000, Origin), 0U}); +  Pointers.insert({Allocator.allocate(2000, Origin, 64), 0U}); +  Pointers.insert({Allocator.allocate(8000, Origin), 0U}); +  Pointers.insert({Allocator.allocate(8000, Origin, 128), 0U}); +  Pointers.insert({Allocator.allocate(2000205, Origin), 0U}); +  Pointers.insert({Allocator.allocate(2000205, Origin, 128), 0U}); +  Pointers.insert({Allocator.allocate(2000205, Origin, 256), 0U}); + +  Allocator.disable(); +  Allocator.iterateOverChunks( +      0, static_cast<scudo::uptr>(SCUDO_MMAP_RANGE_SIZE - 1), +      [](uintptr_t Base, size_t Size, void *Arg) { +        std::unordered_map<void *, size_t> *Pointers = +            reinterpret_cast<std::unordered_map<void *, size_t> *>(Arg); +        (*Pointers)[reinterpret_cast<void *>(Base)] = Size; +      }, +      reinterpret_cast<void *>(&Pointers)); +  Allocator.enable(); + +  for (auto [Ptr, IterateSize] : Pointers) { +    EXPECT_NE(0U, IterateSize) +        << "Pointer " << Ptr << " not found in iterateOverChunks call."; +    EXPECT_EQ(IterateSize, Allocator.getUsableSize(Ptr)) +        << "Pointer " << Ptr +        << " mismatch between iterate size and usable size."; +    Allocator.deallocate(Ptr, Origin); +  } +} + +TEST(ScudoCombinedTest, ExactUsableSize) { +  using AllocatorT = scudo::Allocator<TestExactUsableSizeConfig>; +  auto Allocator = std::unique_ptr<AllocatorT>(new AllocatorT()); + +  VerifyExactUsableSize<AllocatorT>(*Allocator); +  VerifyIterateOverUsableSize<AllocatorT>(*Allocator); +} + +struct TestExactUsableSizeMTEConfig : TestExactUsableSizeConfig { +  static const bool MaySupportMemoryTagging = true; +}; + +TEST(ScudoCombinedTest, ExactUsableSizeMTE) { +  if (!scudo::archSupportsMemoryTagging() || +      !scudo::systemDetectsMemoryTagFaultsTestOnly()) +    TEST_SKIP("Only supported on systems that can enable MTE."); + +  scudo::enableSystemMemoryTaggingTestOnly(); + +  using AllocatorT = scudo::Allocator<TestExactUsableSizeMTEConfig>; +  auto Allocator = std::unique_ptr<AllocatorT>(new AllocatorT()); + +  VerifyExactUsableSize<AllocatorT>(*Allocator); +  VerifyIterateOverUsableSize<AllocatorT>(*Allocator); +} + +template <class AllocatorT> +void VerifyUsableSizePrimary(AllocatorT &Allocator) { +  std::vector<scudo::uptr> SizeClasses = {1024U, 2048U, 4096U, 8192U}; +  for (size_t I = 0; I < SizeClasses.size(); I++) { +    scudo::uptr SizeClass = SizeClasses[I]; +    scudo::uptr StartSize; +    if (I == 0) +      StartSize = 1; +    else +      StartSize = SizeClasses[I - 1]; +    scudo::uptr UsableSize = SizeClass - scudo::Chunk::getHeaderSize(); +    for (scudo::uptr Size = StartSize; Size < UsableSize; Size++) { +      void *P = Allocator.allocate(Size, Origin); +      EXPECT_EQ(UsableSize, Allocator.getUsableSize(P)) +          << "Failed usable size at allocation size " << Size +          << " for size class " << SizeClass; +      memset(P, 0xff, UsableSize); +      EXPECT_EQ(Allocator.getBlockBeginTestOnly(P) + SizeClass, +                reinterpret_cast<scudo::uptr>(P) + UsableSize); +      Allocator.deallocate(P, Origin); +    } + +    StartSize = UsableSize + 1; +  } + +  std::vector<scudo::uptr> Alignments = {32U, 128U}; +  for (size_t I = 0; I < SizeClasses.size(); I++) { +    scudo::uptr SizeClass = SizeClasses[I]; +    scudo::uptr AllocSize; +    if (I == 0) +      AllocSize = 1; +    else +      AllocSize = SizeClasses[I - 1] + 1; + +    for (auto Alignment : Alignments) { +      void *P = Allocator.allocate(AllocSize, Origin, Alignment); +      scudo::uptr UsableSize = Allocator.getUsableSize(P); +      memset(P, 0xff, UsableSize); +      EXPECT_EQ(Allocator.getBlockBeginTestOnly(P) + SizeClass, +                reinterpret_cast<scudo::uptr>(P) + UsableSize) +          << "Failed usable size at allocation size " << AllocSize +          << " for size class " << SizeClass << " at alignment " << Alignment; +      Allocator.deallocate(P, Origin); +    } +  } +} + +template <class AllocatorT> +void VerifyUsableSizeSecondary(AllocatorT &Allocator) { +  const scudo::uptr LargeAllocSize = 996780; +  const scudo::uptr PageSize = scudo::getPageSizeCached(); +  void *P = Allocator.allocate(LargeAllocSize, Origin); +  scudo::uptr UsableSize = Allocator.getUsableSize(P); +  memset(P, 0xff, UsableSize); +  // Assumes that the secondary always rounds up allocations to a page boundary. +  EXPECT_EQ(scudo::roundUp(reinterpret_cast<scudo::uptr>(P) + LargeAllocSize, +                           PageSize), +            reinterpret_cast<scudo::uptr>(P) + UsableSize); +  Allocator.deallocate(P, Origin); + +  // Check aligned allocations now. +  for (scudo::uptr Alignment = 1; Alignment <= 8; Alignment++) { +    void *P = Allocator.allocate(LargeAllocSize, Origin, 1U << Alignment); +    scudo::uptr UsableSize = Allocator.getUsableSize(P); +    EXPECT_EQ(scudo::roundUp(reinterpret_cast<scudo::uptr>(P) + LargeAllocSize, +                             PageSize), +              reinterpret_cast<scudo::uptr>(P) + UsableSize) +        << "Failed usable size at allocation size " << LargeAllocSize +        << " at alignment " << Alignment; +    Allocator.deallocate(P, Origin); +  } +} + +struct TestFullUsableSizeConfig : TestExactUsableSizeConfig { +  static const bool ExactUsableSize = false; +}; + +TEST(ScudoCombinedTest, FullUsableSize) { +  using AllocatorT = scudo::Allocator<TestFullUsableSizeConfig>; +  auto Allocator = std::unique_ptr<AllocatorT>(new AllocatorT()); + +  VerifyUsableSizePrimary<AllocatorT>(*Allocator); +  VerifyUsableSizeSecondary<AllocatorT>(*Allocator); +  VerifyIterateOverUsableSize<AllocatorT>(*Allocator); +} + +struct TestFullUsableSizeMTEConfig : TestFullUsableSizeConfig { +  static const bool MaySupportMemoryTagging = true; +}; + +TEST(ScudoCombinedTest, FullUsableSizeMTE) { +  if (!scudo::archSupportsMemoryTagging() || +      !scudo::systemDetectsMemoryTagFaultsTestOnly()) +    TEST_SKIP("Only supported on systems that can enable MTE."); + +  scudo::enableSystemMemoryTaggingTestOnly(); + +  using AllocatorT = scudo::Allocator<TestFullUsableSizeMTEConfig>; +  auto Allocator = std::unique_ptr<AllocatorT>(new AllocatorT()); + +  // When MTE is enabled, you get exact sizes. +  VerifyExactUsableSize<AllocatorT>(*Allocator); +  VerifyIterateOverUsableSize<AllocatorT>(*Allocator); +}  // Verify that no special quarantine blocks appear in iterateOverChunks.  TEST(ScudoCombinedTest, QuarantineIterateOverChunks) {    using AllocatorT = TestAllocator<TestQuarantineConfig>; diff --git a/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp b/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp index 612317b..9e5d065 100644 --- a/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp +++ b/compiler-rt/lib/scudo/standalone/tests/wrappers_c_test.cpp @@ -588,8 +588,13 @@ TEST_F(ScudoWrappersCTest, MallocInfo) {    EXPECT_EQ(errno, 0);    fclose(F);    EXPECT_EQ(strncmp(Buffer, "<malloc version=\"scudo-", 23), 0); -  EXPECT_NE(nullptr, strstr(Buffer, "<alloc size=\"1234\" count=\"")); -  EXPECT_NE(nullptr, strstr(Buffer, "<alloc size=\"4321\" count=\"")); +  std::string expected; +  expected = +      "<alloc size=\"" + std::to_string(malloc_usable_size(P1)) + "\" count=\""; +  EXPECT_NE(nullptr, strstr(Buffer, expected.c_str())); +  expected = +      "<alloc size=\"" + std::to_string(malloc_usable_size(P2)) + "\" count=\""; +  EXPECT_NE(nullptr, strstr(Buffer, expected.c_str()));    free(P1);    free(P2); diff --git a/compiler-rt/test/tsan/cxa_guard_acquire.cpp b/compiler-rt/test/tsan/cxa_guard_acquire.cpp index fc40725..6050c24 100644 --- a/compiler-rt/test/tsan/cxa_guard_acquire.cpp +++ b/compiler-rt/test/tsan/cxa_guard_acquire.cpp @@ -66,10 +66,17 @@ int main(int argc, char **argv) {    printf("Enter main\n");    // If initialization is contended, the blocked thread should enter a -  // potentially blocking region. +  // potentially blocking region. Note that we use a DAG check because it is +  // possible for Thread 1 to acquire the guard, then Thread 2 fail to acquire +  // the guard then call `OnPotentiallyBlockingRegionBegin` and print "Enter +  // potentially blocking region\n", before Thread 1 manages to reach "Enter +  // constructor\n". This is exceptionally rare, but can be replicated by +  // inserting a `sleep(1)` between `LazyInit() {` and `printf("Enter +  // constructor\n");`. Due to the barrier it is not possible for the exit logs +  // to be inverted.    // -  // CHECK-NEXT: Enter constructor -  // CHECK-NEXT: Enter potentially blocking region +  // CHECK-DAG: Enter constructor +  // CHECK-DAG: Enter potentially blocking region    // CHECK-NEXT: Exit constructor    // CHECK-NEXT: Exit potentially blocking region    barrier_init(&barrier, 2); diff --git a/flang/examples/FeatureList/FeatureList.cpp b/flang/examples/FeatureList/FeatureList.cpp index 225a655..ef58da6 100644 --- a/flang/examples/FeatureList/FeatureList.cpp +++ b/flang/examples/FeatureList/FeatureList.cpp @@ -445,6 +445,7 @@ public:    READ_FEATURE(ObjectDecl)    READ_FEATURE(OldParameterStmt)    READ_FEATURE(OmpAlignedClause) +  READ_FEATURE(OmpAllocateDirective)    READ_FEATURE(OmpBeginDirective)    READ_FEATURE(OmpBeginLoopDirective)    READ_FEATURE(OmpBeginSectionsDirective) @@ -541,7 +542,6 @@ public:    READ_FEATURE(OpenMPCancellationPointConstruct)    READ_FEATURE(OpenMPConstruct)    READ_FEATURE(OpenMPCriticalConstruct) -  READ_FEATURE(OpenMPDeclarativeAllocate)    READ_FEATURE(OpenMPDeclarativeConstruct)    READ_FEATURE(OpenMPDeclareReductionConstruct)    READ_FEATURE(OpenMPDeclareSimdConstruct) @@ -550,7 +550,6 @@ public:    READ_FEATURE(OmpAtomicDefaultMemOrderClause)    READ_FEATURE(OpenMPFlushConstruct)    READ_FEATURE(OpenMPLoopConstruct) -  READ_FEATURE(OpenMPExecutableAllocate)    READ_FEATURE(OpenMPAllocatorsConstruct)    READ_FEATURE(OpenMPRequiresConstruct)    READ_FEATURE(OpenMPSimpleStandaloneConstruct) diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h index 3407dd0..9f15ce6 100644 --- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h +++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h @@ -188,6 +188,8 @@ struct IntrinsicLibrary {    fir::ExtendedValue genAny(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);    mlir::Value genAtanpi(mlir::Type, llvm::ArrayRef<mlir::Value>);    mlir::Value genAtomicAdd(mlir::Type, llvm::ArrayRef<mlir::Value>); +  fir::ExtendedValue genAtomicAddR2(mlir::Type, +                                    llvm::ArrayRef<fir::ExtendedValue>);    mlir::Value genAtomicAnd(mlir::Type, llvm::ArrayRef<mlir::Value>);    fir::ExtendedValue genAtomicCas(mlir::Type,                                    llvm::ArrayRef<fir::ExtendedValue>); diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h index a7398a4..de27164 100644 --- a/flang/include/flang/Parser/dump-parse-tree.h +++ b/flang/include/flang/Parser/dump-parse-tree.h @@ -512,6 +512,7 @@ public:    NODE(parser, OmpAlignModifier)    NODE(parser, OmpAllocateClause)    NODE(OmpAllocateClause, Modifier) +  NODE(parser, OmpAllocateDirective)    NODE(parser, OmpAllocatorComplexModifier)    NODE(parser, OmpAllocatorSimpleModifier)    NODE(parser, OmpAlwaysModifier) @@ -739,7 +740,6 @@ public:    NODE(parser, OpenMPCancellationPointConstruct)    NODE(parser, OpenMPConstruct)    NODE(parser, OpenMPCriticalConstruct) -  NODE(parser, OpenMPDeclarativeAllocate)    NODE(parser, OpenMPDeclarativeAssumes)    NODE(parser, OpenMPDeclarativeConstruct)    NODE(parser, OpenMPDeclareMapperConstruct) @@ -748,7 +748,6 @@ public:    NODE(parser, OpenMPDeclareTargetConstruct)    NODE(parser, OpenMPDepobjConstruct)    NODE(parser, OpenMPDispatchConstruct) -  NODE(parser, OpenMPExecutableAllocate)    NODE(parser, OpenMPFlushConstruct)    NODE(parser, OpenMPGroupprivate)    NODE(parser, OpenMPLoopConstruct) diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h index 49db091..8fa4a84 100644 --- a/flang/include/flang/Parser/openmp-utils.h +++ b/flang/include/flang/Parser/openmp-utils.h @@ -22,6 +22,7 @@  #include <type_traits>  #include <utility>  #include <variant> +#include <vector>  namespace Fortran::parser::omp { @@ -33,23 +34,6 @@ template <typename T> constexpr auto addr_if(const std::optional<T> &x) {  }  namespace detail { -using D = llvm::omp::Directive; - -template <typename Construct> // -struct ConstructId { -  static constexpr llvm::omp::Directive id{D::OMPD_unknown}; -}; - -#define MAKE_CONSTR_ID(Construct, Id) \ -  template <> struct ConstructId<Construct> { \ -    static constexpr llvm::omp::Directive id{Id}; \ -  } - -MAKE_CONSTR_ID(OpenMPDeclarativeAllocate, D::OMPD_allocate); -MAKE_CONSTR_ID(OpenMPExecutableAllocate, D::OMPD_allocate); - -#undef MAKE_CONSTR_ID -  struct DirectiveNameScope {    static OmpDirectiveName MakeName(CharBlock source = {},        llvm::omp::Directive id = llvm::omp::Directive::OMPD_unknown) { @@ -97,9 +81,6 @@ struct DirectiveNameScope {      } else if constexpr (TupleTrait<T>) {        if constexpr (std::is_base_of_v<OmpBlockConstruct, T>) {          return std::get<OmpBeginDirective>(x.t).DirName(); -      } else if constexpr (std::is_same_v<T, OpenMPDeclarativeAllocate> || -          std::is_same_v<T, OpenMPExecutableAllocate>) { -        return MakeName(std::get<Verbatim>(x.t).source, ConstructId<T>::id);        } else {          return GetFromTuple(              x.t, std::make_index_sequence<std::tuple_size_v<decltype(x.t)>>{}); @@ -139,6 +120,9 @@ template <typename T> OmpDirectiveName GetOmpDirectiveName(const T &x) {    return detail::DirectiveNameScope::GetOmpDirectiveName(x);  } +const OpenMPDeclarativeConstruct *GetOmp(const DeclarationConstruct &x); +const OpenMPConstruct *GetOmp(const ExecutionPartConstruct &x); +  const OmpObjectList *GetOmpObjectList(const OmpClause &clause);  template <typename T> @@ -158,6 +142,13 @@ const OmpCombinerExpression *GetCombinerExpr(      const OmpReductionSpecifier &rspec);  const OmpInitializerExpression *GetInitializerExpr(const OmpClause &init); +struct OmpAllocateInfo { +  std::vector<const OmpAllocateDirective *> dirs; +  const ExecutionPartConstruct *body{nullptr}; +}; + +OmpAllocateInfo SplitOmpAllocate(const OmpAllocateDirective &x); +  } // namespace Fortran::parser::omp  #endif // FORTRAN_PARSER_OPENMP_UTILS_H diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h index 375790a..8c7578f 100644 --- a/flang/include/flang/Parser/parse-tree.h +++ b/flang/include/flang/Parser/parse-tree.h @@ -5151,17 +5151,42 @@ struct OpenMPThreadprivate {    CharBlock source;  }; -// 2.11.3 allocate -> ALLOCATE (variable-name-list) [clause] -struct OpenMPDeclarativeAllocate { -  TUPLE_CLASS_BOILERPLATE(OpenMPDeclarativeAllocate); -  CharBlock source; -  std::tuple<Verbatim, OmpObjectList, OmpClauseList> t; +// Ref: [4.5:310-312], [5.0:156-158], [5.1:181-184], [5.2:176-177], +//      [6.0:310-312] +// +// allocate-directive -> +//    ALLOCATE (variable-list-item...) |            // since 4.5 +//    ALLOCATE (variable-list-item...)              // since 5.0, until 5.1 +//    ... +//    allocate-stmt +// +// The first form is the "declarative-allocate", and is a declarative +// directive. The second is the "executable-allocate" and is an executable +// directive. The executable form was deprecated in 5.2. +// +// The executable-allocate consists of several ALLOCATE directives. Since +// in the parse tree every type corresponding to a directive only corresponds +// to a single directive, the executable form is represented by a sequence +// of nested OmpAlocateDirectives, e.g. +//    !$OMP ALLOCATE(x) +//    !$OMP ALLOCATE(y) +//    ALLOCATE(x, y) +// will become +//    OmpAllocateDirective +//    |- ALLOCATE(x)            // begin directive +//    `- OmpAllocateDirective   // block +//       |- ALLOCATE(y)            // begin directive +//       `- ALLOCATE(x, y)         // block +// +// The block in the declarative-allocate will be empty. +struct OmpAllocateDirective : public OmpBlockConstruct { +  INHERITED_TUPLE_CLASS_BOILERPLATE(OmpAllocateDirective, OmpBlockConstruct);  };  struct OpenMPDeclarativeConstruct {    UNION_CLASS_BOILERPLATE(OpenMPDeclarativeConstruct);    CharBlock source; -  std::variant<OpenMPDeclarativeAllocate, OpenMPDeclarativeAssumes, +  std::variant<OmpAllocateDirective, OpenMPDeclarativeAssumes,        OpenMPDeclareMapperConstruct, OpenMPDeclareReductionConstruct,        OpenMPDeclareSimdConstruct, OpenMPDeclareTargetConstruct,        OmpDeclareVariantDirective, OpenMPGroupprivate, OpenMPThreadprivate, @@ -5174,19 +5199,6 @@ struct OpenMPCriticalConstruct : public OmpBlockConstruct {    INHERITED_TUPLE_CLASS_BOILERPLATE(OpenMPCriticalConstruct, OmpBlockConstruct);  }; -// 2.11.3 allocate -> ALLOCATE [(variable-name-list)] [clause] -//        [ALLOCATE (variable-name-list) [clause] [...]] -//        allocate-statement -//        clause -> allocator-clause -struct OpenMPExecutableAllocate { -  TUPLE_CLASS_BOILERPLATE(OpenMPExecutableAllocate); -  CharBlock source; -  std::tuple<Verbatim, std::optional<OmpObjectList>, OmpClauseList, -      std::optional<std::list<OpenMPDeclarativeAllocate>>, -      Statement<AllocateStmt>> -      t; -}; -  // Ref: [5.2:180-181], [6.0:315]  //  // allocators-construct -> @@ -5342,9 +5354,9 @@ struct OpenMPConstruct {    UNION_CLASS_BOILERPLATE(OpenMPConstruct);    std::variant<OpenMPStandaloneConstruct, OpenMPSectionsConstruct,        OpenMPSectionConstruct, OpenMPLoopConstruct, OmpBlockConstruct, -      OpenMPAtomicConstruct, OpenMPDeclarativeAllocate, OpenMPDispatchConstruct, -      OpenMPUtilityConstruct, OpenMPExecutableAllocate, -      OpenMPAllocatorsConstruct, OpenMPAssumeConstruct, OpenMPCriticalConstruct> +      OpenMPAtomicConstruct, OmpAllocateDirective, OpenMPDispatchConstruct, +      OpenMPUtilityConstruct, OpenMPAllocatorsConstruct, OpenMPAssumeConstruct, +      OpenMPCriticalConstruct>        u;  }; diff --git a/flang/include/flang/Semantics/openmp-utils.h b/flang/include/flang/Semantics/openmp-utils.h index 032944d..14a4f0e 100644 --- a/flang/include/flang/Semantics/openmp-utils.h +++ b/flang/include/flang/Semantics/openmp-utils.h @@ -72,6 +72,8 @@ const parser::OmpObject *GetArgumentObject(const parser::OmpArgument &argument);  bool IsCommonBlock(const Symbol &sym);  bool IsExtendedListItem(const Symbol &sym);  bool IsVariableListItem(const Symbol &sym); +bool IsTypeParamInquiry(const Symbol &sym); +bool IsStructureComponent(const Symbol &sym);  bool IsVarOrFunctionRef(const MaybeExpr &expr);  bool IsMapEnteringType(parser::OmpMapType::Value type); diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 7106728..ad456d8 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -3503,12 +3503,12 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,                     lower::pft::Evaluation &eval,                     const parser::OpenMPUtilityConstruct &); -static void -genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, -       semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval, -       const parser::OpenMPDeclarativeAllocate &declarativeAllocate) { +static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, +                   semantics::SemanticsContext &semaCtx, +                   lower::pft::Evaluation &eval, +                   const parser::OmpAllocateDirective &allocate) {    if (!semaCtx.langOptions().OpenMPSimd) -    TODO(converter.getCurrentLocation(), "OpenMPDeclarativeAllocate"); +    TODO(converter.getCurrentLocation(), "OmpAllocateDirective");  }  static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, @@ -3902,14 +3902,6 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,  static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,                     semantics::SemanticsContext &semaCtx,                     lower::pft::Evaluation &eval, -                   const parser::OpenMPExecutableAllocate &execAllocConstruct) { -  if (!semaCtx.langOptions().OpenMPSimd) -    TODO(converter.getCurrentLocation(), "OpenMPExecutableAllocate"); -} - -static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, -                   semantics::SemanticsContext &semaCtx, -                   lower::pft::Evaluation &eval,                     const parser::OpenMPLoopConstruct &loopConstruct) {    const parser::OmpDirectiveSpecification &beginSpec = loopConstruct.BeginDir();    List<Clause> clauses = makeClauses(beginSpec.Clauses(), semaCtx); diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index 15ea845..6be4d9c 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -294,6 +294,10 @@ static constexpr IntrinsicHandler handlers[]{      {"atomicaddf", &I::genAtomicAdd, {{{"a", asAddr}, {"v", asValue}}}, false},      {"atomicaddi", &I::genAtomicAdd, {{{"a", asAddr}, {"v", asValue}}}, false},      {"atomicaddl", &I::genAtomicAdd, {{{"a", asAddr}, {"v", asValue}}}, false}, +    {"atomicaddr2", +     &I::genAtomicAddR2, +     {{{"a", asAddr}, {"v", asAddr}}}, +     false},      {"atomicandi", &I::genAtomicAnd, {{{"a", asAddr}, {"v", asValue}}}, false},      {"atomiccasd",       &I::genAtomicCas, @@ -3119,7 +3123,6 @@ static mlir::Value genAtomBinOp(fir::FirOpBuilder &builder, mlir::Location &loc,  mlir::Value IntrinsicLibrary::genAtomicAdd(mlir::Type resultType,                                             llvm::ArrayRef<mlir::Value> args) {    assert(args.size() == 2); -    mlir::LLVM::AtomicBinOp binOp =        mlir::isa<mlir::IntegerType>(args[1].getType())            ? mlir::LLVM::AtomicBinOp::add @@ -3127,6 +3130,44 @@ mlir::Value IntrinsicLibrary::genAtomicAdd(mlir::Type resultType,    return genAtomBinOp(builder, loc, binOp, args[0], args[1]);  } +fir::ExtendedValue +IntrinsicLibrary::genAtomicAddR2(mlir::Type resultType, +                                 llvm::ArrayRef<fir::ExtendedValue> args) { +  assert(args.size() == 2); + +  mlir::Value a = fir::getBase(args[0]); + +  if (mlir::isa<fir::BaseBoxType>(a.getType())) { +    a = fir::BoxAddrOp::create(builder, loc, a); +  } + +  auto loc = builder.getUnknownLoc(); +  auto f16Ty = builder.getF16Type(); +  auto i32Ty = builder.getI32Type(); +  auto vecF16Ty = mlir::VectorType::get({2}, f16Ty); +  mlir::Type idxTy = builder.getIndexType(); +  auto f16RefTy = fir::ReferenceType::get(f16Ty); +  auto zero = builder.createIntegerConstant(loc, idxTy, 0); +  auto one = builder.createIntegerConstant(loc, idxTy, 1); +  auto v1Coord = fir::CoordinateOp::create(builder, loc, f16RefTy, +                                           fir::getBase(args[1]), zero); +  auto v2Coord = fir::CoordinateOp::create(builder, loc, f16RefTy, +                                           fir::getBase(args[1]), one); +  auto v1 = fir::LoadOp::create(builder, loc, v1Coord); +  auto v2 = fir::LoadOp::create(builder, loc, v2Coord); +  mlir::Value undef = mlir::LLVM::UndefOp::create(builder, loc, vecF16Ty); +  mlir::Value vec1 = mlir::LLVM::InsertElementOp::create( +      builder, loc, undef, v1, builder.createIntegerConstant(loc, i32Ty, 0)); +  mlir::Value vec2 = mlir::LLVM::InsertElementOp::create( +      builder, loc, vec1, v2, builder.createIntegerConstant(loc, i32Ty, 1)); +  auto res = genAtomBinOp(builder, loc, mlir::LLVM::AtomicBinOp::fadd, a, vec2); +  auto i32VecTy = mlir::VectorType::get({1}, i32Ty); +  mlir::Value vecI32 = +      mlir::vector::BitCastOp::create(builder, loc, i32VecTy, res); +  return mlir::vector::ExtractOp::create(builder, loc, vecI32, +                                         mlir::ArrayRef<int64_t>{0}); +} +  mlir::Value IntrinsicLibrary::genAtomicSub(mlir::Type resultType,                                             llvm::ArrayRef<mlir::Value> args) {    assert(args.size() == 2); diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index 4159d2e..4374acb 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -1778,6 +1778,31 @@ private:    llvm::omp::Directive dir_;  }; +struct OmpDeclarativeAllocateParser { +  using resultType = OmpAllocateDirective; + +  std::optional<resultType> Parse(ParseState &state) const { +    constexpr llvm::omp::Directive dir{llvm::omp::Directive::OMPD_allocate}; +    if (auto &&begin{attempt(OmpBeginDirectiveParser(dir)).Parse(state)}) { +      Block empty; +      auto end{maybe(OmpEndDirectiveParser{dir}).Parse(state)}; +      return OmpAllocateDirective{std::move(*begin), std::move(empty), +          llvm::transformOptional(std::move(*end), +              [](auto &&s) { return OmpEndDirective(std::move(s)); })}; +    } +    return std::nullopt; +  } +}; + +struct OmpExecutableAllocateParser { +  using resultType = OmpAllocateDirective; + +  std::optional<resultType> Parse(ParseState &state) const { +    OmpStatementConstructParser p{llvm::omp::Directive::OMPD_allocate}; +    return construct<OmpAllocateDirective>(p).Parse(state); +  } +}; +  TYPE_PARSER(sourced(construct<OpenMPAllocatorsConstruct>(      OmpStatementConstructParser{llvm::omp::Directive::OMPD_allocators}))) @@ -2044,13 +2069,6 @@ TYPE_PARSER(construct<OmpInitializerExpression>(OmpStylizedExpressionParser{}))  TYPE_PARSER(sourced(construct<OpenMPCriticalConstruct>(      OmpBlockConstructParser{llvm::omp::Directive::OMPD_critical}))) -// 2.11.3 Executable Allocate directive -TYPE_PARSER( -    sourced(construct<OpenMPExecutableAllocate>(verbatim("ALLOCATE"_tok), -        maybe(parenthesized(Parser<OmpObjectList>{})), Parser<OmpClauseList>{}, -        maybe(nonemptyList(Parser<OpenMPDeclarativeAllocate>{})) / endOmpLine, -        statement(allocateStmt)))) -  // 2.8.2 Declare Simd construct  TYPE_PARSER(sourced(construct<OpenMPDeclareSimdConstruct>(      predicated(Parser<OmpDirectiveName>{}, @@ -2076,12 +2094,6 @@ TYPE_PARSER(sourced( //              IsDirective(llvm::omp::Directive::OMPD_threadprivate)) >=          Parser<OmpDirectiveSpecification>{}))) -// 2.11.3 Declarative Allocate directive -TYPE_PARSER( -    sourced(construct<OpenMPDeclarativeAllocate>(verbatim("ALLOCATE"_tok), -        parenthesized(Parser<OmpObjectList>{}), Parser<OmpClauseList>{})) / -    lookAhead(endOmpLine / !statement(allocateStmt))) -  // Assumes Construct  TYPE_PARSER(sourced(construct<OpenMPDeclarativeAssumes>(      predicated(OmpDirectiveNameParser{}, @@ -2104,7 +2116,7 @@ TYPE_PARSER(                              construct<OpenMPDeclarativeConstruct>(                                  Parser<OmpDeclareVariantDirective>{}) ||                              construct<OpenMPDeclarativeConstruct>( -                                Parser<OpenMPDeclarativeAllocate>{}) || +                                sourced(OmpDeclarativeAllocateParser{})) ||                              construct<OpenMPDeclarativeConstruct>(                                  Parser<OpenMPGroupprivate>{}) ||                              construct<OpenMPDeclarativeConstruct>( @@ -2192,6 +2204,8 @@ TYPE_CONTEXT_PARSER("OpenMP construct"_en_US,          withMessage("expected OpenMP construct"_err_en_US,              first(construct<OpenMPConstruct>(Parser<OpenMPSectionsConstruct>{}),                  construct<OpenMPConstruct>(Parser<OpenMPLoopConstruct>{}), +                construct<OpenMPConstruct>( +                    sourced(OmpExecutableAllocateParser{})),                  construct<OpenMPConstruct>(Parser<OmpBlockConstruct>{}),                  // OmpBlockConstruct is attempted before                  // OpenMPStandaloneConstruct to resolve !$OMP ORDERED @@ -2199,9 +2213,7 @@ TYPE_CONTEXT_PARSER("OpenMP construct"_en_US,                  construct<OpenMPConstruct>(Parser<OpenMPAtomicConstruct>{}),                  construct<OpenMPConstruct>(Parser<OpenMPUtilityConstruct>{}),                  construct<OpenMPConstruct>(Parser<OpenMPDispatchConstruct>{}), -                construct<OpenMPConstruct>(Parser<OpenMPExecutableAllocate>{}),                  construct<OpenMPConstruct>(Parser<OpenMPAllocatorsConstruct>{}), -                construct<OpenMPConstruct>(Parser<OpenMPDeclarativeAllocate>{}),                  construct<OpenMPConstruct>(Parser<OpenMPAssumeConstruct>{}),                  construct<OpenMPConstruct>(Parser<OpenMPCriticalConstruct>{})))) diff --git a/flang/lib/Parser/openmp-utils.cpp b/flang/lib/Parser/openmp-utils.cpp index 95ad3f6..b9d3763c 100644 --- a/flang/lib/Parser/openmp-utils.cpp +++ b/flang/lib/Parser/openmp-utils.cpp @@ -22,6 +22,25 @@  namespace Fortran::parser::omp { +const OpenMPDeclarativeConstruct *GetOmp(const DeclarationConstruct &x) { +  if (auto *y = std::get_if<SpecificationConstruct>(&x.u)) { +    if (auto *z{std::get_if<common::Indirection<OpenMPDeclarativeConstruct>>( +            &y->u)}) { +      return &z->value(); +    } +  } +  return nullptr; +} + +const OpenMPConstruct *GetOmp(const ExecutionPartConstruct &x) { +  if (auto *y{std::get_if<ExecutableConstruct>(&x.u)}) { +    if (auto *z{std::get_if<common::Indirection<OpenMPConstruct>>(&y->u)}) { +      return &z->value(); +    } +  } +  return nullptr; +} +  const OmpObjectList *GetOmpObjectList(const OmpClause &clause) {    // Clauses with OmpObjectList as its data member    using MemberObjectListClauses = std::tuple<OmpClause::Copyin, @@ -86,4 +105,24 @@ const OmpInitializerExpression *GetInitializerExpr(const OmpClause &init) {    return nullptr;  } +static void SplitOmpAllocateHelper( +    OmpAllocateInfo &n, const OmpAllocateDirective &x) { +  n.dirs.push_back(&x); +  const Block &body{std::get<Block>(x.t)}; +  if (!body.empty()) { +    if (auto *omp{GetOmp(body.front())}) { +      if (auto *ad{std::get_if<OmpAllocateDirective>(&omp->u)}) { +        return SplitOmpAllocateHelper(n, *ad); +      } +    } +    n.body = &body.front(); +  } +} + +OmpAllocateInfo SplitOmpAllocate(const OmpAllocateDirective &x) { +  OmpAllocateInfo info; +  SplitOmpAllocateHelper(info, x); +  return info; +} +  } // namespace Fortran::parser::omp diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp index 9b38cfc..8412303 100644 --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -2482,32 +2482,8 @@ public:      Unparse(static_cast<const OmpBlockConstruct &>(x));    } -  void Unparse(const OpenMPExecutableAllocate &x) { -    const auto &fields = -        std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>( -            x.t); -    if (fields) { -      for (const auto &decl : *fields) { -        Walk(decl); -      } -    } -    BeginOpenMP(); -    Word("!$OMP ALLOCATE"); -    Walk(" (", std::get<std::optional<OmpObjectList>>(x.t), ")"); -    Walk(std::get<OmpClauseList>(x.t)); -    Put("\n"); -    EndOpenMP(); -    Walk(std::get<Statement<AllocateStmt>>(x.t)); -  } -  void Unparse(const OpenMPDeclarativeAllocate &x) { -    BeginOpenMP(); -    Word("!$OMP ALLOCATE"); -    Put(" ("); -    Walk(std::get<OmpObjectList>(x.t)); -    Put(")"); -    Walk(std::get<OmpClauseList>(x.t)); -    Put("\n"); -    EndOpenMP(); +  void Unparse(const OmpAllocateDirective &x) { +    Unparse(static_cast<const OmpBlockConstruct &>(x));    }    void Unparse(const OpenMPAllocatorsConstruct &x) {      Unparse(static_cast<const OmpBlockConstruct &>(x)); diff --git a/flang/lib/Semantics/canonicalize-omp.cpp b/flang/lib/Semantics/canonicalize-omp.cpp index c884658..a11c525 100644 --- a/flang/lib/Semantics/canonicalize-omp.cpp +++ b/flang/lib/Semantics/canonicalize-omp.cpp @@ -51,8 +51,6 @@ public:      } // Block list    } -  void Post(parser::ExecutionPart &body) { RewriteOmpAllocations(body); } -    // Pre-visit all constructs that have both a specification part and    // an execution part, and store the connection between the two.    bool Pre(parser::BlockConstruct &x) { @@ -88,6 +86,7 @@ public:    void Post(parser::SpecificationPart &spec) {      CanonicalizeUtilityConstructs(spec); +    CanonicalizeAllocateDirectives(spec);    }    void Post(parser::OmpMapClause &map) { CanonicalizeMapModifiers(map); } @@ -239,33 +238,138 @@ private:      }    } -  void RewriteOmpAllocations(parser::ExecutionPart &body) { -    // Rewrite leading declarative allocations so they are nested -    // within their respective executable allocate directive -    // -    // Original: -    //   ExecutionPartConstruct -> OpenMPDeclarativeAllocate -    //   ExecutionPartConstruct -> OpenMPDeclarativeAllocate -    //   ExecutionPartConstruct -> OpenMPExecutableAllocate -    // -    // After rewriting: -    //   ExecutionPartConstruct -> OpenMPExecutableAllocate -    //     ExecutionPartConstruct -> OpenMPDeclarativeAllocate -    //     ExecutionPartConstruct -> OpenMPDeclarativeAllocate -    for (auto it = body.v.rbegin(); it != body.v.rend();) { -      if (auto *exec = GetOmpIf<parser::OpenMPExecutableAllocate>(*(it++))) { -        parser::OpenMPDeclarativeAllocate *decl; -        std::list<parser::OpenMPDeclarativeAllocate> subAllocates; -        while (it != body.v.rend() && -            (decl = GetOmpIf<parser::OpenMPDeclarativeAllocate>(*it))) { -          subAllocates.push_front(std::move(*decl)); -          it = decltype(it)(body.v.erase(std::next(it).base())); +  // Canonicalization of allocate directives +  // +  // In OpenMP 5.0 and 5.1 the allocate directive could either be a declarative +  // one or an executable one. As usual in such cases, this poses a problem +  // when the directive appears at the boundary between the specification part +  // and the execution part. +  // The executable form can actually consist of several adjacent directives, +  // whereas the declarative form is always standalone. Additionally, the +  // executable form must be associated with an allocate statement. +  // +  // The parser tries to parse declarative statements first, so in the +  // following case, the two directives will be declarative, even though +  // they should be treated as a single executable form: +  //   integer, allocatable :: x, y   ! Specification +  //   !$omp allocate(x) +  //   !$omp allocate(y) +  //   allocate(x, y)                 ! Execution +  // +  void CanonicalizeAllocateDirectives(parser::SpecificationPart &spec) { +    auto found = blockForSpec_.find(&spec); +    if (found == blockForSpec_.end()) { +      // There is no corresponding execution part, so there is nothing to do. +      return; +    } +    parser::Block &block = *found->second; + +    auto isAllocateStmt = [](const parser::ExecutionPartConstruct &epc) { +      if (auto *ec = std::get_if<parser::ExecutableConstruct>(&epc.u)) { +        if (auto *as = +                std::get_if<parser::Statement<parser::ActionStmt>>(&ec->u)) { +          return std::holds_alternative< +              common::Indirection<parser::AllocateStmt>>(as->statement.u); +        } +      } +      return false; +    }; + +    if (!block.empty() && isAllocateStmt(block.front())) { +      // There are two places where an OpenMP declarative construct can +      // show up in the tuple in specification part: +      // (1) in std::list<OpenMPDeclarativeConstruct>, or +      // (2) in std::list<DeclarationConstruct>. +      // The case (1) is only possible if the list (2) is empty. + +      auto &omps = +          std::get<std::list<parser::OpenMPDeclarativeConstruct>>(spec.t); +      auto &decls = std::get<std::list<parser::DeclarationConstruct>>(spec.t); + +      if (!decls.empty()) { +        MakeExecutableAllocateFromDecls(decls, block); +      } else { +        MakeExecutableAllocateFromOmps(omps, block); +      } +    } +  } + +  parser::ExecutionPartConstruct EmbedInExec( +      parser::OmpAllocateDirective *alo, parser::ExecutionPartConstruct &&epc) { +    // Nest current epc inside the allocate directive. +    std::get<parser::Block>(alo->t).push_front(std::move(epc)); +    // Set the new epc to be the ExecutionPartConstruct made from +    // the allocate directive. +    parser::OpenMPConstruct opc(std::move(*alo)); +    common::Indirection<parser::OpenMPConstruct> ind(std::move(opc)); +    parser::ExecutableConstruct ec(std::move(ind)); +    return parser::ExecutionPartConstruct(std::move(ec)); +  } + +  void MakeExecutableAllocateFromDecls( +      std::list<parser::DeclarationConstruct> &decls, parser::Block &body) { +    using OpenMPDeclarativeConstruct = +        common::Indirection<parser::OpenMPDeclarativeConstruct>; + +    auto getAllocate = [](parser::DeclarationConstruct *dc) { +      if (auto *sc = std::get_if<parser::SpecificationConstruct>(&dc->u)) { +        if (auto *odc = std::get_if<OpenMPDeclarativeConstruct>(&sc->u)) { +          if (auto *alo = +                  std::get_if<parser::OmpAllocateDirective>(&odc->value().u)) { +            return alo; +          } +        } +      } +      return static_cast<parser::OmpAllocateDirective *>(nullptr); +    }; + +    std::list<parser::DeclarationConstruct>::reverse_iterator rlast = [&]() { +      for (auto rit = decls.rbegin(), rend = decls.rend(); rit != rend; ++rit) { +        if (getAllocate(&*rit) == nullptr) { +          return rit;          } -        if (!subAllocates.empty()) { -          std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>( -              exec->t) = {std::move(subAllocates)}; +      } +      return decls.rend(); +    }(); + +    if (rlast != decls.rbegin()) { +      // We have already checked that the first statement in body is +      // ALLOCATE. +      parser::ExecutionPartConstruct epc(std::move(body.front())); +      for (auto rit = decls.rbegin(); rit != rlast; ++rit) { +        epc = EmbedInExec(getAllocate(&*rit), std::move(epc)); +      } + +      body.pop_front(); +      body.push_front(std::move(epc)); +      decls.erase(rlast.base(), decls.end()); +    } +  } + +  void MakeExecutableAllocateFromOmps( +      std::list<parser::OpenMPDeclarativeConstruct> &omps, +      parser::Block &body) { +    using OpenMPDeclarativeConstruct = parser::OpenMPDeclarativeConstruct; + +    std::list<OpenMPDeclarativeConstruct>::reverse_iterator rlast = [&]() { +      for (auto rit = omps.rbegin(), rend = omps.rend(); rit != rend; ++rit) { +        if (!std::holds_alternative<parser::OmpAllocateDirective>(rit->u)) { +          return rit;          }        } +      return omps.rend(); +    }(); + +    if (rlast != omps.rbegin()) { +      parser::ExecutionPartConstruct epc(std::move(body.front())); +      for (auto rit = omps.rbegin(); rit != rlast; ++rit) { +        epc = EmbedInExec( +            &std::get<parser::OmpAllocateDirective>(rit->u), std::move(epc)); +      } + +      body.pop_front(); +      body.push_front(std::move(epc)); +      omps.erase(rlast.base(), omps.end());      }    } diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index aaaf1ec..d7db15d 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -179,29 +179,21 @@ void OmpStructureChecker::Leave(const parser::BlockConstruct &x) {    }  } -// Use when clause falls under 'struct OmpClause' in 'parse-tree.h'. -#define CHECK_SIMPLE_CLAUSE(X, Y) \ -  void OmpStructureChecker::Enter(const parser::OmpClause::X &) { \ -    CheckAllowedClause(llvm::omp::Clause::Y); \ -  } +void OmpStructureChecker::Enter(const parser::SpecificationPart &) { +  partStack_.push_back(PartKind::SpecificationPart); +} -#define CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(X, Y) \ -  void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \ -    CheckAllowedClause(llvm::omp::Clause::Y); \ -    RequiresConstantPositiveParameter(llvm::omp::Clause::Y, c.v); \ -  } +void OmpStructureChecker::Leave(const parser::SpecificationPart &) { +  partStack_.pop_back(); +} -#define CHECK_REQ_SCALAR_INT_CLAUSE(X, Y) \ -  void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \ -    CheckAllowedClause(llvm::omp::Clause::Y); \ -    RequiresPositiveParameter(llvm::omp::Clause::Y, c.v); \ -  } +void OmpStructureChecker::Enter(const parser::ExecutionPart &) { +  partStack_.push_back(PartKind::ExecutionPart); +} -// Use when clause don't falls under 'struct OmpClause' in 'parse-tree.h'. -#define CHECK_SIMPLE_PARSER_CLAUSE(X, Y) \ -  void OmpStructureChecker::Enter(const parser::X &) { \ -    CheckAllowedClause(llvm::omp::Y); \ -  } +void OmpStructureChecker::Leave(const parser::ExecutionPart &) { +  partStack_.pop_back(); +}  // 'OmpWorkshareBlockChecker' is used to check the validity of the assignment  // statements and the expressions enclosed in an OpenMP Workshare construct @@ -667,49 +659,6 @@ void OmpStructureChecker::HasInvalidTeamsNesting(    }  } -void OmpStructureChecker::CheckPredefinedAllocatorRestriction( -    const parser::CharBlock &source, const parser::Name &name) { -  if (const auto *symbol{name.symbol}) { -    const auto *commonBlock{FindCommonBlockContaining(*symbol)}; -    const auto &scope{context_.FindScope(symbol->name())}; -    const Scope &containingScope{GetProgramUnitContaining(scope)}; -    if (!isPredefinedAllocator && -        (IsSaved(*symbol) || commonBlock || -            containingScope.kind() == Scope::Kind::Module)) { -      context_.Say(source, -          "If list items within the %s directive have the " -          "SAVE attribute, are a common block name, or are " -          "declared in the scope of a module, then only " -          "predefined memory allocator parameters can be used " -          "in the allocator clause"_err_en_US, -          ContextDirectiveAsFortran()); -    } -  } -} - -void OmpStructureChecker::CheckPredefinedAllocatorRestriction( -    const parser::CharBlock &source, -    const parser::OmpObjectList &ompObjectList) { -  for (const auto &ompObject : ompObjectList.v) { -    common::visit( -        common::visitors{ -            [&](const parser::Designator &designator) { -              if (const auto *dataRef{ -                      std::get_if<parser::DataRef>(&designator.u)}) { -                if (const auto *name{std::get_if<parser::Name>(&dataRef->u)}) { -                  CheckPredefinedAllocatorRestriction(source, *name); -                } -              } -            }, -            [&](const parser::Name &name) { -              CheckPredefinedAllocatorRestriction(source, name); -            }, -            [&](const parser::OmpObject::Invalid &invalid) {}, -        }, -        ompObject.u); -  } -} -  void OmpStructureChecker::Enter(const parser::OmpClause::Hint &x) {    CheckAllowedClause(llvm::omp::Clause::OMPC_hint);    auto &dirCtx{GetContext()}; @@ -763,18 +712,10 @@ template <typename Checker> struct DirectiveSpellingVisitor {      return std::get<parser::OmpBeginDirective>(t).DirName();    } -  bool Pre(const parser::OpenMPDeclarativeAllocate &x) { -    checker_(std::get<parser::Verbatim>(x.t).source, Directive::OMPD_allocate); -    return false; -  }    bool Pre(const parser::OpenMPDispatchConstruct &x) {      checker_(GetDirName(x.t).source, Directive::OMPD_dispatch);      return false;    } -  bool Pre(const parser::OpenMPExecutableAllocate &x) { -    checker_(std::get<parser::Verbatim>(x.t).source, Directive::OMPD_allocate); -    return false; -  }    bool Pre(const parser::OpenMPAllocatorsConstruct &x) {      checker_(GetDirName(x.t).source, Directive::OMPD_allocators);      return false; @@ -1710,12 +1651,39 @@ void OmpStructureChecker::Leave(const parser::OpenMPRequiresConstruct &) {    dirContext_.pop_back();  } -void OmpStructureChecker::CheckAllocateDirective(parser::CharBlock source, -    const parser::OmpObjectList &objects, -    const parser::OmpClauseList &clauses) { -  const Scope &thisScope{context_.FindScope(source)}; -  SymbolSourceMap symbols; -  GetSymbolsInObjectList(objects, symbols); +static std::pair<const parser::AllocateStmt *, parser::CharBlock> +getAllocateStmtAndSource(const parser::ExecutionPartConstruct *epc) { +  if (SourcedActionStmt as{GetActionStmt(epc)}) { +    using IndirectionAllocateStmt = common::Indirection<parser::AllocateStmt>; +    if (auto *indirect{std::get_if<IndirectionAllocateStmt>(&as.stmt->u)}) { +      return {&indirect->value(), as.source}; +    } +  } +  return {nullptr, ""}; +} + +// Collect symbols that correspond to non-component objects on the +// ALLOCATE statement. +static UnorderedSymbolSet GetNonComponentSymbols( +    const parser::AllocateStmt &stmt) { +  UnorderedSymbolSet symbols; +  for (auto &alloc : std::get<std::list<parser::Allocation>>(stmt.t)) { +    auto &object{std::get<parser::AllocateObject>(alloc.t)}; +    if (auto *name{std::get_if<parser::Name>(&object.u)}) { +      if (name->symbol) { +        symbols.insert(name->symbol->GetUltimate()); +      } +    } +  } +  return symbols; +} + +void OmpStructureChecker::CheckIndividualAllocateDirective( +    const parser::OmpAllocateDirective &x, bool isExecutable) { +  const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()}; +  const parser::OmpDirectiveName &dirName{beginSpec.DirName()}; + +  const Scope &thisScope{context_.FindScope(dirName.source)};    auto maybeHasPredefinedAllocator{[&](const parser::OmpClause *calloc) {      // Return "true" if the ALLOCATOR clause was provided with an argument @@ -1741,73 +1709,200 @@ void OmpStructureChecker::CheckAllocateDirective(parser::CharBlock source,      return true;    }}; -  const auto *allocator{FindClause(llvm::omp::Clause::OMPC_allocator)}; +  const auto *allocator{[&]() { +    // Can't use FindClause in Enter (because clauses haven't been visited +    // yet). +    for (const parser::OmpClause &c : beginSpec.Clauses().v) { +      if (c.Id() == llvm::omp::Clause::OMPC_allocator) { +        return &c; +      } +    } +    return static_cast<const parser::OmpClause *>(nullptr); +  }()}; +    if (InTargetRegion()) {      bool hasDynAllocators{          HasRequires(llvm::omp::Clause::OMPC_dynamic_allocators)};      if (!allocator && !hasDynAllocators) { -      context_.Say(source, +      context_.Say(dirName.source,            "An ALLOCATE directive in a TARGET region must specify an ALLOCATOR clause or REQUIRES(DYNAMIC_ALLOCATORS) must be specified"_err_en_US);      }    }    auto maybePredefined{maybeHasPredefinedAllocator(allocator)}; -  for (auto &[symbol, source] : symbols) { -    if (!inExecutableAllocate_) { -      if (symbol->owner() != thisScope) { +  unsigned version{context_.langOptions().OpenMPVersion}; +  std::string condStr{version == 50 +          ? "a named common block, has SAVE attribute or is declared in the " +            "scope of a module" +          : "a named common block or has SAVE attribute"}; + +  auto checkSymbol{[&](const Symbol &symbol, parser::CharBlock source) { +    if (!isExecutable) { +      // For structure members, the scope is the derived type, which is +      // never "this" scope. Ignore this check for members, they will be +      // flagged anyway. +      if (symbol.owner() != thisScope && !IsStructureComponent(symbol)) {          context_.Say(source,              "A list item on a declarative ALLOCATE must be declared in the same scope in which the directive appears"_err_en_US);        } -      if (IsPointer(*symbol) || IsAllocatable(*symbol)) { +      if (IsPointer(symbol) || IsAllocatable(symbol)) {          context_.Say(source,              "A list item in a declarative ALLOCATE cannot have the ALLOCATABLE or POINTER attribute"_err_en_US);        }      } -    if (symbol->GetUltimate().has<AssocEntityDetails>()) { +    if (symbol.GetUltimate().has<AssocEntityDetails>()) {        context_.Say(source,            "A list item in a declarative ALLOCATE cannot be an associate name"_err_en_US);      } -    if (symbol->attrs().test(Attr::SAVE) || IsCommonBlock(*symbol)) { +    bool inModule{ +        version == 50 && symbol.owner().kind() == Scope::Kind::Module}; +    if (symbol.attrs().test(Attr::SAVE) || IsCommonBlock(symbol) || inModule) {        if (!allocator) {          context_.Say(source, -            "If a list item is a named common block or has SAVE attribute, an ALLOCATOR clause must be present with a predefined allocator"_err_en_US); +            "If a list item is %s, an ALLOCATOR clause must be present with a predefined allocator"_err_en_US, +            condStr);        } else if (!maybePredefined) {          context_.Say(source, -            "If a list item is a named common block or has SAVE attribute, only a predefined allocator may be used on the ALLOCATOR clause"_err_en_US); +            "If a list item is %s, only a predefined allocator may be used on the ALLOCATOR clause"_err_en_US, +            condStr);        }      } -    if (FindCommonBlockContaining(*symbol)) { +    if (FindCommonBlockContaining(symbol)) {        context_.Say(source,            "A variable that is part of a common block may not be specified as a list item in an ALLOCATE directive, except implicitly via the named common block"_err_en_US);      } +  }}; + +  for (const parser::OmpArgument &arg : beginSpec.Arguments().v) { +    const parser::OmpObject *object{GetArgumentObject(arg)}; +    if (!object) { +      context_.Say(arg.source, +          "An argument to ALLOCATE directive must be a variable list item"_err_en_US); +      continue; +    } + +    if (const Symbol *symbol{GetObjectSymbol(*object)}) { +      if (!IsTypeParamInquiry(*symbol)) { +        checkSymbol(*symbol, arg.source); +      } +      CheckVarIsNotPartOfAnotherVar(dirName.source, *object); +    }    } -  CheckVarIsNotPartOfAnotherVar(source, objects);  } -void OmpStructureChecker::Enter(const parser::OpenMPDeclarativeAllocate &x) { -  const auto &dir{std::get<parser::Verbatim>(x.t)}; -  PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_allocate); +void OmpStructureChecker::CheckExecutableAllocateDirective( +    const parser::OmpAllocateDirective &x) { +  parser::omp::OmpAllocateInfo info{SplitOmpAllocate(x)}; + +  auto [allocStmt, allocSource]{getAllocateStmtAndSource(info.body)}; +  if (!allocStmt) { +    // This has been diagnosed already. +    return; +  } + +  UnorderedSymbolSet allocateSyms{GetNonComponentSymbols(*allocStmt)}; +  SymbolSourceMap directiveSyms; +  bool hasEmptyList{false}; + +  for (const parser::OmpAllocateDirective *ompAlloc : info.dirs) { +    const parser::OmpDirectiveSpecification &spec{DEREF(ompAlloc).BeginDir()}; +    if (spec.Arguments().v.empty()) { +      if (hasEmptyList && info.dirs.size() > 1) { +        context_.Say(spec.DirName().source, +            "If multiple directives are present in an executable ALLOCATE directive, at most one of them may specify no list items"_err_en_US); +      } +      hasEmptyList = true; +    } +    for (const parser::OmpArgument &arg : spec.Arguments().v) { +      if (auto *sym{GetArgumentSymbol(arg)}) { +        // Ignore these checks for structure members. They are not allowed +        // in the first place, so don't tell the users that they need to +        // be specified somewhere, +        if (IsStructureComponent(*sym)) { +          continue; +        } +        if (auto f{directiveSyms.find(sym)}; f != directiveSyms.end()) { +          parser::MessageFormattedText txt( +              "A list item on an executable ALLOCATE may only be specified once"_err_en_US); +          parser::Message message(arg.source, txt); +          message.Attach(f->second, "The list item was specified here"_en_US); +          context_.Say(std::move(message)); +        } else { +          directiveSyms.insert(std::make_pair(sym, arg.source)); +        } + +        if (auto f{allocateSyms.find(*sym)}; f == allocateSyms.end()) { +          context_ +              .Say(arg.source, +                  "A list item on an executable ALLOCATE must be specified on the associated ALLOCATE statement"_err_en_US) +              .Attach(allocSource, "The ALLOCATE statement"_en_US); +        } +      } +    } +  }  } -void OmpStructureChecker::Leave(const parser::OpenMPDeclarativeAllocate &x) { -  if (!inExecutableAllocate_) { -    const auto &dir{std::get<parser::Verbatim>(x.t)}; -    const auto &clauseList{std::get<parser::OmpClauseList>(x.t)}; -    const auto &objectList{std::get<parser::OmpObjectList>(x.t)}; +void OmpStructureChecker::Enter(const parser::OmpAllocateDirective &x) { +  const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()}; +  const parser::OmpDirectiveName &dirName{beginSpec.DirName()}; +  PushContextAndClauseSets(dirName.source, dirName.v); +  ++allocateDirectiveLevel; -    isPredefinedAllocator = true; -    CheckAllocateDirective(dir.source, objectList, clauseList); +  bool isExecutable{partStack_.back() == PartKind::ExecutionPart}; + +  unsigned version{context_.langOptions().OpenMPVersion}; +  if (isExecutable && allocateDirectiveLevel == 1 && version >= 52) { +    context_.Warn(common::UsageWarning::OpenMPUsage, dirName.source, +        "The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead"_warn_en_US);    } + +  CheckIndividualAllocateDirective(x, isExecutable); + +  if (isExecutable) { +    auto isOmpAllocate{[](const parser::ExecutionPartConstruct &epc) { +      if (auto *omp{GetOmp(epc)}) { +        auto odn{GetOmpDirectiveName(*omp)}; +        return odn.v == llvm::omp::Directive::OMPD_allocate; +      } +      return false; +    }}; + +    auto &body{std::get<parser::Block>(x.t)}; +    // The parser should put at most one statement in the body. +    assert(body.size() <= 1 && "Multiple statements in allocate"); +    if (body.empty()) { +      context_.Say(dirName.source, +          "An executable ALLOCATE directive must be associated with an ALLOCATE statement"_err_en_US); +    } else { +      const parser::ExecutionPartConstruct &first{body.front()}; +      auto [allocStmt, _]{getAllocateStmtAndSource(&body.front())}; +      if (!isOmpAllocate(first) && !allocStmt) { +        parser::CharBlock source{[&]() { +          if (auto &&maybeSource{parser::GetSource(first)}) { +            return *maybeSource; +          } +          return dirName.source; +        }()}; +        context_.Say(source, +            "The statement associated with executable ALLOCATE directive must be an ALLOCATE statement"_err_en_US); +      } +    } +  } +} + +void OmpStructureChecker::Leave(const parser::OmpAllocateDirective &x) { +  bool isExecutable{partStack_.back() == PartKind::ExecutionPart}; +  if (isExecutable && allocateDirectiveLevel == 1) { +    CheckExecutableAllocateDirective(x); +  } + +  --allocateDirectiveLevel;    dirContext_.pop_back();  }  void OmpStructureChecker::Enter(const parser::OmpClause::Allocator &x) {    CheckAllowedClause(llvm::omp::Clause::OMPC_allocator); -  // Note: Predefined allocators are stored in ScalarExpr as numbers -  //   whereas custom allocators are stored as strings, so if the ScalarExpr -  //   actually has an int value, then it must be a predefined allocator -  isPredefinedAllocator = GetIntValue(x.v).has_value();    RequiresPositiveParameter(llvm::omp::Clause::OMPC_allocator, x.v);  } @@ -1823,16 +1918,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Allocate &x) {              "The alignment value should be a constant positive integer"_err_en_US);        }      } -    // The simple and complex modifiers have the same structure. They only -    // differ in their syntax. -    if (auto *alloc{OmpGetUniqueModifier<parser::OmpAllocatorComplexModifier>( -            modifiers)}) { -      isPredefinedAllocator = GetIntValue(alloc->v).has_value(); -    } -    if (auto *alloc{OmpGetUniqueModifier<parser::OmpAllocatorSimpleModifier>( -            modifiers)}) { -      isPredefinedAllocator = GetIntValue(alloc->v).has_value(); -    }    }  } @@ -2115,168 +2200,88 @@ void OmpStructureChecker::Enter(const parser::OmpClause::At &x) {    }  } -// Goes through the names in an OmpObjectList and checks if each name appears -// in the given allocate statement -void OmpStructureChecker::CheckAllNamesInAllocateStmt( -    const parser::CharBlock &source, const parser::OmpObjectList &ompObjectList, -    const parser::AllocateStmt &allocate) { -  for (const auto &obj : ompObjectList.v) { -    if (const auto *d{std::get_if<parser::Designator>(&obj.u)}) { -      if (const auto *ref{std::get_if<parser::DataRef>(&d->u)}) { -        if (const auto *n{std::get_if<parser::Name>(&ref->u)}) { -          CheckNameInAllocateStmt(source, *n, allocate); -        } -      } -    } -  } -} - -void OmpStructureChecker::CheckNameInAllocateStmt( -    const parser::CharBlock &source, const parser::Name &name, -    const parser::AllocateStmt &allocate) { -  for (const auto &allocation : -      std::get<std::list<parser::Allocation>>(allocate.t)) { -    const auto &allocObj = std::get<parser::AllocateObject>(allocation.t); -    if (const auto *n{std::get_if<parser::Name>(&allocObj.u)}) { -      if (n->source == name.source) { -        return; -      } -    } -  } -  unsigned version{context_.langOptions().OpenMPVersion}; -  context_.Say(source, -      "Object '%s' in %s directive not " -      "found in corresponding ALLOCATE statement"_err_en_US, -      name.ToString(), -      parser::ToUpperCaseLetters( -          llvm::omp::getOpenMPDirectiveName(GetContext().directive, version) -              .str())); -} - -void OmpStructureChecker::Enter(const parser::OpenMPExecutableAllocate &x) { -  inExecutableAllocate_ = true; -  const auto &dir{std::get<parser::Verbatim>(x.t)}; -  PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_allocate); - -  unsigned version{context_.langOptions().OpenMPVersion}; -  if (version >= 52) { -    context_.Warn(common::UsageWarning::OpenMPUsage, x.source, -        "The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead"_warn_en_US); -  } - -  const auto &allocateStmt = -      std::get<parser::Statement<parser::AllocateStmt>>(x.t).statement; -  if (const auto &list{std::get<std::optional<parser::OmpObjectList>>(x.t)}) { -    CheckAllNamesInAllocateStmt( -        std::get<parser::Verbatim>(x.t).source, *list, allocateStmt); -  } -  if (const auto &subDirs{ -          std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>( -              x.t)}) { -    for (const auto &dalloc : *subDirs) { -      CheckAllNamesInAllocateStmt(std::get<parser::Verbatim>(dalloc.t).source, -          std::get<parser::OmpObjectList>(dalloc.t), allocateStmt); -    } -  } - -  isPredefinedAllocator = true; -} +void OmpStructureChecker::Enter(const parser::OpenMPAllocatorsConstruct &x) { +  const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()}; +  const parser::OmpDirectiveName &dirName{beginSpec.DirName()}; +  PushContextAndClauseSets( +      dirName.source, llvm::omp::Directive::OMPD_allocators); -void OmpStructureChecker::Leave(const parser::OpenMPExecutableAllocate &x) { -  parser::OmpObjectList empty{std::list<parser::OmpObject>{}}; -  auto &objects{[&]() -> const parser::OmpObjectList & { -    if (auto &objects{std::get<std::optional<parser::OmpObjectList>>(x.t)}) { -      return *objects; -    } else { -      return empty; +  for (const auto &clause : beginSpec.Clauses().v) { +    auto *alloc{std::get_if<parser::OmpClause::Allocate>(&clause.u)}; +    if (!alloc) { +      continue;      } -  }()}; -  auto &clauses{std::get<parser::OmpClauseList>(x.t)}; -  CheckAllocateDirective( -      std::get<parser::Verbatim>(x.t).source, objects, clauses); - -  if (const auto &subDirs{ -          std::get<std::optional<std::list<parser::OpenMPDeclarativeAllocate>>>( -              x.t)}) { -    for (const auto &dalloc : *subDirs) { -      const auto &dir{std::get<parser::Verbatim>(x.t)}; -      const auto &clauses{std::get<parser::OmpClauseList>(dalloc.t)}; -      const auto &objects{std::get<parser::OmpObjectList>(dalloc.t)}; -      CheckAllocateDirective(dir.source, objects, clauses); +    using OmpAllocatorSimpleModifier = parser::OmpAllocatorSimpleModifier; +    using OmpAllocatorComplexModifier = parser::OmpAllocatorComplexModifier; + +    if (InTargetRegion()) { +      auto &modifiers{OmpGetModifiers(alloc->v)}; +      bool hasAllocator{ +          OmpGetUniqueModifier<OmpAllocatorSimpleModifier>(modifiers) || +          OmpGetUniqueModifier<OmpAllocatorComplexModifier>(modifiers)}; +      bool hasDynAllocators{ +          HasRequires(llvm::omp::Clause::OMPC_dynamic_allocators)}; +      if (!hasAllocator && !hasDynAllocators) { +        context_.Say(clause.source, +            "An ALLOCATE clause in a TARGET region must specify an allocator or REQUIRES(DYNAMIC_ALLOCATORS) must be specified"_err_en_US); +      }      }    } -  dirContext_.pop_back(); -  inExecutableAllocate_ = false; -} - -void OmpStructureChecker::Enter(const parser::OpenMPAllocatorsConstruct &x) { -  isPredefinedAllocator = true; - -  const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()}; -  auto &block{std::get<parser::Block>(x.t)}; -  PushContextAndClauseSets( -      dirSpec.DirName().source, llvm::omp::Directive::OMPD_allocators); - -  if (block.empty()) { -    context_.Say(dirSpec.source, -        "The ALLOCATORS construct should contain a single ALLOCATE statement"_err_en_US); +  auto &body{std::get<parser::Block>(x.t)}; +  // The parser should put at most one statement in the body. +  assert(body.size() <= 1 && "Malformed body in allocators"); +  if (body.empty()) { +    context_.Say(dirName.source, +        "The body of an ALLOCATORS construct should be an ALLOCATE statement"_err_en_US);      return;    } -  omp::SourcedActionStmt action{omp::GetActionStmt(block)}; -  const auto *allocate{ -      action ? parser::Unwrap<parser::AllocateStmt>(action.stmt) : nullptr}; - -  if (allocate) { -    for (const auto &clause : dirSpec.Clauses().v) { -      if (auto *alloc{std::get_if<parser::OmpClause::Allocate>(&clause.u)}) { -        CheckAllNamesInAllocateStmt( -            x.source, std::get<parser::OmpObjectList>(alloc->v.t), *allocate); - -        using OmpAllocatorSimpleModifier = parser::OmpAllocatorSimpleModifier; -        using OmpAllocatorComplexModifier = parser::OmpAllocatorComplexModifier; - -        auto &modifiers{OmpGetModifiers(alloc->v)}; -        bool hasAllocator{ -            OmpGetUniqueModifier<OmpAllocatorSimpleModifier>(modifiers) || -            OmpGetUniqueModifier<OmpAllocatorComplexModifier>(modifiers)}; - -        // TODO: As with allocate directive, exclude the case when a requires -        //       directive with the dynamic_allocators clause is present in -        //       the same compilation unit (OMP5.0 2.11.3). -        if (IsNestedInDirective(llvm::omp::Directive::OMPD_target) && -            !hasAllocator) { -          context_.Say(x.source, -              "ALLOCATORS directives that appear in a TARGET region must specify an allocator"_err_en_US); -        } +  auto [allocStmt, allocSource]{getAllocateStmtAndSource(&body.front())}; +  if (!allocStmt) { +    parser::CharBlock source{[&]() { +      if (auto &&maybeSource{parser::GetSource(body.front())}) { +        return *maybeSource;        } -    } -  } else { -    const parser::CharBlock &source = action ? action.source : x.source; +      return dirName.source; +    }()};      context_.Say(source, -        "The body of the ALLOCATORS construct should be an ALLOCATE statement"_err_en_US); +        "The body of an ALLOCATORS construct should be an ALLOCATE statement"_err_en_US); +    return;    } -  for (const auto &clause : dirSpec.Clauses().v) { -    if (const auto *allocClause{ -            parser::Unwrap<parser::OmpClause::Allocate>(clause)}) { -      CheckVarIsNotPartOfAnotherVar( -          dirSpec.source, std::get<parser::OmpObjectList>(allocClause->v.t)); +  UnorderedSymbolSet allocateSyms{GetNonComponentSymbols(*allocStmt)}; +  for (const auto &clause : beginSpec.Clauses().v) { +    auto *alloc{std::get_if<parser::OmpClause::Allocate>(&clause.u)}; +    if (!alloc) { +      continue; +    } +    for (auto &object : DEREF(GetOmpObjectList(clause)).v) { +      CheckVarIsNotPartOfAnotherVar(dirName.source, object); +      if (auto *symbol{GetObjectSymbol(object)}) { +        if (IsStructureComponent(*symbol)) { +          continue; +        } +        parser::CharBlock source{[&]() { +          if (auto &&objectSource{GetObjectSource(object)}) { +            return *objectSource; +          } +          return clause.source; +        }()}; +        if (!IsTypeParamInquiry(*symbol)) { +          if (auto f{allocateSyms.find(*symbol)}; f == allocateSyms.end()) { +            context_ +                .Say(source, +                    "A list item in an ALLOCATORS construct must be specified on the associated ALLOCATE statement"_err_en_US) +                .Attach(allocSource, "The ALLOCATE statement"_en_US); +          } +        } +      }      }    }  }  void OmpStructureChecker::Leave(const parser::OpenMPAllocatorsConstruct &x) { -  const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()}; - -  for (const auto &clause : dirSpec.Clauses().v) { -    if (const auto *allocClause{ -            std::get_if<parser::OmpClause::Allocate>(&clause.u)}) { -      CheckPredefinedAllocatorRestriction( -          dirSpec.source, std::get<parser::OmpObjectList>(allocClause->v.t)); -    } -  }    dirContext_.pop_back();  } @@ -3362,88 +3367,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Sizes &c) {          /*paramName=*/"parameter", /*allowZero=*/false);  } -// Following clauses do not have a separate node in parse-tree.h. -CHECK_SIMPLE_CLAUSE(Absent, OMPC_absent) -CHECK_SIMPLE_CLAUSE(Affinity, OMPC_affinity) -CHECK_SIMPLE_CLAUSE(Capture, OMPC_capture) -CHECK_SIMPLE_CLAUSE(Contains, OMPC_contains) -CHECK_SIMPLE_CLAUSE(Default, OMPC_default) -CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj) -CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type) -CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule) -CHECK_SIMPLE_CLAUSE(DynGroupprivate, OMPC_dyn_groupprivate) -CHECK_SIMPLE_CLAUSE(Exclusive, OMPC_exclusive) -CHECK_SIMPLE_CLAUSE(Final, OMPC_final) -CHECK_SIMPLE_CLAUSE(Flush, OMPC_flush) -CHECK_SIMPLE_CLAUSE(Full, OMPC_full) -CHECK_SIMPLE_CLAUSE(Grainsize, OMPC_grainsize) -CHECK_SIMPLE_CLAUSE(GraphId, OMPC_graph_id) -CHECK_SIMPLE_CLAUSE(GraphReset, OMPC_graph_reset) -CHECK_SIMPLE_CLAUSE(Holds, OMPC_holds) -CHECK_SIMPLE_CLAUSE(Inclusive, OMPC_inclusive) -CHECK_SIMPLE_CLAUSE(Initializer, OMPC_initializer) -CHECK_SIMPLE_CLAUSE(Match, OMPC_match) -CHECK_SIMPLE_CLAUSE(Nontemporal, OMPC_nontemporal) -CHECK_SIMPLE_CLAUSE(NumTasks, OMPC_num_tasks) -CHECK_SIMPLE_CLAUSE(Order, OMPC_order) -CHECK_SIMPLE_CLAUSE(Read, OMPC_read) -CHECK_SIMPLE_CLAUSE(Threadprivate, OMPC_threadprivate) -CHECK_SIMPLE_CLAUSE(Groupprivate, OMPC_groupprivate) -CHECK_SIMPLE_CLAUSE(Threads, OMPC_threads) -CHECK_SIMPLE_CLAUSE(Threadset, OMPC_threadset) -CHECK_SIMPLE_CLAUSE(Inbranch, OMPC_inbranch) -CHECK_SIMPLE_CLAUSE(Link, OMPC_link) -CHECK_SIMPLE_CLAUSE(Indirect, OMPC_indirect) -CHECK_SIMPLE_CLAUSE(Mergeable, OMPC_mergeable) -CHECK_SIMPLE_CLAUSE(NoOpenmp, OMPC_no_openmp) -CHECK_SIMPLE_CLAUSE(NoOpenmpRoutines, OMPC_no_openmp_routines) -CHECK_SIMPLE_CLAUSE(NoOpenmpConstructs, OMPC_no_openmp_constructs) -CHECK_SIMPLE_CLAUSE(NoParallelism, OMPC_no_parallelism) -CHECK_SIMPLE_CLAUSE(Nogroup, OMPC_nogroup) -CHECK_SIMPLE_CLAUSE(Notinbranch, OMPC_notinbranch) -CHECK_SIMPLE_CLAUSE(Partial, OMPC_partial) -CHECK_SIMPLE_CLAUSE(ProcBind, OMPC_proc_bind) -CHECK_SIMPLE_CLAUSE(Simd, OMPC_simd) -CHECK_SIMPLE_CLAUSE(Permutation, OMPC_permutation) -CHECK_SIMPLE_CLAUSE(Uniform, OMPC_uniform) -CHECK_SIMPLE_CLAUSE(Unknown, OMPC_unknown) -CHECK_SIMPLE_CLAUSE(Untied, OMPC_untied) -CHECK_SIMPLE_CLAUSE(UsesAllocators, OMPC_uses_allocators) -CHECK_SIMPLE_CLAUSE(Write, OMPC_write) -CHECK_SIMPLE_CLAUSE(Init, OMPC_init) -CHECK_SIMPLE_CLAUSE(Use, OMPC_use) -CHECK_SIMPLE_CLAUSE(Novariants, OMPC_novariants) -CHECK_SIMPLE_CLAUSE(Nocontext, OMPC_nocontext) -CHECK_SIMPLE_CLAUSE(Severity, OMPC_severity) -CHECK_SIMPLE_CLAUSE(Message, OMPC_message) -CHECK_SIMPLE_CLAUSE(Filter, OMPC_filter) -CHECK_SIMPLE_CLAUSE(Otherwise, OMPC_otherwise) -CHECK_SIMPLE_CLAUSE(AdjustArgs, OMPC_adjust_args) -CHECK_SIMPLE_CLAUSE(AppendArgs, OMPC_append_args) -CHECK_SIMPLE_CLAUSE(MemoryOrder, OMPC_memory_order) -CHECK_SIMPLE_CLAUSE(Bind, OMPC_bind) -CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare) -CHECK_SIMPLE_CLAUSE(OmpxAttribute, OMPC_ompx_attribute) -CHECK_SIMPLE_CLAUSE(Weak, OMPC_weak) -CHECK_SIMPLE_CLAUSE(AcqRel, OMPC_acq_rel) -CHECK_SIMPLE_CLAUSE(Acquire, OMPC_acquire) -CHECK_SIMPLE_CLAUSE(Relaxed, OMPC_relaxed) -CHECK_SIMPLE_CLAUSE(Release, OMPC_release) -CHECK_SIMPLE_CLAUSE(Replayable, OMPC_replayable) -CHECK_SIMPLE_CLAUSE(Transparent, OMPC_transparent) -CHECK_SIMPLE_CLAUSE(SeqCst, OMPC_seq_cst) -CHECK_SIMPLE_CLAUSE(Fail, OMPC_fail) - -CHECK_REQ_SCALAR_INT_CLAUSE(NumTeams, OMPC_num_teams) -CHECK_REQ_SCALAR_INT_CLAUSE(NumThreads, OMPC_num_threads) -CHECK_REQ_SCALAR_INT_CLAUSE(OmpxDynCgroupMem, OMPC_ompx_dyn_cgroup_mem) -CHECK_REQ_SCALAR_INT_CLAUSE(Priority, OMPC_priority) -CHECK_REQ_SCALAR_INT_CLAUSE(ThreadLimit, OMPC_thread_limit) - -CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Collapse, OMPC_collapse) -CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Safelen, OMPC_safelen) -CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Simdlen, OMPC_simdlen) -  void OmpStructureChecker::Enter(const parser::OmpClause::Looprange &x) {    context_.Say(GetContext().clauseSource,        "LOOPRANGE clause is not implemented yet"_err_en_US, @@ -5516,4 +5439,104 @@ void OmpStructureChecker::CheckAllowedRequiresClause(llvmOmpClause clause) {    }  } +// Use when clause falls under 'struct OmpClause' in 'parse-tree.h'. +#define CHECK_SIMPLE_CLAUSE(X, Y) \ +  void OmpStructureChecker::Enter(const parser::OmpClause::X &) { \ +    CheckAllowedClause(llvm::omp::Clause::Y); \ +  } + +#define CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(X, Y) \ +  void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \ +    CheckAllowedClause(llvm::omp::Clause::Y); \ +    RequiresConstantPositiveParameter(llvm::omp::Clause::Y, c.v); \ +  } + +#define CHECK_REQ_SCALAR_INT_CLAUSE(X, Y) \ +  void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \ +    CheckAllowedClause(llvm::omp::Clause::Y); \ +    RequiresPositiveParameter(llvm::omp::Clause::Y, c.v); \ +  } + +// Following clauses do not have a separate node in parse-tree.h. +CHECK_SIMPLE_CLAUSE(Absent, OMPC_absent) +CHECK_SIMPLE_CLAUSE(AcqRel, OMPC_acq_rel) +CHECK_SIMPLE_CLAUSE(Acquire, OMPC_acquire) +CHECK_SIMPLE_CLAUSE(AdjustArgs, OMPC_adjust_args) +CHECK_SIMPLE_CLAUSE(Affinity, OMPC_affinity) +CHECK_SIMPLE_CLAUSE(AppendArgs, OMPC_append_args) +CHECK_SIMPLE_CLAUSE(Bind, OMPC_bind) +CHECK_SIMPLE_CLAUSE(Capture, OMPC_capture) +CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare) +CHECK_SIMPLE_CLAUSE(Contains, OMPC_contains) +CHECK_SIMPLE_CLAUSE(Default, OMPC_default) +CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj) +CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type) +CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule) +CHECK_SIMPLE_CLAUSE(DynGroupprivate, OMPC_dyn_groupprivate) +CHECK_SIMPLE_CLAUSE(Exclusive, OMPC_exclusive) +CHECK_SIMPLE_CLAUSE(Fail, OMPC_fail) +CHECK_SIMPLE_CLAUSE(Filter, OMPC_filter) +CHECK_SIMPLE_CLAUSE(Final, OMPC_final) +CHECK_SIMPLE_CLAUSE(Flush, OMPC_flush) +CHECK_SIMPLE_CLAUSE(Full, OMPC_full) +CHECK_SIMPLE_CLAUSE(Grainsize, OMPC_grainsize) +CHECK_SIMPLE_CLAUSE(GraphId, OMPC_graph_id) +CHECK_SIMPLE_CLAUSE(GraphReset, OMPC_graph_reset) +CHECK_SIMPLE_CLAUSE(Groupprivate, OMPC_groupprivate) +CHECK_SIMPLE_CLAUSE(Holds, OMPC_holds) +CHECK_SIMPLE_CLAUSE(Inbranch, OMPC_inbranch) +CHECK_SIMPLE_CLAUSE(Inclusive, OMPC_inclusive) +CHECK_SIMPLE_CLAUSE(Indirect, OMPC_indirect) +CHECK_SIMPLE_CLAUSE(Initializer, OMPC_initializer) +CHECK_SIMPLE_CLAUSE(Init, OMPC_init) +CHECK_SIMPLE_CLAUSE(Link, OMPC_link) +CHECK_SIMPLE_CLAUSE(Match, OMPC_match) +CHECK_SIMPLE_CLAUSE(MemoryOrder, OMPC_memory_order) +CHECK_SIMPLE_CLAUSE(Mergeable, OMPC_mergeable) +CHECK_SIMPLE_CLAUSE(Message, OMPC_message) +CHECK_SIMPLE_CLAUSE(Nocontext, OMPC_nocontext) +CHECK_SIMPLE_CLAUSE(Nogroup, OMPC_nogroup) +CHECK_SIMPLE_CLAUSE(Nontemporal, OMPC_nontemporal) +CHECK_SIMPLE_CLAUSE(NoOpenmpConstructs, OMPC_no_openmp_constructs) +CHECK_SIMPLE_CLAUSE(NoOpenmp, OMPC_no_openmp) +CHECK_SIMPLE_CLAUSE(NoOpenmpRoutines, OMPC_no_openmp_routines) +CHECK_SIMPLE_CLAUSE(NoParallelism, OMPC_no_parallelism) +CHECK_SIMPLE_CLAUSE(Notinbranch, OMPC_notinbranch) +CHECK_SIMPLE_CLAUSE(Novariants, OMPC_novariants) +CHECK_SIMPLE_CLAUSE(NumTasks, OMPC_num_tasks) +CHECK_SIMPLE_CLAUSE(OmpxAttribute, OMPC_ompx_attribute) +CHECK_SIMPLE_CLAUSE(Order, OMPC_order) +CHECK_SIMPLE_CLAUSE(Otherwise, OMPC_otherwise) +CHECK_SIMPLE_CLAUSE(Partial, OMPC_partial) +CHECK_SIMPLE_CLAUSE(Permutation, OMPC_permutation) +CHECK_SIMPLE_CLAUSE(ProcBind, OMPC_proc_bind) +CHECK_SIMPLE_CLAUSE(Read, OMPC_read) +CHECK_SIMPLE_CLAUSE(Relaxed, OMPC_relaxed) +CHECK_SIMPLE_CLAUSE(Release, OMPC_release) +CHECK_SIMPLE_CLAUSE(Replayable, OMPC_replayable) +CHECK_SIMPLE_CLAUSE(SeqCst, OMPC_seq_cst) +CHECK_SIMPLE_CLAUSE(Severity, OMPC_severity) +CHECK_SIMPLE_CLAUSE(Simd, OMPC_simd) +CHECK_SIMPLE_CLAUSE(Threadprivate, OMPC_threadprivate) +CHECK_SIMPLE_CLAUSE(Threadset, OMPC_threadset) +CHECK_SIMPLE_CLAUSE(Threads, OMPC_threads) +CHECK_SIMPLE_CLAUSE(Transparent, OMPC_transparent) +CHECK_SIMPLE_CLAUSE(Uniform, OMPC_uniform) +CHECK_SIMPLE_CLAUSE(Unknown, OMPC_unknown) +CHECK_SIMPLE_CLAUSE(Untied, OMPC_untied) +CHECK_SIMPLE_CLAUSE(Use, OMPC_use) +CHECK_SIMPLE_CLAUSE(UsesAllocators, OMPC_uses_allocators) +CHECK_SIMPLE_CLAUSE(Weak, OMPC_weak) +CHECK_SIMPLE_CLAUSE(Write, OMPC_write) + +CHECK_REQ_SCALAR_INT_CLAUSE(NumTeams, OMPC_num_teams) +CHECK_REQ_SCALAR_INT_CLAUSE(NumThreads, OMPC_num_threads) +CHECK_REQ_SCALAR_INT_CLAUSE(OmpxDynCgroupMem, OMPC_ompx_dyn_cgroup_mem) +CHECK_REQ_SCALAR_INT_CLAUSE(Priority, OMPC_priority) +CHECK_REQ_SCALAR_INT_CLAUSE(ThreadLimit, OMPC_thread_limit) + +CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Collapse, OMPC_collapse) +CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Safelen, OMPC_safelen) +CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Simdlen, OMPC_simdlen) +  } // namespace Fortran::semantics diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h index 7426559..1b84bc5 100644 --- a/flang/lib/Semantics/check-omp-structure.h +++ b/flang/lib/Semantics/check-omp-structure.h @@ -82,6 +82,11 @@ public:    bool Enter(const parser::BlockConstruct &);    void Leave(const parser::BlockConstruct &); +  void Enter(const parser::SpecificationPart &); +  void Leave(const parser::SpecificationPart &); +  void Enter(const parser::ExecutionPart &); +  void Leave(const parser::ExecutionPart &); +    void Enter(const parser::OpenMPConstruct &);    void Leave(const parser::OpenMPConstruct &);    void Enter(const parser::OpenMPInteropConstruct &); @@ -113,8 +118,8 @@ public:    void Leave(const parser::OmpDeclareVariantDirective &);    void Enter(const parser::OpenMPDeclareSimdConstruct &);    void Leave(const parser::OpenMPDeclareSimdConstruct &); -  void Enter(const parser::OpenMPDeclarativeAllocate &); -  void Leave(const parser::OpenMPDeclarativeAllocate &); +  void Enter(const parser::OmpAllocateDirective &); +  void Leave(const parser::OmpAllocateDirective &);    void Enter(const parser::OpenMPDeclareMapperConstruct &);    void Leave(const parser::OpenMPDeclareMapperConstruct &);    void Enter(const parser::OpenMPDeclareReductionConstruct &); @@ -129,8 +134,6 @@ public:    void Leave(const parser::OmpErrorDirective &);    void Enter(const parser::OmpNothingDirective &);    void Leave(const parser::OmpNothingDirective &); -  void Enter(const parser::OpenMPExecutableAllocate &); -  void Leave(const parser::OpenMPExecutableAllocate &);    void Enter(const parser::OpenMPAllocatorsConstruct &);    void Leave(const parser::OpenMPAllocatorsConstruct &);    void Enter(const parser::OpenMPRequiresConstruct &); @@ -263,9 +266,9 @@ private:    bool CheckTargetBlockOnlyTeams(const parser::Block &);    void CheckWorkshareBlockStmts(const parser::Block &, parser::CharBlock);    void CheckWorkdistributeBlockStmts(const parser::Block &, parser::CharBlock); -  void CheckAllocateDirective(parser::CharBlock source, -      const parser::OmpObjectList &objects, -      const parser::OmpClauseList &clauses); +  void CheckIndividualAllocateDirective( +      const parser::OmpAllocateDirective &x, bool isExecutable); +  void CheckExecutableAllocateDirective(const parser::OmpAllocateDirective &x);    void CheckIteratorRange(const parser::OmpIteratorSpecifier &x);    void CheckIteratorModifier(const parser::OmpIterator &x); @@ -325,11 +328,6 @@ private:        const std::optional<parser::OmpClauseList> &maybeClauses);    void CheckCancellationNest(        const parser::CharBlock &source, llvm::omp::Directive type); -  void CheckAllNamesInAllocateStmt(const parser::CharBlock &source, -      const parser::OmpObjectList &ompObjectList, -      const parser::AllocateStmt &allocate); -  void CheckNameInAllocateStmt(const parser::CharBlock &source, -      const parser::Name &ompObject, const parser::AllocateStmt &allocate);    std::int64_t GetOrdCollapseLevel(const parser::OpenMPLoopConstruct &x);    void CheckReductionObjects(        const parser::OmpObjectList &objects, llvm::omp::Clause clauseId); @@ -353,11 +351,6 @@ private:        const parser::OmpObjectList &ompObjectList);    void CheckIfContiguous(const parser::OmpObject &object);    const parser::Name *GetObjectName(const parser::OmpObject &object); -  void CheckPredefinedAllocatorRestriction(const parser::CharBlock &source, -      const parser::OmpObjectList &ompObjectList); -  void CheckPredefinedAllocatorRestriction( -      const parser::CharBlock &source, const parser::Name &name); -  bool isPredefinedAllocator{false};    void CheckAllowedRequiresClause(llvmOmpClause clause);    bool deviceConstructFound_{false}; @@ -383,7 +376,7 @@ private:    };    int directiveNest_[LastType + 1] = {0}; -  bool inExecutableAllocate_{false}; +  int allocateDirectiveLevel{0};    parser::CharBlock visitedAtomicSource_;    SymbolSourceMap deferredNonVariables_; @@ -392,6 +385,14 @@ private:    std::vector<LoopConstruct> loopStack_;    // Scopes for scoping units.    std::vector<const Scope *> scopeStack_; + +  enum class PartKind : int { +    // There are also other "parts", such as internal-subprogram-part, etc, +    // but we're keeping track of these two for now. +    SpecificationPart, +    ExecutionPart, +  }; +  std::vector<PartKind> partStack_;  };  /// Find a duplicate entry in the range, and return an iterator to it. diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp index 6b304b6..4a40d6e 100644 --- a/flang/lib/Semantics/openmp-utils.cpp +++ b/flang/lib/Semantics/openmp-utils.cpp @@ -186,6 +186,23 @@ bool IsExtendedListItem(const Symbol &sym) {    return IsVariableListItem(sym) || sym.IsSubprogram();  } +bool IsTypeParamInquiry(const Symbol &sym) { +  return common::visit( // +      common::visitors{ +          [&](const MiscDetails &d) { +            return d.kind() == MiscDetails::Kind::KindParamInquiry || +                d.kind() == MiscDetails::Kind::LenParamInquiry; +          }, +          [&](const TypeParamDetails &s) { return true; }, +          [&](auto &&) { return false; }, +      }, +      sym.details()); +} + +bool IsStructureComponent(const Symbol &sym) { +  return sym.owner().kind() == Scope::Kind::DerivedType; +} +  bool IsVarOrFunctionRef(const MaybeExpr &expr) {    if (expr) {      return evaluate::UnwrapProcedureRef(*expr) != nullptr || diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 628068f..deb57e0 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -415,6 +415,18 @@ public:      return true;    } +  bool Pre(const parser::SpecificationPart &) { +    partStack_.push_back(PartKind::SpecificationPart); +    return true; +  } +  void Post(const parser::SpecificationPart &) { partStack_.pop_back(); } + +  bool Pre(const parser::ExecutionPart &) { +    partStack_.push_back(PartKind::ExecutionPart); +    return true; +  } +  void Post(const parser::ExecutionPart &) { partStack_.pop_back(); } +    bool Pre(const parser::InternalSubprogram &) {      // Clear the labels being tracked in the previous scope      ClearLabels(); @@ -639,8 +651,7 @@ public:    bool Pre(const parser::OpenMPThreadprivate &);    void Post(const parser::OpenMPThreadprivate &) { PopContext(); } -  bool Pre(const parser::OpenMPDeclarativeAllocate &); -  void Post(const parser::OpenMPDeclarativeAllocate &) { PopContext(); } +  bool Pre(const parser::OmpAllocateDirective &);    bool Pre(const parser::OpenMPAssumeConstruct &);    void Post(const parser::OpenMPAssumeConstruct &) { PopContext(); } @@ -651,9 +662,6 @@ public:    bool Pre(const parser::OpenMPDispatchConstruct &);    void Post(const parser::OpenMPDispatchConstruct &) { PopContext(); } -  bool Pre(const parser::OpenMPExecutableAllocate &); -  void Post(const parser::OpenMPExecutableAllocate &); -    bool Pre(const parser::OpenMPAllocatorsConstruct &);    void Post(const parser::OpenMPAllocatorsConstruct &); @@ -998,6 +1006,14 @@ private:        targetLabels_;    parser::CharBlock currentStatementSource_; +  enum class PartKind : int { +    // There are also other "parts", such as internal-subprogram-part, etc, +    // but we're keeping track of these two for now. +    SpecificationPart, +    ExecutionPart, +  }; +  std::vector<PartKind> partStack_; +    void AddAllocateName(const parser::Name *&object) {      allocateNames_.push_back(object);    } @@ -2558,10 +2574,24 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPThreadprivate &x) {    return true;  } -bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclarativeAllocate &x) { +bool OmpAttributeVisitor::Pre(const parser::OmpAllocateDirective &x) {    PushContext(x.source, llvm::omp::Directive::OMPD_allocate); -  const auto &list{std::get<parser::OmpObjectList>(x.t)}; -  ResolveOmpObjectList(list, Symbol::Flag::OmpDeclarativeAllocateDirective); +  assert(!partStack_.empty() && "Misplaced directive"); + +  auto ompFlag{partStack_.back() == PartKind::SpecificationPart +          ? Symbol::Flag::OmpDeclarativeAllocateDirective +          : Symbol::Flag::OmpExecutableAllocateDirective}; + +  parser::omp::OmpAllocateInfo info{parser::omp::SplitOmpAllocate(x)}; +  for (const parser::OmpAllocateDirective *ad : info.dirs) { +    for (const parser::OmpArgument &arg : ad->BeginDir().Arguments().v) { +      if (auto *object{omp::GetArgumentObject(arg)}) { +        ResolveOmpObject(*object, ompFlag); +      } +    } +  } + +  PopContext();    return false;  } @@ -2580,15 +2610,6 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDispatchConstruct &x) {    return true;  } -bool OmpAttributeVisitor::Pre(const parser::OpenMPExecutableAllocate &x) { -  PushContext(x.source, llvm::omp::Directive::OMPD_allocate); -  const auto &list{std::get<std::optional<parser::OmpObjectList>>(x.t)}; -  if (list) { -    ResolveOmpObjectList(*list, Symbol::Flag::OmpExecutableAllocateDirective); -  } -  return true; -} -  bool OmpAttributeVisitor::Pre(const parser::OpenMPAllocatorsConstruct &x) {    const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()};    PushContext(x.source, dirSpec.DirId()); @@ -2660,10 +2681,6 @@ bool OmpAttributeVisitor::IsNestedInDirective(llvm::omp::Directive directive) {    return false;  } -void OmpAttributeVisitor::Post(const parser::OpenMPExecutableAllocate &x) { -  PopContext(); -} -  void OmpAttributeVisitor::Post(const parser::OpenMPAllocatorsConstruct &x) {    PopContext();  } diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 220f1c9..a2062ef 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -1700,12 +1700,12 @@ public:    void Post(const parser::OpenMPDeclareTargetConstruct &) {      SkipImplicitTyping(false);    } -  bool Pre(const parser::OpenMPDeclarativeAllocate &x) { +  bool Pre(const parser::OmpAllocateDirective &x) {      AddOmpSourceRange(x.source);      SkipImplicitTyping(true);      return true;    } -  void Post(const parser::OpenMPDeclarativeAllocate &) { +  void Post(const parser::OmpAllocateDirective &) {      SkipImplicitTyping(false);      messageHandler().set_currStmtSource(std::nullopt);    } diff --git a/flang/module/cudadevice.f90 b/flang/module/cudadevice.f90 index 59af58d..7a764b5 100644 --- a/flang/module/cudadevice.f90 +++ b/flang/module/cudadevice.f90 @@ -1171,6 +1171,11 @@ implicit none      integer(8), intent(inout) :: address      integer(8), value :: val      end function +    attributes(device) pure integer(4) function atomicaddr2(address, val) +      !dir$ ignore_tkr (rd) address, (d) val +      real(2), dimension(2), intent(inout) :: address +      real(2), dimension(2), intent(in) :: val +    end function    end interface    interface atomicsub diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtbegin.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtend.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crti.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13/crtn.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtbegin.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtend.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crti.o diff --git a/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/flang/test/Driver/Inputs/fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13/crtn.o diff --git a/flang/test/Driver/gcc-triple.f90 b/flang/test/Driver/gcc-triple.f90 new file mode 100644 index 0000000..027d78a --- /dev/null +++ b/flang/test/Driver/gcc-triple.f90 @@ -0,0 +1,18 @@ +!! UNSUPPORTED: system-windows + +!! Test that --gcc-triple option is working as expected. + +! RUN: %flang -v --sysroot=%S/Inputs/fedora_39_tree 2>&1 | FileCheck %s --dump-input=always --check-prefix=DEFAULT_TRIPLE +! DEFAULT_TRIPLE: {{^}}Found candidate GCC installation: +! DEFAULT_TRIPLE: fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13 +! DEFAULT_TRIPLE: {{^}}Found candidate GCC installation: +! DEFAULT_TRIPLE: fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13 +! DEFAULT_TRIPLE: {{^}}Selected GCC installation: +! DEFAULT_TRIPLE: fedora_39_tree/usr/lib/gcc/x86_64-linux-gnu/13 + +! RUN: %flang -v --sysroot=%S/Inputs/fedora_39_tree --gcc-triple=x86_64-redhat-linux 2>&1 | FileCheck %s --check-prefix=TRIPLE_EXISTS +! TRIPLE_EXISTS: {{^}}Selected GCC installation: +! TRIPLE_EXISTS: fedora_39_tree/usr/lib/gcc/x86_64-redhat-linux/13 + +! RUN: %flang -v --sysroot=%S/Inputs/fedora_39_tree --gcc-triple=x86_64-foo-linux 2>&1 | FileCheck %s --check-prefix=TRIPLE_DOES_NOT_EXISTS +! TRIPLE_DOES_NOT_EXISTS-NOT: x86_64-foo-linux
\ No newline at end of file diff --git a/flang/test/Lower/CUDA/cuda-device-proc.cuf b/flang/test/Lower/CUDA/cuda-device-proc.cuf index 09b4302..674548b 100644 --- a/flang/test/Lower/CUDA/cuda-device-proc.cuf +++ b/flang/test/Lower/CUDA/cuda-device-proc.cuf @@ -14,6 +14,8 @@ attributes(global) subroutine devsub()    integer :: smalltime    integer(4) :: res, offset    integer(8) :: resl +  real(2) :: r2a(2) +  real(2) :: tmp2(2)    integer :: tid    tid = threadIdx%x @@ -34,6 +36,7 @@ attributes(global) subroutine devsub()    al = atomicadd(al, 1_8)    af = atomicadd(af, 1.0_4)    ad = atomicadd(ad, 1.0_8) +  ai = atomicadd(r2a, tmp2)    ai = atomicsub(ai, 1_4)    al = atomicsub(al, 1_8) @@ -128,6 +131,7 @@ end  ! CHECK: %{{.*}} = llvm.atomicrmw add  %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i64  ! CHECK: %{{.*}} = llvm.atomicrmw fadd %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, f32  ! CHECK: %{{.*}} = llvm.atomicrmw fadd %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, f64 +! CHECK: %{{.*}} = llvm.atomicrmw fadd %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, vector<2xf16>  ! CHECK: %{{.*}} = llvm.atomicrmw sub  %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i32  ! CHECK: %{{.*}} = llvm.atomicrmw sub  %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i64 diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90 index 8daf20e..fec146a 100644 --- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90 +++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90 @@ -5,6 +5,6 @@  program main    integer :: x -  ! CHECK: not yet implemented: OpenMPDeclarativeAllocate +  ! CHECK: not yet implemented: OmpAllocateDirective    !$omp allocate(x) align(32)  end diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 index e83b433..3307eb2 100644 --- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 +++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 @@ -5,6 +5,6 @@  program main    integer :: x, y -  ! CHECK: not yet implemented: OpenMPDeclarativeAllocate +  ! CHECK: not yet implemented: OmpAllocateDirective    !$omp allocate(x, y)  end diff --git a/flang/test/Parser/OpenMP/allocate-align-tree.f90 b/flang/test/Parser/OpenMP/allocate-align-tree.f90 index 0d247cd..d799aa1 100644 --- a/flang/test/Parser/OpenMP/allocate-align-tree.f90 +++ b/flang/test/Parser/OpenMP/allocate-align-tree.f90 @@ -16,27 +16,33 @@ program allocate_align_tree      allocate(j(z), xarray(t))  end program allocate_align_tree -!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt -!CHECK-NEXT: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> -!CHECK-NEXT: | | | AttrSpec -> Allocatable -!CHECK-NEXT: | | | EntityDecl -!CHECK-NEXT: | | | | Name = 'j' +!CHECK:      DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt +!CHECK-NEXT: | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> +!CHECK-NEXT: | AttrSpec -> Allocatable +!CHECK-NEXT: | EntityDecl +!CHECK-NEXT: | | Name = 'j' +!CHECK:      ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | OmpBeginDirective +!CHECK-NEXT: | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'j' +!CHECK-NEXT: | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '16_4' +!CHECK-NEXT: | | | LiteralConstant -> IntLiteralConstant = '16' +!CHECK-NEXT: | | Flags = None +!CHECK-NEXT: | Block +!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | OmpBeginDirective +!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'xarray' +!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '32_4' +!CHECK-NEXT: | | | | | LiteralConstant -> IntLiteralConstant = '32' +!CHECK-NEXT: | | | | OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8' +!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc' +!CHECK-NEXT: | | | | Flags = None +!CHECK-NEXT: | | | Block +!CHECK-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AllocateStmt -!CHECK: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPExecutableAllocate -!CHECK-NEXT: | | | Verbatim -!CHECK-NEXT: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'xarray' -!CHECK-NEXT: | | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '32_4' -!CHECK-NEXT: | | | | LiteralConstant -> IntLiteralConstant = '32' -!CHECK-NEXT: | | | OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8' -!CHECK-NEXT: | | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc' -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'j' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Align -> OmpAlignClause -> Scalar -> Integer -> Constant -> Expr = '16_4' -!CHECK-NEXT: | | | | | LiteralConstant -> IntLiteralConstant = '16' -!CHECK-NEXT: | | | AllocateStmt +!UNPARSE:      !$OMP ALLOCATE(j) ALIGN(16_4) +!UNPARSE-NEXT: !$OMP ALLOCATE(xarray) ALIGN(32_4) ALLOCATOR(2_8) +!UNPARSE-NEXT:  ALLOCATE(j(z), xarray(t)) -!UNPARSE: !$OMP ALLOCATE (j) ALIGN(16_4) -!UNPARSE: !$OMP ALLOCATE (xarray) ALIGN(32_4) ALLOCATOR(2_8) -!UNPARSE-NEXT: ALLOCATE(j(z), xarray(t)) diff --git a/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90 b/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90 index afcaf44..800e4a5 100644 --- a/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90 +++ b/flang/test/Parser/OpenMP/allocate-tree-spec-part.f90 @@ -17,33 +17,48 @@ program allocate_tree      allocate (w, xarray(4), zarray(5, f))  end program allocate_tree -!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | Verbatim -!CHECK-NEXT: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'f' -!CHECK-NEXT: | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | Designator -> DataRef -> Name = +!CHECK:      | | DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | OmpBeginDirective +!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'f' +!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '1_8' +!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_default_mem_alloc' +!CHECK-NEXT: | | | | Flags = None +!CHECK-NEXT: | | | Block  !CHECK-NEXT: | ExecutionPart -> Block  !CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'f=2_4'  !CHECK-NEXT: | | | Variable = 'f'  !CHECK-NEXT: | | | | Designator -> DataRef -> Name = 'f'  !CHECK-NEXT: | | | Expr = '2_4'  !CHECK-NEXT: | | | | LiteralConstant -> IntLiteralConstant = '2' -!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPExecutableAllocate -!CHECK-NEXT: | | | Verbatim -!CHECK-NEXT: | | | OmpClauseList -> -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'w' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'xarray' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'zarray' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = -!CHECK-NEXT: | | | AllocateStmt +!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | OmpBeginDirective +!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'w' +!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '3_8' +!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_const_mem_alloc' +!CHECK-NEXT: | | | | Flags = None +!CHECK-NEXT: | | | Block +!CHECK-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | | | OmpBeginDirective +!CHECK-NEXT: | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'xarray' +!CHECK-NEXT: | | | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8' +!CHECK-NEXT: | | | | | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc' +!CHECK-NEXT: | | | | | | Flags = None +!CHECK-NEXT: | | | | | Block +!CHECK-NEXT: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | | | | | OmpBeginDirective +!CHECK-NEXT: | | | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'zarray' +!CHECK-NEXT: | | | | | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '1_8' +!CHECK-NEXT: | | | | | | | | | Designator -> DataRef -> Name = 'omp_default_mem_alloc' +!CHECK-NEXT: | | | | | | | | Flags = None +!CHECK-NEXT: | | | | | | | Block +!CHECK-NEXT: | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | | | | | | | OmpBeginDirective +!CHECK-NEXT: | | | | | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | | | | | | | OmpClauseList -> +!CHECK-NEXT: | | | | | | | | | | Flags = None +!CHECK-NEXT: | | | | | | | | | Block +!CHECK-NEXT: | | | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AllocateStmt diff --git a/flang/test/Parser/OpenMP/allocate-tree.f90 b/flang/test/Parser/OpenMP/allocate-tree.f90 index bf413d5..021d810 100644 --- a/flang/test/Parser/OpenMP/allocate-tree.f90 +++ b/flang/test/Parser/OpenMP/allocate-tree.f90 @@ -7,52 +7,54 @@  program allocate_tree      use omp_lib -    integer, allocatable :: w, xarray(:), zarray(:, :) -    integer :: z, t +    integer, allocatable :: xarray(:), zarray(:, :) +    integer :: z, t, w +!$omp allocate(w) allocator(omp_const_mem_alloc)      t = 2      z = 3 -!$omp allocate(w) allocator(omp_const_mem_alloc)  !$omp allocate(xarray) allocator(omp_large_cap_mem_alloc)  !$omp allocate(zarray) allocator(omp_default_mem_alloc)  !$omp allocate -    allocate(w, xarray(4), zarray(t, z)) +    allocate(xarray(4), zarray(t, z))  end program allocate_tree -!CHECK: | | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt -!CHECK-NEXT: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> -!CHECK-NEXT: | | | AttrSpec -> Allocatable -!CHECK-NEXT: | | | EntityDecl -!CHECK-NEXT: | | | | Name = 'w' -!CHECK-NEXT: | | | EntityDecl -!CHECK-NEXT: | | | | Name = 'xarray' -!CHECK-NEXT: | | | | ArraySpec -> DeferredShapeSpecList -> int = '1' -!CHECK-NEXT: | | | EntityDecl -!CHECK-NEXT: | | | | Name = 'zarray' -!CHECK-NEXT: | | | | ArraySpec -> DeferredShapeSpecList -> int = '2' - +!CHECK:      DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpAllocateDirective +!CHECK-NEXT: | OmpBeginDirective +!CHECK-NEXT: | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'w' +!CHECK-NEXT: | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '3_8' +!CHECK-NEXT: | | | Designator -> DataRef -> Name = 'omp_const_mem_alloc' +!CHECK-NEXT: | | Flags = None +!CHECK-NEXT: | Block -!CHECK: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPExecutableAllocate -!CHECK-NEXT: | | | Verbatim -!CHECK-NEXT: | | | OmpClauseList -> -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'w' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'xarray' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = -!CHECK-NEXT: | | | OpenMPDeclarativeAllocate -!CHECK-NEXT: | | | | Verbatim -!CHECK-NEXT: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'zarray' -!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = -!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = -!CHECK-NEXT: | | | AllocateStmt +!CHECK:      ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | OmpBeginDirective +!CHECK-NEXT: | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'xarray' +!CHECK-NEXT: | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '2_8' +!CHECK-NEXT: | | | Designator -> DataRef -> Name = 'omp_large_cap_mem_alloc' +!CHECK-NEXT: | | Flags = None +!CHECK-NEXT: | Block +!CHECK-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | OmpBeginDirective +!CHECK-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'zarray' +!CHECK-NEXT: | | | | OmpClauseList -> OmpClause -> Allocator -> Scalar -> Integer -> Expr = '1_8' +!CHECK-NEXT: | | | | | Designator -> DataRef -> Name = 'omp_default_mem_alloc' +!CHECK-NEXT: | | | | Flags = None +!CHECK-NEXT: | | | Block +!CHECK-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpAllocateDirective +!CHECK-NEXT: | | | | | OmpBeginDirective +!CHECK-NEXT: | | | | | | OmpDirectiveName -> llvm::omp::Directive = allocate +!CHECK-NEXT: | | | | | | OmpClauseList -> +!CHECK-NEXT: | | | | | | Flags = None +!CHECK-NEXT: | | | | | Block +!CHECK-NEXT: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AllocateStmt -!UNPARSE: !$OMP ALLOCATE (w) ALLOCATOR(3_8) -!UNPARSE-NEXT: !$OMP ALLOCATE (xarray) ALLOCATOR(2_8) -!UNPARSE-NEXT: !$OMP ALLOCATE (zarray) ALLOCATOR(1_8) +!UNPARSE:      !$OMP ALLOCATE(w) ALLOCATOR(3_8) +!UNPARSE-NEXT:   t=2_4 +!UNPARSE-NEXT:   z=3_4 +!UNPARSE-NEXT: !$OMP ALLOCATE(xarray) ALLOCATOR(2_8) +!UNPARSE-NEXT: !$OMP ALLOCATE(zarray) ALLOCATOR(1_8)  !UNPARSE-NEXT: !$OMP ALLOCATE -!UNPARSE-NEXT: ALLOCATE(w, xarray(4_4), zarray(t,z)) +!UNPARSE-NEXT:  ALLOCATE(xarray(4_4), zarray(t,z)) diff --git a/flang/test/Parser/OpenMP/allocate-unparse.f90 b/flang/test/Parser/OpenMP/allocate-unparse.f90 index 94bc2ad..b61a971 100644 --- a/flang/test/Parser/OpenMP/allocate-unparse.f90 +++ b/flang/test/Parser/OpenMP/allocate-unparse.f90 @@ -9,6 +9,7 @@ integer :: a, b, j, m, n, t, x, y, z  ! 2.11.3 declarative allocate +!$omp allocate  !$omp allocate(x, y)  !$omp allocate(x, y) allocator(omp_default_mem_alloc) @@ -28,19 +29,24 @@ integer :: a, b, j, m, n, t, x, y, z  !$omp allocate(j) align(16)      allocate ( darray(z, t) ) +!$omp allocate +    allocate ( darray(a, b) )  end program allocate_unparse -!CHECK:!$OMP ALLOCATE (x,y) -!CHECK:!$OMP ALLOCATE (x,y) ALLOCATOR(omp_default_mem_alloc) -!CHECK:!$OMP ALLOCATE (a,b) +!CHECK:!$OMP ALLOCATE{{[ ]*$}} +!CHECK:!$OMP ALLOCATE(x, y) +!CHECK:!$OMP ALLOCATE(x, y) ALLOCATOR(omp_default_mem_alloc) +!CHECK:!$OMP ALLOCATE(a, b)  !CHECK:ALLOCATE(darray(a,b))  !CHECK:!$OMP ALLOCATE ALLOCATOR(omp_default_mem_alloc)  !CHECK:ALLOCATE(darray(a,b)) -!CHECK:!$OMP ALLOCATE (a,b) ALLOCATOR(omp_default_mem_alloc) +!CHECK:!$OMP ALLOCATE(a, b) ALLOCATOR(omp_default_mem_alloc)  !CHECK:ALLOCATE(darray(a,b)) -!CHECK:!$OMP ALLOCATE (t) ALLOCATOR(omp_const_mem_alloc) -!CHECK:!$OMP ALLOCATE (z) ALLOCATOR(omp_default_mem_alloc) -!CHECK:!$OMP ALLOCATE (m) ALLOCATOR(omp_default_mem_alloc) -!CHECK:!$OMP ALLOCATE (n) -!CHECK:!$OMP ALLOCATE (j) ALIGN(16) +!CHECK:!$OMP ALLOCATE(t) ALLOCATOR(omp_const_mem_alloc) +!CHECK:!$OMP ALLOCATE(z) ALLOCATOR(omp_default_mem_alloc) +!CHECK:!$OMP ALLOCATE(m) ALLOCATOR(omp_default_mem_alloc) +!CHECK:!$OMP ALLOCATE(n) +!CHECK:!$OMP ALLOCATE(j) ALIGN(16)  !CHECK:ALLOCATE(darray(z,t)) +!CHECK:!$OMP ALLOCATE{{[ ]*$}} +!CHECK:ALLOCATE(darray(a,b)) diff --git a/flang/test/Semantics/OpenMP/allocate-align01.f90 b/flang/test/Semantics/OpenMP/allocate-align01.f90 index 88bcd6d..4a1e60c 100644 --- a/flang/test/Semantics/OpenMP/allocate-align01.f90 +++ b/flang/test/Semantics/OpenMP/allocate-align01.f90 @@ -11,9 +11,9 @@ program allocate_align_tree      integer :: z, t, xx      t = 2      z = 3 +    !WARNING: The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead [-Wopen-mp-usage]      !ERROR: Must be a constant value  !$omp allocate(j) align(xx) -    !WARNING: The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead [-Wopen-mp-usage]      !ERROR: The alignment should be positive  !$omp allocate(xarray) align(-32) allocator(omp_large_cap_mem_alloc)      allocate(j(z), xarray(t)) diff --git a/flang/test/Semantics/OpenMP/allocate-directive.f90 b/flang/test/Semantics/OpenMP/allocate-directive.f90 index 18a14b8..e34125b 100644 --- a/flang/test/Semantics/OpenMP/allocate-directive.f90 +++ b/flang/test/Semantics/OpenMP/allocate-directive.f90 @@ -11,7 +11,7 @@ integer :: x, y  integer, allocatable :: a, b, m, n, t, z  !$omp allocate(x, y)  !$omp allocate(x, y) allocator(omp_default_mem_alloc) - +    continue  !$omp allocate(a, b)      allocate ( a, b ) diff --git a/flang/test/Semantics/OpenMP/allocate01.f90 b/flang/test/Semantics/OpenMP/allocate01.f90 index 229fd4d..5fe4efd 100644 --- a/flang/test/Semantics/OpenMP/allocate01.f90 +++ b/flang/test/Semantics/OpenMP/allocate01.f90 @@ -17,7 +17,7 @@ use omp_lib      !ERROR: A list item on a declarative ALLOCATE must be declared in the same scope in which the directive appears      !$omp allocate(y) -        print *, a +    print *, a      !WARNING: The executable form of the OpenMP ALLOCATE directive has been deprecated, please use ALLOCATORS instead [-Wopen-mp-usage]      !$omp allocate(x) allocator(omp_default_mem_alloc) diff --git a/flang/test/Semantics/OpenMP/allocate02.f90 b/flang/test/Semantics/OpenMP/allocate02.f90 index 8f0579e..a1e6847 100644 --- a/flang/test/Semantics/OpenMP/allocate02.f90 +++ b/flang/test/Semantics/OpenMP/allocate02.f90 @@ -16,6 +16,7 @@ use omp_lib    !ERROR: At most one ALLOCATOR clause can appear on the ALLOCATE directive    !$omp allocate(x, y) allocator(omp_default_mem_alloc) allocator(omp_default_mem_alloc) +  continue    !$omp allocate(darray) allocator(omp_default_mem_alloc)        allocate ( darray(a, b) ) diff --git a/flang/test/Semantics/OpenMP/allocate03.f90 b/flang/test/Semantics/OpenMP/allocate03.f90 index e35115f..3609f38 100644 --- a/flang/test/Semantics/OpenMP/allocate03.f90 +++ b/flang/test/Semantics/OpenMP/allocate03.f90 @@ -17,6 +17,7 @@ use omp_lib    !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear on the ALLOCATE directive    !$omp allocate(my_var%array) +  continue    !ERROR: A variable that is part of another variable (as an array or structure element) cannot appear on the ALLOCATE directive    !$omp allocate(darray, my_var%array) allocator(omp_default_mem_alloc) diff --git a/flang/test/Semantics/OpenMP/allocate06.f90 b/flang/test/Semantics/OpenMP/allocate06.f90 index 9b57322..272094a 100644 --- a/flang/test/Semantics/OpenMP/allocate06.f90 +++ b/flang/test/Semantics/OpenMP/allocate06.f90 @@ -13,7 +13,7 @@ use omp_lib    !ERROR: A list item in a declarative ALLOCATE cannot have the ALLOCATABLE or POINTER attribute    !$omp allocate(darray) allocator(omp_default_mem_alloc) - +  continue    !$omp allocate(darray) allocator(omp_default_mem_alloc)      allocate(darray(a, b)) diff --git a/flang/test/Semantics/OpenMP/allocate08.f90 b/flang/test/Semantics/OpenMP/allocate08.f90 index f4f11e2..3f59493 100644 --- a/flang/test/Semantics/OpenMP/allocate08.f90 +++ b/flang/test/Semantics/OpenMP/allocate08.f90 @@ -1,11 +1,11 @@  ! REQUIRES: openmp_runtime -! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -! OpenMP Version 5.0 +! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51 +! OpenMP Version 5.1  ! 2.11.3 allocate Directive  ! If list items within the ALLOCATE directive have the SAVE attribute, are a -! common block name, or are declared in the scope of a module, then only -! predefined memory allocator parameters can be used in the allocator clause +! common block name, then only predefined memory allocator parameters can be +! used in the allocator clause  module AllocateModule    INTEGER :: z diff --git a/flang/test/Semantics/OpenMP/allocate09.f90 b/flang/test/Semantics/OpenMP/allocate09.f90 index 0f93a34..8b8d07c 100644 --- a/flang/test/Semantics/OpenMP/allocate09.f90 +++ b/flang/test/Semantics/OpenMP/allocate09.f90 @@ -23,11 +23,11 @@ use omp_lib    !$omp allocate      allocate(e(5), f(6), g(7)) -  !ERROR: Object 'i' in ALLOCATE directive not found in corresponding ALLOCATE statement +  !ERROR: A list item on an executable ALLOCATE must be specified on the associated ALLOCATE statement    !$omp allocate(h, i) allocator(omp_default_mem_alloc)      allocate(h(8)) -  !ERROR: Object 'j' in ALLOCATE directive not found in corresponding ALLOCATE statement +  !ERROR: A list item on an executable ALLOCATE must be specified on the associated ALLOCATE statement    !$omp allocate(j, k) allocator(omp_default_mem_alloc)    !$omp allocate(l) allocator(omp_default_mem_alloc)      allocate(k(9), l(10)) diff --git a/flang/test/Semantics/OpenMP/allocate10.f90 b/flang/test/Semantics/OpenMP/allocate10.f90 new file mode 100644 index 0000000..0a9e85b --- /dev/null +++ b/flang/test/Semantics/OpenMP/allocate10.f90 @@ -0,0 +1,11 @@ +!RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51 + +subroutine f00 +  integer, allocatable :: x, y + +  continue +  !$omp allocate +  !ERROR: If multiple directives are present in an executable ALLOCATE directive, at most one of them may specify no list items +  !$omp allocate +  allocate(x, y) +end diff --git a/flang/test/Semantics/OpenMP/allocate11.f90 b/flang/test/Semantics/OpenMP/allocate11.f90 new file mode 100644 index 0000000..89beaa0 --- /dev/null +++ b/flang/test/Semantics/OpenMP/allocate11.f90 @@ -0,0 +1,27 @@ +! REQUIRES: openmp_runtime + +! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=50 +! OpenMP Version 5.0 +! 2.11.3 allocate Directive +! If list items within the ALLOCATE directive have the SAVE attribute, are a +! common block name, or are declared in the scope of a module, then only +! predefined memory allocator parameters can be used in the allocator clause + +module AllocateModule +  INTEGER :: z +  !ERROR: If a list item is a named common block, has SAVE attribute or is declared in the scope of a module, an ALLOCATOR clause must be present with a predefined allocator +  !$omp allocate(z) +end module + +subroutine allocate(custom_allocator) +use omp_lib +use AllocateModule +  integer, SAVE :: x +  integer :: w +  COMMON /CommonName/ y + +  integer(kind=omp_allocator_handle_kind) :: custom_allocator + +  !ERROR: If a list item is a named common block, has SAVE attribute or is declared in the scope of a module, an ALLOCATOR clause must be present with a predefined allocator +  !$omp allocate(x) +end subroutine allocate diff --git a/flang/test/Semantics/OpenMP/allocate12.f90 b/flang/test/Semantics/OpenMP/allocate12.f90 new file mode 100644 index 0000000..2b3b510f --- /dev/null +++ b/flang/test/Semantics/OpenMP/allocate12.f90 @@ -0,0 +1,16 @@ +!RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51 + +subroutine f00 +  integer, allocatable :: x +  continue +  !ERROR: An executable ALLOCATE directive must be associated with an ALLOCATE statement +  !$omp allocate(x) +end + +subroutine f01 +  integer, allocatable :: x +  continue +  !$omp allocate(x) +  !ERROR: The statement associated with executable ALLOCATE directive must be an ALLOCATE statement +  continue +end diff --git a/flang/test/Semantics/OpenMP/allocators01.f90 b/flang/test/Semantics/OpenMP/allocators01.f90 index ff92fa3..a334206 100644 --- a/flang/test/Semantics/OpenMP/allocators01.f90 +++ b/flang/test/Semantics/OpenMP/allocators01.f90 @@ -16,7 +16,7 @@ use omp_lib      allocate(arr3(3), arr4(4, 4))    !$omp end allocators -  !ERROR: Object 'arr1' in ALLOCATORS directive not found in corresponding ALLOCATE statement +  !ERROR: A list item in an ALLOCATORS construct must be specified on the associated ALLOCATE statement    !$omp allocators allocate(omp_default_mem_alloc: arr1, arr2)      allocate(arr2(2, 2)) diff --git a/flang/test/Semantics/OpenMP/allocators04.f90 b/flang/test/Semantics/OpenMP/allocators04.f90 deleted file mode 100644 index 212e48f..0000000 --- a/flang/test/Semantics/OpenMP/allocators04.f90 +++ /dev/null @@ -1,31 +0,0 @@ -! REQUIRES: openmp_runtime - -! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=50 -! OpenMP Version 5.2 -! Inherited from 2.11.3 allocate Directive -! If list items within the ALLOCATE directive have the SAVE attribute, are a common block name, or are declared in the scope of a -! module, then only predefined memory allocator parameters can be used in the allocator clause -! SAVE and common block names can't be declared as allocatable, only module scope variables are tested - -module AllocateModule -    integer, allocatable :: a, b -end module - -subroutine allocate() -    use omp_lib -    use AllocateModule - -    integer(kind=omp_allocator_handle_kind) :: custom_allocator -    type(omp_alloctrait) :: trait(1) - -    trait(1)%key = fallback -    trait(1)%value = default_mem_fb -    custom_allocator = omp_init_allocator(omp_default_mem_space, 1, trait) - -    !$omp allocators allocate(omp_default_mem_alloc: a) -        allocate(a) - -    !ERROR: If list items within the ALLOCATORS directive have the SAVE attribute, are a common block name, or are declared in the scope of a module, then only predefined memory allocator parameters can be used in the allocator clause -    !$omp allocators allocate(custom_allocator: b) -        allocate(b) -end subroutine diff --git a/flang/test/Semantics/OpenMP/allocators05.f90 b/flang/test/Semantics/OpenMP/allocators05.f90 index efacdfa..f49182f 100644 --- a/flang/test/Semantics/OpenMP/allocators05.f90 +++ b/flang/test/Semantics/OpenMP/allocators05.f90 @@ -17,7 +17,7 @@ subroutine allocate()      !$omp target private(a, b)      !$omp allocators allocate(omp_default_mem_alloc: a)          allocate(a(LEN)) -    !ERROR: ALLOCATORS directives that appear in a TARGET region must specify an allocator +    !ERROR: An ALLOCATE clause in a TARGET region must specify an allocator or REQUIRES(DYNAMIC_ALLOCATORS) must be specified      !$omp allocators allocate(b)          allocate(b(LEN))      !$omp end target diff --git a/flang/test/Semantics/OpenMP/allocators07.f90 b/flang/test/Semantics/OpenMP/allocators07.f90 index a28f706..baaacee 100644 --- a/flang/test/Semantics/OpenMP/allocators07.f90 +++ b/flang/test/Semantics/OpenMP/allocators07.f90 @@ -5,7 +5,7 @@ subroutine f00    integer, allocatable :: a(:)    !$omp allocators allocate(a) -!ERROR: The body of the ALLOCATORS construct should be an ALLOCATE statement +!ERROR: The body of an ALLOCATORS construct should be an ALLOCATE statement    continue  end @@ -13,7 +13,7 @@ subroutine f01    implicit none    integer, allocatable :: a(:) -!ERROR: The ALLOCATORS construct should contain a single ALLOCATE statement +!ERROR: The body of an ALLOCATORS construct should be an ALLOCATE statement    !$omp allocators allocate(a)    !$omp end allocators  end @@ -22,6 +22,6 @@ subroutine f02    implicit none    integer, allocatable :: a(:) -!ERROR: The ALLOCATORS construct should contain a single ALLOCATE statement +!ERROR: The body of an ALLOCATORS construct should be an ALLOCATE statement    !$omp allocators allocate(a)  end diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt index ae555a25..4e6b419 100644 --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -47,8 +47,6 @@ set(LIBC_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})  set(LIBC_ENABLE_USE_BY_CLANG OFF CACHE BOOL "Whether or not to place libc in a build directory findable by a just built clang") -set(LIBC_KERNEL_HEADERS "/usr/include" CACHE STRING "Path to Linux kernel headers") -  # Defining a global namespace to enclose all libc functions.  set(default_namespace "__llvm_libc")  if(LLVM_VERSION_MAJOR) @@ -146,6 +144,11 @@ option(LLVM_LIBC_ALL_HEADERS "Outputs all functions in header files, regardless  option(LIBC_CONFIG_PATH "The path to user provided folder that configures the build for the target system." OFF) +if(LIBC_TARGET_OS_IS_LINUX) +  set(kernel_headers "/usr/include") +endif() +set(LIBC_KERNEL_HEADERS "${kernel_headers}" CACHE STRING "Path to Linux kernel headers") +  set(LIBC_ENABLE_UNITTESTS ON)  set(LIBC_ENABLE_HERMETIC_TESTS ${LLVM_LIBC_FULL_BUILD}) diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst index 980390c..58e0ee9 100644 --- a/libcxx/docs/ReleaseNotes/22.rst +++ b/libcxx/docs/ReleaseNotes/22.rst @@ -43,6 +43,8 @@ Implemented Papers  - P3044R2: sub-``string_view`` from ``string`` (`Github <https://llvm.org/PR148140>`__)  - P3223R2: Making ``std::istream::ignore`` less surprising (`Github <https://llvm.org/PR148178>`__)  - P3060R3: Add ``std::views::indices(n)`` (`Github <https://llvm.org/PR148175>`__) +- P2641R4: Checking if a ``union`` alternative is active (``std::is_within_lifetime``) +  (`Github <https://llvm.org/PR105381>`__)  - P2835R7: Expose ``std::atomic_ref``'s object address (`Github <https://llvm.org/PR118377>`__)  - P2944R3: Comparisons for ``reference_wrapper`` (`Github <https://llvm.org/PR105424>`__)  - P3168R2: Give ``std::optional`` Range Support (`Github <https://llvm.org/PR105430>`__) diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv index a5423ac..e0e47b8 100644 --- a/libcxx/docs/Status/Cxx2cPapers.csv +++ b/libcxx/docs/Status/Cxx2cPapers.csv @@ -18,7 +18,7 @@  "`P2874R2 <https://wg21.link/P2874R2>`__","P2874R2: Mandating Annex D Require No More","2023-06 (Varna)","|Complete|","12","`#105377 <https://github.com/llvm/llvm-project/issues/105377>`__",""  "`P2757R3 <https://wg21.link/P2757R3>`__","Type-checking format args","2023-06 (Varna)","","","`#105378 <https://github.com/llvm/llvm-project/issues/105378>`__",""  "`P2637R3 <https://wg21.link/P2637R3>`__","Member ``visit``","2023-06 (Varna)","|Complete|","19","`#105380 <https://github.com/llvm/llvm-project/issues/105380>`__","Change of ``__cpp_lib_variant`` is completed in LLVM 20. Change of ``__cpp_lib_format`` is blocked by `P2419R2 <https://wg21.link/P2419R2>`__." -"`P2641R4 <https://wg21.link/P2641R4>`__","Checking if a ``union`` alternative is active","2023-06 (Varna)","","","`#105381 <https://github.com/llvm/llvm-project/issues/105381>`__","" +"`P2641R4 <https://wg21.link/P2641R4>`__","Checking if a ``union`` alternative is active","2023-06 (Varna)","|Complete|","22","`#105381 <https://github.com/llvm/llvm-project/issues/105381>`__",""  "`P1759R6 <https://wg21.link/P1759R6>`__","Native handles and file streams","2023-06 (Varna)","|Complete|","18","`#105382 <https://github.com/llvm/llvm-project/issues/105382>`__",""  "`P2697R1 <https://wg21.link/P2697R1>`__","Interfacing ``bitset`` with ``string_view``","2023-06 (Varna)","|Complete|","18","`#105384 <https://github.com/llvm/llvm-project/issues/105384>`__",""  "`P1383R2 <https://wg21.link/P1383R2>`__","More ``constexpr`` for ``<cmath>`` and ``<complex>``","2023-06 (Varna)","","","`#105385 <https://github.com/llvm/llvm-project/issues/105385>`__","" diff --git a/libcxx/docs/TestingLibcxx.rst b/libcxx/docs/TestingLibcxx.rst index dbe6948..e15c5b1 100644 --- a/libcxx/docs/TestingLibcxx.rst +++ b/libcxx/docs/TestingLibcxx.rst @@ -451,7 +451,7 @@ Instead use:  .. code-block:: cpp -   // UNSUPPORTED: std-at-least-c++26 +   // REQUIRES: std-at-least-c++26  There is no corresponding ``std-at-most-c++23``. This could be useful when  tests are only valid for a small set of standard versions. For example, a diff --git a/libcxx/include/__configuration/availability.h b/libcxx/include/__configuration/availability.h index d0414ec..5433df8 100644 --- a/libcxx/include/__configuration/availability.h +++ b/libcxx/include/__configuration/availability.h @@ -118,14 +118,40 @@  #  define _LIBCPP_INTRODUCED_IN_LLVM_21_ATTRIBUTE __attribute__((unavailable))  // LLVM 20 -// TODO: Fill this in -#  define _LIBCPP_INTRODUCED_IN_LLVM_20 0 -#  define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE __attribute__((unavailable)) +// +// Note that versions for most Apple OSes were bumped forward and aligned in that release. +#  if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 260000) ||       \ +      (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 260000) ||     \ +      (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 260000) ||             \ +      (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 260000) ||       \ +      (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 100000) +#    define _LIBCPP_INTRODUCED_IN_LLVM_20 0 +#  else +#    define _LIBCPP_INTRODUCED_IN_LLVM_20 1 +#  endif +#  define _LIBCPP_INTRODUCED_IN_LLVM_20_ATTRIBUTE                                                                 \ +    __attribute__((availability(macos, strict, introduced = 26.0)))                                               \ +    __attribute__((availability(ios, strict, introduced = 26.0)))                                                 \ +    __attribute__((availability(tvos, strict, introduced = 26.0)))                                                \ +    __attribute__((availability(watchos, strict, introduced = 26.0)))                                             \ +    __attribute__((availability(bridgeos, strict, introduced = 10.0)))  // LLVM 19 -// TODO: Fill this in -#  define _LIBCPP_INTRODUCED_IN_LLVM_19 0 -#  define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE __attribute__((unavailable)) +#  if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150400) ||       \ +      (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 180400) ||     \ +      (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 180400) ||             \ +      (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 110400) ||       \ +      (defined(__ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_BRIDGE_OS_VERSION_MIN_REQUIRED__ < 90400) +#    define _LIBCPP_INTRODUCED_IN_LLVM_19 0 +#  else +#    define _LIBCPP_INTRODUCED_IN_LLVM_19 1 +#  endif +#  define _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE                                                                 \ +    __attribute__((availability(macos, strict, introduced = 15.4)))                                               \ +    __attribute__((availability(ios, strict, introduced = 18.4)))                                                 \ +    __attribute__((availability(tvos, strict, introduced = 18.4)))                                                \ +    __attribute__((availability(watchos, strict, introduced = 11.4)))                                             \ +    __attribute__((availability(bridgeos, strict, introduced = 9.4)))  // LLVM 18  #  if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 150000) ||       \ diff --git a/libcxx/include/__exception/exception_ptr.h b/libcxx/include/__exception/exception_ptr.h index 796fa92..e78126e 100644 --- a/libcxx/include/__exception/exception_ptr.h +++ b/libcxx/include/__exception/exception_ptr.h @@ -16,6 +16,8 @@  #include <__memory/construct_at.h>  #include <__type_traits/decay.h>  #include <__type_traits/is_pointer.h> +#include <__utility/move.h> +#include <__utility/swap.h>  #include <cstdlib>  #include <typeinfo> @@ -23,6 +25,9 @@  #  pragma GCC system_header  #endif +_LIBCPP_PUSH_MACROS +#include <__undef_macros> +  #ifndef _LIBCPP_ABI_MICROSOFT  #  if _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION @@ -57,6 +62,8 @@ _LIBCPP_BEGIN_UNVERSIONED_NAMESPACE_STD  #ifndef _LIBCPP_ABI_MICROSOFT +inline _LIBCPP_HIDE_FROM_ABI void swap(exception_ptr& __x, exception_ptr& __y) _NOEXCEPT; +  class _LIBCPP_EXPORTED_FROM_ABI exception_ptr {    void* __ptr_; @@ -75,7 +82,15 @@ public:    _LIBCPP_HIDE_FROM_ABI exception_ptr(nullptr_t) _NOEXCEPT : __ptr_() {}    exception_ptr(const exception_ptr&) _NOEXCEPT; +  _LIBCPP_HIDE_FROM_ABI exception_ptr(exception_ptr&& __other) _NOEXCEPT : __ptr_(__other.__ptr_) { +    __other.__ptr_ = nullptr; +  }    exception_ptr& operator=(const exception_ptr&) _NOEXCEPT; +  _LIBCPP_HIDE_FROM_ABI exception_ptr& operator=(exception_ptr&& __other) _NOEXCEPT { +    exception_ptr __tmp(std::move(__other)); +    std::swap(__tmp, *this); +    return *this; +  }    ~exception_ptr() _NOEXCEPT;    _LIBCPP_HIDE_FROM_ABI explicit operator bool() const _NOEXCEPT { return __ptr_ != nullptr; } @@ -88,10 +103,16 @@ public:      return !(__x == __y);    } +  friend _LIBCPP_HIDE_FROM_ABI void swap(exception_ptr& __x, exception_ptr& __y) _NOEXCEPT; +    friend _LIBCPP_EXPORTED_FROM_ABI exception_ptr current_exception() _NOEXCEPT;    friend _LIBCPP_EXPORTED_FROM_ABI void rethrow_exception(exception_ptr);  }; +inline _LIBCPP_HIDE_FROM_ABI void swap(exception_ptr& __x, exception_ptr& __y) _NOEXCEPT { +  std::swap(__x.__ptr_, __y.__ptr_); +} +  #  if _LIBCPP_HAS_EXCEPTIONS  #    if _LIBCPP_AVAILABILITY_HAS_INIT_PRIMARY_EXCEPTION  template <class _Ep> @@ -201,4 +222,6 @@ _LIBCPP_HIDE_FROM_ABI exception_ptr make_exception_ptr(_Ep __e) _NOEXCEPT {  #endif // _LIBCPP_ABI_MICROSOFT  _LIBCPP_END_UNVERSIONED_NAMESPACE_STD +_LIBCPP_POP_MACROS +  #endif // _LIBCPP___EXCEPTION_EXCEPTION_PTR_H diff --git a/libcxx/include/__format/formatter_output.h b/libcxx/include/__format/formatter_output.h index d53b6ce..63dd7fc 100644 --- a/libcxx/include/__format/formatter_output.h +++ b/libcxx/include/__format/formatter_output.h @@ -151,45 +151,41 @@ _LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, _CharT __value)    }  } -#  if _LIBCPP_HAS_UNICODE  template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt> -  requires(same_as<_CharT, char>)  _LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) { -  std::size_t __bytes = std::countl_one(static_cast<unsigned char>(__value.__data[0])); -  if (__bytes == 0) -    return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); - -  for (size_t __i = 0; __i < __n; ++__i) -    __out_it = __formatter::__copy( -        std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + __bytes, std::move(__out_it)); -  return __out_it; -} - +#  if _LIBCPP_HAS_UNICODE +  if constexpr (same_as<_CharT, char>) { +    std::size_t __bytes = std::countl_one(static_cast<unsigned char>(__value.__data[0])); +    if (__bytes == 0) +      return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); + +    for (size_t __i = 0; __i < __n; ++__i) +      __out_it = __formatter::__copy( +          std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + __bytes, std::move(__out_it)); +    return __out_it;  #    if _LIBCPP_HAS_WIDE_CHARACTERS -template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt> -  requires(same_as<_CharT, wchar_t> && sizeof(wchar_t) == 2) -_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) { -  if (!__unicode::__is_high_surrogate(__value.__data[0])) -    return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); - -  for (size_t __i = 0; __i < __n; ++__i) -    __out_it = __formatter::__copy( -        std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + 2, std::move(__out_it)); -  return __out_it; -} - -template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt> -  requires(same_as<_CharT, wchar_t> && sizeof(wchar_t) == 4) -_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) { -  return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); -} +  } else if constexpr (same_as<_CharT, wchar_t>) { +    if constexpr (sizeof(wchar_t) == 2) { +      if (!__unicode::__is_high_surrogate(__value.__data[0])) +        return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); + +      for (size_t __i = 0; __i < __n; ++__i) +        __out_it = __formatter::__copy( +            std::addressof(__value.__data[0]), std::addressof(__value.__data[0]) + 2, std::move(__out_it)); +      return __out_it; +    } else if constexpr (sizeof(wchar_t) == 4) { +      return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); +    } else { +      static_assert(false, "expected sizeof(wchar_t) to be 2 or 4"); +    }  #    endif // _LIBCPP_HAS_WIDE_CHARACTERS -#  else    // _LIBCPP_HAS_UNICODE -template <__fmt_char_type _CharT, output_iterator<const _CharT&> _OutIt> -_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, __format_spec::__code_point<_CharT> __value) { +  } else { +    static_assert(false, "Unexpected CharT"); +  } +#  else  // _LIBCPP_HAS_UNICODE    return __formatter::__fill(std::move(__out_it), __n, __value.__data[0]); +#  endif // _LIBCPP_HAS_UNICODE  } -#  endif   // _LIBCPP_HAS_UNICODE  /// Writes the input to the output with the required padding.  /// diff --git a/libcxx/include/__new/align_val_t.h b/libcxx/include/__new/align_val_t.h index 03ab7cb..d8ce528 100644 --- a/libcxx/include/__new/align_val_t.h +++ b/libcxx/include/__new/align_val_t.h @@ -16,6 +16,12 @@  #  pragma GCC system_header  #endif +// <vcruntime_exception.h> defines its own std::align_val_t type, +// which we use in order to be ABI-compatible with other STLs on Windows. +#if _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION && defined(_LIBCPP_ABI_VCRUNTIME) +#  include <vcruntime_new.h> +#endif +  _LIBCPP_BEGIN_UNVERSIONED_NAMESPACE_STD  #if _LIBCPP_HAS_LIBRARY_ALIGNED_ALLOCATION && !defined(_LIBCPP_ABI_VCRUNTIME)  #  ifndef _LIBCPP_CXX03_LANG diff --git a/libcxx/include/__new/exceptions.h b/libcxx/include/__new/exceptions.h index 8695181..483e5e3 100644 --- a/libcxx/include/__new/exceptions.h +++ b/libcxx/include/__new/exceptions.h @@ -17,6 +17,12 @@  #  pragma GCC system_header  #endif +// <vcruntime_exception.h> defines its own std::bad_alloc type, +// which we use in order to be ABI-compatible with other STLs on Windows. +#if defined(_LIBCPP_ABI_VCRUNTIME) +#  include <vcruntime_exception.h> +#endif +  _LIBCPP_BEGIN_UNVERSIONED_NAMESPACE_STD  #if !defined(_LIBCPP_ABI_VCRUNTIME) diff --git a/libcxx/include/string b/libcxx/include/string index 8f80afbc..ede4246 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -644,6 +644,7 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len );  #  include <__utility/forward.h>  #  include <__utility/is_pointer_in_range.h>  #  include <__utility/move.h> +#  include <__utility/no_destroy.h>  #  include <__utility/scope_guard.h>  #  include <__utility/swap.h>  #  include <climits> @@ -914,6 +915,11 @@ private:    union __rep {      __short __s;      __long __l; + +    __rep() = default; +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__short __r) : __s(__r) {} +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__long __r) : __l(__r) {} +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __rep(__uninitialized_tag) {}    };    _LIBCPP_COMPRESSED_PAIR(__rep, __rep_, allocator_type, __alloc_); @@ -1206,7 +1212,10 @@ public:    }  #  endif // _LIBCPP_CXX03_LANG -  inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string() { __reset_internal_buffer(); } +  // TODO(boomanaiden154): Once we mark this in destructors as dead on return, +  // we can use a normal call to __reset_internal_buffer and remove the extra +  // __rep constructor. +  inline _LIBCPP_CONSTEXPR_SINCE_CXX20 ~basic_string() { __reset_internal_buffer(__rep(__uninitialized_tag())); }    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 operator __self_view() const _NOEXCEPT {      return __self_view(typename __self_view::__assume_valid(), data(), size()); @@ -2259,18 +2268,12 @@ private:      return __long(__buffer, __capacity);    } -  // Deallocate the long buffer if it exists and clear the short buffer so we are an empty string -  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reset_internal_buffer() { +  // Replace the current buffer with __new_rep. Deallocate the old long buffer if it exists. +  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __reset_internal_buffer(__rep __new_rep = __short()) {      __annotate_delete();      if (__is_long())        __alloc_traits::deallocate(__alloc_, __get_long_pointer(), __get_long_cap()); -    __rep_.__s = __short(); -  } - -  // Replace the current buffer with __alloc; the first __size elements constitute a string -  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __replace_internal_buffer(__long __alloc) { -    __reset_internal_buffer(); -    __rep_.__l = __alloc; +    __rep_ = __new_rep;    }    // Initialize the internal buffer to hold __size elements @@ -2444,7 +2447,7 @@ private:          __annotate_delete();          auto __guard = std::__make_scope_guard(__annotate_new_size(*this));          auto __alloc = __str.__alloc_; -        __replace_internal_buffer(__allocate_long_buffer(__alloc, __str.size())); +        __reset_internal_buffer(__allocate_long_buffer(__alloc, __str.size()));          __alloc_ = std::move(__alloc);        }      } @@ -2710,7 +2713,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocator>::__                        __sec_cp_sz);    __buffer.__size_ = __n_copy + __n_add + __sec_cp_sz;    traits_type::assign(__buffer.__data_[__buffer.__size_], value_type()); -  __replace_internal_buffer(__buffer); +  __reset_internal_buffer(__buffer);  }  // __grow_by is deprecated because it does not set the size. It may not update the size when the size is changed, and it @@ -2746,7 +2749,7 @@ _LIBCPP_DEPRECATED_("use __grow_by_without_replace") basic_string<_CharT, _Trait    // This is -1 to make sure the caller sets the size properly, since old versions of this function didn't set the size    // at all.    __buffer.__size_ = -1; -  __replace_internal_buffer(__buffer); +  __reset_internal_buffer(__buffer);  }  template <class _CharT, class _Traits, class _Allocator> @@ -3394,7 +3397,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocator>::re    __long __buffer  = __allocate_long_buffer(__alloc_, __requested_capacity);    __buffer.__size_ = size();    traits_type::copy(std::__to_address(__buffer.__data_), data(), __buffer.__size_ + 1); -  __replace_internal_buffer(__buffer); +  __reset_internal_buffer(__buffer);  }  template <class _CharT, class _Traits, class _Allocator> @@ -3433,7 +3436,7 @@ inline _LIBCPP_CONSTEXPR_SINCE_CXX20 void basic_string<_CharT, _Traits, _Allocat      }      traits_type::copy(std::__to_address(__buffer.__data_), std::__to_address(__get_long_pointer()), __size + 1); -    __replace_internal_buffer(__buffer); +    __reset_internal_buffer(__buffer);  #  if _LIBCPP_HAS_EXCEPTIONS    } catch (...) {      return; diff --git a/libcxx/modules/std/exception.inc b/libcxx/modules/std/exception.inc index 02b0f80..3dbc011 100644 --- a/libcxx/modules/std/exception.inc +++ b/libcxx/modules/std/exception.inc @@ -18,6 +18,7 @@ export namespace std {    using std::rethrow_exception;    using std::rethrow_if_nested;    using std::set_terminate; +  using std::swap;    using std::terminate;    using std::terminate_handler;    using std::throw_with_nested; diff --git a/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp b/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp index 16d66e3..e5d48a3 100644 --- a/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp +++ b/libcxx/test/libcxx/input.output/iostreams.base/ios.base/ios.base.cons/dtor.uninitialized.pass.cpp @@ -10,8 +10,7 @@  // The fix for issue 57964 requires an updated dylib due to explicit  // instantiations. That means Apple backdeployment targets remain broken. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  // <ios> diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp index 00aa97a..72af0a2 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp @@ -12,8 +12,7 @@  // This test requires the fix to https://llvm.org/PR60509 in the dylib,  // which landed in 5afb937d8a30445642ccaf33866ee4cdd0713222. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  #include <fstream>  #include <cstddef> diff --git a/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp b/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp index b04d2c0..79d20ce 100644 --- a/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp @@ -13,8 +13,7 @@  // The fix for bug 51497 and bug 51499 require and updated dylib due to  // explicit instantiations. That means Apple backdeployment targets remain  // broken. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  #include <istream>  #include <cassert> diff --git a/libcxx/test/std/language.support/support.exception/propagation/exception_ptr.pass.cpp b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr.pass.cpp index 0aded33..7e25d40 100644 --- a/libcxx/test/std/language.support/support.exception/propagation/exception_ptr.pass.cpp +++ b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr.pass.cpp @@ -14,7 +14,6 @@  #include <exception>  #include <cassert> -#include <type_traits>  #include "test_macros.h" diff --git a/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_move_assignment.pass.cpp b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_move_assignment.pass.cpp new file mode 100644 index 0000000..6882bc6 --- /dev/null +++ b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_move_assignment.pass.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: no-exceptions, c++03 + +// <exception> + +// typedef unspecified exception_ptr; + +// Test the move assignment of exception_ptr + +#include <exception> +#include <utility> +#include <cassert> + +#include "test_macros.h" + +int main(int, char**) { +  std::exception_ptr p = std::make_exception_ptr(42); +  std::exception_ptr p2{p}; +  assert(p2 == p); +  // Under test: the move assignment +  std::exception_ptr p3; +  p3 = std::move(p2); +  assert(p3 == p); +// `p2` was moved from. In libc++ it will be nullptr, but +// this is not guaranteed by the standard. +#if defined(_LIBCPP_VERSION) && !defined(_LIBCPP_ABI_MICROSOFT) +  assert(p2 == nullptr); +  assert(p2 == nullptr); +#endif + +  try { +    std::rethrow_exception(p3); +  } catch (int e) { +    assert(e == 42); +  } + +  return 0; +} diff --git a/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_move_ctr.pass.cpp b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_move_ctr.pass.cpp new file mode 100644 index 0000000..122e229 --- /dev/null +++ b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_move_ctr.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: no-exceptions, c++03 + +// <exception> + +// typedef unspecified exception_ptr; + +// Test the move constructor of exception_ptr + +#include <exception> +#include <utility> +#include <cassert> + +#include "test_macros.h" + +int main(int, char**) { +  std::exception_ptr p = std::make_exception_ptr(42); +  std::exception_ptr p2{p}; +  assert(p2 == p); +  // Under test: The move constructor +  std::exception_ptr p3{std::move(p2)}; +  assert(p3 == p); +// `p2` was moved from. In libc++ it will be nullptr, but +// this is not guaranteed by the standard. +#if defined(_LIBCPP_VERSION) && !defined(_LIBCPP_ABI_MICROSOFT) +  assert(p2 == nullptr); +#endif + +  try { +    std::rethrow_exception(p3); +  } catch (int e) { +    assert(e == 42); +  } + +  return 0; +} diff --git a/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_swap.pass.cpp b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_swap.pass.cpp new file mode 100644 index 0000000..82b4713 --- /dev/null +++ b/libcxx/test/std/language.support/support.exception/propagation/exception_ptr_swap.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: no-exceptions + +// <exception> + +// typedef unspecified exception_ptr; + +// Test swapping of exception_ptr + +#include <exception> +#include <utility> +#include <cassert> + +#include "test_macros.h" + +int main(int, char**) { +  std::exception_ptr p21 = std::make_exception_ptr(42); +  std::exception_ptr p42 = std::make_exception_ptr(21); +  std::swap(p42, p21); + +  try { +    std::rethrow_exception(p21); +  } catch (int e) { +    assert(e == 21); +  } +  try { +    std::rethrow_exception(p42); +  } catch (int e) { +    assert(e == 42); +  } + +  return 0; +} diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp index 31682fea..a388c0b 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp @@ -8,8 +8,7 @@  // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of  // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  // <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp index 57eedc8..596d81c 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp @@ -8,8 +8,7 @@  // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of  // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  // <locale> diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp index 8324ee3..8a9fd41 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_long_double.pass.cpp @@ -8,8 +8,7 @@  // The fix for LWG2381 (https://github.com/llvm/llvm-project/pull/77948) changed behavior of  // FP parsing. This requires 3e15c97fa3812993bdc319827a5c6d867b765ae8 in the dylib. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  // <locale> diff --git a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp index 5eb3240..8e59195 100644 --- a/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/over_max_size.pass.cpp @@ -8,11 +8,13 @@  // UNSUPPORTED: no-exceptions -// After changing the alignment of the allocated pointer from 16 to 8, the exception -// thrown is no longer `bad_alloc` but instead length_error on systems using new -// headers but a dylib that doesn't contain 04ce0ba. +// This test fails when using a built library that does not contain +// 15860446a8c3, which changed the return value of max_size(). Without +// that change, the built library believes the max size to be one greater +// than it really is, and we fail to throw `length_error` from `string::resize()`, +// which is explicitly instantiated in the built library.  // -// XFAIL: using-built-library-before-llvm-19 +// XFAIL: using-built-library-before-llvm-21  // <string> diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index 7d6e78d..5da1d9a 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -734,16 +734,44 @@ DEFAULT_FEATURES += [  # Those are used for backdeployment features below, do not use directly in tests.  DEFAULT_FEATURES += [      Feature( +        name="_target-has-llvm-22", +        when=lambda cfg: BooleanExpression.evaluate( +            "TBD", +            cfg.available_features, +        ), +    ), +    Feature( +        name="_target-has-llvm-21", +        when=lambda cfg: BooleanExpression.evaluate( +            "TBD", +            cfg.available_features, +        ), +    ), +    Feature( +        name="_target-has-llvm-20", +        when=lambda cfg: BooleanExpression.evaluate( +            "_target-has-llvm-21 || target={{.+}}-apple-macosx{{26.[0-9](.\d+)?}}", +            cfg.available_features, +        ), +    ), +    Feature( +        name="_target-has-llvm-19", +        when=lambda cfg: BooleanExpression.evaluate( +            "_target-has-llvm-20 || target={{.+}}-apple-macosx{{15.[4-9](.\d+)?}}", +            cfg.available_features, +        ), +    ), +    Feature(          name="_target-has-llvm-18",          when=lambda cfg: BooleanExpression.evaluate( -            "target={{.+}}-apple-macosx{{15(.[0-9]+)?(.[0-9]+)?}}", +            "_target-has-llvm-19 || target={{.+}}-apple-macosx{{15.[0-3](.\d+)?}}",              cfg.available_features,          ),      ),      Feature(          name="_target-has-llvm-17",          when=lambda cfg: BooleanExpression.evaluate( -            "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.[0-9]+)?}} || target={{.+}}-apple-macosx{{1[5-9]([.].+)?}}", +            "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.\d+)?}}",              cfg.available_features,          ),      ), @@ -821,7 +849,7 @@ DEFAULT_FEATURES += [  # a libc++ flavor that enables availability markup. Similarly, a test could fail when  # run against the system library of an older version of FreeBSD, even though FreeBSD  # doesn't provide availability markup at the time of writing this. -for version in ("12", "13", "14", "15", "16", "17", "18", "19", "20"): +for version in ("12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22"):      DEFAULT_FEATURES.append(          Feature(              name="using-built-library-before-llvm-{}".format(version), diff --git a/libcxxabi/src/demangle/Utility.h b/libcxxabi/src/demangle/Utility.h index 8829f3f..76243f5 100644 --- a/libcxxabi/src/demangle/Utility.h +++ b/libcxxabi/src/demangle/Utility.h @@ -81,7 +81,7 @@ public:    OutputBuffer(const OutputBuffer &) = delete;    OutputBuffer &operator=(const OutputBuffer &) = delete; -  virtual ~OutputBuffer() {} +  virtual ~OutputBuffer() = default;    operator std::string_view() const {      return std::string_view(Buffer, CurrentPosition); diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 858347b..6790d70 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -13,6 +13,10 @@  // dd8b266ef.  // UNSUPPORTED: using-built-library-before-llvm-20 +// This test exercises support for BitInt demangling introduced in +// 20f56d140909a01c74e9981835373eaab6021af9. +// UNSUPPORTED: using-built-library-before-llvm-21 +  // XFAIL: win32-broken-printf-a-precision  #include "support/timer.h" diff --git a/libcxxabi/test/uncaught_exception.pass.cpp b/libcxxabi/test/uncaught_exception.pass.cpp index e977320..cace88a 100644 --- a/libcxxabi/test/uncaught_exception.pass.cpp +++ b/libcxxabi/test/uncaught_exception.pass.cpp @@ -15,8 +15,7 @@  // to undefined symbols when linking against a libc++ that re-exports the symbols,  // but running against a libc++ that doesn't. Fortunately, usage of __cxa_uncaught_exception()  // in the wild seems to be close to non-existent. -// TODO: Remove && !darwin once availability markup for LLVM 19 on macOS has been added -// XFAIL: using-built-library-before-llvm-19 && !darwin +// XFAIL: using-built-library-before-llvm-19  #include <cxxabi.h>  #include <cassert> diff --git a/lldb/CMakeLists.txt b/lldb/CMakeLists.txt index e3b72e9..01b5546 100644 --- a/lldb/CMakeLists.txt +++ b/lldb/CMakeLists.txt @@ -87,6 +87,12 @@ if (LLDB_ENABLE_PYTHON)        set(LLDB_PYTHON_EXT_SUFFIX "_d${LLDB_PYTHON_EXT_SUFFIX}")      endif()    endif() +  if(TARGET Python3::Python) +    get_target_property(_Python3_LIB_PATH Python3::Python IMPORTED_LIBRARY_LOCATION) +    if(_Python3_LIB_PATH) +      get_filename_component(LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME "${_Python3_LIB_PATH}" NAME) +    endif() +  endif()  endif ()  if (LLDB_ENABLE_LUA) diff --git a/lldb/include/lldb/Target/InstrumentationRuntime.h b/lldb/include/lldb/Target/InstrumentationRuntime.h index a6121c2..d249952 100644 --- a/lldb/include/lldb/Target/InstrumentationRuntime.h +++ b/lldb/include/lldb/Target/InstrumentationRuntime.h @@ -73,6 +73,13 @@ protected:    /// is guaranteed to be loaded.    virtual void Activate() = 0; +  /// \return true if `CheckIfRuntimeIsValid` should be called on all modules. +  /// In this case the return value of `GetPatternForRuntimeLibrary` will be +  /// ignored. Return false if `CheckIfRuntimeIsValid` should only be called +  /// for modules whose name matches `GetPatternForRuntimeLibrary`. +  /// +  virtual bool MatchAllModules() { return false; } +  public:    static void ModulesDidLoad(lldb_private::ModuleList &module_list,                               Process *process, diff --git a/lldb/include/lldb/Utility/Stream.h b/lldb/include/lldb/Utility/Stream.h index 82774d5..1345555 100644 --- a/lldb/include/lldb/Utility/Stream.h +++ b/lldb/include/lldb/Utility/Stream.h @@ -300,6 +300,12 @@ public:    ///     The current indentation level.    unsigned GetIndentLevel() const; +  /// Set the current indentation level. +  /// +  /// \param[in] level +  ///     The new indentation level. +  void SetIndentLevel(unsigned level); +    /// Indent the current line in the stream.    ///    /// Indent the current line using the current indentation level and print an @@ -315,6 +321,20 @@ public:    /// Increment the current indentation level.    void IndentMore(unsigned amount = 2); +  struct IndentScope { +    IndentScope(Stream &stream) +        : m_stream(stream), m_original_indent_level(stream.GetIndentLevel()) {} +    ~IndentScope() { m_stream.SetIndentLevel(m_original_indent_level); } + +  private: +    Stream &m_stream; +    unsigned m_original_indent_level; +  }; + +  /// Create an indentation scope that restores the original indent level when +  /// the object goes out of scope (RAII). +  IndentScope MakeIndentScope(unsigned indent_amount = 2); +    /// Output an offset value.    ///    /// Put an offset \a uval out to the stream using the printf format in \a @@ -364,12 +384,6 @@ public:    ///     address and pointer values.    void SetAddressByteSize(uint32_t addr_size); -  /// Set the current indentation level. -  /// -  /// \param[in] level -  ///     The new indentation level. -  void SetIndentLevel(unsigned level); -    /// Output a SLEB128 number to the stream.    ///    /// Put an SLEB128 \a uval out to the stream using the printf format in \a diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 49841e7..e06e69f 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2735,9 +2735,8 @@ static void ApplyELF64ABS64Relocation(Symtab *symtab, ELFRelocation &rel,      // ObjectFileELF creates a WritableDataBuffer in CreateInstance.      WritableDataBuffer *data_buffer =          llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); -    uint64_t *dst = reinterpret_cast<uint64_t *>( -        data_buffer->GetBytes() + rel_section->GetFileOffset() + -        ELFRelocation::RelocOffset64(rel)); +    void *const dst = data_buffer->GetBytes() + rel_section->GetFileOffset() + +                      ELFRelocation::RelocOffset64(rel);      uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel);      memcpy(dst, &val_offset, sizeof(uint64_t));    } @@ -2762,9 +2761,8 @@ static void ApplyELF64ABS32Relocation(Symtab *symtab, ELFRelocation &rel,      // ObjectFileELF creates a WritableDataBuffer in CreateInstance.      WritableDataBuffer *data_buffer =          llvm::cast<WritableDataBuffer>(data_buffer_sp.get()); -    uint32_t *dst = reinterpret_cast<uint32_t *>( -        data_buffer->GetBytes() + rel_section->GetFileOffset() + -        ELFRelocation::RelocOffset32(rel)); +    void *const dst = data_buffer->GetBytes() + rel_section->GetFileOffset() + +                      ELFRelocation::RelocOffset32(rel);      memcpy(dst, &truncated_addr, sizeof(uint32_t));    }  } diff --git a/lldb/source/Target/InstrumentationRuntime.cpp b/lldb/source/Target/InstrumentationRuntime.cpp index 7e58e8b..d9800a8 100644 --- a/lldb/source/Target/InstrumentationRuntime.cpp +++ b/lldb/source/Target/InstrumentationRuntime.cpp @@ -55,7 +55,8 @@ void InstrumentationRuntime::ModulesDidLoad(        return IterationAction::Continue;      const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary(); -    if (runtime_regex.Execute(file_spec.GetFilename().GetCString()) || +    if (MatchAllModules() || +        runtime_regex.Execute(file_spec.GetFilename().GetCString()) ||          module_sp->IsExecutable()) {        if (CheckIfRuntimeIsValid(module_sp)) {          SetRuntimeModuleSP(module_sp); diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 1e43094..a23091a 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -3962,9 +3962,7 @@ void Target::StopHook::GetDescription(Stream &s,      return;    } -  unsigned indent_level = s.GetIndentLevel(); - -  s.SetIndentLevel(indent_level + 2); +  auto indent_scope = s.MakeIndentScope();    s.Printf("Hook: %" PRIu64 "\n", GetID());    if (m_active) @@ -3978,19 +3976,17 @@ void Target::StopHook::GetDescription(Stream &s,    if (m_specifier_sp) {      s.Indent();      s.PutCString("Specifier:\n"); -    s.SetIndentLevel(indent_level + 4); +    auto indent_scope = s.MakeIndentScope();      m_specifier_sp->GetDescription(&s, level); -    s.SetIndentLevel(indent_level + 2);    }    if (m_thread_spec_up) {      StreamString tmp;      s.Indent("Thread:\n");      m_thread_spec_up->GetDescription(&tmp, level); -    s.SetIndentLevel(indent_level + 4); +    auto indent_scope = s.MakeIndentScope();      s.Indent(tmp.GetString());      s.PutCString("\n"); -    s.SetIndentLevel(indent_level + 2);    }    GetSubclassDescription(s, level);  } @@ -4003,14 +3999,13 @@ void Target::StopHookCommandLine::GetSubclassDescription(        s.PutCString(m_commands.GetStringAtIndex(0));      return;    } -  s.Indent("Commands: \n"); -  s.SetIndentLevel(s.GetIndentLevel() + 4); +  s.Indent("Commands:\n"); +  auto indent_scope = s.MakeIndentScope(4);    uint32_t num_commands = m_commands.GetSize();    for (uint32_t i = 0; i < num_commands; i++) {      s.Indent(m_commands.GetStringAtIndex(i));      s.PutCString("\n");    } -  s.SetIndentLevel(s.GetIndentLevel() - 4);  }  // Target::StopHookCommandLine @@ -4145,7 +4140,7 @@ void Target::StopHookScripted::GetSubclassDescription(      return;    s.Indent("Args:\n"); -  s.SetIndentLevel(s.GetIndentLevel() + 4); +  auto indent_scope = s.MakeIndentScope(4);    auto print_one_element = [&s](llvm::StringRef key,                                  StructuredData::Object *object) { @@ -4155,8 +4150,6 @@ void Target::StopHookScripted::GetSubclassDescription(    };    as_dict->ForEach(print_one_element); - -  s.SetIndentLevel(s.GetIndentLevel() - 4);  }  static constexpr OptionEnumValueElement g_dynamic_value_types[] = { diff --git a/lldb/source/Utility/Stream.cpp b/lldb/source/Utility/Stream.cpp index 89dce9f..e9632c3 100644 --- a/lldb/source/Utility/Stream.cpp +++ b/lldb/source/Utility/Stream.cpp @@ -202,6 +202,14 @@ void Stream::IndentLess(unsigned amount) {      m_indent_level = 0;  } +// Create an indentation scope that restores the original indent level when the +// object goes out of scope (RAII). +Stream::IndentScope Stream::MakeIndentScope(unsigned indent_amount) { +  IndentScope indent_scope(*this); +  IndentMore(indent_amount); +  return indent_scope; +} +  // Get the address size in bytes  uint32_t Stream::GetAddressByteSize() const { return m_addr_size; } diff --git a/lldb/test/API/commands/expression/weak_symbols/TestWeakSymbols.py b/lldb/test/API/commands/expression/weak_symbols/TestWeakSymbols.py index 50efecb..bed129a 100644 --- a/lldb/test/API/commands/expression/weak_symbols/TestWeakSymbols.py +++ b/lldb/test/API/commands/expression/weak_symbols/TestWeakSymbols.py @@ -15,7 +15,7 @@ class TestWeakSymbolsInExpressions(TestBase):      NO_DEBUG_INFO_TESTCASE = True      @skipUnlessDarwin -    @skipIf(compiler="clang", compiler_version=["<", "7.0"]) +    @skipIf(compiler="clang", compiler_version=["<", "19.0"])      def test_weak_symbol_in_expr(self):          """Tests that we can refer to weak symbols in expressions."""          self.build() diff --git a/lldb/test/API/lang/cpp/libcxx-internals-recognizer/TestLibcxxInternalsRecognizer.py b/lldb/test/API/lang/cpp/libcxx-internals-recognizer/TestLibcxxInternalsRecognizer.py index 2f942da..d8a729b 100644 --- a/lldb/test/API/lang/cpp/libcxx-internals-recognizer/TestLibcxxInternalsRecognizer.py +++ b/lldb/test/API/lang/cpp/libcxx-internals-recognizer/TestLibcxxInternalsRecognizer.py @@ -9,7 +9,7 @@ class LibCxxInternalsRecognizerTestCase(TestBase):      NO_DEBUG_INFO_TESTCASE = True      @add_test_categories(["libc++"]) -    @skipIf(compiler="clang", compiler_version=["<=", "19.0"]) +    @skipIf(compiler="clang", compiler_version=["<", "19.0"])      def test_frame_recognizer(self):          """Test that implementation details of libc++ are hidden"""          self.build() diff --git a/lldb/test/API/lang/objc/modules-auto-import/TestModulesAutoImport.py b/lldb/test/API/lang/objc/modules-auto-import/TestModulesAutoImport.py index 142d27d..f3558f6 100644 --- a/lldb/test/API/lang/objc/modules-auto-import/TestModulesAutoImport.py +++ b/lldb/test/API/lang/objc/modules-auto-import/TestModulesAutoImport.py @@ -16,6 +16,7 @@ class ObjCModulesAutoImportTestCase(TestBase):          self.line = line_number("main.m", "// Set breakpoint 0 here.")      @skipIf(macos_version=["<", "10.12"]) +    @skipIf(compiler="clang", compiler_version=["<", "19.0"])      def test_expr(self):          self.build()          exe = self.getBuildArtifact("a.out") diff --git a/lldb/test/API/lang/objc/modules-objc-property/TestModulesObjCProperty.py b/lldb/test/API/lang/objc/modules-objc-property/TestModulesObjCProperty.py index 3be064a..657a710 100644 --- a/lldb/test/API/lang/objc/modules-objc-property/TestModulesObjCProperty.py +++ b/lldb/test/API/lang/objc/modules-objc-property/TestModulesObjCProperty.py @@ -6,6 +6,7 @@ from lldbsuite.test import lldbutil  class TestCase(TestBase):      @no_debug_info_test +    @skipIf(compiler="clang", compiler_version=["<", "19.0"])      def test_conflicting_properties(self):          """Tests receiving two properties with the same name from modules."""          self.build() diff --git a/lldb/test/Shell/DAP/TestClientLauncher.test b/lldb/test/Shell/DAP/TestClientLauncher.test new file mode 100644 index 0000000..a79a940 --- /dev/null +++ b/lldb/test/Shell/DAP/TestClientLauncher.test @@ -0,0 +1,2 @@ +# RUN: lldb-dap --client vscode-url -- /path/to/foo | FileCheck %s +# CHECK: vscode://llvm-vs-code-extensions.lldb-dap/start?program=%2Fpath%2Fto%2Ffoo diff --git a/lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test b/lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test new file mode 100644 index 0000000..a955780 --- /dev/null +++ b/lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test @@ -0,0 +1,36 @@ +# Test format (e.g., indentation) when printing the list of stop hooks. +# +# RUN: %lldb -b -s %s | FileCheck %s --match-full-lines --strict-whitespace + +# Create some stop hooks +target stop-hook add -o 'print "Hello"' --auto-continue true --at-initial-stop true +target stop-hook add -o 'print "world,"' -o 'print "nice"' --file 'my_file' +target stop-hook add -o 'print "weather!"'  --classname 'MyClass' --thread-name 'my_thread' + +# Print hooks +target stop-hook list + +# CHECK:(lldb) target stop-hook list +# CHECK:Hook: 1 +# CHECK:  State: enabled +# CHECK:  AutoContinue on +# CHECK:  Commands: +# CHECK:      print "Hello" +# CHECK-EMPTY: +# CHECK:Hook: 2 +# CHECK:  State: enabled +# CHECK:  Specifier: +# CHECK:    File: my_file. +# CHECK:  Commands: +# CHECK:      print "world," +# CHECK:      print "nice" +# CHECK-EMPTY: +# CHECK:Hook: 3 +# CHECK:  State: enabled +# CHECK:  Specifier: +# CHECK:    Class name: MyClass. +# CHECK:  Thread: +# CHECK:    thread name: "my_thread"  +# CHECK:  Commands: +# CHECK:      print "weather!" +# CHECK-EMPTY: diff --git a/lldb/tools/driver/CMakeLists.txt b/lldb/tools/driver/CMakeLists.txt index 67956af..efe5150 100644 --- a/lldb/tools/driver/CMakeLists.txt +++ b/lldb/tools/driver/CMakeLists.txt @@ -37,6 +37,9 @@ add_dependencies(lldb  if(DEFINED LLDB_PYTHON_DLL_RELATIVE_PATH)    target_compile_definitions(lldb PRIVATE LLDB_PYTHON_DLL_RELATIVE_PATH="${LLDB_PYTHON_DLL_RELATIVE_PATH}")  endif() +if(DEFINED LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME) +  target_compile_definitions(lldb PRIVATE LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME="${LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME}") +endif()  if(LLDB_BUILD_FRAMEWORK)    # In the build-tree, we know the exact path to the framework directory. diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index 733331f..bebf1a7 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -433,7 +433,8 @@ SBError Driver::ProcessArgs(const opt::InputArgList &args, bool &exiting) {    return error;  } -#if defined(_WIN32) && defined(LLDB_PYTHON_DLL_RELATIVE_PATH) +#ifdef _WIN32 +#ifdef LLDB_PYTHON_DLL_RELATIVE_PATH  /// Returns the full path to the lldb.exe executable.  inline std::wstring GetPathToExecutableW() {    // Iterate until we reach the Windows API maximum path length (32,767). @@ -447,30 +448,73 @@ inline std::wstring GetPathToExecutableW() {    return L"";  } -/// Resolve the full path of the directory defined by +/// \brief Resolve the full path of the directory defined by  /// LLDB_PYTHON_DLL_RELATIVE_PATH. If it exists, add it to the list of DLL  /// search directories. -void AddPythonDLLToSearchPath() { +/// \return `true` if the library was added to the search path. +/// `false` otherwise. +bool AddPythonDLLToSearchPath() {    std::wstring modulePath = GetPathToExecutableW(); -  if (modulePath.empty()) { -    llvm::errs() << "error: unable to find python.dll." << '\n'; -    return; -  } +  if (modulePath.empty()) +    return false;    SmallVector<char, MAX_PATH> utf8Path;    if (sys::windows::UTF16ToUTF8(modulePath.c_str(), modulePath.length(),                                  utf8Path)) -    return; +    return false;    sys::path::remove_filename(utf8Path);    sys::path::append(utf8Path, LLDB_PYTHON_DLL_RELATIVE_PATH);    sys::fs::make_absolute(utf8Path);    SmallVector<wchar_t, 1> widePath;    if (sys::windows::widenPath(utf8Path.data(), widePath)) -    return; +    return false;    if (sys::fs::exists(utf8Path)) -    SetDllDirectoryW(widePath.data()); +    return SetDllDirectoryW(widePath.data()); +  return false; +} +#endif + +#ifdef LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME +/// Returns whether `python3x.dll` is in the DLL search path. +bool IsPythonDLLInPath() { +#define WIDEN2(x) L##x +#define WIDEN(x) WIDEN2(x) +  WCHAR foundPath[MAX_PATH]; +  DWORD result = +      SearchPathW(nullptr, WIDEN(LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME), nullptr, +                  MAX_PATH, foundPath, nullptr); +#undef WIDEN2 +#undef WIDEN + +  return result > 0; +} +#endif + +/// Try to setup the DLL search path for the Python Runtime Library +/// (python3xx.dll). +/// +/// If `LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME` is set, we first check if +/// python3xx.dll is in the search path. If it's not, we try to add it and +/// check for it a second time. +/// If only `LLDB_PYTHON_DLL_RELATIVE_PATH` is set, we try to add python3xx.dll +/// to the search path python.dll is already in the search path or not. +void SetupPythonRuntimeLibrary() { +#ifdef LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME +  if (IsPythonDLLInPath()) +    return; +#ifdef LLDB_PYTHON_DLL_RELATIVE_PATH +  if (AddPythonDLLToSearchPath() && IsPythonDLLInPath()) +    return; +#endif +  llvm::errs() << "error: unable to find '" +               << LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME << "'.\n"; +  return; +#elif defined(LLDB_PYTHON_DLL_RELATIVE_PATH) +  if (!AddPythonDLLToSearchPath()) +    llvm::errs() << "error: unable to find the Python runtime library.\n"; +#endif  }  #endif @@ -776,8 +820,8 @@ int main(int argc, char const *argv[]) {                          "~/Library/Logs/DiagnosticReports/.\n");  #endif -#if defined(_WIN32) && defined(LLDB_PYTHON_DLL_RELATIVE_PATH) -  AddPythonDLLToSearchPath(); +#ifdef _WIN32 +  SetupPythonRuntimeLibrary();  #endif    // Parse arguments. diff --git a/lldb/tools/lldb-dap/CMakeLists.txt b/lldb/tools/lldb-dap/CMakeLists.txt index dd1bbbd..fa940b7 100644 --- a/lldb/tools/lldb-dap/CMakeLists.txt +++ b/lldb/tools/lldb-dap/CMakeLists.txt @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS Support)  add_lldb_library(lldbDAP    Breakpoint.cpp    BreakpointBase.cpp +  ClientLauncher.cpp    CommandPlugins.cpp    DAP.cpp    DAPError.cpp diff --git a/lldb/tools/lldb-dap/ClientLauncher.cpp b/lldb/tools/lldb-dap/ClientLauncher.cpp new file mode 100644 index 0000000..4cac1d6 --- /dev/null +++ b/lldb/tools/lldb-dap/ClientLauncher.cpp @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "ClientLauncher.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/FormatVariadic.h" + +using namespace lldb_dap; + +std::optional<ClientLauncher::Client> +ClientLauncher::GetClientFrom(llvm::StringRef str) { +  return llvm::StringSwitch<std::optional<ClientLauncher::Client>>(str.lower()) +      .Case("vscode", ClientLauncher::VSCode) +      .Case("vscode-url", ClientLauncher::VSCodeURL) +      .Default(std::nullopt); +} + +std::unique_ptr<ClientLauncher> +ClientLauncher::GetLauncher(ClientLauncher::Client client) { +  switch (client) { +  case ClientLauncher::VSCode: +    return std::make_unique<VSCodeLauncher>(); +  case ClientLauncher::VSCodeURL: +    return std::make_unique<VSCodeURLPrinter>(); +  } +  return nullptr; +} + +std::string VSCodeLauncher::URLEncode(llvm::StringRef str) { +  std::string out; +  llvm::raw_string_ostream os(out); +  for (char c : str) { +    if (std::isalnum(c) || llvm::StringRef("-_.~").contains(c)) +      os << c; +    else +      os << '%' << llvm::utohexstr(c, false, 2); +  } +  return os.str(); +} + +std::string +VSCodeLauncher::GetLaunchURL(const std::vector<llvm::StringRef> args) const { +  assert(!args.empty() && "empty launch args"); + +  std::vector<std::string> encoded_launch_args; +  for (llvm::StringRef arg : args) +    encoded_launch_args.push_back(URLEncode(arg)); + +  const std::string args_str = llvm::join(encoded_launch_args, "&args="); +  return llvm::formatv( +             "vscode://llvm-vs-code-extensions.lldb-dap/start?program={0}", +             args_str) +      .str(); +} + +llvm::Error VSCodeLauncher::Launch(const std::vector<llvm::StringRef> args) { +  const std::string launch_url = GetLaunchURL(args); +  const std::string command = +      llvm::formatv("code --open-url {0}", launch_url).str(); + +  std::system(command.c_str()); +  return llvm::Error::success(); +} + +llvm::Error VSCodeURLPrinter::Launch(const std::vector<llvm::StringRef> args) { +  llvm::outs() << GetLaunchURL(args) << '\n'; +  return llvm::Error::success(); +} diff --git a/lldb/tools/lldb-dap/ClientLauncher.h b/lldb/tools/lldb-dap/ClientLauncher.h new file mode 100644 index 0000000..780b178 --- /dev/null +++ b/lldb/tools/lldb-dap/ClientLauncher.h @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_TOOLS_LLDB_DAP_CLIENTLAUNCHER_H +#define LLDB_TOOLS_LLDB_DAP_CLIENTLAUNCHER_H + +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/Error.h" +#include <vector> + +namespace lldb_dap { + +class ClientLauncher { +public: +  enum Client { +    VSCode, +    VSCodeURL, +  }; + +  virtual ~ClientLauncher() = default; +  virtual llvm::Error Launch(const std::vector<llvm::StringRef> args) = 0; + +  static std::optional<Client> GetClientFrom(llvm::StringRef str); +  static std::unique_ptr<ClientLauncher> GetLauncher(Client client); +}; + +class VSCodeLauncher : public ClientLauncher { +public: +  using ClientLauncher::ClientLauncher; + +  llvm::Error Launch(const std::vector<llvm::StringRef> args) override; + +  std::string GetLaunchURL(const std::vector<llvm::StringRef> args) const; +  static std::string URLEncode(llvm::StringRef str); +}; + +class VSCodeURLPrinter : public VSCodeLauncher { +  using VSCodeLauncher::VSCodeLauncher; + +  llvm::Error Launch(const std::vector<llvm::StringRef> args) override; +}; + +} // namespace lldb_dap + +#endif diff --git a/lldb/tools/lldb-dap/tool/Options.td b/lldb/tools/lldb-dap/tool/Options.td index 5e9dd7a..339a64f 100644 --- a/lldb/tools/lldb-dap/tool/Options.td +++ b/lldb/tools/lldb-dap/tool/Options.td @@ -82,3 +82,11 @@ def connection_timeout: S<"connection-timeout">,      "timeout is reached, the server will be closed and the process will exit. "      "Not specifying this argument or specifying non-positive values will "      "cause the server to wait for new connections indefinitely.">; + +def client +    : S<"client">, +      MetaVarName<"<client>">, +      HelpText< +          "Use lldb-dap as a launcher for a curated number of DAP client.">; + +def REM : R<["--"], "">; diff --git a/lldb/tools/lldb-dap/tool/lldb-dap.cpp b/lldb/tools/lldb-dap/tool/lldb-dap.cpp index 45caa1a..f10ed12 100644 --- a/lldb/tools/lldb-dap/tool/lldb-dap.cpp +++ b/lldb/tools/lldb-dap/tool/lldb-dap.cpp @@ -6,6 +6,7 @@  //  //===----------------------------------------------------------------------===// +#include "ClientLauncher.h"  #include "DAP.h"  #include "DAPLog.h"  #include "EventHelper.h" @@ -141,6 +142,12 @@ EXAMPLES:    debugger to attach to the process.      lldb-dap -g + +  You can also use lldb-dap to launch a supported client, for example the +  LLDB-DAP Visual Studio Code extension. + +    lldb-dap --client vscode -- /path/to/binary <args> +  )___";  } @@ -150,6 +157,29 @@ static void PrintVersion() {    llvm::outs() << "liblldb: " << lldb::SBDebugger::GetVersionString() << '\n';  } +static llvm::Error LaunchClient(const llvm::opt::InputArgList &args) { +  auto *client_arg = args.getLastArg(OPT_client); +  assert(client_arg && "must have client arg"); + +  std::optional<ClientLauncher::Client> client = +      ClientLauncher::GetClientFrom(client_arg->getValue()); +  if (!client) +    return llvm::createStringError( +        llvm::formatv("unsupported client: {0}", client_arg->getValue())); + +  std::vector<llvm::StringRef> launch_args; +  if (auto *arg = args.getLastArgNoClaim(OPT_REM)) { +    for (auto *value : arg->getValues()) { +      launch_args.push_back(value); +    } +  } + +  if (launch_args.empty()) +    return llvm::createStringError("no launch arguments provided"); + +  return ClientLauncher::GetLauncher(*client)->Launch(launch_args); +} +  #if not defined(_WIN32)  struct FDGroup {    int GetFlags() const { @@ -541,6 +571,14 @@ int main(int argc, char *argv[]) {      return EXIT_SUCCESS;    } +  if (input_args.hasArg(OPT_client)) { +    if (llvm::Error error = LaunchClient(input_args)) { +      llvm::WithColor::error() << llvm::toString(std::move(error)) << '\n'; +      return EXIT_FAILURE; +    } +    return EXIT_SUCCESS; +  } +    ReplMode default_repl_mode = ReplMode::Auto;    if (input_args.hasArg(OPT_repl_mode)) {      llvm::opt::Arg *repl_mode = input_args.getLastArg(OPT_repl_mode); diff --git a/lldb/unittests/DAP/CMakeLists.txt b/lldb/unittests/DAP/CMakeLists.txt index a08414c..b1fdef1 100644 --- a/lldb/unittests/DAP/CMakeLists.txt +++ b/lldb/unittests/DAP/CMakeLists.txt @@ -1,4 +1,5 @@  add_lldb_unittest(DAPTests +  ClientLauncherTest.cpp    DAPErrorTest.cpp    DAPTest.cpp    DAPTypesTest.cpp diff --git a/lldb/unittests/DAP/ClientLauncherTest.cpp b/lldb/unittests/DAP/ClientLauncherTest.cpp new file mode 100644 index 0000000..dbaf9ee --- /dev/null +++ b/lldb/unittests/DAP/ClientLauncherTest.cpp @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "ClientLauncher.h" +#include "llvm/ADT/StringRef.h" +#include "gtest/gtest.h" +#include <optional> + +using namespace lldb_dap; +using namespace llvm; + +TEST(ClientLauncherTest, GetClientFromVSCode) { +  std::optional<ClientLauncher::Client> result = +      ClientLauncher::GetClientFrom("vscode"); +  ASSERT_TRUE(result.has_value()); +  EXPECT_EQ(ClientLauncher::VSCode, result.value()); +} + +TEST(ClientLauncherTest, GetClientFromVSCodeUpperCase) { +  std::optional<ClientLauncher::Client> result = +      ClientLauncher::GetClientFrom("VSCODE"); +  ASSERT_TRUE(result.has_value()); +  EXPECT_EQ(ClientLauncher::VSCode, result.value()); +} + +TEST(ClientLauncherTest, GetClientFromVSCodeMixedCase) { +  std::optional<ClientLauncher::Client> result = +      ClientLauncher::GetClientFrom("VSCode"); +  ASSERT_TRUE(result.has_value()); +  EXPECT_EQ(ClientLauncher::VSCode, result.value()); +} + +TEST(ClientLauncherTest, GetClientFromInvalidString) { +  std::optional<ClientLauncher::Client> result = +      ClientLauncher::GetClientFrom("invalid"); +  EXPECT_FALSE(result.has_value()); +} + +TEST(ClientLauncherTest, GetClientFromEmptyString) { +  std::optional<ClientLauncher::Client> result = +      ClientLauncher::GetClientFrom(""); +  EXPECT_FALSE(result.has_value()); +} + +TEST(ClientLauncherTest, URLEncode) { +  EXPECT_EQ("", VSCodeLauncher::URLEncode("")); +  EXPECT_EQ( +      "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~", +      VSCodeLauncher::URLEncode("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST" +                                "UVWXYZ0123456789-_.~")); +  EXPECT_EQ("hello%20world", VSCodeLauncher::URLEncode("hello world")); +  EXPECT_EQ("hello%21%40%23%24", VSCodeLauncher::URLEncode("hello!@#$")); +  EXPECT_EQ("%2Fpath%2Fto%2Ffile", VSCodeLauncher::URLEncode("/path/to/file")); +  EXPECT_EQ("key%3Dvalue%26key2%3Dvalue2", +            VSCodeLauncher::URLEncode("key=value&key2=value2")); +  EXPECT_EQ("100%25complete", VSCodeLauncher::URLEncode("100%complete")); +  EXPECT_EQ("file_name%20with%20spaces%20%26%20special%21.txt", +            VSCodeLauncher::URLEncode("file_name with spaces & special!.txt")); +  EXPECT_EQ("%00%01%02", +            VSCodeLauncher::URLEncode(llvm::StringRef("\x00\x01\x02", 3))); +  EXPECT_EQ("test-file_name.txt~", +            VSCodeLauncher::URLEncode("test-file_name.txt~")); + +  // UTF-8 encoded characters should be percent-encoded byte by byte. +  EXPECT_EQ("%C3%A9", VSCodeLauncher::URLEncode("é")); +} diff --git a/llvm/docs/CommandGuide/dsymutil.rst b/llvm/docs/CommandGuide/dsymutil.rst index 8e61e01..0e442d6 100644 --- a/llvm/docs/CommandGuide/dsymutil.rst +++ b/llvm/docs/CommandGuide/dsymutil.rst @@ -70,6 +70,14 @@ OPTIONS   Print this help output. +.. option:: --include-swiftmodules-from-interface + + Whether or not to copy binary swiftmodules built from textual .swiftinterface + files into the dSYM bundle. These typically come only from the SDK (since + textual interfaces require library evolution) and thus are a waste of space to + copy into the bundle. Turn this on if the swiftmodules are different from + those in the SDK. +  .. option:: --keep-function-for-static   Make a static variable keep the enclosing function even if it would have been diff --git a/llvm/docs/MIRLangRef.rst b/llvm/docs/MIRLangRef.rst index 3f4c3cd..f7647c8 100644 --- a/llvm/docs/MIRLangRef.rst +++ b/llvm/docs/MIRLangRef.rst @@ -86,25 +86,25 @@ Tests are more accessible and future proof when simplified:  - Use the ``-simplify-mir`` option with llc.  - Machine function attributes often have default values or the test works just -  as well with default values. Typical candidates for this are: `alignment:`, -  `exposesReturnsTwice`, `legalized`, `regBankSelected`, `selected`. +  as well with default values. Typical candidates for this are: ``alignment:``, +  ``exposesReturnsTwice``, ``legalized``, ``regBankSelected``, ``selected``.    The whole `frameInfo` section is often unnecessary if there is no special -  frame usage in the function. `tracksRegLiveness` on the other hand is often +  frame usage in the function. ``tracksRegLiveness`` on the other hand is often    necessary for some passes that care about block livein lists. -- The (global) `liveins:` list is typically only interesting for early +- The (global) ``liveins:`` list is typically only interesting for early    instruction selection passes and can be removed when testing later passes. -  The per-block `liveins:` on the other hand are necessary if +  The per-block ``liveins:`` on the other hand are necessary if    `tracksRegLiveness` is true. -- Branch probability data in block `successors:` lists can be dropped if the +- Branch probability data in block ``successors:`` lists can be dropped if the    test doesn't depend on it. Example: -  `successors: %bb.1(0x40000000), %bb.2(0x40000000)` can be replaced with -  `successors: %bb.1, %bb.2`. +  ``successors: %bb.1(0x40000000), %bb.2(0x40000000)`` can be replaced with +  ``successors: %bb.1, %bb.2``.  - MIR code contains a whole IR module. This is necessary because there are    no equivalents in MIR for global variables, references to external functions, -  function attributes, metadata, debug info. Instead some MIR data references +  function attributes, metadata, debug info. Instead, some MIR data references    the IR constructs. You can often remove them if the test doesn't depend on    them. @@ -114,16 +114,16 @@ Tests are more accessible and future proof when simplified:    dropped: `:: (load 8)`  - MIR blocks can reference IR blocks for debug printing, profile information, -  or debug locations. Example: `bb.42.myblock` in MIR references the IR block -  `myblock`. It is usually possible to drop the `.myblock` reference and simply -  use `bb.42`. +  or debug locations. Example: ``bb.42.myblock`` in MIR references the IR block +  ``myblock``. It is usually possible to drop the ``.myblock`` reference and simply +  use ``bb.42``.  - If there are no memory operands or blocks referencing the IR, then the    IR function can be replaced by a parameterless dummy function like -  `define @func() { ret void }`. +  ``define @func() { ret void }``.  - It is possible to drop the whole IR section of the MIR file if it only -  contains dummy functions (see above). The .mir loader will create the +  contains dummy functions (see above). The ``.mir`` loader will create the    IR functions automatically in this case.  .. _limitations: @@ -131,7 +131,7 @@ Tests are more accessible and future proof when simplified:  Limitations  ----------- -Currently the MIR format has several limitations in terms of which state it +Currently, the MIR format has several limitations in terms of which state it  can serialize:  - The target-specific state in the target-specific ``MachineFunctionInfo`` @@ -150,7 +150,7 @@ These limitations impose restrictions on what you can test with the MIR format.  For now, tests that would like to test some behaviour that depends on the state  of temporary or local ``MCSymbol``  operands or the exception handling state in  MMI, can't use the MIR format. As well as that, tests that test some behaviour -that depends on the state of the target specific ``MachineFunctionInfo`` or +that depends on the state of the target-specific ``MachineFunctionInfo`` or  ``MachineConstantPoolValue`` subclasses can't use the MIR format at the moment.  High Level Structure @@ -286,7 +286,7 @@ Example:  Successors  ^^^^^^^^^^ -The machine basic block's successors have to be specified before any of the +The machine basic block's successors must be specified before any of the  instructions:  .. code-block:: text @@ -489,13 +489,13 @@ In case this is true, the Machine Operand is printed according to the target.  For example: -In AArch64RegisterInfo.td: +In ``AArch64RegisterInfo.td``:  .. code-block:: text    def sub_32 : SubRegIndex<32>; -If the third operand is an immediate with the value ``15`` (target-dependent +If the third operand is an immediate with the value ``15`` (a target-dependent  value), based on the instruction's opcode and the operand's index the operand  will be printed as ``%subreg.sub_32``: @@ -503,7 +503,7 @@ will be printed as ``%subreg.sub_32``:      %1:gpr64 = SUBREG_TO_REG 0, %0, %subreg.sub_32 -For integers > 64 bits, we use a special machine operand, ``MO_CImmediate``, +For integers larger than 64 bits, we use a special machine operand, ``MO_CImmediate``,  which stores the immediate in a ``ConstantInt`` using an ``APInt`` (LLVM's  arbitrary-precision integers). @@ -552,7 +552,7 @@ corresponding internal ``llvm::RegState`` representation:     * - ``implicit``       - ``RegState::Implicit`` -     - Not emitted register (e.g. carry, or temporary result). +     - Not emitted register (e.g., carry, or temporary result).     * - ``implicit-def``       - ``RegState::ImplicitDefine`` @@ -625,7 +625,7 @@ For a CPI with the index 0 and offset -12:      %1:gr64 = MOV64ri %const.0 - 12 -A constant pool entry is bound to a LLVM IR ``Constant`` or a target-specific +A constant pool entry is bound to an LLVM IR ``Constant`` or a target-specific  ``MachineConstantPoolValue``. When serializing all the function's constants, the  following format is used: @@ -670,12 +670,12 @@ a global value operand named ``G``:      $rax = MOV64rm $rip, 1, _, @G, _ -The named global values are represented using an identifier with the '@' prefix. +The named global values are represented using an identifier with the ``@`` prefix.  If the identifier doesn't match the regular expression -`[-a-zA-Z$._][-a-zA-Z$._0-9]*`, then this identifier must be quoted. +``[-a-zA-Z$._][-a-zA-Z$._0-9]*``, then this identifier must be quoted.  The unnamed global values are represented using an unsigned numeric value with -the '@' prefix, like in the following examples: ``@0``, ``@989``. +the ``@`` prefix, as in the following examples: ``@0``, ``@989``.  Target-dependent Index Operands  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -741,7 +741,7 @@ Example:  MCSymbol Operands  ^^^^^^^^^^^^^^^^^ -A MCSymbol operand holds a pointer to a ``MCSymbol``. For the limitations +An ``MCSymbol`` operand holds a pointer to an ``MCSymbol``. For the limitations  of this operand in MIR, see :ref:`limitations <limitations>`.  The syntax is: @@ -825,7 +825,7 @@ Comments  ^^^^^^^^  Machine operands can have C/C++ style comments, which are annotations enclosed -between ``/*`` and ``*/`` to improve readability of e.g. immediate operands. +between ``/*`` and ``*/`` to improve readability of e.g., immediate operands.  In the example below, ARM instructions EOR and BCC and immediate operands  ``14`` and ``0`` have been annotated with their condition codes (CC)  definitions, i.e. the ``always`` and ``eq`` condition codes: @@ -920,7 +920,7 @@ Instruction referencing locations  This experimental feature aims to separate the specification of variable  *values* from the program point where a variable takes on that value. Changes -in variable value occur in the same manner as ``DBG_VALUE`` meta instructions +in a variable value occur in the same manner as ``DBG_VALUE`` meta instructions  but using ``DBG_INSTR_REF``. Variable values are identified by a pair of  instruction number and operand number. Consider the example below: diff --git a/llvm/examples/Kaleidoscope/Chapter9/toy.cpp b/llvm/examples/Kaleidoscope/Chapter9/toy.cpp index 51457a3..14081fb 100644 --- a/llvm/examples/Kaleidoscope/Chapter9/toy.cpp +++ b/llvm/examples/Kaleidoscope/Chapter9/toy.cpp @@ -203,7 +203,7 @@ class ExprAST {  public:    ExprAST(SourceLocation Loc = CurLoc) : Loc(Loc) {} -  virtual ~ExprAST() {} +  virtual ~ExprAST() = default;    virtual Value *codegen() = 0;    int getLine() const { return Loc.Line; }    int getCol() const { return Loc.Col; } diff --git a/llvm/examples/OptSubcommand/llvm-hello-sub.cpp b/llvm/examples/OptSubcommand/llvm-hello-sub.cpp index 8071f56..bcf433f 100644 --- a/llvm/examples/OptSubcommand/llvm-hello-sub.cpp +++ b/llvm/examples/OptSubcommand/llvm-hello-sub.cpp @@ -46,7 +46,7 @@ public:    HelloSubOptTable()        : GenericOptTable(OptionStrTable, OptionPrefixesTable, InfoTable,                          /*IgnoreCase=*/false, OptionSubCommands, -                        OptionSubCommandIDsTable) {} +                        OptionSubCommandIDsTable) {};  };  } // namespace diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h index bccdb89..82ac9a3 100644 --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -152,7 +152,7 @@ public:    static constexpr unsigned integerPartWidth = APInt::APINT_BITS_PER_WORD;    /// A signed type to represent a floating point numbers unbiased exponent. -  typedef int32_t ExponentType; +  using ExponentType = int32_t;    /// \name Floating Point Semantics.    /// @{ @@ -938,8 +938,8 @@ LLVM_ABI DoubleAPFloat frexp(const DoubleAPFloat &X, int &Exp, roundingMode);  // This is a interface class that is currently forwarding functionalities from  // detail::IEEEFloat.  class APFloat : public APFloatBase { -  typedef detail::IEEEFloat IEEEFloat; -  typedef detail::DoubleAPFloat DoubleAPFloat; +  using IEEEFloat = detail::IEEEFloat; +  using DoubleAPFloat = detail::DoubleAPFloat;    static_assert(std::is_standard_layout<IEEEFloat>::value); diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h index 9fa98ad..26283d2 100644 --- a/llvm/include/llvm/ADT/APInt.h +++ b/llvm/include/llvm/ADT/APInt.h @@ -77,7 +77,7 @@ inline APInt operator-(APInt);  ///  class [[nodiscard]] APInt {  public: -  typedef uint64_t WordType; +  using WordType = uint64_t;    /// Byte size of a word.    static constexpr unsigned APINT_WORD_SIZE = sizeof(WordType); diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h index 9e81a4b..cc3f3a9 100644 --- a/llvm/include/llvm/ADT/BitVector.h +++ b/llvm/include/llvm/ADT/BitVector.h @@ -99,7 +99,7 @@ public:  };  class BitVector { -  typedef uintptr_t BitWord; +  using BitWord = uintptr_t;    enum { BITWORD_SIZE = (unsigned)sizeof(BitWord) * CHAR_BIT }; @@ -147,8 +147,8 @@ public:      }    }; -  typedef const_set_bits_iterator_impl<BitVector> const_set_bits_iterator; -  typedef const_set_bits_iterator set_iterator; +  using const_set_bits_iterator = const_set_bits_iterator_impl<BitVector>; +  using set_iterator = const_set_bits_iterator;    const_set_bits_iterator set_bits_begin() const {      return const_set_bits_iterator(*this); diff --git a/llvm/include/llvm/ADT/GenericSSAContext.h b/llvm/include/llvm/ADT/GenericSSAContext.h index e9f99ba..426a083 100644 --- a/llvm/include/llvm/ADT/GenericSSAContext.h +++ b/llvm/include/llvm/ADT/GenericSSAContext.h @@ -25,7 +25,7 @@ template <typename, bool> class DominatorTreeBase;  template <typename> class SmallVectorImpl;  namespace Intrinsic { -typedef unsigned ID; +using ID = unsigned;  }  // Specializations of this template should provide the types used by the diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index a9841c6..8de8eb5 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1516,8 +1516,8 @@ template <class Iterator, class RNG>  void shuffle(Iterator first, Iterator last, RNG &&g) {    // It would be better to use a std::uniform_int_distribution,    // but that would be stdlib dependent. -  typedef -      typename std::iterator_traits<Iterator>::difference_type difference_type; +  using difference_type = +      typename std::iterator_traits<Iterator>::difference_type;    for (auto size = last - first; size > 1; ++first, (void)--size) {      difference_type offset = g() % size;      // Avoid self-assignment due to incorrect assertions in libstdc++ diff --git a/llvm/include/llvm/ADT/StringSwitch.h b/llvm/include/llvm/ADT/StringSwitch.h index 8c8d31b..53ebec1 100644 --- a/llvm/include/llvm/ADT/StringSwitch.h +++ b/llvm/include/llvm/ADT/StringSwitch.h @@ -14,7 +14,6 @@  #define LLVM_ADT_STRINGSWITCH_H  #include "llvm/ADT/StringRef.h" -#include "llvm/Support/Compiler.h"  #include "llvm/Support/ErrorHandling.h"  #include <cassert>  #include <cstring> @@ -42,6 +41,8 @@ namespace llvm {  ///   .Cases({"violet", "purple"}, Violet)  ///   .Default(UnknownColor);  /// \endcode +/// +/// When multiple matches are found, the value of the first match is returned.  template<typename T, typename R = T>  class StringSwitch {    /// The string we are matching. @@ -64,7 +65,7 @@ public:    void operator=(const StringSwitch &) = delete;    void operator=(StringSwitch &&) = delete; -  // Case-sensitive case matchers +  // Case-sensitive case matchers.    StringSwitch &Case(StringLiteral S, T Value) {      CaseImpl(S, Value);      return *this; @@ -214,23 +215,30 @@ public:    [[nodiscard]] operator R() { return DefaultUnreachable(); }  private: -  // Returns true when `Str` matches the `S` argument, and stores the result. +  // Returns true when a match is found. If `Str` matches the `S` argument, +  // stores the result.    bool CaseImpl(StringLiteral S, T &Value) { -    if (!Result && Str == S) { -      Result = std::move(Value); +    if (Result)        return true; -    } -    return false; + +    if (Str != S) +      return false; + +    Result = std::move(Value); +    return true;    } -  // Returns true when `Str` matches the `S` argument (case-insensitive), and -  // stores the result. +  // Returns true when a match is found. If `Str` matches the `S` argument +  // (case-insensitive), stores the result.    bool CaseLowerImpl(StringLiteral S, T &Value) { -    if (!Result && Str.equals_insensitive(S)) { -      Result = std::move(Value); +    if (Result)        return true; -    } -    return false; + +    if (!Str.equals_insensitive(S)) +      return false; + +    Result = std::move(Value); +    return true;    }    StringSwitch &CasesImpl(std::initializer_list<StringLiteral> Cases, diff --git a/llvm/include/llvm/ADT/ilist.h b/llvm/include/llvm/ADT/ilist.h index aed19cc..6439290 100644 --- a/llvm/include/llvm/ADT/ilist.h +++ b/llvm/include/llvm/ADT/ilist.h @@ -108,21 +108,21 @@ template <typename Ty> struct ilist_traits<const Ty> {};  /// list.  template <class IntrusiveListT, class TraitsT>  class iplist_impl : public TraitsT, IntrusiveListT { -  typedef IntrusiveListT base_list_type; +  using base_list_type = IntrusiveListT;  public: -  typedef typename base_list_type::pointer pointer; -  typedef typename base_list_type::const_pointer const_pointer; -  typedef typename base_list_type::reference reference; -  typedef typename base_list_type::const_reference const_reference; -  typedef typename base_list_type::value_type value_type; -  typedef typename base_list_type::size_type size_type; -  typedef typename base_list_type::difference_type difference_type; -  typedef typename base_list_type::iterator iterator; -  typedef typename base_list_type::const_iterator const_iterator; -  typedef typename base_list_type::reverse_iterator reverse_iterator; -  typedef -      typename base_list_type::const_reverse_iterator const_reverse_iterator; +  using pointer = typename base_list_type::pointer; +  using const_pointer = typename base_list_type::const_pointer; +  using reference = typename base_list_type::reference; +  using const_reference = typename base_list_type::const_reference; +  using value_type = typename base_list_type::value_type; +  using size_type = typename base_list_type::size_type; +  using difference_type = typename base_list_type::difference_type; +  using iterator = typename base_list_type::iterator; +  using const_iterator = typename base_list_type::const_iterator; +  using reverse_iterator = typename base_list_type::reverse_iterator; +  using const_reverse_iterator = +      typename base_list_type::const_reverse_iterator;  private:    static bool op_less(const_reference L, const_reference R) { return L < R; } diff --git a/llvm/include/llvm/ADT/ilist_node_options.h b/llvm/include/llvm/ADT/ilist_node_options.h index 003d5da..53719b0 100644 --- a/llvm/include/llvm/ADT/ilist_node_options.h +++ b/llvm/include/llvm/ADT/ilist_node_options.h @@ -58,8 +58,8 @@ namespace ilist_detail {  template <bool IsExplicit> struct explicitness {    static const bool is_explicit = IsExplicit;  }; -typedef explicitness<true> is_explicit; -typedef explicitness<false> is_implicit; +using is_explicit = explicitness<true>; +using is_implicit = explicitness<false>;  /// Check whether an option is valid.  /// @@ -103,12 +103,12 @@ struct is_valid_option<ilist_sentinel_tracking<EnableSentinelTracking>>  template <class... Options> struct extract_tag;  template <class Tag, class... Options>  struct extract_tag<ilist_tag<Tag>, Options...> { -  typedef Tag type; +  using type = Tag;  };  template <class Option1, class... Options>  struct extract_tag<Option1, Options...> : extract_tag<Options...> {};  template <> struct extract_tag<> { -  typedef void type; +  using type = void;  };  template <class Tag> struct is_valid_option<ilist_tag<Tag>> : std::true_type {}; @@ -134,11 +134,13 @@ struct is_valid_option<ilist_iterator_bits<IteratorBits>> : std::true_type {};  template <class... Options> struct extract_parent;  template <class ParentTy, class... Options>  struct extract_parent<ilist_parent<ParentTy>, Options...> { -  typedef ParentTy type; +  using type = ParentTy;  };  template <class Option1, class... Options>  struct extract_parent<Option1, Options...> : extract_parent<Options...> {}; -template <> struct extract_parent<> { typedef void type; }; +template <> struct extract_parent<> { +  using type = void; +};  template <class ParentTy>  struct is_valid_option<ilist_parent<ParentTy>> : std::true_type {}; @@ -154,28 +156,27 @@ struct check_options : std::conjunction<is_valid_option<Options>...> {};  template <class T, bool EnableSentinelTracking, bool IsSentinelTrackingExplicit,            class TagT, bool HasIteratorBits, class ParentTy>  struct node_options { -  typedef T value_type; -  typedef T *pointer; -  typedef T &reference; -  typedef const T *const_pointer; -  typedef const T &const_reference; +  using value_type = T; +  using pointer = T *; +  using reference = T &; +  using const_pointer = const T *; +  using const_reference = const T &;    static const bool enable_sentinel_tracking = EnableSentinelTracking;    static const bool is_sentinel_tracking_explicit = IsSentinelTrackingExplicit;    static const bool has_iterator_bits = HasIteratorBits; -  typedef TagT tag; -  typedef ParentTy parent_ty; -  typedef ilist_node_base<enable_sentinel_tracking, parent_ty> node_base_type; -  typedef ilist_base<enable_sentinel_tracking, parent_ty> list_base_type; +  using tag = TagT; +  using parent_ty = ParentTy; +  using node_base_type = ilist_node_base<enable_sentinel_tracking, parent_ty>; +  using list_base_type = ilist_base<enable_sentinel_tracking, parent_ty>;  };  template <class T, class... Options> struct compute_node_options { -  typedef node_options<T, extract_sentinel_tracking<Options...>::value, -                       extract_sentinel_tracking<Options...>::is_explicit, -                       typename extract_tag<Options...>::type, -                       extract_iterator_bits<Options...>::value, -                       typename extract_parent<Options...>::type> -      type; +  using type = node_options<T, extract_sentinel_tracking<Options...>::value, +                            extract_sentinel_tracking<Options...>::is_explicit, +                            typename extract_tag<Options...>::type, +                            extract_iterator_bits<Options...>::value, +                            typename extract_parent<Options...>::type>;  };  } // end namespace ilist_detail diff --git a/llvm/include/llvm/Analysis/DDG.h b/llvm/include/llvm/Analysis/DDG.h index 1c53291..120bb46 100644 --- a/llvm/include/llvm/Analysis/DDG.h +++ b/llvm/include/llvm/Analysis/DDG.h @@ -60,11 +60,7 @@ public:    DDGNode(DDGNode &&N) : DDGNodeBase(std::move(N)), Kind(N.Kind) {}    virtual ~DDGNode() = 0; -  DDGNode &operator=(const DDGNode &N) { -    DGNode::operator=(N); -    Kind = N.Kind; -    return *this; -  } +  DDGNode &operator=(const DDGNode &N) = default;    DDGNode &operator=(DDGNode &&N) {      DGNode::operator=(std::move(N)); diff --git a/llvm/include/llvm/CAS/ActionCache.h b/llvm/include/llvm/CAS/ActionCache.h index 69ee4dd..7f5b112 100644 --- a/llvm/include/llvm/CAS/ActionCache.h +++ b/llvm/include/llvm/CAS/ActionCache.h @@ -75,6 +75,9 @@ public:                     CanBeDistributed);    } +  /// Validate the ActionCache contents. +  virtual Error validate() const = 0; +    virtual ~ActionCache() = default;  protected: @@ -97,6 +100,9 @@ private:  /// Create an action cache in memory.  std::unique_ptr<ActionCache> createInMemoryActionCache(); +/// Create an action cache on disk. +Expected<std::unique_ptr<ActionCache>> createOnDiskActionCache(StringRef Path); +  } // end namespace llvm::cas  #endif // LLVM_CAS_ACTIONCACHE_H diff --git a/llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h b/llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h new file mode 100644 index 0000000..6c165c4 --- /dev/null +++ b/llvm/include/llvm/CAS/BuiltinUnifiedCASDatabases.h @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CAS_BUILTINUNIFIEDCASDATABASES_H +#define LLVM_CAS_BUILTINUNIFIEDCASDATABASES_H + +#include "llvm/Support/Error.h" + +namespace llvm::cas { + +class ActionCache; +class ObjectStore; + +/// Create on-disk \c ObjectStore and \c ActionCache instances based on +/// \c ondisk::UnifiedOnDiskCache, with built-in hashing. +Expected<std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>>> +createOnDiskUnifiedCASDatabases(StringRef Path); + +/// Represents the result of validating the contents using +/// \c validateOnDiskUnifiedCASDatabasesIfNeeded. +/// +/// Note: invalid results are handled as an \c Error. +enum class ValidationResult { +  /// The data is already valid. +  Valid, +  /// The data was invalid, but was recovered. +  Recovered, +  /// Validation was skipped, as it was not needed. +  Skipped, +}; + +/// Validate the data in \p Path, if needed to ensure correctness. +/// +/// \param Path directory for the on-disk database. +/// \param CheckHash Whether to validate hashes match the data. +/// \param AllowRecovery Whether to automatically recover from invalid data by +/// marking the files for garbage collection. +/// \param ForceValidation Whether to force validation to occur even if it +/// should not be necessary. +/// \param LLVMCasBinaryPath If provided, validation is performed out-of-process +/// using the given \c llvm-cas executable which protects against crashes +/// during validation. Otherwise validation is performed in-process. +/// +/// \returns \c Valid if the data is already valid, \c Recovered if data +/// was invalid but has been cleared, \c Skipped if validation is not needed, +/// or an \c Error if validation cannot be performed or if the data is left +/// in an invalid state because \p AllowRecovery is false. +Expected<ValidationResult> validateOnDiskUnifiedCASDatabasesIfNeeded( +    StringRef Path, bool CheckHash, bool AllowRecovery, bool ForceValidation, +    std::optional<StringRef> LLVMCasBinaryPath); + +} // namespace llvm::cas + +#endif // LLVM_CAS_BUILTINUNIFIEDCASDATABASES_H diff --git a/llvm/include/llvm/CAS/ObjectStore.h b/llvm/include/llvm/CAS/ObjectStore.h index 6db5dd3..29950fe 100644 --- a/llvm/include/llvm/CAS/ObjectStore.h +++ b/llvm/include/llvm/CAS/ObjectStore.h @@ -5,6 +5,11 @@  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains the declaration of the ObjectStore class. +/// +//===----------------------------------------------------------------------===//  #ifndef LLVM_CAS_OBJECTSTORE_H  #define LLVM_CAS_OBJECTSTORE_H @@ -111,7 +116,10 @@ public:    virtual Expected<bool> isMaterialized(ObjectRef Ref) const = 0;    /// Validate the underlying object referred by CASID. -  virtual Error validate(const CASID &ID) = 0; +  virtual Error validateObject(const CASID &ID) = 0; + +  /// Validate the entire ObjectStore. +  virtual Error validate(bool CheckHash) const = 0;  protected:    /// Load the object referenced by \p Ref. @@ -215,9 +223,39 @@ public:      return Data.size();    } +  /// Set the size for limiting growth of on-disk storage. This has an effect +  /// for when the instance is closed. +  /// +  /// Implementations may leave this unimplemented. +  virtual Error setSizeLimit(std::optional<uint64_t> SizeLimit) { +    return Error::success(); +  } + +  /// \returns the storage size of the on-disk CAS data. +  /// +  /// Implementations that don't have an implementation for this should return +  /// \p std::nullopt. +  virtual Expected<std::optional<uint64_t>> getStorageSize() const { +    return std::nullopt; +  } + +  /// Prune local storage to reduce its size according to the desired size +  /// limit. Pruning can happen concurrently with other operations. +  /// +  /// Implementations may leave this unimplemented. +  virtual Error pruneStorageData() { return Error::success(); } +    /// Validate the whole node tree.    Error validateTree(ObjectRef Ref); +  /// Import object from another CAS. This will import the full tree from the +  /// other CAS. +  Expected<ObjectRef> importObject(ObjectStore &Upstream, ObjectRef Other); + +  /// Print the ObjectStore internals for debugging purpose. +  virtual void print(raw_ostream &) const {} +  void dump() const; +    /// Get CASContext    const CASContext &getContext() const { return Context; } @@ -290,8 +328,15 @@ private:    ObjectHandle H;  }; +/// Create an in memory CAS.  std::unique_ptr<ObjectStore> createInMemoryCAS(); +/// \returns true if \c LLVM_ENABLE_ONDISK_CAS configuration was enabled. +bool isOnDiskCASEnabled(); + +/// Create a persistent on-disk path at \p Path. +Expected<std::unique_ptr<ObjectStore>> createOnDiskCAS(const Twine &Path); +  } // namespace cas  } // namespace llvm diff --git a/llvm/include/llvm/CAS/OnDiskGraphDB.h b/llvm/include/llvm/CAS/OnDiskGraphDB.h index 5f0ee0e..76cc528 100644 --- a/llvm/include/llvm/CAS/OnDiskGraphDB.h +++ b/llvm/include/llvm/CAS/OnDiskGraphDB.h @@ -340,13 +340,16 @@ public:    /// \param HashByteSize Size for the object digest hash bytes.    /// \param UpstreamDB Optional on-disk store to be used for faulting-in nodes    /// if they don't exist in the primary store. The upstream store is only used -  /// for reading nodes, new nodes are only written to the primary store. +  /// for reading nodes, new nodes are only written to the primary store. User +  /// need to make sure \p UpstreamDB outlives current instance of +  /// OnDiskGraphDB and the common usage is to have an \p UnifiedOnDiskCache to +  /// manage both.    /// \param Policy If \p UpstreamDB is provided, controls how nodes are copied    /// to primary store. This is recorded at creation time and subsequent opens    /// need to pass the same policy otherwise the \p open will fail.    static Expected<std::unique_ptr<OnDiskGraphDB>>    open(StringRef Path, StringRef HashName, unsigned HashByteSize, -       std::unique_ptr<OnDiskGraphDB> UpstreamDB = nullptr, +       OnDiskGraphDB *UpstreamDB = nullptr,         FaultInPolicy Policy = FaultInPolicy::FullTree);    ~OnDiskGraphDB(); @@ -438,8 +441,7 @@ private:    // Private constructor.    OnDiskGraphDB(StringRef RootPath, OnDiskTrieRawHashMap Index, -                OnDiskDataAllocator DataPool, -                std::unique_ptr<OnDiskGraphDB> UpstreamDB, +                OnDiskDataAllocator DataPool, OnDiskGraphDB *UpstreamDB,                  FaultInPolicy Policy);    /// Mapping from hash to object reference. @@ -459,7 +461,7 @@ private:    std::string RootPath;    /// Optional on-disk store to be used for faulting-in nodes. -  std::unique_ptr<OnDiskGraphDB> UpstreamDB; +  OnDiskGraphDB *UpstreamDB = nullptr;    /// The policy used to fault in data from upstream.    FaultInPolicy FIPolicy; diff --git a/llvm/include/llvm/CAS/OnDiskKeyValueDB.h b/llvm/include/llvm/CAS/OnDiskKeyValueDB.h index b762518..17ae52f 100644 --- a/llvm/include/llvm/CAS/OnDiskKeyValueDB.h +++ b/llvm/include/llvm/CAS/OnDiskKeyValueDB.h @@ -19,6 +19,8 @@  namespace llvm::cas::ondisk { +class UnifiedOnDiskCache; +  /// An on-disk key-value data store with the following properties:  /// * Keys are fixed length binary hashes with expected normal distribution.  /// * Values are buffers of the same size, specified at creation time. @@ -59,9 +61,13 @@ public:    /// \param KeySize Size for the key hash bytes.    /// \param ValueName Identifier name for the values.    /// \param ValueSize Size for the value bytes. +  /// \param UnifiedCache An optional UnifiedOnDiskCache that manages the size +  /// and lifetime of the CAS instance and it must owns current initializing +  /// KeyValueDB after initialized.    static Expected<std::unique_ptr<OnDiskKeyValueDB>>    open(StringRef Path, StringRef HashName, unsigned KeySize, -       StringRef ValueName, size_t ValueSize); +       StringRef ValueName, size_t ValueSize, +       UnifiedOnDiskCache *UnifiedCache = nullptr);    using CheckValueT =        function_ref<Error(FileOffset Offset, ArrayRef<char> Data)>; @@ -70,11 +76,14 @@ public:    Error validate(CheckValueT CheckValue) const;  private: -  OnDiskKeyValueDB(size_t ValueSize, OnDiskTrieRawHashMap Cache) -      : ValueSize(ValueSize), Cache(std::move(Cache)) {} +  OnDiskKeyValueDB(size_t ValueSize, OnDiskTrieRawHashMap Cache, +                   UnifiedOnDiskCache *UnifiedCache) +      : ValueSize(ValueSize), Cache(std::move(Cache)), +        UnifiedCache(UnifiedCache) {}    const size_t ValueSize;    OnDiskTrieRawHashMap Cache; +  UnifiedOnDiskCache *UnifiedCache = nullptr;  };  } // namespace llvm::cas::ondisk diff --git a/llvm/include/llvm/CAS/UnifiedOnDiskCache.h b/llvm/include/llvm/CAS/UnifiedOnDiskCache.h new file mode 100644 index 0000000..6e0878a --- /dev/null +++ b/llvm/include/llvm/CAS/UnifiedOnDiskCache.h @@ -0,0 +1,172 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CAS_UNIFIEDONDISKCACHE_H +#define LLVM_CAS_UNIFIEDONDISKCACHE_H + +#include "llvm/CAS/BuiltinUnifiedCASDatabases.h" +#include "llvm/CAS/OnDiskGraphDB.h" +#include <atomic> + +namespace llvm::cas::ondisk { + +class OnDiskKeyValueDB; + +/// A unified CAS nodes and key-value database, using on-disk storage for both. +/// It manages storage growth and provides APIs for garbage collection. +/// +/// High-level properties: +/// * While \p UnifiedOnDiskCache is open on a directory, by any process, the +///   storage size in that directory will keep growing unrestricted. For data to +///   become eligible for garbage-collection there should be no open instances +///   of \p UnifiedOnDiskCache for that directory, by any process. +/// * Garbage-collection needs to be triggered explicitly by the client. It can +///   be triggered on a directory concurrently, at any time and by any process, +///   without affecting any active readers/writers, in the same process or other +///   processes. +/// +/// Usage patterns should be that an instance of \p UnifiedOnDiskCache is open +/// for a limited period of time, e.g. for the duration of a build operation. +/// For long-living processes that need periodic access to a +/// \p UnifiedOnDiskCache, the client should devise a scheme where access is +/// performed within some defined period. For example, if a service is designed +/// to continuously wait for requests that access a \p UnifiedOnDiskCache, it +/// could keep the instance alive while new requests are coming in but close it +/// after a time period in which there are no new requests. +class UnifiedOnDiskCache { +public: +  /// The \p OnDiskGraphDB instance for the open directory. +  OnDiskGraphDB &getGraphDB() { return *PrimaryGraphDB; } + +  /// The \p OnDiskGraphDB instance for the open directory. +  OnDiskKeyValueDB &getKeyValueDB() { return *PrimaryKVDB; } + +  /// Open a \p UnifiedOnDiskCache instance for a directory. +  /// +  /// \param Path directory for the on-disk database. The directory will be +  /// created if it doesn't exist. +  /// \param SizeLimit Optional size for limiting growth. This has an effect for +  /// when the instance is closed. +  /// \param HashName Identifier name for the hashing algorithm that is going to +  /// be used. +  /// \param HashByteSize Size for the object digest hash bytes. +  /// \param FaultInPolicy Controls how nodes are copied to primary store. This +  /// is recorded at creation time and subsequent opens need to pass the same +  /// policy otherwise the \p open will fail. +  static Expected<std::unique_ptr<UnifiedOnDiskCache>> +  open(StringRef Path, std::optional<uint64_t> SizeLimit, StringRef HashName, +       unsigned HashByteSize, +       OnDiskGraphDB::FaultInPolicy FaultInPolicy = +           OnDiskGraphDB::FaultInPolicy::FullTree); + +  /// Validate the data in \p Path, if needed to ensure correctness. +  /// +  /// Note: if invalid data is detected and \p AllowRecovery is true, then +  /// recovery requires exclusive access to the CAS and it is an error to +  /// attempt recovery if there is concurrent use of the CAS. +  /// +  /// \param Path directory for the on-disk database. +  /// \param HashName Identifier name for the hashing algorithm that is going to +  /// be used. +  /// \param HashByteSize Size for the object digest hash bytes. +  /// \param CheckHash Whether to validate hashes match the data. +  /// \param AllowRecovery Whether to automatically recover from invalid data by +  /// marking the files for garbage collection. +  /// \param ForceValidation Whether to force validation to occur even if it +  /// should not be necessary. +  /// \param LLVMCasBinary If provided, validation is performed out-of-process +  /// using the given \c llvm-cas executable which protects against crashes +  /// during validation. Otherwise validation is performed in-process. +  /// +  /// \returns \c Valid if the data is already valid, \c Recovered if data +  /// was invalid but has been cleared, \c Skipped if validation is not needed, +  /// or an \c Error if validation cannot be performed or if the data is left +  /// in an invalid state because \p AllowRecovery is false. +  static Expected<ValidationResult> +  validateIfNeeded(StringRef Path, StringRef HashName, unsigned HashByteSize, +                   bool CheckHash, bool AllowRecovery, bool ForceValidation, +                   std::optional<StringRef> LLVMCasBinary); + +  /// This is called implicitly at destruction time, so it is not required for a +  /// client to call this. After calling \p close the only method that is valid +  /// to call is \p needsGarbageCollection. +  /// +  /// \param CheckSizeLimit if true it will check whether the primary store has +  /// exceeded its intended size limit. If false the check is skipped even if a +  /// \p SizeLimit was passed to the \p open call. +  Error close(bool CheckSizeLimit = true); + +  /// Set the size for limiting growth. This has an effect for when the instance +  /// is closed. +  void setSizeLimit(std::optional<uint64_t> SizeLimit); + +  /// \returns the storage size of the cache data. +  uint64_t getStorageSize() const; + +  /// \returns whether the primary store has exceeded the intended size limit. +  /// This can return false even if the overall size of the opened directory is +  /// over the \p SizeLimit passed to \p open. To know whether garbage +  /// collection needs to be triggered or not, call \p needsGarbaseCollection. +  bool hasExceededSizeLimit() const; + +  /// \returns whether there are unused data that can be deleted using a +  /// \p collectGarbage call. +  bool needsGarbageCollection() const { return NeedsGarbageCollection; } + +  /// Remove any unused data from the directory at \p Path. If there are no such +  /// data the operation is a no-op. +  /// +  /// This can be called concurrently, regardless of whether there is an open +  /// \p UnifiedOnDiskCache instance or not; it has no effect on readers/writers +  /// in the same process or other processes. +  /// +  /// It is recommended that garbage-collection is triggered concurrently in the +  /// background, so that it has minimal effect on the workload of the process. +  static Error collectGarbage(StringRef Path); + +  /// Remove unused data from the current UnifiedOnDiskCache. +  Error collectGarbage(); + +  /// Helper function to convert the value stored in KeyValueDB and ObjectID. +  static ObjectID getObjectIDFromValue(ArrayRef<char> Value); + +  using ValueBytes = std::array<char, sizeof(uint64_t)>; +  static ValueBytes getValueFromObjectID(ObjectID ID); + +  ~UnifiedOnDiskCache(); + +private: +  friend class OnDiskGraphDB; +  friend class OnDiskKeyValueDB; + +  UnifiedOnDiskCache(); + +  Expected<std::optional<ArrayRef<char>>> +  faultInFromUpstreamKV(ArrayRef<uint8_t> Key); + +  /// \returns the storage size of the primary directory. +  uint64_t getPrimaryStorageSize() const; + +  std::string RootPath; +  std::atomic<uint64_t> SizeLimit; + +  int LockFD = -1; + +  std::atomic<bool> NeedsGarbageCollection; +  std::string PrimaryDBDir; + +  std::unique_ptr<OnDiskGraphDB> UpstreamGraphDB; +  std::unique_ptr<OnDiskGraphDB> PrimaryGraphDB; + +  std::unique_ptr<OnDiskKeyValueDB> UpstreamKVDB; +  std::unique_ptr<OnDiskKeyValueDB> PrimaryKVDB; +}; + +} // namespace llvm::cas::ondisk + +#endif // LLVM_CAS_UNIFIEDONDISKCACHE_H diff --git a/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h b/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h index caea5b6..54ea68a 100644 --- a/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h +++ b/llvm/include/llvm/CodeGen/GlobalMergeFunctions.h @@ -58,7 +58,7 @@ public:    /// The suffix used to identify the merged function that parameterizes    /// the constant values. Note that the original function, without this suffix,    /// becomes a thunk supplying contexts to the merged function via parameters. -  static constexpr const char MergingInstanceSuffix[] = ".Tgm"; +  static constexpr char MergingInstanceSuffix[] = ".Tgm";    GlobalMergeFunc(const ModuleSummaryIndex *Index) : Index(Index) {}; diff --git a/llvm/include/llvm/Demangle/Utility.h b/llvm/include/llvm/Demangle/Utility.h index 002a1f5..6e6203d 100644 --- a/llvm/include/llvm/Demangle/Utility.h +++ b/llvm/include/llvm/Demangle/Utility.h @@ -81,7 +81,7 @@ public:    OutputBuffer(const OutputBuffer &) = delete;    OutputBuffer &operator=(const OutputBuffer &) = delete; -  virtual ~OutputBuffer() {} +  virtual ~OutputBuffer() = default;    operator std::string_view() const {      return std::string_view(Buffer, CurrentPosition); diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h index 98170f6..9479c10 100644 --- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h @@ -175,7 +175,7 @@ struct HalfWords {  /// FixupInfo base class is required for dynamic lookups.  struct FixupInfoBase {    LLVM_ABI static const FixupInfoBase *getDynFixupInfo(Edge::Kind K); -  virtual ~FixupInfoBase() {} +  virtual ~FixupInfoBase() = default;  };  /// FixupInfo checks for Arm edge kinds work on 32-bit words diff --git a/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h b/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h index dd41025..1296e24 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h @@ -36,7 +36,7 @@ size_t writeMachOStruct(MutableArrayRef<char> Buf, size_t Offset, MachOStruct S,  /// Base type for MachOBuilder load command wrappers.  struct MachOBuilderLoadCommandBase { -  virtual ~MachOBuilderLoadCommandBase() {} +  virtual ~MachOBuilderLoadCommandBase() = default;    virtual size_t size() const = 0;    virtual size_t write(MutableArrayRef<char> Buf, size_t Offset,                         bool SwapStruct) = 0; diff --git a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h index 2c385de..8f87650 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/TargetProcess/ExecutorSharedMemoryMapperService.h @@ -29,7 +29,7 @@ namespace rt_bootstrap {  class LLVM_ABI ExecutorSharedMemoryMapperService final      : public ExecutorBootstrapService {  public: -  ~ExecutorSharedMemoryMapperService() override {}; +  ~ExecutorSharedMemoryMapperService() override = default;    Expected<std::pair<ExecutorAddr, std::string>> reserve(uint64_t Size);    Expected<ExecutorAddr> initialize(ExecutorAddr Reservation, diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h index 5331cb5..b3d7ab4 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -2383,7 +2383,7 @@ public:      /// runtime library for debugging      Value *MapNamesArray = nullptr; -    explicit TargetDataRTArgs() {} +    explicit TargetDataRTArgs() = default;      explicit TargetDataRTArgs(Value *BasePointersArray, Value *PointersArray,                                Value *SizesArray, Value *MapTypesArray,                                Value *MapTypesArrayEnd, Value *MappersArray, @@ -2451,7 +2451,7 @@ public:      bool HasNoWait = false;      // Constructors for TargetKernelArgs. -    TargetKernelArgs() {} +    TargetKernelArgs() = default;      TargetKernelArgs(unsigned NumTargetItems, TargetDataRTArgs RTArgs,                       Value *NumIterations, ArrayRef<Value *> NumTeams,                       ArrayRef<Value *> NumThreads, Value *DynCGGroupMem, @@ -2494,7 +2494,7 @@ public:      /// Whether the `target ... data` directive has a `nowait` clause.      bool HasNoWait = false; -    explicit TargetDataInfo() {} +    explicit TargetDataInfo() = default;      explicit TargetDataInfo(bool RequiresDevicePointerInfo,                              bool SeparateBeginEndCalls)          : RequiresDevicePointerInfo(RequiresDevicePointerInfo), diff --git a/llvm/include/llvm/IR/DebugProgramInstruction.h b/llvm/include/llvm/IR/DebugProgramInstruction.h index 457c60e3b..66f44fe 100644 --- a/llvm/include/llvm/IR/DebugProgramInstruction.h +++ b/llvm/include/llvm/IR/DebugProgramInstruction.h @@ -589,7 +589,7 @@ filterDbgVars(iterator_range<simple_ilist<DbgRecord>::iterator> R) {  /// date.  class DbgMarker {  public: -  DbgMarker() {} +  DbgMarker() = default;    /// Link back to the Instruction that owns this marker. Can be null during    /// operations that move a marker from one instruction to another.    Instruction *MarkedInstr = nullptr; diff --git a/llvm/include/llvm/IR/DroppedVariableStats.h b/llvm/include/llvm/IR/DroppedVariableStats.h index 42e86dd..8a1dbd6a 100644 --- a/llvm/include/llvm/IR/DroppedVariableStats.h +++ b/llvm/include/llvm/IR/DroppedVariableStats.h @@ -42,7 +42,7 @@ class DroppedVariableStats {  public:    LLVM_ABI DroppedVariableStats(bool DroppedVarStatsEnabled); -  virtual ~DroppedVariableStats() {} +  virtual ~DroppedVariableStats() = default;    // We intend this to be unique per-compilation, thus no copies.    DroppedVariableStats(const DroppedVariableStats &) = delete; diff --git a/llvm/include/llvm/IR/TrackingMDRef.h b/llvm/include/llvm/IR/TrackingMDRef.h index d737739..7ad7225 100644 --- a/llvm/include/llvm/IR/TrackingMDRef.h +++ b/llvm/include/llvm/IR/TrackingMDRef.h @@ -111,17 +111,14 @@ public:    explicit TypedTrackingMDRef(T *MD) : Ref(static_cast<Metadata *>(MD)) {}    TypedTrackingMDRef(TypedTrackingMDRef &&X) : Ref(std::move(X.Ref)) {} -  TypedTrackingMDRef(const TypedTrackingMDRef &X) : Ref(X.Ref) {} +  TypedTrackingMDRef(const TypedTrackingMDRef &X) = default;    TypedTrackingMDRef &operator=(TypedTrackingMDRef &&X) {      Ref = std::move(X.Ref);      return *this;    } -  TypedTrackingMDRef &operator=(const TypedTrackingMDRef &X) { -    Ref = X.Ref; -    return *this; -  } +  TypedTrackingMDRef &operator=(const TypedTrackingMDRef &X) = default;    T *get() const { return (T *)Ref.get(); }    operator T *() const { return get(); } diff --git a/llvm/include/llvm/MC/MCRegisterInfo.h b/llvm/include/llvm/MC/MCRegisterInfo.h index e6fc707..f611edd 100644 --- a/llvm/include/llvm/MC/MCRegisterInfo.h +++ b/llvm/include/llvm/MC/MCRegisterInfo.h @@ -272,7 +272,7 @@ public:    friend class MCRegUnitRootIterator;    friend class MCRegAliasIterator; -  virtual ~MCRegisterInfo() {} +  virtual ~MCRegisterInfo() = default;    /// Initialize MCRegisterInfo, called by TableGen    /// auto-generated routines. *DO NOT USE*. diff --git a/llvm/include/llvm/MCA/SourceMgr.h b/llvm/include/llvm/MCA/SourceMgr.h index 16a60d1..300961c 100644 --- a/llvm/include/llvm/MCA/SourceMgr.h +++ b/llvm/include/llvm/MCA/SourceMgr.h @@ -50,7 +50,7 @@ struct SourceMgr {    /// Advance to the next \a SourceRef.    virtual void updateNext() = 0; -  virtual ~SourceMgr() {} +  virtual ~SourceMgr() = default;  };  /// The default implementation of \a SourceMgr. It always takes a fixed number diff --git a/llvm/include/llvm/ObjCopy/ConfigManager.h b/llvm/include/llvm/ObjCopy/ConfigManager.h index 1568799..45f847f 100644 --- a/llvm/include/llvm/ObjCopy/ConfigManager.h +++ b/llvm/include/llvm/ObjCopy/ConfigManager.h @@ -23,7 +23,7 @@ namespace llvm {  namespace objcopy {  struct LLVM_ABI ConfigManager : public MultiFormatConfig { -  ~ConfigManager() override {} +  ~ConfigManager() override = default;    const CommonConfig &getCommonConfig() const override { return Common; } diff --git a/llvm/include/llvm/ObjCopy/MultiFormatConfig.h b/llvm/include/llvm/ObjCopy/MultiFormatConfig.h index bb93f64..91baf9b 100644 --- a/llvm/include/llvm/ObjCopy/MultiFormatConfig.h +++ b/llvm/include/llvm/ObjCopy/MultiFormatConfig.h @@ -24,7 +24,7 @@ struct DXContainerConfig;  class MultiFormatConfig {  public: -  virtual ~MultiFormatConfig() {} +  virtual ~MultiFormatConfig() = default;    virtual const CommonConfig &getCommonConfig() const = 0;    virtual Expected<const ELFConfig &> getELFConfig() const = 0; diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h index b5b110d..fbfe306 100644 --- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h +++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h @@ -115,7 +115,7 @@ struct RootParameterHeaderYaml {    dxbc::ShaderVisibility Visibility;    uint32_t Offset; -  RootParameterHeaderYaml(){}; +  RootParameterHeaderYaml() = default;    RootParameterHeaderYaml(dxbc::RootParameterType T) : Type(T) {}  }; @@ -123,7 +123,7 @@ struct RootParameterLocationYaml {    RootParameterHeaderYaml Header;    std::optional<size_t> IndexInSignature; -  RootParameterLocationYaml(){}; +  RootParameterLocationYaml() = default;    explicit RootParameterLocationYaml(RootParameterHeaderYaml Header)        : Header(Header) {}  }; diff --git a/llvm/include/llvm/ProfileData/DataAccessProf.h b/llvm/include/llvm/ProfileData/DataAccessProf.h index 608306f..ea256ef 100644 --- a/llvm/include/llvm/ProfileData/DataAccessProf.h +++ b/llvm/include/llvm/ProfileData/DataAccessProf.h @@ -42,7 +42,7 @@ struct SourceLocation {        : FileName(FileNameRef.str()), Line(Line) {}    // Empty constructor is used in yaml conversion. -  SourceLocation() {} +  SourceLocation() = default;    /// The filename where the data is located.    std::string FileName;    /// The line number in the source code. diff --git a/llvm/include/llvm/SandboxIR/Context.h b/llvm/include/llvm/SandboxIR/Context.h index 7d8b2c8..a8966db 100644 --- a/llvm/include/llvm/SandboxIR/Context.h +++ b/llvm/include/llvm/SandboxIR/Context.h @@ -51,7 +51,7 @@ public:      // Uses a 64-bit integer so we don't have to worry about the unlikely case      // of overflowing a 32-bit counter.      using ValTy = uint64_t; -    static constexpr const ValTy InvalidVal = 0; +    static constexpr ValTy InvalidVal = 0;    private:      // Default initialization results in an invalid ID. diff --git a/llvm/include/llvm/SandboxIR/Instruction.h b/llvm/include/llvm/SandboxIR/Instruction.h index e1c1ca0..5e369a4 100644 --- a/llvm/include/llvm/SandboxIR/Instruction.h +++ b/llvm/include/llvm/SandboxIR/Instruction.h @@ -1866,7 +1866,7 @@ class SwitchInst : public SingleLLVMInstructionImpl<llvm::SwitchInst> {    friend class Context; // For accessing the constructor in create*()  public: -  static constexpr const unsigned DefaultPseudoIndex = +  static constexpr unsigned DefaultPseudoIndex =        llvm::SwitchInst::DefaultPseudoIndex;    LLVM_ABI static SwitchInst *create(Value *V, BasicBlock *Dest, diff --git a/llvm/include/llvm/SandboxIR/Pass.h b/llvm/include/llvm/SandboxIR/Pass.h index 267389a..eb84f21 100644 --- a/llvm/include/llvm/SandboxIR/Pass.h +++ b/llvm/include/llvm/SandboxIR/Pass.h @@ -56,7 +56,7 @@ public:             "A pass name should not contain whitespaces!");      assert(!Name.starts_with('-') && "A pass name should not start with '-'!");    } -  virtual ~Pass() {} +  virtual ~Pass() = default;    /// \Returns the name of the pass.    StringRef getName() const { return Name; }  #ifndef NDEBUG diff --git a/llvm/include/llvm/SandboxIR/PassManager.h b/llvm/include/llvm/SandboxIR/PassManager.h index 93ca710..a8117aa 100644 --- a/llvm/include/llvm/SandboxIR/PassManager.h +++ b/llvm/include/llvm/SandboxIR/PassManager.h @@ -59,10 +59,10 @@ public:      Passes.push_back(std::move(Pass));    } -  static constexpr const char EndToken = '\0'; -  static constexpr const char BeginArgsToken = '<'; -  static constexpr const char EndArgsToken = '>'; -  static constexpr const char PassDelimToken = ','; +  static constexpr char EndToken = '\0'; +  static constexpr char BeginArgsToken = '<'; +  static constexpr char EndArgsToken = '>'; +  static constexpr char PassDelimToken = ',';    /// Parses \p Pipeline as a comma-separated sequence of pass names and sets    /// the pass pipeline, using \p CreatePass to instantiate passes by name. diff --git a/llvm/include/llvm/Support/Allocator.h b/llvm/include/llvm/Support/Allocator.h index bc02659..fffcbd9 100644 --- a/llvm/include/llvm/Support/Allocator.h +++ b/llvm/include/llvm/Support/Allocator.h @@ -380,7 +380,7 @@ private:  /// The standard BumpPtrAllocator which just uses the default template  /// parameters. -typedef BumpPtrAllocatorImpl<> BumpPtrAllocator; +using BumpPtrAllocator = BumpPtrAllocatorImpl<>;  /// A BumpPtrAllocator that allows only elements of a specific type to be  /// allocated. diff --git a/llvm/include/llvm/Support/Atomic.h b/llvm/include/llvm/Support/Atomic.h index c2d9ae2..3c62672 100644 --- a/llvm/include/llvm/Support/Atomic.h +++ b/llvm/include/llvm/Support/Atomic.h @@ -30,9 +30,9 @@ namespace llvm {    LLVM_ABI void MemoryFence();  #ifdef _MSC_VER -  typedef long cas_flag; +  using cas_flag = long;  #else -  typedef uint32_t cas_flag; +  using cas_flag = uint32_t;  #endif    LLVM_ABI cas_flag CompareAndSwap(volatile cas_flag *ptr, cas_flag new_value,                                     cas_flag old_value); diff --git a/llvm/include/llvm/Support/BinaryStreamArray.h b/llvm/include/llvm/Support/BinaryStreamArray.h index ef2233c..a7d03f6 100644 --- a/llvm/include/llvm/Support/BinaryStreamArray.h +++ b/llvm/include/llvm/Support/BinaryStreamArray.h @@ -93,7 +93,7 @@ class VarStreamArray {    friend class VarStreamArrayIterator<ValueType, Extractor>;  public: -  typedef VarStreamArrayIterator<ValueType, Extractor> Iterator; +  using Iterator = VarStreamArrayIterator<ValueType, Extractor>;    VarStreamArray() = default; @@ -156,8 +156,8 @@ template <typename ValueType, typename Extractor>  class VarStreamArrayIterator      : public iterator_facade_base<VarStreamArrayIterator<ValueType, Extractor>,                                    std::forward_iterator_tag, const ValueType> { -  typedef VarStreamArrayIterator<ValueType, Extractor> IterType; -  typedef VarStreamArray<ValueType, Extractor> ArrayType; +  using IterType = VarStreamArrayIterator<ValueType, Extractor>; +  using ArrayType = VarStreamArray<ValueType, Extractor>;  public:    VarStreamArrayIterator(const ArrayType &Array, const Extractor &E, @@ -260,7 +260,7 @@ template <typename T> class FixedStreamArray {    friend class FixedStreamArrayIterator<T>;  public: -  typedef FixedStreamArrayIterator<T> Iterator; +  using Iterator = FixedStreamArrayIterator<T>;    FixedStreamArray() = default;    explicit FixedStreamArray(BinaryStreamRef Stream) : Stream(Stream) { diff --git a/llvm/include/llvm/Support/Chrono.h b/llvm/include/llvm/Support/Chrono.h index 5b8102d..e5f98249 100644 --- a/llvm/include/llvm/Support/Chrono.h +++ b/llvm/include/llvm/Support/Chrono.h @@ -150,10 +150,10 @@ template <> struct unit<std::nano> {  template <typename Rep, typename Period>  struct format_provider<std::chrono::duration<Rep, Period>> {  private: -  typedef std::chrono::duration<Rep, Period> Dur; -  typedef std::conditional_t<std::chrono::treat_as_floating_point<Rep>::value, -                             double, intmax_t> -      InternalRep; +  using Dur = std::chrono::duration<Rep, Period>; +  using InternalRep = +      std::conditional_t<std::chrono::treat_as_floating_point<Rep>::value, +                         double, intmax_t>;    template <typename AsPeriod> static InternalRep getAs(const Dur &D) {      using namespace std::chrono; diff --git a/llvm/include/llvm/Support/ConvertUTF.h b/llvm/include/llvm/Support/ConvertUTF.h index bb17235..ddf7057 100644 --- a/llvm/include/llvm/Support/ConvertUTF.h +++ b/llvm/include/llvm/Support/ConvertUTF.h @@ -126,10 +126,10 @@ namespace llvm {      bit mask & shift operations.  ------------------------------------------------------------------------ */ -typedef unsigned int    UTF32;  /* at least 32 bits */ -typedef unsigned short  UTF16;  /* at least 16 bits */ -typedef unsigned char   UTF8;   /* typically 8 bits */ -typedef unsigned char   Boolean; /* 0 or 1 */ +using UTF32 = unsigned int;    /* at least 32 bits */ +using UTF16 = unsigned short;  /* at least 16 bits */ +using UTF8 = unsigned char;    /* typically 8 bits */ +using Boolean = unsigned char; /* 0 or 1 */  /* Some fundamental constants */  #define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD @@ -146,17 +146,14 @@ typedef unsigned char   Boolean; /* 0 or 1 */  #define UNI_UTF32_BYTE_ORDER_MARK_NATIVE 0x0000FEFF  #define UNI_UTF32_BYTE_ORDER_MARK_SWAPPED 0xFFFE0000 -typedef enum { -  conversionOK,           /* conversion successful */ -  sourceExhausted,        /* partial character in source, but hit end */ -  targetExhausted,        /* insuff. room in target for conversion */ -  sourceIllegal           /* source sequence is illegal/malformed */ -} ConversionResult; - -typedef enum { -  strictConversion = 0, -  lenientConversion -} ConversionFlags; +enum ConversionResult { +  conversionOK,    /* conversion successful */ +  sourceExhausted, /* partial character in source, but hit end */ +  targetExhausted, /* insuff. room in target for conversion */ +  sourceIllegal    /* source sequence is illegal/malformed */ +}; + +enum ConversionFlags { strictConversion = 0, lenientConversion };  LLVM_ABI ConversionResult ConvertUTF8toUTF16(const UTF8 **sourceStart,                                               const UTF8 *sourceEnd, diff --git a/llvm/include/llvm/Support/DebugCounter.h b/llvm/include/llvm/Support/DebugCounter.h index 39a08d4..9904a0d 100644 --- a/llvm/include/llvm/Support/DebugCounter.h +++ b/llvm/include/llvm/Support/DebugCounter.h @@ -140,7 +140,7 @@ public:    }    // Iterate through the registered counters -  typedef UniqueVector<std::string> CounterVector; +  using CounterVector = UniqueVector<std::string>;    CounterVector::const_iterator begin() const {      return RegisteredCounters.begin();    } diff --git a/llvm/include/llvm/Support/ErrorHandling.h b/llvm/include/llvm/Support/ErrorHandling.h index 4c17b6e8..a4fd008 100644 --- a/llvm/include/llvm/Support/ErrorHandling.h +++ b/llvm/include/llvm/Support/ErrorHandling.h @@ -21,8 +21,8 @@ class StringRef;  class Twine;  /// An error handler callback. -typedef void (*fatal_error_handler_t)(void *user_data, const char *reason, -                                      bool gen_crash_diag); +using fatal_error_handler_t = void (*)(void *user_data, const char *reason, +                                       bool gen_crash_diag);  /// install_fatal_error_handler - Installs a new error handler to be used  /// whenever a serious (non-recoverable) error is encountered by LLVM. diff --git a/llvm/include/llvm/Support/FormatVariadicDetails.h b/llvm/include/llvm/Support/FormatVariadicDetails.h index 0fdc7b6..c0b245e 100644 --- a/llvm/include/llvm/Support/FormatVariadicDetails.h +++ b/llvm/include/llvm/Support/FormatVariadicDetails.h @@ -63,8 +63,8 @@ template <typename T> class missing_format_adapter;  template <class T> class has_FormatProvider {  public:    using Decayed = std::decay_t<T>; -  typedef void (*Signature_format)(const Decayed &, llvm::raw_ostream &, -                                   StringRef); +  using Signature_format = void (*)(const Decayed &, llvm::raw_ostream &, +                                    StringRef);    template <typename U> using check = SameType<Signature_format, &U::format>; diff --git a/llvm/include/llvm/Support/GenericLoopInfo.h b/llvm/include/llvm/Support/GenericLoopInfo.h index b6bb360..9e2f61f 100644 --- a/llvm/include/llvm/Support/GenericLoopInfo.h +++ b/llvm/include/llvm/Support/GenericLoopInfo.h @@ -150,9 +150,9 @@ public:      assert(!isInvalid() && "Loop not in a valid state!");      return SubLoops;    } -  typedef typename std::vector<LoopT *>::const_iterator iterator; -  typedef -      typename std::vector<LoopT *>::const_reverse_iterator reverse_iterator; +  using iterator = typename std::vector<LoopT *>::const_iterator; +  using reverse_iterator = +      typename std::vector<LoopT *>::const_reverse_iterator;    iterator begin() const { return getSubLoops().begin(); }    iterator end() const { return getSubLoops().end(); }    reverse_iterator rbegin() const { return getSubLoops().rbegin(); } @@ -174,7 +174,7 @@ public:      assert(!isInvalid() && "Loop not in a valid state!");      return Blocks;    } -  typedef typename ArrayRef<BlockT *>::const_iterator block_iterator; +  using block_iterator = typename ArrayRef<BlockT *>::const_iterator;    block_iterator block_begin() const { return getBlocks().begin(); }    block_iterator block_end() const { return getBlocks().end(); }    inline iterator_range<block_iterator> blocks() const { @@ -302,7 +302,7 @@ public:    bool hasNoExitBlocks() const;    /// Edge type. -  typedef std::pair<BlockT *, BlockT *> Edge; +  using Edge = std::pair<BlockT *, BlockT *>;    /// Return all pairs of (_inside_block_,_outside_block_).    void getExitEdges(SmallVectorImpl<Edge> &ExitEdges) const; @@ -575,9 +575,9 @@ public:    /// iterator/begin/end - The interface to the top-level loops in the current    /// function.    /// -  typedef typename std::vector<LoopT *>::const_iterator iterator; -  typedef -      typename std::vector<LoopT *>::const_reverse_iterator reverse_iterator; +  using iterator = typename std::vector<LoopT *>::const_iterator; +  using reverse_iterator = +      typename std::vector<LoopT *>::const_reverse_iterator;    iterator begin() const { return TopLevelLoops.begin(); }    iterator end() const { return TopLevelLoops.end(); }    reverse_iterator rbegin() const { return TopLevelLoops.rbegin(); } diff --git a/llvm/include/llvm/Support/GenericLoopInfoImpl.h b/llvm/include/llvm/Support/GenericLoopInfoImpl.h index 5416780..c830f0a 100644 --- a/llvm/include/llvm/Support/GenericLoopInfoImpl.h +++ b/llvm/include/llvm/Support/GenericLoopInfoImpl.h @@ -459,7 +459,7 @@ template <class BlockT, class LoopT>  static void discoverAndMapSubloop(LoopT *L, ArrayRef<BlockT *> Backedges,                                    LoopInfoBase<BlockT, LoopT> *LI,                                    const DomTreeBase<BlockT> &DomTree) { -  typedef GraphTraits<Inverse<BlockT *>> InvBlockTraits; +  using InvBlockTraits = GraphTraits<Inverse<BlockT *>>;    unsigned NumBlocks = 0;    unsigned NumSubloops = 0; @@ -513,8 +513,8 @@ static void discoverAndMapSubloop(LoopT *L, ArrayRef<BlockT *> Backedges,  /// Populate all loop data in a stable order during a single forward DFS.  template <class BlockT, class LoopT> class PopulateLoopsDFS { -  typedef GraphTraits<BlockT *> BlockTraits; -  typedef typename BlockTraits::ChildIteratorType SuccIterTy; +  using BlockTraits = GraphTraits<BlockT *>; +  using SuccIterTy = typename BlockTraits::ChildIteratorType;    LoopInfoBase<BlockT, LoopT> *LI; diff --git a/llvm/include/llvm/Support/MD5.h b/llvm/include/llvm/Support/MD5.h index 4ba3867..dbcb66d 100644 --- a/llvm/include/llvm/Support/MD5.h +++ b/llvm/include/llvm/Support/MD5.h @@ -90,7 +90,7 @@ public:  private:    // Any 32-bit or wider unsigned integer data type will do. -  typedef uint32_t MD5_u32plus; +  using MD5_u32plus = uint32_t;    // Internal State    struct { diff --git a/llvm/include/llvm/Support/Mutex.h b/llvm/include/llvm/Support/Mutex.h index d61e3fd..3ca5c9a 100644 --- a/llvm/include/llvm/Support/Mutex.h +++ b/llvm/include/llvm/Support/Mutex.h @@ -63,12 +63,12 @@ namespace llvm      };      /// Mutex - A standard, always enforced mutex. -    typedef SmartMutex<false> Mutex; +    using Mutex = SmartMutex<false>;      template <bool mt_only>      using SmartScopedLock = std::lock_guard<SmartMutex<mt_only>>; -    typedef SmartScopedLock<false> ScopedLock; +    using ScopedLock = SmartScopedLock<false>;    }  } diff --git a/llvm/include/llvm/Support/OnDiskHashTable.h b/llvm/include/llvm/Support/OnDiskHashTable.h index d7d72cf..54c6b71 100644 --- a/llvm/include/llvm/Support/OnDiskHashTable.h +++ b/llvm/include/llvm/Support/OnDiskHashTable.h @@ -69,7 +69,7 @@ template <typename Info> class OnDiskChainedHashTableGenerator {          : Key(Key), Data(Data), Next(nullptr), Hash(InfoObj.ComputeHash(Key)) {}    }; -  typedef typename Info::offset_type offset_type; +  using offset_type = typename Info::offset_type;    offset_type NumBuckets;    offset_type NumEntries;    llvm::SpecificBumpPtrAllocator<Item> BA; @@ -278,12 +278,12 @@ template <typename Info> class OnDiskChainedHashTable {    Info InfoObj;  public: -  typedef Info InfoType; -  typedef typename Info::internal_key_type internal_key_type; -  typedef typename Info::external_key_type external_key_type; -  typedef typename Info::data_type data_type; -  typedef typename Info::hash_value_type hash_value_type; -  typedef typename Info::offset_type offset_type; +  using InfoType = Info; +  using internal_key_type = typename Info::internal_key_type; +  using external_key_type = typename Info::external_key_type; +  using data_type = typename Info::data_type; +  using hash_value_type = typename Info::hash_value_type; +  using offset_type = typename Info::offset_type;    OnDiskChainedHashTable(offset_type NumBuckets, offset_type NumEntries,                           const unsigned char *Buckets, @@ -435,12 +435,12 @@ class OnDiskIterableChainedHashTable : public OnDiskChainedHashTable<Info> {    const unsigned char *Payload;  public: -  typedef OnDiskChainedHashTable<Info>          base_type; -  typedef typename base_type::internal_key_type internal_key_type; -  typedef typename base_type::external_key_type external_key_type; -  typedef typename base_type::data_type         data_type; -  typedef typename base_type::hash_value_type   hash_value_type; -  typedef typename base_type::offset_type       offset_type; +  using base_type = OnDiskChainedHashTable<Info>; +  using internal_key_type = typename base_type::internal_key_type; +  using external_key_type = typename base_type::external_key_type; +  using data_type = typename base_type::data_type; +  using hash_value_type = typename base_type::hash_value_type; +  using offset_type = typename base_type::offset_type;  private:    /// Iterates over all of the keys in the table. @@ -450,7 +450,7 @@ private:      offset_type NumEntriesLeft;    public: -    typedef external_key_type value_type; +    using value_type = external_key_type;      iterator_base(const unsigned char *const Ptr, offset_type NumEntries)          : Ptr(Ptr), NumItemsInBucketLeft(0), NumEntriesLeft(NumEntries) {} @@ -505,7 +505,7 @@ public:      Info *InfoObj;    public: -    typedef external_key_type value_type; +    using value_type = external_key_type;      key_iterator(const unsigned char *const Ptr, offset_type NumEntries,                   Info *InfoObj) @@ -551,7 +551,7 @@ public:      Info *InfoObj;    public: -    typedef data_type value_type; +    using value_type = data_type;      data_iterator(const unsigned char *const Ptr, offset_type NumEntries,                    Info *InfoObj) diff --git a/llvm/include/llvm/Support/PointerLikeTypeTraits.h b/llvm/include/llvm/Support/PointerLikeTypeTraits.h index 320f6b6..a47d684 100644 --- a/llvm/include/llvm/Support/PointerLikeTypeTraits.h +++ b/llvm/include/llvm/Support/PointerLikeTypeTraits.h @@ -70,7 +70,7 @@ template <> struct PointerLikeTypeTraits<void *> {  // Provide PointerLikeTypeTraits for const things.  template <typename T> struct PointerLikeTypeTraits<const T> { -  typedef PointerLikeTypeTraits<T> NonConst; +  using NonConst = PointerLikeTypeTraits<T>;    static inline const void *getAsVoidPointer(const T P) {      return NonConst::getAsVoidPointer(P); @@ -83,7 +83,7 @@ template <typename T> struct PointerLikeTypeTraits<const T> {  // Provide PointerLikeTypeTraits for const pointers.  template <typename T> struct PointerLikeTypeTraits<const T *> { -  typedef PointerLikeTypeTraits<T *> NonConst; +  using NonConst = PointerLikeTypeTraits<T *>;    static inline const void *getAsVoidPointer(const T *P) {      return NonConst::getAsVoidPointer(const_cast<T *>(P)); diff --git a/llvm/include/llvm/Support/Program.h b/llvm/include/llvm/Support/Program.h index 53c2e75..575e416 100644 --- a/llvm/include/llvm/Support/Program.h +++ b/llvm/include/llvm/Support/Program.h @@ -39,8 +39,8 @@ const char EnvPathSeparator = ';';  typedef unsigned long procid_t; // Must match the type of DWORD on Windows.  typedef void *process_t;        // Must match the type of HANDLE on Windows.  #else -typedef ::pid_t procid_t; -typedef procid_t process_t; +using procid_t = ::pid_t; +using process_t = procid_t;  #endif  /// This struct encapsulates information about a process. diff --git a/llvm/include/llvm/Support/RISCVISAUtils.h b/llvm/include/llvm/Support/RISCVISAUtils.h index 165bb08..05fd32e 100644 --- a/llvm/include/llvm/Support/RISCVISAUtils.h +++ b/llvm/include/llvm/Support/RISCVISAUtils.h @@ -40,8 +40,8 @@ struct ExtensionComparator {  /// OrderedExtensionMap is std::map, it's specialized to keep entries  /// in canonical order of extension. -typedef std::map<std::string, ExtensionVersion, ExtensionComparator> -    OrderedExtensionMap; +using OrderedExtensionMap = +    std::map<std::string, ExtensionVersion, ExtensionComparator>;  } // namespace RISCVISAUtils diff --git a/llvm/include/llvm/Support/RWMutex.h b/llvm/include/llvm/Support/RWMutex.h index 8d221aa..efc1ca1 100644 --- a/llvm/include/llvm/Support/RWMutex.h +++ b/llvm/include/llvm/Support/RWMutex.h @@ -162,7 +162,7 @@ public:    bool try_lock() { return impl.try_lock(); }  }; -typedef SmartRWMutex<false> RWMutex; +using RWMutex = SmartRWMutex<false>;  /// ScopedReader - RAII acquisition of a reader lock  #if !defined(LLVM_USE_RW_MUTEX_IMPL) @@ -179,7 +179,7 @@ template <bool mt_only> struct SmartScopedReader {    ~SmartScopedReader() { mutex.unlock_shared(); }  };  #endif -typedef SmartScopedReader<false> ScopedReader; +using ScopedReader = SmartScopedReader<false>;  /// ScopedWriter - RAII acquisition of a writer lock  #if !defined(LLVM_USE_RW_MUTEX_IMPL) @@ -196,7 +196,7 @@ template <bool mt_only> struct SmartScopedWriter {    ~SmartScopedWriter() { mutex.unlock(); }  };  #endif -typedef SmartScopedWriter<false> ScopedWriter; +using ScopedWriter = SmartScopedWriter<false>;  } // end namespace sys  } // end namespace llvm diff --git a/llvm/include/llvm/Support/Registry.h b/llvm/include/llvm/Support/Registry.h index c02f15e..acd3b06 100644 --- a/llvm/include/llvm/Support/Registry.h +++ b/llvm/include/llvm/Support/Registry.h @@ -43,8 +43,8 @@ namespace llvm {    template <typename T>    class Registry {    public: -    typedef T type; -    typedef SimpleRegistryEntry<T> entry; +    using type = T; +    using entry = SimpleRegistryEntry<T>;      class node;      class iterator; diff --git a/llvm/include/llvm/Support/ScaledNumber.h b/llvm/include/llvm/Support/ScaledNumber.h index 07baf15..8ca8d457e 100644 --- a/llvm/include/llvm/Support/ScaledNumber.h +++ b/llvm/include/llvm/Support/ScaledNumber.h @@ -498,10 +498,10 @@ public:    static_assert(!std::numeric_limits<DigitsT>::is_signed,                  "only unsigned floats supported"); -  typedef DigitsT DigitsType; +  using DigitsType = DigitsT;  private: -  typedef std::numeric_limits<DigitsType> DigitsLimits; +  using DigitsLimits = std::numeric_limits<DigitsType>;    static constexpr int Width = sizeof(DigitsType) * 8;    static_assert(Width <= 64, "invalid integer width for digits"); @@ -782,7 +782,7 @@ uint64_t ScaledNumber<DigitsT>::scale(uint64_t N) const {  template <class DigitsT>  template <class IntT>  IntT ScaledNumber<DigitsT>::toInt() const { -  typedef std::numeric_limits<IntT> Limits; +  using Limits = std::numeric_limits<IntT>;    if (*this < 1)      return 0;    if (*this >= Limits::max()) diff --git a/llvm/include/llvm/Support/SuffixTree.h b/llvm/include/llvm/Support/SuffixTree.h index 4c78235..eac66d8 100644 --- a/llvm/include/llvm/Support/SuffixTree.h +++ b/llvm/include/llvm/Support/SuffixTree.h @@ -219,7 +219,7 @@ public:      }    }; -  typedef RepeatedSubstringIterator iterator; +  using iterator = RepeatedSubstringIterator;    iterator begin() { return iterator(Root, LeafNodes); }    iterator end() { return iterator(nullptr); }  }; diff --git a/llvm/include/llvm/Support/Threading.h b/llvm/include/llvm/Support/Threading.h index 8884680..89d90b3 100644 --- a/llvm/include/llvm/Support/Threading.h +++ b/llvm/include/llvm/Support/Threading.h @@ -53,7 +53,7 @@ constexpr bool llvm_is_multithreaded() { return LLVM_ENABLE_THREADS; }  #if LLVM_THREADING_USE_STD_CALL_ONCE -  typedef std::once_flag once_flag; +using once_flag = std::once_flag;  #else diff --git a/llvm/include/llvm/Support/TrailingObjects.h b/llvm/include/llvm/Support/TrailingObjects.h index c479765..218c2e3 100644 --- a/llvm/include/llvm/Support/TrailingObjects.h +++ b/llvm/include/llvm/Support/TrailingObjects.h @@ -76,7 +76,7 @@ protected:  // number of a different type. e.g.:  //   ExtractSecondType<Foo..., int>::type  template <typename Ty1, typename Ty2> struct ExtractSecondType { -  typedef Ty2 type; +  using type = Ty2;  };  // TrailingObjectsImpl is somewhat complicated, because it is a @@ -101,8 +101,8 @@ class TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, PrevTy, NextTy,      : public TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, NextTy,                                   MoreTys...> { -  typedef TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, NextTy, MoreTys...> -      ParentType; +  using ParentType = +      TrailingObjectsImpl<Align, BaseTy, TopTrailingObj, NextTy, MoreTys...>;    struct RequiresRealignment {      static const bool value = alignof(PrevTy) < alignof(NextTy); diff --git a/llvm/include/llvm/Support/UnicodeCharRanges.h b/llvm/include/llvm/Support/UnicodeCharRanges.h index 7f1a9b3..2b5fc83 100644 --- a/llvm/include/llvm/Support/UnicodeCharRanges.h +++ b/llvm/include/llvm/Support/UnicodeCharRanges.h @@ -37,7 +37,7 @@ inline bool operator<(UnicodeCharRange Range, uint32_t Value) {  /// array.  class UnicodeCharSet {  public: -  typedef ArrayRef<UnicodeCharRange> CharRanges; +  using CharRanges = ArrayRef<UnicodeCharRange>;    /// Constructs a UnicodeCharSet instance from an array of    /// UnicodeCharRanges. diff --git a/llvm/include/llvm/Support/float128.h b/llvm/include/llvm/Support/float128.h index e15a98d..ffad124 100644 --- a/llvm/include/llvm/Support/float128.h +++ b/llvm/include/llvm/Support/float128.h @@ -14,7 +14,7 @@ namespace llvm {  #if defined(__clang__) && defined(__FLOAT128__) &&                             \      defined(__SIZEOF_INT128__) && !defined(__LONG_DOUBLE_IBM128__)  #define HAS_IEE754_FLOAT128 -typedef __float128 float128; +using float128 = __float128;  #elif defined(__FLOAT128__) && defined(__SIZEOF_INT128__) &&                   \      !defined(__LONG_DOUBLE_IBM128__) &&                                        \      (defined(__GNUC__) || defined(__GNUG__)) diff --git a/llvm/include/llvm/Support/thread.h b/llvm/include/llvm/Support/thread.h index 16e322b..ecde62d 100644 --- a/llvm/include/llvm/Support/thread.h +++ b/llvm/include/llvm/Support/thread.h @@ -127,7 +127,7 @@ LLVM_ABI thread::id llvm_thread_get_current_id_impl();  template <class Function, class... Args>  thread::thread(std::optional<unsigned> StackSizeInBytes, Function &&f,                 Args &&...args) { -  typedef std::tuple<std::decay_t<Function>, std::decay_t<Args>...> CalleeTuple; +  using CalleeTuple = std::tuple<std::decay_t<Function>, std::decay_t<Args>...>;    std::unique_ptr<CalleeTuple> Callee(        new CalleeTuple(std::forward<Function>(f), std::forward<Args>(args)...)); diff --git a/llvm/lib/CAS/ActionCaches.cpp b/llvm/lib/CAS/ActionCaches.cpp index 571c5b3..003c850 100644 --- a/llvm/lib/CAS/ActionCaches.cpp +++ b/llvm/lib/CAS/ActionCaches.cpp @@ -13,7 +13,11 @@  #include "BuiltinCAS.h"  #include "llvm/ADT/TrieRawHashMap.h"  #include "llvm/CAS/ActionCache.h" +#include "llvm/CAS/OnDiskKeyValueDB.h" +#include "llvm/CAS/UnifiedOnDiskCache.h" +#include "llvm/Config/llvm-config.h"  #include "llvm/Support/BLAKE3.h" +#include "llvm/Support/Errc.h"  #define DEBUG_TYPE "cas-action-caches" @@ -47,12 +51,54 @@ public:    Expected<std::optional<CASID>> getImpl(ArrayRef<uint8_t> ActionKey,                                           bool CanBeDistributed) const final; +  Error validate() const final { +    return createStringError("InMemoryActionCache doesn't support validate()"); +  } +  private:    using DataT = CacheEntry<sizeof(HashType)>;    using InMemoryCacheT = ThreadSafeTrieRawHashMap<DataT, sizeof(HashType)>;    InMemoryCacheT Cache;  }; + +/// Builtin basic OnDiskActionCache that uses one underlying OnDiskKeyValueDB. +class OnDiskActionCache final : public ActionCache { +public: +  Error putImpl(ArrayRef<uint8_t> ActionKey, const CASID &Result, +                bool CanBeDistributed) final; +  Expected<std::optional<CASID>> getImpl(ArrayRef<uint8_t> ActionKey, +                                         bool CanBeDistributed) const final; + +  static Expected<std::unique_ptr<OnDiskActionCache>> create(StringRef Path); + +  Error validate() const final; + +private: +  static StringRef getHashName() { return "BLAKE3"; } + +  OnDiskActionCache(std::unique_ptr<ondisk::OnDiskKeyValueDB> DB); + +  std::unique_ptr<ondisk::OnDiskKeyValueDB> DB; +  using DataT = CacheEntry<sizeof(HashType)>; +}; + +/// Builtin unified ActionCache that wraps around UnifiedOnDiskCache to provide +/// access to its ActionCache. +class UnifiedOnDiskActionCache final : public ActionCache { +public: +  Error putImpl(ArrayRef<uint8_t> ActionKey, const CASID &Result, +                bool CanBeDistributed) final; +  Expected<std::optional<CASID>> getImpl(ArrayRef<uint8_t> ActionKey, +                                         bool CanBeDistributed) const final; + +  UnifiedOnDiskActionCache(std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB); + +  Error validate() const final; + +private: +  std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB; +};  } // end namespace  static Error createResultCachePoisonedError(ArrayRef<uint8_t> KeyHash, @@ -99,3 +145,123 @@ std::unique_ptr<ActionCache> createInMemoryActionCache() {  }  } // namespace llvm::cas + +OnDiskActionCache::OnDiskActionCache( +    std::unique_ptr<ondisk::OnDiskKeyValueDB> DB) +    : ActionCache(builtin::BuiltinCASContext::getDefaultContext()), +      DB(std::move(DB)) {} + +Expected<std::unique_ptr<OnDiskActionCache>> +OnDiskActionCache::create(StringRef AbsPath) { +  std::unique_ptr<ondisk::OnDiskKeyValueDB> DB; +  if (Error E = ondisk::OnDiskKeyValueDB::open(AbsPath, getHashName(), +                                               sizeof(HashType), getHashName(), +                                               sizeof(DataT)) +                    .moveInto(DB)) +    return std::move(E); +  return std::unique_ptr<OnDiskActionCache>( +      new OnDiskActionCache(std::move(DB))); +} + +Expected<std::optional<CASID>> +OnDiskActionCache::getImpl(ArrayRef<uint8_t> Key, +                           bool /*CanBeDistributed*/) const { +  std::optional<ArrayRef<char>> Val; +  if (Error E = DB->get(Key).moveInto(Val)) +    return std::move(E); +  if (!Val) +    return std::nullopt; +  return CASID::create(&getContext(), toStringRef(*Val)); +} + +Error OnDiskActionCache::putImpl(ArrayRef<uint8_t> Key, const CASID &Result, +                                 bool /*CanBeDistributed*/) { +  auto ResultHash = Result.getHash(); +  ArrayRef Expected((const char *)ResultHash.data(), ResultHash.size()); +  ArrayRef<char> Observed; +  if (Error E = DB->put(Key, Expected).moveInto(Observed)) +    return E; + +  if (Expected == Observed) +    return Error::success(); + +  return createResultCachePoisonedError( +      Key, getContext(), Result, +      ArrayRef((const uint8_t *)Observed.data(), Observed.size())); +} + +Error OnDiskActionCache::validate() const { +  // FIXME: without the matching CAS there is nothing we can check about the +  // cached values. The hash size is already validated by the DB validator. +  return DB->validate(nullptr); +} + +UnifiedOnDiskActionCache::UnifiedOnDiskActionCache( +    std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) +    : ActionCache(builtin::BuiltinCASContext::getDefaultContext()), +      UniDB(std::move(UniDB)) {} + +Expected<std::optional<CASID>> +UnifiedOnDiskActionCache::getImpl(ArrayRef<uint8_t> Key, +                                  bool /*CanBeDistributed*/) const { +  std::optional<ArrayRef<char>> Val; +  if (Error E = UniDB->getKeyValueDB().get(Key).moveInto(Val)) +    return std::move(E); +  if (!Val) +    return std::nullopt; +  auto ID = ondisk::UnifiedOnDiskCache::getObjectIDFromValue(*Val); +  return CASID::create(&getContext(), +                       toStringRef(UniDB->getGraphDB().getDigest(ID))); +} + +Error UnifiedOnDiskActionCache::putImpl(ArrayRef<uint8_t> Key, +                                        const CASID &Result, +                                        bool /*CanBeDistributed*/) { +  auto Expected = UniDB->getGraphDB().getReference(Result.getHash()); +  if (LLVM_UNLIKELY(!Expected)) +    return Expected.takeError(); + +  auto Value = ondisk::UnifiedOnDiskCache::getValueFromObjectID(*Expected); +  std::optional<ArrayRef<char>> Observed; +  if (Error E = UniDB->getKeyValueDB().put(Key, Value).moveInto(Observed)) +    return E; + +  auto ObservedID = ondisk::UnifiedOnDiskCache::getObjectIDFromValue(*Observed); +  if (*Expected == ObservedID) +    return Error::success(); + +  return createResultCachePoisonedError( +      Key, getContext(), Result, UniDB->getGraphDB().getDigest(ObservedID)); +} + +Error UnifiedOnDiskActionCache::validate() const { +  auto ValidateRef = [](FileOffset Offset, ArrayRef<char> Value) -> Error { +    auto ID = ondisk::UnifiedOnDiskCache::getObjectIDFromValue(Value); +    auto formatError = [&](Twine Msg) { +      return createStringError( +          llvm::errc::illegal_byte_sequence, +          "bad record at 0x" + +              utohexstr((unsigned)Offset.get(), /*LowerCase=*/true) + ": " + +              Msg.str()); +    }; +    if (ID.getOpaqueData() == 0) +      return formatError("zero is not a valid ref"); +    return Error::success(); +  }; +  return UniDB->getKeyValueDB().validate(ValidateRef); +} + +Expected<std::unique_ptr<ActionCache>> +cas::createOnDiskActionCache(StringRef Path) { +#if LLVM_ENABLE_ONDISK_CAS +  return OnDiskActionCache::create(Path); +#else +  return createStringError(inconvertibleErrorCode(), "OnDiskCache is disabled"); +#endif +} + +std::unique_ptr<ActionCache> +cas::builtin::createActionCacheFromUnifiedOnDiskCache( +    std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) { +  return std::make_unique<UnifiedOnDiskActionCache>(std::move(UniDB)); +} diff --git a/llvm/lib/CAS/BuiltinCAS.cpp b/llvm/lib/CAS/BuiltinCAS.cpp index 73646ad..e9bc6d8 100644 --- a/llvm/lib/CAS/BuiltinCAS.cpp +++ b/llvm/lib/CAS/BuiltinCAS.cpp @@ -9,6 +9,7 @@  #include "BuiltinCAS.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/CAS/BuiltinObjectHasher.h" +#include "llvm/CAS/UnifiedOnDiskCache.h"  #include "llvm/Support/Process.h"  using namespace llvm; @@ -68,7 +69,7 @@ Expected<ObjectRef> BuiltinCAS::store(ArrayRef<ObjectRef> Refs,                     Refs, Data);  } -Error BuiltinCAS::validate(const CASID &ID) { +Error BuiltinCAS::validateObject(const CASID &ID) {    auto Ref = getReference(ID);    if (!Ref)      return createUnknownObjectError(ID); @@ -92,3 +93,14 @@ Error BuiltinCAS::validate(const CASID &ID) {    return Error::success();  } + +Expected<std::unique_ptr<ondisk::UnifiedOnDiskCache>> +cas::builtin::createBuiltinUnifiedOnDiskCache(StringRef Path) { +#if LLVM_ENABLE_ONDISK_CAS +  return ondisk::UnifiedOnDiskCache::open(Path, /*SizeLimit=*/std::nullopt, +                                          BuiltinCASContext::getHashName(), +                                          sizeof(HashType)); +#else +  return createStringError(inconvertibleErrorCode(), "OnDiskCache is disabled"); +#endif +} diff --git a/llvm/lib/CAS/BuiltinCAS.h b/llvm/lib/CAS/BuiltinCAS.h index 3b5374d..4d2de66 100644 --- a/llvm/lib/CAS/BuiltinCAS.h +++ b/llvm/lib/CAS/BuiltinCAS.h @@ -1,4 +1,4 @@ -//===- BuiltinCAS.h ---------------------------------------------*- C++ -*-===// +//===----------------------------------------------------------------------===//  //  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.  // See https://llvm.org/LICENSE.txt for license information. @@ -15,6 +15,9 @@  namespace llvm::cas {  class ActionCache; +namespace ondisk { +class UnifiedOnDiskCache; +} // namespace ondisk  namespace builtin {  /// Common base class for builtin CAS implementations using the same CASContext. @@ -65,9 +68,27 @@ public:                               "corrupt storage");    } -  Error validate(const CASID &ID) final; +  Error validateObject(const CASID &ID) final;  }; +/// Create a \p UnifiedOnDiskCache instance that uses \p BLAKE3 hashing. +Expected<std::unique_ptr<ondisk::UnifiedOnDiskCache>> +createBuiltinUnifiedOnDiskCache(StringRef Path); + +/// \param UniDB A \p UnifiedOnDiskCache instance from \p +/// createBuiltinUnifiedOnDiskCache. +std::unique_ptr<ObjectStore> createObjectStoreFromUnifiedOnDiskCache( +    std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB); + +/// \param UniDB A \p UnifiedOnDiskCache instance from \p +/// createBuiltinUnifiedOnDiskCache. +std::unique_ptr<ActionCache> createActionCacheFromUnifiedOnDiskCache( +    std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB); + +// FIXME: Proxy not portable. Maybe also error-prone? +constexpr StringLiteral DefaultDirProxy = "/^llvm::cas::builtin::default"; +constexpr StringLiteral DefaultDir = "llvm.cas.builtin.default"; +  } // end namespace builtin  } // end namespace llvm::cas diff --git a/llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp b/llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp new file mode 100644 index 0000000..f3f6fa0 --- /dev/null +++ b/llvm/lib/CAS/BuiltinUnifiedCASDatabases.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/CAS/BuiltinUnifiedCASDatabases.h" +#include "BuiltinCAS.h" +#include "llvm/CAS/ActionCache.h" +#include "llvm/CAS/UnifiedOnDiskCache.h" + +using namespace llvm; +using namespace llvm::cas; + +Expected<std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>>> +cas::createOnDiskUnifiedCASDatabases(StringRef Path) { +  std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB; +  if (Error E = builtin::createBuiltinUnifiedOnDiskCache(Path).moveInto(UniDB)) +    return std::move(E); +  auto CAS = builtin::createObjectStoreFromUnifiedOnDiskCache(UniDB); +  auto AC = builtin::createActionCacheFromUnifiedOnDiskCache(std::move(UniDB)); +  return std::make_pair(std::move(CAS), std::move(AC)); +} + +Expected<ValidationResult> cas::validateOnDiskUnifiedCASDatabasesIfNeeded( +    StringRef Path, bool CheckHash, bool AllowRecovery, bool ForceValidation, +    std::optional<StringRef> LLVMCasBinary) { +#if LLVM_ENABLE_ONDISK_CAS +  return ondisk::UnifiedOnDiskCache::validateIfNeeded( +      Path, builtin::BuiltinCASContext::getHashName(), +      sizeof(builtin::HashType), CheckHash, AllowRecovery, ForceValidation, +      LLVMCasBinary); +#else +  return createStringError(inconvertibleErrorCode(), "OnDiskCache is disabled"); +#endif +} diff --git a/llvm/lib/CAS/CMakeLists.txt b/llvm/lib/CAS/CMakeLists.txt index a2f8c49..aad77dc 100644 --- a/llvm/lib/CAS/CMakeLists.txt +++ b/llvm/lib/CAS/CMakeLists.txt @@ -2,15 +2,18 @@ add_llvm_component_library(LLVMCAS    ActionCache.cpp    ActionCaches.cpp    BuiltinCAS.cpp +  BuiltinUnifiedCASDatabases.cpp    DatabaseFile.cpp    InMemoryCAS.cpp    MappedFileRegionArena.cpp    ObjectStore.cpp +  OnDiskCAS.cpp    OnDiskCommon.cpp    OnDiskDataAllocator.cpp    OnDiskGraphDB.cpp    OnDiskKeyValueDB.cpp    OnDiskTrieRawHashMap.cpp +  UnifiedOnDiskCache.cpp    ADDITIONAL_HEADER_DIRS    ${LLVM_MAIN_INCLUDE_DIR}/llvm/CAS diff --git a/llvm/lib/CAS/InMemoryCAS.cpp b/llvm/lib/CAS/InMemoryCAS.cpp index c63ee70d..2d4eedd 100644 --- a/llvm/lib/CAS/InMemoryCAS.cpp +++ b/llvm/lib/CAS/InMemoryCAS.cpp @@ -233,6 +233,12 @@ public:      return cast<InMemoryObject>(asInMemoryObject(Node)).getData();    } +  void print(raw_ostream &OS) const final; + +  Error validate(bool CheckHash) const final { +    return createStringError("InMemoryCAS doesn't support validate()"); +  } +    InMemoryCAS() = default;  private: @@ -271,6 +277,8 @@ ArrayRef<const InMemoryObject *> InMemoryObject::getRefs() const {    return cast<InMemoryInlineObject>(this)->getRefsImpl();  } +void InMemoryCAS::print(raw_ostream &OS) const {} +  Expected<ObjectRef>  InMemoryCAS::storeFromNullTerminatedRegion(ArrayRef<uint8_t> ComputedHash,                                             sys::fs::mapped_file_region Map) { diff --git a/llvm/lib/CAS/ObjectStore.cpp b/llvm/lib/CAS/ObjectStore.cpp index e0be50b..3110577 100644 --- a/llvm/lib/CAS/ObjectStore.cpp +++ b/llvm/lib/CAS/ObjectStore.cpp @@ -1,4 +1,4 @@ -//===- ObjectStore.cpp ------------------------------------------*- C++ -*-===// +//===----------------------------------------------------------------------===//  //  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.  // See https://llvm.org/LICENSE.txt for license information. @@ -12,7 +12,7 @@  #include "llvm/Support/Errc.h"  #include "llvm/Support/FileSystem.h"  #include "llvm/Support/MemoryBuffer.h" -#include <optional> +#include <deque>  using namespace llvm;  using namespace llvm::cas; @@ -21,6 +21,7 @@ void CASContext::anchor() {}  void ObjectStore::anchor() {}  LLVM_DUMP_METHOD void CASID::dump() const { print(dbgs()); } +LLVM_DUMP_METHOD void ObjectStore::dump() const { print(dbgs()); }  LLVM_DUMP_METHOD void ObjectRef::dump() const { print(dbgs()); }  LLVM_DUMP_METHOD void ObjectHandle::dump() const { print(dbgs()); } @@ -141,7 +142,7 @@ Error ObjectStore::validateTree(ObjectRef Root) {      auto [I, Inserted] = ValidatedRefs.insert(Ref);      if (!Inserted)        continue; // already validated. -    if (Error E = validate(getID(Ref))) +    if (Error E = validateObject(getID(Ref)))        return E;      Expected<ObjectHandle> Obj = load(Ref);      if (!Obj) @@ -155,6 +156,92 @@ Error ObjectStore::validateTree(ObjectRef Root) {    return Error::success();  } +Expected<ObjectRef> ObjectStore::importObject(ObjectStore &Upstream, +                                              ObjectRef Other) { +  // Copy the full CAS tree from upstream with depth-first ordering to ensure +  // all the child nodes are available in downstream CAS before inserting +  // current object. This uses a similar algorithm as +  // `OnDiskGraphDB::importFullTree` but doesn't assume the upstream CAS schema +  // so it can be used to import from any other ObjectStore reguardless of the +  // CAS schema. + +  // There is no work to do if importing from self. +  if (this == &Upstream) +    return Other; + +  /// Keeps track of the state of visitation for current node and all of its +  /// parents. Upstream Cursor holds information only from upstream CAS. +  struct UpstreamCursor { +    ObjectRef Ref; +    ObjectHandle Node; +    size_t RefsCount; +    std::deque<ObjectRef> Refs; +  }; +  SmallVector<UpstreamCursor, 16> CursorStack; +  /// PrimaryNodeStack holds the ObjectRef of the current CAS, with nodes either +  /// just stored in the CAS or nodes already exists in the current CAS. +  SmallVector<ObjectRef, 128> PrimaryRefStack; +  /// A map from upstream ObjectRef to current ObjectRef. +  llvm::DenseMap<ObjectRef, ObjectRef> CreatedObjects; + +  auto enqueueNode = [&](ObjectRef Ref, ObjectHandle Node) { +    unsigned NumRefs = Upstream.getNumRefs(Node); +    std::deque<ObjectRef> Refs; +    for (unsigned I = 0; I < NumRefs; ++I) +      Refs.push_back(Upstream.readRef(Node, I)); + +    CursorStack.push_back({Ref, Node, NumRefs, std::move(Refs)}); +  }; + +  auto UpstreamHandle = Upstream.load(Other); +  if (!UpstreamHandle) +    return UpstreamHandle.takeError(); +  enqueueNode(Other, *UpstreamHandle); + +  while (!CursorStack.empty()) { +    UpstreamCursor &Cur = CursorStack.back(); +    if (Cur.Refs.empty()) { +      // Copy the node data into the primary store. +      // The bottom of \p PrimaryRefStack contains the ObjectRef for the +      // current node. +      assert(PrimaryRefStack.size() >= Cur.RefsCount); +      auto Refs = ArrayRef(PrimaryRefStack) +                      .slice(PrimaryRefStack.size() - Cur.RefsCount); +      auto NewNode = store(Refs, Upstream.getData(Cur.Node)); +      if (!NewNode) +        return NewNode.takeError(); + +      // Remove the current node and its IDs from the stack. +      PrimaryRefStack.truncate(PrimaryRefStack.size() - Cur.RefsCount); +      CursorStack.pop_back(); + +      PrimaryRefStack.push_back(*NewNode); +      CreatedObjects.try_emplace(Cur.Ref, *NewNode); +      continue; +    } + +    // Check if the node exists already. +    auto CurrentID = Cur.Refs.front(); +    Cur.Refs.pop_front(); +    auto Ref = CreatedObjects.find(CurrentID); +    if (Ref != CreatedObjects.end()) { +      // If exists already, just need to enqueue the primary node. +      PrimaryRefStack.push_back(Ref->second); +      continue; +    } + +    // Load child. +    auto PrimaryID = Upstream.load(CurrentID); +    if (LLVM_UNLIKELY(!PrimaryID)) +      return PrimaryID.takeError(); + +    enqueueNode(CurrentID, *PrimaryID); +  } + +  assert(PrimaryRefStack.size() == 1); +  return PrimaryRefStack.front(); +} +  std::unique_ptr<MemoryBuffer>  ObjectProxy::getMemoryBuffer(StringRef Name,                               bool RequiresNullTerminator) const { diff --git a/llvm/lib/CAS/OnDiskCAS.cpp b/llvm/lib/CAS/OnDiskCAS.cpp new file mode 100644 index 0000000..7d29f44 --- /dev/null +++ b/llvm/lib/CAS/OnDiskCAS.cpp @@ -0,0 +1,211 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "BuiltinCAS.h" +#include "llvm/CAS/BuiltinCASContext.h" +#include "llvm/CAS/BuiltinObjectHasher.h" +#include "llvm/CAS/OnDiskGraphDB.h" +#include "llvm/CAS/UnifiedOnDiskCache.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Error.h" + +using namespace llvm; +using namespace llvm::cas; +using namespace llvm::cas::builtin; + +namespace { + +class OnDiskCAS : public BuiltinCAS { +public: +  Expected<ObjectRef> storeImpl(ArrayRef<uint8_t> ComputedHash, +                                ArrayRef<ObjectRef> Refs, +                                ArrayRef<char> Data) final; + +  Expected<std::optional<ObjectHandle>> loadIfExists(ObjectRef Ref) final; + +  CASID getID(ObjectRef Ref) const final; + +  std::optional<ObjectRef> getReference(const CASID &ID) const final; + +  Expected<bool> isMaterialized(ObjectRef Ref) const final; + +  ArrayRef<char> getDataConst(ObjectHandle Node) const final; + +  void print(raw_ostream &OS) const final; +  Error validate(bool CheckHash) const final; + +  static Expected<std::unique_ptr<OnDiskCAS>> open(StringRef Path); + +  OnDiskCAS(std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) +      : UnifiedDB(std::move(UniDB)), DB(&UnifiedDB->getGraphDB()) {} + +private: +  ObjectHandle convertHandle(ondisk::ObjectHandle Node) const { +    return makeObjectHandle(Node.getOpaqueData()); +  } + +  ondisk::ObjectHandle convertHandle(ObjectHandle Node) const { +    return ondisk::ObjectHandle(Node.getInternalRef(*this)); +  } + +  ObjectRef convertRef(ondisk::ObjectID Ref) const { +    return makeObjectRef(Ref.getOpaqueData()); +  } + +  ondisk::ObjectID convertRef(ObjectRef Ref) const { +    return ondisk::ObjectID::fromOpaqueData(Ref.getInternalRef(*this)); +  } + +  size_t getNumRefs(ObjectHandle Node) const final { +    auto RefsRange = DB->getObjectRefs(convertHandle(Node)); +    return std::distance(RefsRange.begin(), RefsRange.end()); +  } + +  ObjectRef readRef(ObjectHandle Node, size_t I) const final { +    auto RefsRange = DB->getObjectRefs(convertHandle(Node)); +    return convertRef(RefsRange.begin()[I]); +  } + +  Error forEachRef(ObjectHandle Node, +                   function_ref<Error(ObjectRef)> Callback) const final; + +  Error setSizeLimit(std::optional<uint64_t> SizeLimit) final; +  Expected<std::optional<uint64_t>> getStorageSize() const final; +  Error pruneStorageData() final; + +  OnDiskCAS(std::unique_ptr<ondisk::OnDiskGraphDB> GraphDB) +      : OwnedDB(std::move(GraphDB)), DB(OwnedDB.get()) {} + +  std::unique_ptr<ondisk::OnDiskGraphDB> OwnedDB; +  std::shared_ptr<ondisk::UnifiedOnDiskCache> UnifiedDB; +  ondisk::OnDiskGraphDB *DB; +}; + +} // end anonymous namespace + +void OnDiskCAS::print(raw_ostream &OS) const { DB->print(OS); } +Error OnDiskCAS::validate(bool CheckHash) const { +  auto Hasher = [](ArrayRef<ArrayRef<uint8_t>> Refs, ArrayRef<char> Data, +                   SmallVectorImpl<uint8_t> &Result) { +    auto Hash = BuiltinObjectHasher<llvm::cas::builtin::HasherT>::hashObject( +        Refs, Data); +    Result.assign(Hash.begin(), Hash.end()); +  }; + +  if (auto E = DB->validate(CheckHash, Hasher)) +    return E; + +  return Error::success(); +} + +CASID OnDiskCAS::getID(ObjectRef Ref) const { +  ArrayRef<uint8_t> Hash = DB->getDigest(convertRef(Ref)); +  return CASID::create(&getContext(), toStringRef(Hash)); +} + +std::optional<ObjectRef> OnDiskCAS::getReference(const CASID &ID) const { +  std::optional<ondisk::ObjectID> ObjID = +      DB->getExistingReference(ID.getHash()); +  if (!ObjID) +    return std::nullopt; +  return convertRef(*ObjID); +} + +Expected<bool> OnDiskCAS::isMaterialized(ObjectRef ExternalRef) const { +  return DB->isMaterialized(convertRef(ExternalRef)); +} + +ArrayRef<char> OnDiskCAS::getDataConst(ObjectHandle Node) const { +  return DB->getObjectData(convertHandle(Node)); +} + +Expected<std::optional<ObjectHandle>> +OnDiskCAS::loadIfExists(ObjectRef ExternalRef) { +  Expected<std::optional<ondisk::ObjectHandle>> ObjHnd = +      DB->load(convertRef(ExternalRef)); +  if (!ObjHnd) +    return ObjHnd.takeError(); +  if (!*ObjHnd) +    return std::nullopt; +  return convertHandle(**ObjHnd); +} + +Expected<ObjectRef> OnDiskCAS::storeImpl(ArrayRef<uint8_t> ComputedHash, +                                         ArrayRef<ObjectRef> Refs, +                                         ArrayRef<char> Data) { +  SmallVector<ondisk::ObjectID, 64> IDs; +  IDs.reserve(Refs.size()); +  for (ObjectRef Ref : Refs) { +    IDs.push_back(convertRef(Ref)); +  } + +  auto StoredID = DB->getReference(ComputedHash); +  if (LLVM_UNLIKELY(!StoredID)) +    return StoredID.takeError(); +  if (Error E = DB->store(*StoredID, IDs, Data)) +    return std::move(E); +  return convertRef(*StoredID); +} + +Error OnDiskCAS::forEachRef(ObjectHandle Node, +                            function_ref<Error(ObjectRef)> Callback) const { +  auto RefsRange = DB->getObjectRefs(convertHandle(Node)); +  for (ondisk::ObjectID Ref : RefsRange) { +    if (Error E = Callback(convertRef(Ref))) +      return E; +  } +  return Error::success(); +} + +Error OnDiskCAS::setSizeLimit(std::optional<uint64_t> SizeLimit) { +  UnifiedDB->setSizeLimit(SizeLimit); +  return Error::success(); +} + +Expected<std::optional<uint64_t>> OnDiskCAS::getStorageSize() const { +  return UnifiedDB->getStorageSize(); +} + +Error OnDiskCAS::pruneStorageData() { return UnifiedDB->collectGarbage(); } + +Expected<std::unique_ptr<OnDiskCAS>> OnDiskCAS::open(StringRef AbsPath) { +  Expected<std::unique_ptr<ondisk::OnDiskGraphDB>> DB = +      ondisk::OnDiskGraphDB::open(AbsPath, BuiltinCASContext::getHashName(), +                                  sizeof(HashType)); +  if (!DB) +    return DB.takeError(); +  return std::unique_ptr<OnDiskCAS>(new OnDiskCAS(std::move(*DB))); +} + +bool cas::isOnDiskCASEnabled() { +#if LLVM_ENABLE_ONDISK_CAS +  return true; +#else +  return false; +#endif +} + +Expected<std::unique_ptr<ObjectStore>> cas::createOnDiskCAS(const Twine &Path) { +#if LLVM_ENABLE_ONDISK_CAS +  // FIXME: An absolute path isn't really good enough. Should open a directory +  // and use openat() for files underneath. +  SmallString<256> AbsPath; +  Path.toVector(AbsPath); +  sys::fs::make_absolute(AbsPath); + +  return OnDiskCAS::open(AbsPath); +#else +  return createStringError(inconvertibleErrorCode(), "OnDiskCAS is disabled"); +#endif /* LLVM_ENABLE_ONDISK_CAS */ +} + +std::unique_ptr<ObjectStore> +cas::builtin::createObjectStoreFromUnifiedOnDiskCache( +    std::shared_ptr<ondisk::UnifiedOnDiskCache> UniDB) { +  return std::make_unique<OnDiskCAS>(std::move(UniDB)); +} diff --git a/llvm/lib/CAS/OnDiskGraphDB.cpp b/llvm/lib/CAS/OnDiskGraphDB.cpp index 64cbe9d..245b6fb 100644 --- a/llvm/lib/CAS/OnDiskGraphDB.cpp +++ b/llvm/lib/CAS/OnDiskGraphDB.cpp @@ -893,6 +893,10 @@ int64_t DataRecordHandle::getDataRelOffset() const {  }  Error OnDiskGraphDB::validate(bool Deep, HashingFuncT Hasher) const { +  if (UpstreamDB) { +    if (auto E = UpstreamDB->validate(Deep, Hasher)) +      return E; +  }    return Index.validate([&](FileOffset Offset,                              OnDiskTrieRawHashMap::ConstValueProxy Record)                              -> Error { @@ -1202,11 +1206,8 @@ OnDiskGraphDB::load(ObjectID ExternalRef) {      return I.takeError();    TrieRecord::Data Object = I->Ref.load(); -  if (Object.SK == TrieRecord::StorageKind::Unknown) { -    if (!UpstreamDB) -      return std::nullopt; +  if (Object.SK == TrieRecord::StorageKind::Unknown)      return faultInFromUpstream(ExternalRef); -  }    if (Object.SK == TrieRecord::StorageKind::DataPool)      return ObjectHandle::fromFileOffset(Object.Offset); @@ -1286,8 +1287,10 @@ OnDiskGraphDB::getObjectPresence(ObjectID ExternalRef,    TrieRecord::Data Object = I->Ref.load();    if (Object.SK != TrieRecord::StorageKind::Unknown)      return ObjectPresence::InPrimaryDB; +    if (!CheckUpstream || !UpstreamDB)      return ObjectPresence::Missing; +    std::optional<ObjectID> UpstreamID =        UpstreamDB->getExistingReference(getDigest(*I));    return UpstreamID.has_value() ? ObjectPresence::OnlyInUpstreamDB @@ -1549,9 +1552,10 @@ unsigned OnDiskGraphDB::getHardStorageLimitUtilization() const {    return std::max(IndexPercent, DataPercent);  } -Expected<std::unique_ptr<OnDiskGraphDB>> OnDiskGraphDB::open( -    StringRef AbsPath, StringRef HashName, unsigned HashByteSize, -    std::unique_ptr<OnDiskGraphDB> UpstreamDB, FaultInPolicy Policy) { +Expected<std::unique_ptr<OnDiskGraphDB>> +OnDiskGraphDB::open(StringRef AbsPath, StringRef HashName, +                    unsigned HashByteSize, OnDiskGraphDB *UpstreamDB, +                    FaultInPolicy Policy) {    if (std::error_code EC = sys::fs::create_directories(AbsPath))      return createFileError(AbsPath, EC); @@ -1604,18 +1608,15 @@ Expected<std::unique_ptr<OnDiskGraphDB>> OnDiskGraphDB::open(                               "unexpected user header in '" + DataPoolPath +                                   "'"); -  return std::unique_ptr<OnDiskGraphDB>( -      new OnDiskGraphDB(AbsPath, std::move(*Index), std::move(*DataPool), -                        std::move(UpstreamDB), Policy)); +  return std::unique_ptr<OnDiskGraphDB>(new OnDiskGraphDB( +      AbsPath, std::move(*Index), std::move(*DataPool), UpstreamDB, Policy));  }  OnDiskGraphDB::OnDiskGraphDB(StringRef RootPath, OnDiskTrieRawHashMap Index,                               OnDiskDataAllocator DataPool, -                             std::unique_ptr<OnDiskGraphDB> UpstreamDB, -                             FaultInPolicy Policy) +                             OnDiskGraphDB *UpstreamDB, FaultInPolicy Policy)      : Index(std::move(Index)), DataPool(std::move(DataPool)), -      RootPath(RootPath.str()), UpstreamDB(std::move(UpstreamDB)), -      FIPolicy(Policy) { +      RootPath(RootPath.str()), UpstreamDB(UpstreamDB), FIPolicy(Policy) {    /// Lifetime for "big" objects not in DataPool.    ///    /// NOTE: Could use ThreadSafeTrieRawHashMap here. For now, doing something @@ -1638,7 +1639,6 @@ Error OnDiskGraphDB::importFullTree(ObjectID PrimaryID,    // against the process dying during importing and leaving the database with an    // incomplete tree. Note that if the upstream has missing nodes then the tree    // will be copied with missing nodes as well, it won't be considered an error. -    struct UpstreamCursor {      ObjectHandle Node;      size_t RefsCount; @@ -1720,7 +1720,6 @@ Error OnDiskGraphDB::importSingleNode(ObjectID PrimaryID,    // Copy the node data into the primary store.    // FIXME: Use hard-link or cloning if the file-system supports it and data is    // stored into a separate file. -    auto Data = UpstreamDB->getObjectData(UpstreamNode);    auto UpstreamRefs = UpstreamDB->getObjectRefs(UpstreamNode);    SmallVector<ObjectID, 64> Refs; @@ -1737,7 +1736,8 @@ Error OnDiskGraphDB::importSingleNode(ObjectID PrimaryID,  Expected<std::optional<ObjectHandle>>  OnDiskGraphDB::faultInFromUpstream(ObjectID PrimaryID) { -  assert(UpstreamDB); +  if (!UpstreamDB) +    return std::nullopt;    auto UpstreamID = UpstreamDB->getReference(getDigest(PrimaryID));    if (LLVM_UNLIKELY(!UpstreamID)) diff --git a/llvm/lib/CAS/OnDiskKeyValueDB.cpp b/llvm/lib/CAS/OnDiskKeyValueDB.cpp index 2186071..15656cb 100644 --- a/llvm/lib/CAS/OnDiskKeyValueDB.cpp +++ b/llvm/lib/CAS/OnDiskKeyValueDB.cpp @@ -20,6 +20,7 @@  #include "llvm/CAS/OnDiskKeyValueDB.h"  #include "OnDiskCommon.h"  #include "llvm/ADT/StringExtras.h" +#include "llvm/CAS/UnifiedOnDiskCache.h"  #include "llvm/Support/Alignment.h"  #include "llvm/Support/Compiler.h"  #include "llvm/Support/Errc.h" @@ -53,15 +54,21 @@ Expected<std::optional<ArrayRef<char>>>  OnDiskKeyValueDB::get(ArrayRef<uint8_t> Key) {    // Check the result cache.    OnDiskTrieRawHashMap::ConstOnDiskPtr ActionP = Cache.find(Key); -  if (!ActionP) +  if (ActionP) { +    assert(isAddrAligned(Align(8), ActionP->Data.data())); +    return ActionP->Data; +  } +  if (!UnifiedCache || !UnifiedCache->UpstreamKVDB)      return std::nullopt; -  assert(isAddrAligned(Align(8), ActionP->Data.data())); -  return ActionP->Data; + +  // Try to fault in from upstream. +  return UnifiedCache->faultInFromUpstreamKV(Key);  }  Expected<std::unique_ptr<OnDiskKeyValueDB>>  OnDiskKeyValueDB::open(StringRef Path, StringRef HashName, unsigned KeySize, -                       StringRef ValueName, size_t ValueSize) { +                       StringRef ValueName, size_t ValueSize, +                       UnifiedOnDiskCache *Cache) {    if (std::error_code EC = sys::fs::create_directories(Path))      return createFileError(Path, EC); @@ -87,10 +94,14 @@ OnDiskKeyValueDB::open(StringRef Path, StringRef HashName, unsigned KeySize,      return std::move(E);    return std::unique_ptr<OnDiskKeyValueDB>( -      new OnDiskKeyValueDB(ValueSize, std::move(*ActionCache))); +      new OnDiskKeyValueDB(ValueSize, std::move(*ActionCache), Cache));  }  Error OnDiskKeyValueDB::validate(CheckValueT CheckValue) const { +  if (UnifiedCache && UnifiedCache->UpstreamKVDB) { +    if (auto E = UnifiedCache->UpstreamKVDB->validate(CheckValue)) +      return E; +  }    return Cache.validate(        [&](FileOffset Offset,            OnDiskTrieRawHashMap::ConstValueProxy Record) -> Error { diff --git a/llvm/lib/CAS/UnifiedOnDiskCache.cpp b/llvm/lib/CAS/UnifiedOnDiskCache.cpp new file mode 100644 index 0000000..ae9d818 --- /dev/null +++ b/llvm/lib/CAS/UnifiedOnDiskCache.cpp @@ -0,0 +1,613 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +/// \file +/// Encapsulates \p OnDiskGraphDB and \p OnDiskKeyValueDB instances within one +/// directory while also restricting storage growth with a scheme of chaining +/// the two most recent directories (primary & upstream), where the primary +/// "faults-in" data from the upstream one. When the primary (most recent) +/// directory exceeds its intended limit a new empty directory becomes the +/// primary one. +/// +/// Within the top-level directory (the path that \p UnifiedOnDiskCache::open +/// receives) there are directories named like this: +/// +/// 'v<version>.<x>' +/// 'v<version>.<x+1>' +/// 'v<version>.<x+2>' +/// ... +/// +/// 'version' is the version integer for this \p UnifiedOnDiskCache's scheme and +/// the part after the dot is an increasing integer. The primary directory is +/// the one with the highest integer and the upstream one is the directory +/// before it. For example, if the sub-directories contained are: +/// +/// 'v1.5', 'v1.6', 'v1.7', 'v1.8' +/// +/// Then the primary one is 'v1.8', the upstream one is 'v1.7', and the rest are +/// unused directories that can be safely deleted at any time and by any +/// process. +/// +/// Contained within the top-level directory is a file named "lock" which is +/// used for processes to take shared or exclusive locks for the contents of the +/// top directory. While a \p UnifiedOnDiskCache is open it keeps a shared lock +/// for the top-level directory; when it closes, if the primary sub-directory +/// exceeded its limit, it attempts to get an exclusive lock in order to create +/// a new empty primary directory; if it can't get the exclusive lock it gives +/// up and lets the next \p UnifiedOnDiskCache instance that closes to attempt +/// again. +/// +/// The downside of this scheme is that while \p UnifiedOnDiskCache is open on a +/// directory, by any process, the storage size in that directory will keep +/// growing unrestricted. But the major benefit is that garbage-collection can +/// be triggered on a directory concurrently, at any time and by any process, +/// without affecting any active readers/writers in the same process or other +/// processes. +/// +/// The \c UnifiedOnDiskCache also provides validation and recovery on top of +/// the underlying on-disk storage. The low-level storage is designed to remain +/// coherent across regular process crashes, but may be invalid after power loss +/// or similar system failures. \c UnifiedOnDiskCache::validateIfNeeded allows +/// validating the contents once per boot and can recover by marking invalid +/// data for garbage collection. +/// +/// The data recovery described above requires exclusive access to the CAS, and +/// it is an error to attempt recovery if the CAS is open in any process/thread. +/// In order to maximize backwards compatibility with tools that do not perform +/// validation before opening the CAS, we do not attempt to get exclusive access +/// until recovery is actually performed, meaning as long as the data is valid +/// it will not conflict with concurrent use. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CAS/UnifiedOnDiskCache.h" +#include "BuiltinCAS.h" +#include "OnDiskCommon.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/ScopeExit.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/CAS/ActionCache.h" +#include "llvm/CAS/OnDiskGraphDB.h" +#include "llvm/CAS/OnDiskKeyValueDB.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Errc.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/FileUtilities.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/raw_ostream.h" +#include <optional> + +#if __has_include(<sys/sysctl.h>) +#include <sys/sysctl.h> +#endif + +using namespace llvm; +using namespace llvm::cas; +using namespace llvm::cas::ondisk; + +/// FIXME: When the version of \p DBDirPrefix is bumped up we need to figure out +/// how to handle the leftover sub-directories of the previous version, within +/// the \p UnifiedOnDiskCache::collectGarbage function. +static constexpr StringLiteral DBDirPrefix = "v1."; + +static constexpr StringLiteral ValidationFilename = "v1.validation"; +static constexpr StringLiteral CorruptPrefix = "corrupt."; + +ObjectID UnifiedOnDiskCache::getObjectIDFromValue(ArrayRef<char> Value) { +  // little endian encoded. +  assert(Value.size() == sizeof(uint64_t)); +  return ObjectID::fromOpaqueData(support::endian::read64le(Value.data())); +} + +UnifiedOnDiskCache::ValueBytes +UnifiedOnDiskCache::getValueFromObjectID(ObjectID ID) { +  // little endian encoded. +  UnifiedOnDiskCache::ValueBytes ValBytes; +  static_assert(ValBytes.size() == sizeof(ID.getOpaqueData())); +  support::endian::write64le(ValBytes.data(), ID.getOpaqueData()); +  return ValBytes; +} + +Expected<std::optional<ArrayRef<char>>> +UnifiedOnDiskCache::faultInFromUpstreamKV(ArrayRef<uint8_t> Key) { +  assert(UpstreamGraphDB); +  assert(UpstreamKVDB); + +  std::optional<ArrayRef<char>> UpstreamValue; +  if (Error E = UpstreamKVDB->get(Key).moveInto(UpstreamValue)) +    return std::move(E); +  if (!UpstreamValue) +    return std::nullopt; + +  // The value is the \p ObjectID in the context of the upstream +  // \p OnDiskGraphDB instance. Translate it to the context of the primary +  // \p OnDiskGraphDB instance. +  ObjectID UpstreamID = getObjectIDFromValue(*UpstreamValue); +  auto PrimaryID = +      PrimaryGraphDB->getReference(UpstreamGraphDB->getDigest(UpstreamID)); +  if (LLVM_UNLIKELY(!PrimaryID)) +    return PrimaryID.takeError(); +  return PrimaryKVDB->put(Key, getValueFromObjectID(*PrimaryID)); +} + +/// \returns all the 'v<version>.<x>' names of sub-directories, sorted with +/// ascending order of the integer after the dot. Corrupt directories, if +/// included, will come first. +static Expected<SmallVector<std::string, 4>> +getAllDBDirs(StringRef Path, bool IncludeCorrupt = false) { +  struct DBDir { +    uint64_t Order; +    std::string Name; +  }; +  SmallVector<DBDir> FoundDBDirs; + +  std::error_code EC; +  for (sys::fs::directory_iterator DirI(Path, EC), DirE; !EC && DirI != DirE; +       DirI.increment(EC)) { +    if (DirI->type() != sys::fs::file_type::directory_file) +      continue; +    StringRef SubDir = sys::path::filename(DirI->path()); +    if (IncludeCorrupt && SubDir.starts_with(CorruptPrefix)) { +      FoundDBDirs.push_back({0, std::string(SubDir)}); +      continue; +    } +    if (!SubDir.starts_with(DBDirPrefix)) +      continue; +    uint64_t Order; +    if (SubDir.substr(DBDirPrefix.size()).getAsInteger(10, Order)) +      return createStringError(inconvertibleErrorCode(), +                               "unexpected directory " + DirI->path()); +    FoundDBDirs.push_back({Order, std::string(SubDir)}); +  } +  if (EC) +    return createFileError(Path, EC); + +  llvm::sort(FoundDBDirs, [](const DBDir &LHS, const DBDir &RHS) -> bool { +    return LHS.Order <= RHS.Order; +  }); + +  SmallVector<std::string, 4> DBDirs; +  for (DBDir &Dir : FoundDBDirs) +    DBDirs.push_back(std::move(Dir.Name)); +  return DBDirs; +} + +static Expected<SmallVector<std::string, 4>> getAllGarbageDirs(StringRef Path) { +  auto DBDirs = getAllDBDirs(Path, /*IncludeCorrupt=*/true); +  if (!DBDirs) +    return DBDirs.takeError(); + +  // FIXME: When the version of \p DBDirPrefix is bumped up we need to figure +  // out how to handle the leftover sub-directories of the previous version. + +  for (unsigned Keep = 2; Keep > 0 && !DBDirs->empty(); --Keep) { +    StringRef Back(DBDirs->back()); +    if (Back.starts_with(CorruptPrefix)) +      break; +    DBDirs->pop_back(); +  } +  return *DBDirs; +} + +/// \returns Given a sub-directory named 'v<version>.<x>', it outputs the +/// 'v<version>.<x+1>' name. +static void getNextDBDirName(StringRef DBDir, llvm::raw_ostream &OS) { +  assert(DBDir.starts_with(DBDirPrefix)); +  uint64_t Count; +  bool Failed = DBDir.substr(DBDirPrefix.size()).getAsInteger(10, Count); +  assert(!Failed); +  (void)Failed; +  OS << DBDirPrefix << Count + 1; +} + +static Error validateOutOfProcess(StringRef LLVMCasBinary, StringRef RootPath, +                                  bool CheckHash) { +  SmallVector<StringRef> Args{LLVMCasBinary, "-cas", RootPath, "-validate"}; +  if (CheckHash) +    Args.push_back("-check-hash"); + +  llvm::SmallString<128> StdErrPath; +  int StdErrFD = -1; +  if (std::error_code EC = sys::fs::createTemporaryFile( +          "llvm-cas-validate-stderr", "txt", StdErrFD, StdErrPath, +          llvm::sys::fs::OF_Text)) +    return createStringError(EC, "failed to create temporary file"); +  FileRemover OutputRemover(StdErrPath.c_str()); + +  std::optional<llvm::StringRef> Redirects[] = { +      {""}, // stdin = /dev/null +      {""}, // stdout = /dev/null +      StdErrPath.str(), +  }; + +  std::string ErrMsg; +  int Result = +      sys::ExecuteAndWait(LLVMCasBinary, Args, /*Env=*/std::nullopt, Redirects, +                          /*SecondsToWait=*/120, /*MemoryLimit=*/0, &ErrMsg); + +  if (Result == -1) +    return createStringError("failed to exec " + join(Args, " ") + ": " + +                             ErrMsg); +  if (Result != 0) { +    llvm::SmallString<64> Err("cas contents invalid"); +    if (!ErrMsg.empty()) { +      Err += ": "; +      Err += ErrMsg; +    } +    auto StdErrBuf = MemoryBuffer::getFile(StdErrPath.c_str()); +    if (StdErrBuf && !(*StdErrBuf)->getBuffer().empty()) { +      Err += ": "; +      Err += (*StdErrBuf)->getBuffer(); +    } +    return createStringError(Err); +  } +  return Error::success(); +} + +static Error validateInProcess(StringRef RootPath, StringRef HashName, +                               unsigned HashByteSize, bool CheckHash) { +  std::shared_ptr<UnifiedOnDiskCache> UniDB; +  if (Error E = UnifiedOnDiskCache::open(RootPath, std::nullopt, HashName, +                                         HashByteSize) +                    .moveInto(UniDB)) +    return E; +  auto CAS = builtin::createObjectStoreFromUnifiedOnDiskCache(UniDB); +  if (Error E = CAS->validate(CheckHash)) +    return E; +  auto Cache = builtin::createActionCacheFromUnifiedOnDiskCache(UniDB); +  if (Error E = Cache->validate()) +    return E; +  return Error::success(); +} + +static Expected<uint64_t> getBootTime() { +#if __has_include(<sys/sysctl.h>) && defined(KERN_BOOTTIME) +  struct timeval TV; +  size_t TVLen = sizeof(TV); +  int KernBoot[2] = {CTL_KERN, KERN_BOOTTIME}; +  if (sysctl(KernBoot, 2, &TV, &TVLen, nullptr, 0) < 0) +    return createStringError(llvm::errnoAsErrorCode(), +                             "failed to get boottime"); +  if (TVLen != sizeof(TV)) +    return createStringError("sysctl kern.boottime unexpected format"); +  return TV.tv_sec; +#elif defined(__linux__) +  // Use the mtime for /proc, which is recreated during system boot. +  // We could also read /proc/stat and search for 'btime'. +  sys::fs::file_status Status; +  if (std::error_code EC = sys::fs::status("/proc", Status)) +    return createFileError("/proc", EC); +  return Status.getLastModificationTime().time_since_epoch().count(); +#else +  llvm::report_fatal_error("getBootTime unimplemented"); +#endif +} + +Expected<ValidationResult> UnifiedOnDiskCache::validateIfNeeded( +    StringRef RootPath, StringRef HashName, unsigned HashByteSize, +    bool CheckHash, bool AllowRecovery, bool ForceValidation, +    std::optional<StringRef> LLVMCasBinaryPath) { +  if (std::error_code EC = sys::fs::create_directories(RootPath)) +    return createFileError(RootPath, EC); + +  SmallString<256> PathBuf(RootPath); +  sys::path::append(PathBuf, ValidationFilename); +  int FD = -1; +  if (std::error_code EC = sys::fs::openFileForReadWrite( +          PathBuf, FD, sys::fs::CD_OpenAlways, sys::fs::OF_None)) +    return createFileError(PathBuf, EC); +  assert(FD != -1); + +  sys::fs::file_t File = sys::fs::convertFDToNativeFile(FD); +  auto CloseFile = make_scope_exit([&]() { sys::fs::closeFile(File); }); + +  if (std::error_code EC = lockFileThreadSafe(FD, sys::fs::LockKind::Exclusive)) +    return createFileError(PathBuf, EC); +  auto UnlockFD = make_scope_exit([&]() { unlockFileThreadSafe(FD); }); + +  SmallString<8> Bytes; +  if (Error E = sys::fs::readNativeFileToEOF(File, Bytes)) +    return createFileError(PathBuf, std::move(E)); + +  uint64_t ValidationBootTime = 0; +  if (!Bytes.empty() && +      StringRef(Bytes).trim().getAsInteger(10, ValidationBootTime)) +    return createFileError(PathBuf, errc::illegal_byte_sequence, +                           "expected integer"); + +  static uint64_t BootTime = 0; +  if (BootTime == 0) +    if (Error E = getBootTime().moveInto(BootTime)) +      return std::move(E); + +  std::string LogValidationError; + +  if (ValidationBootTime == BootTime && !ForceValidation) +    return ValidationResult::Skipped; + +  // Validate! +  bool NeedsRecovery = false; +  if (Error E = +          LLVMCasBinaryPath +              ? validateOutOfProcess(*LLVMCasBinaryPath, RootPath, CheckHash) +              : validateInProcess(RootPath, HashName, HashByteSize, +                                  CheckHash)) { +    if (AllowRecovery) { +      consumeError(std::move(E)); +      NeedsRecovery = true; +    } else { +      return std::move(E); +    } +  } + +  if (NeedsRecovery) { +    sys::path::remove_filename(PathBuf); +    sys::path::append(PathBuf, "lock"); + +    int LockFD = -1; +    if (std::error_code EC = sys::fs::openFileForReadWrite( +            PathBuf, LockFD, sys::fs::CD_OpenAlways, sys::fs::OF_None)) +      return createFileError(PathBuf, EC); +    sys::fs::file_t LockFile = sys::fs::convertFDToNativeFile(LockFD); +    auto CloseLock = make_scope_exit([&]() { sys::fs::closeFile(LockFile); }); +    if (std::error_code EC = tryLockFileThreadSafe(LockFD)) { +      if (EC == std::errc::no_lock_available) +        return createFileError( +            PathBuf, EC, +            "CAS validation requires exclusive access but CAS was in use"); +      return createFileError(PathBuf, EC); +    } +    auto UnlockFD = make_scope_exit([&]() { unlockFileThreadSafe(LockFD); }); + +    auto DBDirs = getAllDBDirs(RootPath); +    if (!DBDirs) +      return DBDirs.takeError(); + +    for (StringRef DBDir : *DBDirs) { +      sys::path::remove_filename(PathBuf); +      sys::path::append(PathBuf, DBDir); +      std::error_code EC; +      int Attempt = 0, MaxAttempts = 100; +      SmallString<128> GCPath; +      for (; Attempt < MaxAttempts; ++Attempt) { +        GCPath.assign(RootPath); +        sys::path::append(GCPath, CorruptPrefix + std::to_string(Attempt) + +                                      "." + DBDir); +        EC = sys::fs::rename(PathBuf, GCPath); +        // Darwin uses ENOTEMPTY. Linux may return either ENOTEMPTY or EEXIST. +        if (EC != errc::directory_not_empty && EC != errc::file_exists) +          break; +      } +      if (Attempt == MaxAttempts) +        return createStringError( +            EC, "rename " + PathBuf + +                    " failed: too many CAS directories awaiting pruning"); +      if (EC) +        return createStringError(EC, "rename " + PathBuf + " to " + GCPath + +                                         " failed: " + EC.message()); +    } +  } + +  if (ValidationBootTime != BootTime) { +    // Fix filename in case we have error to report. +    sys::path::remove_filename(PathBuf); +    sys::path::append(PathBuf, ValidationFilename); +    if (std::error_code EC = sys::fs::resize_file(FD, 0)) +      return createFileError(PathBuf, EC); +    raw_fd_ostream OS(FD, /*shouldClose=*/false); +    OS.seek(0); // resize does not reset position +    OS << BootTime << '\n'; +    if (OS.has_error()) +      return createFileError(PathBuf, OS.error()); +  } + +  return NeedsRecovery ? ValidationResult::Recovered : ValidationResult::Valid; +} + +Expected<std::unique_ptr<UnifiedOnDiskCache>> +UnifiedOnDiskCache::open(StringRef RootPath, std::optional<uint64_t> SizeLimit, +                         StringRef HashName, unsigned HashByteSize, +                         OnDiskGraphDB::FaultInPolicy FaultInPolicy) { +  if (std::error_code EC = sys::fs::create_directories(RootPath)) +    return createFileError(RootPath, EC); + +  SmallString<256> PathBuf(RootPath); +  sys::path::append(PathBuf, "lock"); +  int LockFD = -1; +  if (std::error_code EC = sys::fs::openFileForReadWrite( +          PathBuf, LockFD, sys::fs::CD_OpenAlways, sys::fs::OF_None)) +    return createFileError(PathBuf, EC); +  assert(LockFD != -1); +  // Locking the directory using shared lock, which will prevent other processes +  // from creating a new chain (essentially while a \p UnifiedOnDiskCache +  // instance holds a shared lock the storage for the primary directory will +  // grow unrestricted). +  if (std::error_code EC = +          lockFileThreadSafe(LockFD, sys::fs::LockKind::Shared)) +    return createFileError(PathBuf, EC); + +  auto DBDirs = getAllDBDirs(RootPath); +  if (!DBDirs) +    return DBDirs.takeError(); +  if (DBDirs->empty()) +    DBDirs->push_back((Twine(DBDirPrefix) + "1").str()); + +  assert(!DBDirs->empty()); + +  /// If there is only one directory open databases on it. If there are 2 or +  /// more directories, get the most recent directories and chain them, with the +  /// most recent being the primary one. The remaining directories are unused +  /// data than can be garbage-collected. +  auto UniDB = std::unique_ptr<UnifiedOnDiskCache>(new UnifiedOnDiskCache()); +  std::unique_ptr<OnDiskGraphDB> UpstreamGraphDB; +  std::unique_ptr<OnDiskKeyValueDB> UpstreamKVDB; +  if (DBDirs->size() > 1) { +    StringRef UpstreamDir = *(DBDirs->end() - 2); +    PathBuf = RootPath; +    sys::path::append(PathBuf, UpstreamDir); +    if (Error E = OnDiskGraphDB::open(PathBuf, HashName, HashByteSize, +                                      /*UpstreamDB=*/nullptr, FaultInPolicy) +                      .moveInto(UpstreamGraphDB)) +      return std::move(E); +    if (Error E = OnDiskKeyValueDB::open(PathBuf, HashName, HashByteSize, +                                         /*ValueName=*/"objectid", +                                         /*ValueSize=*/sizeof(uint64_t)) +                      .moveInto(UpstreamKVDB)) +      return std::move(E); +  } + +  StringRef PrimaryDir = *(DBDirs->end() - 1); +  PathBuf = RootPath; +  sys::path::append(PathBuf, PrimaryDir); +  std::unique_ptr<OnDiskGraphDB> PrimaryGraphDB; +  if (Error E = OnDiskGraphDB::open(PathBuf, HashName, HashByteSize, +                                    UpstreamGraphDB.get(), FaultInPolicy) +                    .moveInto(PrimaryGraphDB)) +    return std::move(E); +  std::unique_ptr<OnDiskKeyValueDB> PrimaryKVDB; +  // \p UnifiedOnDiskCache does manual chaining for key-value requests, +  // including an extra translation step of the value during fault-in. +  if (Error E = +          OnDiskKeyValueDB::open(PathBuf, HashName, HashByteSize, +                                 /*ValueName=*/"objectid", +                                 /*ValueSize=*/sizeof(uint64_t), UniDB.get()) +              .moveInto(PrimaryKVDB)) +    return std::move(E); + +  UniDB->RootPath = RootPath; +  UniDB->SizeLimit = SizeLimit.value_or(0); +  UniDB->LockFD = LockFD; +  UniDB->NeedsGarbageCollection = DBDirs->size() > 2; +  UniDB->PrimaryDBDir = PrimaryDir; +  UniDB->UpstreamGraphDB = std::move(UpstreamGraphDB); +  UniDB->PrimaryGraphDB = std::move(PrimaryGraphDB); +  UniDB->UpstreamKVDB = std::move(UpstreamKVDB); +  UniDB->PrimaryKVDB = std::move(PrimaryKVDB); + +  return std::move(UniDB); +} + +void UnifiedOnDiskCache::setSizeLimit(std::optional<uint64_t> SizeLimit) { +  this->SizeLimit = SizeLimit.value_or(0); +} + +uint64_t UnifiedOnDiskCache::getStorageSize() const { +  uint64_t TotalSize = getPrimaryStorageSize(); +  if (UpstreamGraphDB) +    TotalSize += UpstreamGraphDB->getStorageSize(); +  if (UpstreamKVDB) +    TotalSize += UpstreamKVDB->getStorageSize(); +  return TotalSize; +} + +uint64_t UnifiedOnDiskCache::getPrimaryStorageSize() const { +  return PrimaryGraphDB->getStorageSize() + PrimaryKVDB->getStorageSize(); +} + +bool UnifiedOnDiskCache::hasExceededSizeLimit() const { +  uint64_t CurSizeLimit = SizeLimit; +  if (!CurSizeLimit) +    return false; + +  // If the hard limit is beyond 85%, declare above limit and request clean up. +  unsigned CurrentPercent = +      std::max(PrimaryGraphDB->getHardStorageLimitUtilization(), +               PrimaryKVDB->getHardStorageLimitUtilization()); +  if (CurrentPercent > 85) +    return true; + +  // We allow each of the directories in the chain to reach up to half the +  // intended size limit. Check whether the primary directory has exceeded half +  // the limit or not, in order to decide whether we need to start a new chain. +  // +  // We could check the size limit against the sum of sizes of both the primary +  // and upstream directories but then if the upstream is significantly larger +  // than the intended limit, it would trigger a new chain to be created before +  // the primary has reached its own limit. Essentially in such situation we +  // prefer reclaiming the storage later in order to have more consistent cache +  // hits behavior. +  return (CurSizeLimit / 2) < getPrimaryStorageSize(); +} + +Error UnifiedOnDiskCache::close(bool CheckSizeLimit) { +  if (LockFD == -1) +    return Error::success(); // already closed. +  auto CloseLock = make_scope_exit([&]() { +    assert(LockFD >= 0); +    sys::fs::file_t LockFile = sys::fs::convertFDToNativeFile(LockFD); +    sys::fs::closeFile(LockFile); +    LockFD = -1; +  }); + +  bool ExceededSizeLimit = CheckSizeLimit ? hasExceededSizeLimit() : false; +  UpstreamKVDB.reset(); +  PrimaryKVDB.reset(); +  UpstreamGraphDB.reset(); +  PrimaryGraphDB.reset(); +  if (std::error_code EC = unlockFileThreadSafe(LockFD)) +    return createFileError(RootPath, EC); + +  if (!ExceededSizeLimit) +    return Error::success(); + +  // The primary directory exceeded its intended size limit. Try to get an +  // exclusive lock in order to create a new primary directory for next time +  // this \p UnifiedOnDiskCache path is opened. + +  if (std::error_code EC = tryLockFileThreadSafe( +          LockFD, std::chrono::milliseconds(0), sys::fs::LockKind::Exclusive)) { +    if (EC == errc::no_lock_available) +      return Error::success(); // couldn't get exclusive lock, give up. +    return createFileError(RootPath, EC); +  } +  auto UnlockFile = make_scope_exit([&]() { unlockFileThreadSafe(LockFD); }); + +  // Managed to get an exclusive lock which means there are no other open +  // \p UnifiedOnDiskCache instances for the same path, so we can safely start a +  // new primary directory. To start a new primary directory we just have to +  // create a new empty directory with the next consecutive index; since this is +  // an atomic operation we will leave the top-level directory in a consistent +  // state even if the process dies during this code-path. + +  SmallString<256> PathBuf(RootPath); +  raw_svector_ostream OS(PathBuf); +  OS << sys::path::get_separator(); +  getNextDBDirName(PrimaryDBDir, OS); +  if (std::error_code EC = sys::fs::create_directory(PathBuf)) +    return createFileError(PathBuf, EC); + +  NeedsGarbageCollection = true; +  return Error::success(); +} + +UnifiedOnDiskCache::UnifiedOnDiskCache() = default; + +UnifiedOnDiskCache::~UnifiedOnDiskCache() { consumeError(close()); } + +Error UnifiedOnDiskCache::collectGarbage(StringRef Path) { +  auto DBDirs = getAllGarbageDirs(Path); +  if (!DBDirs) +    return DBDirs.takeError(); + +  SmallString<256> PathBuf(Path); +  for (StringRef UnusedSubDir : *DBDirs) { +    sys::path::append(PathBuf, UnusedSubDir); +    if (std::error_code EC = sys::fs::remove_directories(PathBuf)) +      return createFileError(PathBuf, EC); +    sys::path::remove_filename(PathBuf); +  } +  return Error::success(); +} + +Error UnifiedOnDiskCache::collectGarbage() { return collectGarbage(RootPath); } diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index e5c85d5..1ea30d8 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -745,11 +745,6 @@ void AppleAccelTableStaticTypeData::emit(AsmPrinter *Asm) const {    Asm->emitInt32(QualifiedNameHash);  } -constexpr AppleAccelTableData::Atom AppleAccelTableTypeData::Atoms[]; -constexpr AppleAccelTableData::Atom AppleAccelTableOffsetData::Atoms[]; -constexpr AppleAccelTableData::Atom AppleAccelTableStaticOffsetData::Atoms[]; -constexpr AppleAccelTableData::Atom AppleAccelTableStaticTypeData::Atoms[]; -  #ifndef NDEBUG  void AppleAccelTableWriter::Header::print(raw_ostream &OS) const {    OS << "Magic: " << format("0x%x", Magic) << "\n" diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 4b4df98..637acd6 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -109,8 +109,10 @@ MachineInstrBuilder MachineIRBuilder::buildConstDbgValue(const Constant &C,    if (auto *CI = dyn_cast<ConstantInt>(NumericConstant)) {      if (CI->getBitWidth() > 64)        MIB.addCImm(CI); -    else +    else if (CI->getBitWidth() == 1)        MIB.addImm(CI->getZExtValue()); +    else +      MIB.addImm(CI->getSExtValue());    } else if (auto *CFP = dyn_cast<ConstantFP>(NumericConstant)) {      MIB.addFPImm(CFP);    } else if (isa<ConstantPointerNull>(NumericConstant)) { diff --git a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp index bb10cf6..d84c3fb 100644 --- a/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -733,6 +733,8 @@ MachineOperand GetMOForConstDbgOp(const SDDbgOperand &Op) {    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {      if (CI->getBitWidth() > 64)        return MachineOperand::CreateCImm(CI); +    if (CI->getBitWidth() == 1) +      return MachineOperand::CreateImm(CI->getZExtValue());      return MachineOperand::CreateImm(CI->getSExtValue());    }    if (const ConstantFP *CF = dyn_cast<ConstantFP>(V)) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index a522650..fa0c899 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -8958,9 +8958,8 @@ bool SelectionDAGBuilder::canTailCall(const CallBase &CB) const {    // Avoid emitting tail calls in functions with the disable-tail-calls    // attribute.    const Function *Caller = CB.getParent()->getParent(); -  if (Caller->getFnAttribute("disable-tail-calls").getValueAsString() == -          "true" && -      !isMustTailCall) +  if (!isMustTailCall && +      Caller->getFnAttribute("disable-tail-calls").getValueAsBool())      return false;    // We can't tail call inside a function with a swifterror argument. Lowering diff --git a/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h b/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h index 84757ae..970abdc 100644 --- a/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h +++ b/llvm/lib/DWARFLinker/Parallel/DWARFLinkerUnit.h @@ -28,7 +28,7 @@ using MacroOffset2UnitMapTy = DenseMap<uint64_t, DwarfUnit *>;  /// Base class for all Dwarf units(Compile unit/Type table unit).  class DwarfUnit : public OutputSections {  public: -  virtual ~DwarfUnit() {} +  virtual ~DwarfUnit() = default;    DwarfUnit(LinkingGlobalData &GlobalData, unsigned ID,              StringRef ClangModuleName)        : OutputSections(GlobalData), ID(ID), ClangModuleName(ClangModuleName), diff --git a/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h b/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h index f67536e..8ccb4a5 100644 --- a/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h +++ b/llvm/lib/DWARFLinker/Parallel/StringEntryToDwarfStringPoolEntryMap.h @@ -22,7 +22,7 @@ class StringEntryToDwarfStringPoolEntryMap {  public:    StringEntryToDwarfStringPoolEntryMap(LinkingGlobalData &GlobalData)        : GlobalData(GlobalData) {} -  ~StringEntryToDwarfStringPoolEntryMap() {} +  ~StringEntryToDwarfStringPoolEntryMap() = default;    /// Create DwarfStringPoolEntry for specified StringEntry if necessary.    /// Initialize DwarfStringPoolEntry with initial values. diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp index 7e606c6a..4e7db82 100644 --- a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp +++ b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp @@ -27,7 +27,7 @@  namespace llvm {  namespace orc { -MemoryMapper::~MemoryMapper() {} +MemoryMapper::~MemoryMapper() = default;  InProcessMemoryMapper::InProcessMemoryMapper(size_t PageSize)      : PageSize(PageSize) {} diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index 0e5926f..fff9a81 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -528,7 +528,7 @@ void OpenMPIRBuilder::getKernelArgsVector(TargetKernelArgs &KernelArgs,    Value *Version = Builder.getInt32(OMP_KERNEL_ARG_VERSION);    Value *PointerNum = Builder.getInt32(KernelArgs.NumTargetItems);    auto Int32Ty = Type::getInt32Ty(Builder.getContext()); -  constexpr const size_t MaxDim = 3; +  constexpr size_t MaxDim = 3;    Value *ZeroArray = Constant::getNullValue(ArrayType::get(Int32Ty, MaxDim));    Value *Flags = Builder.getInt64(KernelArgs.HasNoWait); diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index b618222..23be42f 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -1076,63 +1076,59 @@ Expected<ArrayRef<SymbolResolution>>  LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,                  ArrayRef<SymbolResolution> Res) {    llvm::TimeTraceScope timeScope("LTO add thin LTO"); +  const auto BMID = BM.getModuleIdentifier();    ArrayRef<SymbolResolution> ResTmp = Res;    for (const InputFile::Symbol &Sym : Syms) {      assert(!ResTmp.empty());      const SymbolResolution &R = ResTmp.consume_front(); -    if (!Sym.getIRName().empty()) { +    if (!Sym.getIRName().empty() && R.Prevailing) {        auto GUID = GlobalValue::getGUIDAssumingExternalLinkage(            GlobalValue::getGlobalIdentifier(Sym.getIRName(),                                             GlobalValue::ExternalLinkage, "")); -      if (R.Prevailing) -        ThinLTO.setPrevailingModuleForGUID(GUID, BM.getModuleIdentifier()); +      ThinLTO.setPrevailingModuleForGUID(GUID, BMID);      }    } -  if (Error Err = -          BM.readSummary(ThinLTO.CombinedIndex, BM.getModuleIdentifier(), -                         [&](GlobalValue::GUID GUID) { -                           return ThinLTO.isPrevailingModuleForGUID( -                               GUID, BM.getModuleIdentifier()); -                         })) +  if (Error Err = BM.readSummary( +          ThinLTO.CombinedIndex, BMID, [&](GlobalValue::GUID GUID) { +            return ThinLTO.isPrevailingModuleForGUID(GUID, BMID); +          }))      return Err; -  LLVM_DEBUG(dbgs() << "Module " << BM.getModuleIdentifier() << "\n"); +  LLVM_DEBUG(dbgs() << "Module " << BMID << "\n");    for (const InputFile::Symbol &Sym : Syms) {      assert(!Res.empty());      const SymbolResolution &R = Res.consume_front(); -    if (!Sym.getIRName().empty()) { +    if (!Sym.getIRName().empty() && +        (R.Prevailing || R.FinalDefinitionInLinkageUnit)) {        auto GUID = GlobalValue::getGUIDAssumingExternalLinkage(            GlobalValue::getGlobalIdentifier(Sym.getIRName(),                                             GlobalValue::ExternalLinkage, ""));        if (R.Prevailing) { -        assert( -            ThinLTO.isPrevailingModuleForGUID(GUID, BM.getModuleIdentifier())); +        assert(ThinLTO.isPrevailingModuleForGUID(GUID, BMID));          // For linker redefined symbols (via --wrap or --defsym) we want to          // switch the linkage to `weak` to prevent IPOs from happening.          // Find the summary in the module for this very GV and record the new          // linkage so that we can switch it when we import the GV.          if (R.LinkerRedefined) -          if (auto S = ThinLTO.CombinedIndex.findSummaryInModule( -                  GUID, BM.getModuleIdentifier())) +          if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID))              S->setLinkage(GlobalValue::WeakAnyLinkage);        }        // If the linker resolved the symbol to a local definition then mark it        // as local in the summary for the module we are adding.        if (R.FinalDefinitionInLinkageUnit) { -        if (auto S = ThinLTO.CombinedIndex.findSummaryInModule( -                GUID, BM.getModuleIdentifier())) { +        if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(GUID, BMID)) {            S->setDSOLocal(true);          }        }      }    } -  if (!ThinLTO.ModuleMap.insert({BM.getModuleIdentifier(), BM}).second) +  if (!ThinLTO.ModuleMap.insert({BMID, BM}).second)      return make_error<StringError>(          "Expected at most one ThinLTO module per bitcode file",          inconvertibleErrorCode()); @@ -1143,10 +1139,10 @@ LTO::addThinLTO(BitcodeModule BM, ArrayRef<InputFile::Symbol> Syms,      // This is a fuzzy name matching where only modules with name containing the      // specified switch values are going to be compiled.      for (const std::string &Name : Conf.ThinLTOModulesToCompile) { -      if (BM.getModuleIdentifier().contains(Name)) { -        ThinLTO.ModulesToCompile->insert({BM.getModuleIdentifier(), BM}); -        LLVM_DEBUG(dbgs() << "[ThinLTO] Selecting " << BM.getModuleIdentifier() -                          << " to compile\n"); +      if (BMID.contains(Name)) { +        ThinLTO.ModulesToCompile->insert({BMID, BM}); +        LLVM_DEBUG(dbgs() << "[ThinLTO] Selecting " << BMID << " to compile\n"); +        break;        }      }    } diff --git a/llvm/lib/MC/GOFFObjectWriter.cpp b/llvm/lib/MC/GOFFObjectWriter.cpp index 71bd397..a3eaaa7 100644 --- a/llvm/lib/MC/GOFFObjectWriter.cpp +++ b/llvm/lib/MC/GOFFObjectWriter.cpp @@ -520,7 +520,7 @@ GOFFObjectWriter::GOFFObjectWriter(      std::unique_ptr<MCGOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)      : TargetObjectWriter(std::move(MOTW)), OS(OS) {} -GOFFObjectWriter::~GOFFObjectWriter() {} +GOFFObjectWriter::~GOFFObjectWriter() = default;  uint64_t GOFFObjectWriter::writeObject() {    uint64_t Size = GOFFWriter(OS, *Asm).writeObject(); diff --git a/llvm/lib/MC/MCDXContainerWriter.cpp b/llvm/lib/MC/MCDXContainerWriter.cpp index 5eda039..ebed411 100644 --- a/llvm/lib/MC/MCDXContainerWriter.cpp +++ b/llvm/lib/MC/MCDXContainerWriter.cpp @@ -16,7 +16,7 @@  using namespace llvm; -MCDXContainerTargetWriter::~MCDXContainerTargetWriter() {} +MCDXContainerTargetWriter::~MCDXContainerTargetWriter() = default;  uint64_t DXContainerObjectWriter::writeObject() {    auto &Asm = *this->Asm; diff --git a/llvm/lib/MC/MCGOFFStreamer.cpp b/llvm/lib/MC/MCGOFFStreamer.cpp index 8b228db..ad6397b 100644 --- a/llvm/lib/MC/MCGOFFStreamer.cpp +++ b/llvm/lib/MC/MCGOFFStreamer.cpp @@ -20,7 +20,7 @@  using namespace llvm; -MCGOFFStreamer::~MCGOFFStreamer() {} +MCGOFFStreamer::~MCGOFFStreamer() = default;  GOFFObjectWriter &MCGOFFStreamer::getWriter() {    return static_cast<GOFFObjectWriter &>(getAssembler().getWriter()); diff --git a/llvm/lib/ObjCopy/COFF/COFFWriter.h b/llvm/lib/ObjCopy/COFF/COFFWriter.h index 66d7f01..3ee0e06 100644 --- a/llvm/lib/ObjCopy/COFF/COFFWriter.h +++ b/llvm/lib/ObjCopy/COFF/COFFWriter.h @@ -50,7 +50,7 @@ class COFFWriter {    Expected<uint32_t> virtualAddressToFileAddress(uint32_t RVA);  public: -  virtual ~COFFWriter() {} +  virtual ~COFFWriter() = default;    Error write();    COFFWriter(Object &Obj, raw_ostream &Out) diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.h b/llvm/lib/ObjCopy/ELF/ELFObject.h index 4f6473f..2783ef27 100644 --- a/llvm/lib/ObjCopy/ELF/ELFObject.h +++ b/llvm/lib/ObjCopy/ELF/ELFObject.h @@ -134,7 +134,7 @@ private:    using Elf_Sym = typename ELFT::Sym;  public: -  ~ELFSectionWriter() override {} +  ~ELFSectionWriter() override = default;    Error visit(const SymbolTableSection &Sec) override;    Error visit(const RelocationSection &Sec) override;    Error visit(const GnuDebugLinkSection &Sec) override; @@ -180,7 +180,7 @@ public:  class BinarySectionWriter : public SectionWriter {  public: -  ~BinarySectionWriter() override {} +  ~BinarySectionWriter() override = default;    Error visit(const SymbolTableSection &Sec) override;    Error visit(const RelocationSection &Sec) override; @@ -346,7 +346,7 @@ private:    size_t totalSize() const;  public: -  ~ELFWriter() override {} +  ~ELFWriter() override = default;    bool WriteSectionHeaders;    // For --only-keep-debug, select an alternative section/segment layout @@ -367,7 +367,7 @@ private:    uint64_t TotalSize = 0;  public: -  ~BinaryWriter() override {} +  ~BinaryWriter() override = default;    Error finalize() override;    Error write() override;    BinaryWriter(Object &Obj, raw_ostream &Out, const CommonConfig &Config) @@ -784,7 +784,7 @@ private:    SymbolTableSection *Symbols = nullptr;  public: -  ~SectionIndexSection() override {} +  ~SectionIndexSection() override = default;    void addIndex(uint32_t Index) {      assert(Size > 0);      Indexes.push_back(Index); diff --git a/llvm/lib/ObjCopy/MachO/MachOReader.h b/llvm/lib/ObjCopy/MachO/MachOReader.h index e315e6fd..940ba4c 100644 --- a/llvm/lib/ObjCopy/MachO/MachOReader.h +++ b/llvm/lib/ObjCopy/MachO/MachOReader.h @@ -23,7 +23,7 @@ namespace macho {  // raw binaries and regular MachO object files.  class Reader {  public: -  virtual ~Reader(){}; +  virtual ~Reader() = default;    virtual Expected<std::unique_ptr<Object>> create() const = 0;  }; diff --git a/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h b/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h index 8620548..47639ad 100644 --- a/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h +++ b/llvm/lib/ObjCopy/XCOFF/XCOFFWriter.h @@ -20,7 +20,7 @@ namespace xcoff {  class XCOFFWriter {  public: -  virtual ~XCOFFWriter() {} +  virtual ~XCOFFWriter() = default;    XCOFFWriter(Object &Obj, raw_ostream &Out) : Obj(Obj), Out(Out) {}    Error write(); diff --git a/llvm/lib/ObjectYAML/GOFFYAML.cpp b/llvm/lib/ObjectYAML/GOFFYAML.cpp index 60bc1f7..ecd7fb6 100644 --- a/llvm/lib/ObjectYAML/GOFFYAML.cpp +++ b/llvm/lib/ObjectYAML/GOFFYAML.cpp @@ -15,7 +15,7 @@  namespace llvm {  namespace GOFFYAML { -Object::Object() {} +Object::Object() = default;  } // namespace GOFFYAML diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp index 7290a86..6b7e980 100644 --- a/llvm/lib/Passes/StandardInstrumentations.cpp +++ b/llvm/lib/Passes/StandardInstrumentations.cpp @@ -537,7 +537,7 @@ void IRChangedPrinter::handleAfter(StringRef PassID, std::string &Name,    Out << "*** IR Dump After " << PassID << " on " << Name << " ***\n" << After;  } -IRChangedTester::~IRChangedTester() {} +IRChangedTester::~IRChangedTester() = default;  void IRChangedTester::registerCallbacks(PassInstrumentationCallbacks &PIC) {    if (TestChanged != "") @@ -1566,7 +1566,7 @@ void InLineChangePrinter::registerCallbacks(PassInstrumentationCallbacks &PIC) {      TextChangeReporter<IRDataT<EmptyData>>::registerRequiredCallbacks(PIC);  } -TimeProfilingPassesHandler::TimeProfilingPassesHandler() {} +TimeProfilingPassesHandler::TimeProfilingPassesHandler() = default;  void TimeProfilingPassesHandler::registerCallbacks(      PassInstrumentationCallbacks &PIC) { diff --git a/llvm/lib/SandboxIR/Context.cpp b/llvm/lib/SandboxIR/Context.cpp index fb6ff62..6f5d072 100644 --- a/llvm/lib/SandboxIR/Context.cpp +++ b/llvm/lib/SandboxIR/Context.cpp @@ -637,7 +637,7 @@ Context::Context(LLVMContext &LLVMCtx)      : LLVMCtx(LLVMCtx), IRTracker(*this),        LLVMIRBuilder(LLVMCtx, ConstantFolder()) {} -Context::~Context() {} +Context::~Context() = default;  void Context::clear() {    // TODO: Ideally we should clear only function-scope objects, and keep global diff --git a/llvm/lib/Support/BalancedPartitioning.cpp b/llvm/lib/Support/BalancedPartitioning.cpp index 1914f4c..d859abd 100644 --- a/llvm/lib/Support/BalancedPartitioning.cpp +++ b/llvm/lib/Support/BalancedPartitioning.cpp @@ -231,7 +231,7 @@ unsigned BalancedPartitioning::runIteration(const FunctionNodeRange Nodes,    }    // Compute move gains -  typedef std::pair<float, BPFunctionNode *> GainPair; +  using GainPair = std::pair<float, BPFunctionNode *>;    std::vector<GainPair> Gains;    for (auto &N : Nodes) {      bool FromLeftToRight = (N.Bucket == LeftBucket); diff --git a/llvm/lib/Support/BranchProbability.cpp b/llvm/lib/Support/BranchProbability.cpp index ea42f34..143e58a 100644 --- a/llvm/lib/Support/BranchProbability.cpp +++ b/llvm/lib/Support/BranchProbability.cpp @@ -20,8 +20,6 @@  using namespace llvm; -constexpr uint32_t BranchProbability::D; -  raw_ostream &BranchProbability::print(raw_ostream &OS) const {    if (isUnknown())      return OS << "?%"; diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp index de5bd79..dab8bee 100644 --- a/llvm/lib/Support/CommandLine.cpp +++ b/llvm/lib/Support/CommandLine.cpp @@ -2343,10 +2343,10 @@ namespace {  class HelpPrinter {  protected:    const bool ShowHidden; -  typedef SmallVector<std::pair<const char *, Option *>, 128> -      StrOptionPairVector; -  typedef SmallVector<std::pair<const char *, SubCommand *>, 128> -      StrSubCommandPairVector; +  using StrOptionPairVector = +      SmallVector<std::pair<const char *, Option *>, 128>; +  using StrSubCommandPairVector = +      SmallVector<std::pair<const char *, SubCommand *>, 128>;    // Print the options. Opts is assumed to be alphabetically sorted.    virtual void printOptions(StrOptionPairVector &Opts, size_t MaxArgLen) {      for (const auto &Opt : Opts) diff --git a/llvm/lib/Support/DAGDeltaAlgorithm.cpp b/llvm/lib/Support/DAGDeltaAlgorithm.cpp index 98153647..3bfae14 100644 --- a/llvm/lib/Support/DAGDeltaAlgorithm.cpp +++ b/llvm/lib/Support/DAGDeltaAlgorithm.cpp @@ -47,16 +47,16 @@ class DAGDeltaAlgorithmImpl {    friend class DeltaActiveSetHelper;  public: -  typedef DAGDeltaAlgorithm::change_ty change_ty; -  typedef DAGDeltaAlgorithm::changeset_ty changeset_ty; -  typedef DAGDeltaAlgorithm::changesetlist_ty changesetlist_ty; -  typedef DAGDeltaAlgorithm::edge_ty edge_ty; +  using change_ty = DAGDeltaAlgorithm::change_ty; +  using changeset_ty = DAGDeltaAlgorithm::changeset_ty; +  using changesetlist_ty = DAGDeltaAlgorithm::changesetlist_ty; +  using edge_ty = DAGDeltaAlgorithm::edge_ty;  private: -  typedef std::vector<change_ty>::iterator pred_iterator_ty; -  typedef std::vector<change_ty>::iterator succ_iterator_ty; -  typedef std::set<change_ty>::iterator pred_closure_iterator_ty; -  typedef std::set<change_ty>::iterator succ_closure_iterator_ty; +  using pred_iterator_ty = std::vector<change_ty>::iterator; +  using succ_iterator_ty = std::vector<change_ty>::iterator; +  using pred_closure_iterator_ty = std::set<change_ty>::iterator; +  using succ_closure_iterator_ty = std::set<change_ty>::iterator;    DAGDeltaAlgorithm &DDA; diff --git a/llvm/lib/Support/DynamicLibrary.cpp b/llvm/lib/Support/DynamicLibrary.cpp index f1c15c0..61566d3 100644 --- a/llvm/lib/Support/DynamicLibrary.cpp +++ b/llvm/lib/Support/DynamicLibrary.cpp @@ -23,7 +23,7 @@ using namespace llvm::sys;  // All methods for HandleSet should be used holding SymbolsMutex.  class DynamicLibrary::HandleSet { -  typedef std::vector<void *> HandleList; +  using HandleList = std::vector<void *>;    HandleList Handles;    void *Process = &Invalid; diff --git a/llvm/lib/Support/Timer.cpp b/llvm/lib/Support/Timer.cpp index 9d45096..b08f508 100644 --- a/llvm/lib/Support/Timer.cpp +++ b/llvm/lib/Support/Timer.cpp @@ -207,7 +207,7 @@ void TimeRecord::print(const TimeRecord &Total, raw_ostream &OS) const {  namespace { -typedef StringMap<Timer> Name2TimerMap; +using Name2TimerMap = StringMap<Timer>;  class Name2PairMap {    StringMap<std::pair<TimerGroup*, Name2TimerMap> > Map; diff --git a/llvm/lib/Support/UnicodeNameToCodepoint.cpp b/llvm/lib/Support/UnicodeNameToCodepoint.cpp index 6f8e091..8f0d24e 100644 --- a/llvm/lib/Support/UnicodeNameToCodepoint.cpp +++ b/llvm/lib/Support/UnicodeNameToCodepoint.cpp @@ -251,10 +251,10 @@ constexpr const char *const HangulSyllables[][3] = {  // Unicode 15.0  // 3.12 Conjoining Jamo Behavior Common constants -constexpr const char32_t SBase = 0xAC00; -constexpr const uint32_t LCount = 19; -constexpr const uint32_t VCount = 21; -constexpr const uint32_t TCount = 28; +constexpr char32_t SBase = 0xAC00; +constexpr uint32_t LCount = 19; +constexpr uint32_t VCount = 21; +constexpr uint32_t TCount = 28;  static std::size_t findSyllable(StringRef Name, bool Strict,                                  char &PreviousInName, int &Pos, int Column) { diff --git a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp index 7e03b97..45b7120 100644 --- a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp +++ b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.cpp @@ -370,6 +370,22 @@ SVEFrameSizes AArch64PrologueEpilogueCommon::getSVEStackFrameSizes() const {            {ZPRCalleeSavesSize, PPRLocalsSize + ZPRLocalsSize}};  } +SVEStackAllocations AArch64PrologueEpilogueCommon::getSVEStackAllocations( +    SVEFrameSizes const &SVE) { +  StackOffset AfterZPRs = SVE.ZPR.LocalsSize; +  StackOffset BeforePPRs = SVE.ZPR.CalleeSavesSize + SVE.PPR.CalleeSavesSize; +  StackOffset AfterPPRs = {}; +  if (SVELayout == SVEStackLayout::Split) { +    BeforePPRs = SVE.PPR.CalleeSavesSize; +    // If there are no ZPR CSRs, place all local allocations after the ZPRs. +    if (SVE.ZPR.CalleeSavesSize) +      AfterPPRs += SVE.PPR.LocalsSize + SVE.ZPR.CalleeSavesSize; +    else +      AfterZPRs += SVE.PPR.LocalsSize; // Group allocation of locals. +  } +  return {BeforePPRs, AfterPPRs, AfterZPRs}; +} +  struct SVEPartitions {    struct {      MachineBasicBlock::iterator Begin, End; @@ -687,16 +703,19 @@ void AArch64PrologueEmitter::emitPrologue() {    // All of the remaining stack allocations are for locals.    determineLocalsStackSize(NumBytes, PrologueSaveSize); +  auto [PPR, ZPR] = getSVEStackFrameSizes(); +  SVEStackAllocations SVEAllocs = getSVEStackAllocations({PPR, ZPR}); +    MachineBasicBlock::iterator FirstGPRSaveI = PrologueBeginI;    if (SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord) { +    assert(!SVEAllocs.AfterPPRs && +           "unexpected SVE allocs after PPRs with CalleeSavesAboveFrameRecord");      // If we're doing SVE saves first, we need to immediately allocate space      // for fixed objects, then space for the SVE callee saves.      //      // Windows unwind requires that the scalable size is a multiple of 16;      // that's handled when the callee-saved size is computed. -    auto SaveSize = -        StackOffset::getScalable(AFI->getSVECalleeSavedStackSize()) + -        StackOffset::getFixed(FixedObject); +    auto SaveSize = SVEAllocs.BeforePPRs + StackOffset::getFixed(FixedObject);      allocateStackSpace(PrologueBeginI, 0, SaveSize, false, StackOffset{},                         /*FollowupAllocs=*/true);      NumBytes -= FixedObject; @@ -764,12 +783,11 @@ void AArch64PrologueEmitter::emitPrologue() {    if (AFL.windowsRequiresStackProbe(MF, NumBytes + RealignmentPadding))      emitWindowsStackProbe(AfterGPRSavesI, DL, NumBytes, RealignmentPadding); -  auto [PPR, ZPR] = getSVEStackFrameSizes(); -  StackOffset SVECalleeSavesSize = ZPR.CalleeSavesSize + PPR.CalleeSavesSize;    StackOffset NonSVELocalsSize = StackOffset::getFixed(NumBytes); +  SVEAllocs.AfterZPRs += NonSVELocalsSize; +    StackOffset CFAOffset =        StackOffset::getFixed(MFI.getStackSize()) - NonSVELocalsSize; -    MachineBasicBlock::iterator AfterSVESavesI = AfterGPRSavesI;    // Allocate space for the callee saves and PPR locals (if any).    if (SVELayout != SVEStackLayout::CalleeSavesAboveFrameRecord) { @@ -780,31 +798,23 @@ void AArch64PrologueEmitter::emitPrologue() {      if (EmitAsyncCFI)        emitCalleeSavedSVELocations(AfterSVESavesI); -    StackOffset AllocateBeforePPRs = SVECalleeSavesSize; -    StackOffset AllocateAfterPPRs = PPR.LocalsSize; -    if (SVELayout == SVEStackLayout::Split) { -      AllocateBeforePPRs = PPR.CalleeSavesSize; -      AllocateAfterPPRs = PPR.LocalsSize + ZPR.CalleeSavesSize; -    } -    allocateStackSpace(PPRRange.Begin, 0, AllocateBeforePPRs, +    allocateStackSpace(PPRRange.Begin, 0, SVEAllocs.BeforePPRs,                         EmitAsyncCFI && !HasFP, CFAOffset, -                       MFI.hasVarSizedObjects() || AllocateAfterPPRs || -                           ZPR.LocalsSize || NonSVELocalsSize); -    CFAOffset += AllocateBeforePPRs; +                       MFI.hasVarSizedObjects() || SVEAllocs.AfterPPRs || +                           SVEAllocs.AfterZPRs); +    CFAOffset += SVEAllocs.BeforePPRs;      assert(PPRRange.End == ZPRRange.Begin &&             "Expected ZPR callee saves after PPR locals"); -    allocateStackSpace(PPRRange.End, RealignmentPadding, AllocateAfterPPRs, +    allocateStackSpace(PPRRange.End, RealignmentPadding, SVEAllocs.AfterPPRs,                         EmitAsyncCFI && !HasFP, CFAOffset, -                       MFI.hasVarSizedObjects() || ZPR.LocalsSize || -                           NonSVELocalsSize); -    CFAOffset += AllocateAfterPPRs; +                       MFI.hasVarSizedObjects() || SVEAllocs.AfterZPRs); +    CFAOffset += SVEAllocs.AfterPPRs;    } else {      assert(SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord); -    // Note: With CalleeSavesAboveFrameRecord, the SVE CS have already been -    // allocated (and separate PPR locals are not supported, all SVE locals, -    // both PPR and ZPR, are within the ZPR locals area). -    assert(!PPR.LocalsSize && "Unexpected PPR locals!"); -    CFAOffset += SVECalleeSavesSize; +    // Note: With CalleeSavesAboveFrameRecord, the SVE CS (BeforePPRs) have +    // already been allocated. PPR locals (included in AfterPPRs) are not +    // supported (note: this is asserted above). +    CFAOffset += SVEAllocs.BeforePPRs;    }    // Allocate space for the rest of the frame including ZPR locals. Align the @@ -815,9 +825,9 @@ void AArch64PrologueEmitter::emitPrologue() {      // FIXME: in the case of dynamic re-alignment, NumBytes doesn't have the      // correct value here, as NumBytes also includes padding bytes, which      // shouldn't be counted here. -    allocateStackSpace( -        AfterSVESavesI, RealignmentPadding, ZPR.LocalsSize + NonSVELocalsSize, -        EmitAsyncCFI && !HasFP, CFAOffset, MFI.hasVarSizedObjects()); +    allocateStackSpace(AfterSVESavesI, RealignmentPadding, SVEAllocs.AfterZPRs, +                       EmitAsyncCFI && !HasFP, CFAOffset, +                       MFI.hasVarSizedObjects());    }    // If we need a base pointer, set it up here. It's whatever the value of the @@ -1472,27 +1482,26 @@ void AArch64EpilogueEmitter::emitEpilogue() {    assert(NumBytes >= 0 && "Negative stack allocation size!?");    StackOffset SVECalleeSavesSize = ZPR.CalleeSavesSize + PPR.CalleeSavesSize; -  StackOffset SVEStackSize = -      SVECalleeSavesSize + PPR.LocalsSize + ZPR.LocalsSize; +  SVEStackAllocations SVEAllocs = getSVEStackAllocations({PPR, ZPR});    MachineBasicBlock::iterator RestoreBegin = ZPRRange.Begin; -  MachineBasicBlock::iterator RestoreEnd = PPRRange.End;    // Deallocate the SVE area.    if (SVELayout == SVEStackLayout::CalleeSavesAboveFrameRecord) { -    StackOffset SVELocalsSize = ZPR.LocalsSize + PPR.LocalsSize; +    assert(!SVEAllocs.AfterPPRs && +           "unexpected SVE allocs after PPRs with CalleeSavesAboveFrameRecord");      // If the callee-save area is before FP, restoring the FP implicitly -    // deallocates non-callee-save SVE allocations.  Otherwise, deallocate them +    // deallocates non-callee-save SVE allocations. Otherwise, deallocate them      // explicitly.      if (!AFI->isStackRealigned() && !MFI.hasVarSizedObjects()) {        emitFrameOffset(MBB, FirstGPRRestoreI, DL, AArch64::SP, AArch64::SP, -                      SVELocalsSize, TII, MachineInstr::FrameDestroy, false, -                      NeedsWinCFI, &HasWinCFI); +                      SVEAllocs.AfterZPRs, TII, MachineInstr::FrameDestroy, +                      false, NeedsWinCFI, &HasWinCFI);      }      // Deallocate callee-save SVE registers. -    emitFrameOffset(MBB, RestoreEnd, DL, AArch64::SP, AArch64::SP, -                    SVECalleeSavesSize, TII, MachineInstr::FrameDestroy, false, -                    NeedsWinCFI, &HasWinCFI); +    emitFrameOffset(MBB, PPRRange.End, DL, AArch64::SP, AArch64::SP, +                    SVEAllocs.BeforePPRs, TII, MachineInstr::FrameDestroy, +                    false, NeedsWinCFI, &HasWinCFI);    } else if (AFI->hasSVEStackSize()) {      // If we have stack realignment or variable-sized objects we must use the FP      // to restore SVE callee saves (as there is an unknown amount of @@ -1524,46 +1533,33 @@ void AArch64EpilogueEmitter::emitEpilogue() {        emitFrameOffset(MBB, RestoreBegin, DL, AArch64::SP, CalleeSaveBase,                        -SVECalleeSavesSize, TII, MachineInstr::FrameDestroy);      } else if (BaseForSVEDealloc == AArch64::SP) { -      auto CFAOffset = -          SVEStackSize + StackOffset::getFixed(NumBytes + PrologueSaveSize); - -      if (SVECalleeSavesSize) { -        // Deallocate the non-SVE locals first before we can deallocate (and -        // restore callee saves) from the SVE area. -        auto NonSVELocals = StackOffset::getFixed(NumBytes); -        emitFrameOffset(MBB, ZPRRange.Begin, DL, AArch64::SP, AArch64::SP, -                        NonSVELocals, TII, MachineInstr::FrameDestroy, false, -                        NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, CFAOffset); -        CFAOffset -= NonSVELocals; -        NumBytes = 0; -      } - -      if (ZPR.LocalsSize) { -        emitFrameOffset(MBB, ZPRRange.Begin, DL, AArch64::SP, AArch64::SP, -                        ZPR.LocalsSize, TII, MachineInstr::FrameDestroy, false, -                        NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, CFAOffset); -        CFAOffset -= ZPR.LocalsSize; +      auto NonSVELocals = StackOffset::getFixed(NumBytes); +      auto CFAOffset = NonSVELocals + StackOffset::getFixed(PrologueSaveSize) + +                       SVEAllocs.totalSize(); + +      if (SVECalleeSavesSize || SVELayout == SVEStackLayout::Split) { +        // Deallocate non-SVE locals now. This is needed to reach the SVE callee +        // saves, but may also allow combining stack hazard bumps for split SVE. +        SVEAllocs.AfterZPRs += NonSVELocals; +        NumBytes -= NonSVELocals.getFixed();        } - -      StackOffset SVECalleeSavesToDealloc = SVECalleeSavesSize; -      if (SVELayout == SVEStackLayout::Split && -          (PPR.LocalsSize || ZPR.CalleeSavesSize)) { -        assert(PPRRange.Begin == ZPRRange.End && -               "Expected PPR restores after ZPR"); -        emitFrameOffset(MBB, PPRRange.Begin, DL, AArch64::SP, AArch64::SP, -                        PPR.LocalsSize + ZPR.CalleeSavesSize, TII, -                        MachineInstr::FrameDestroy, false, NeedsWinCFI, -                        &HasWinCFI, EmitCFI && !HasFP, CFAOffset); -        CFAOffset -= PPR.LocalsSize + ZPR.CalleeSavesSize; -        SVECalleeSavesToDealloc -= ZPR.CalleeSavesSize; -      } - -      // If split SVE is on, this dealloc PPRs, otherwise, deallocs ZPRs + PPRs: -      if (SVECalleeSavesToDealloc) -        emitFrameOffset(MBB, PPRRange.End, DL, AArch64::SP, AArch64::SP, -                        SVECalleeSavesToDealloc, TII, -                        MachineInstr::FrameDestroy, false, NeedsWinCFI, -                        &HasWinCFI, EmitCFI && !HasFP, CFAOffset); +      // To deallocate the SVE stack adjust by the allocations in reverse. +      emitFrameOffset(MBB, ZPRRange.Begin, DL, AArch64::SP, AArch64::SP, +                      SVEAllocs.AfterZPRs, TII, MachineInstr::FrameDestroy, +                      false, NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, +                      CFAOffset); +      CFAOffset -= SVEAllocs.AfterZPRs; +      assert(PPRRange.Begin == ZPRRange.End && +             "Expected PPR restores after ZPR"); +      emitFrameOffset(MBB, PPRRange.Begin, DL, AArch64::SP, AArch64::SP, +                      SVEAllocs.AfterPPRs, TII, MachineInstr::FrameDestroy, +                      false, NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, +                      CFAOffset); +      CFAOffset -= SVEAllocs.AfterPPRs; +      emitFrameOffset(MBB, PPRRange.End, DL, AArch64::SP, AArch64::SP, +                      SVEAllocs.BeforePPRs, TII, MachineInstr::FrameDestroy, +                      false, NeedsWinCFI, &HasWinCFI, EmitCFI && !HasFP, +                      CFAOffset);      }      if (EmitCFI) diff --git a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h index bccadda..6e0e283 100644 --- a/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h +++ b/llvm/lib/Target/AArch64/AArch64PrologueEpilogue.h @@ -33,6 +33,11 @@ struct SVEFrameSizes {    } PPR, ZPR;  }; +struct SVEStackAllocations { +  StackOffset BeforePPRs, AfterPPRs, AfterZPRs; +  StackOffset totalSize() const { return BeforePPRs + AfterPPRs + AfterZPRs; } +}; +  class AArch64PrologueEpilogueCommon {  public:    AArch64PrologueEpilogueCommon(MachineFunction &MF, MachineBasicBlock &MBB, @@ -66,6 +71,7 @@ protected:    bool shouldCombineCSRLocalStackBump(uint64_t StackBumpBytes) const;    SVEFrameSizes getSVEStackFrameSizes() const; +  SVEStackAllocations getSVEStackAllocations(SVEFrameSizes const &);    MachineFunction &MF;    MachineBasicBlock &MBB; diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index e8352be..5b5565a 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -6657,10 +6657,15 @@ bool AArch64TTIImpl::isProfitableToSinkOperands(            Ops.push_back(&Ext->getOperandUse(0));          Ops.push_back(&Op); -        if (isa<SExtInst>(Ext)) +        if (isa<SExtInst>(Ext)) {            NumSExts++; -        else +        } else {            NumZExts++; +          // A zext(a) is also a sext(zext(a)), if we take more than 2 steps. +          if (Ext->getOperand(0)->getType()->getScalarSizeInBits() * 2 < +              I->getType()->getScalarSizeInBits()) +            NumSExts++; +        }          continue;        } diff --git a/llvm/lib/Target/AMDGPU/AMDGPU.h b/llvm/lib/Target/AMDGPU/AMDGPU.h index cd8b249..67042b7 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPU.h +++ b/llvm/lib/Target/AMDGPU/AMDGPU.h @@ -69,7 +69,7 @@ FunctionPass *createAMDGPUPreloadKernArgPrologLegacyPass();  ModulePass *createAMDGPUPreloadKernelArgumentsLegacyPass(const TargetMachine *);  struct AMDGPUSimplifyLibCallsPass : PassInfoMixin<AMDGPUSimplifyLibCallsPass> { -  AMDGPUSimplifyLibCallsPass() {} +  AMDGPUSimplifyLibCallsPass() = default;    PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);  }; @@ -371,13 +371,13 @@ public:  class AMDGPUAnnotateUniformValuesPass      : public PassInfoMixin<AMDGPUAnnotateUniformValuesPass> {  public: -  AMDGPUAnnotateUniformValuesPass() {} +  AMDGPUAnnotateUniformValuesPass() = default;    PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);  };  class SIModeRegisterPass : public PassInfoMixin<SIModeRegisterPass> {  public: -  SIModeRegisterPass() {} +  SIModeRegisterPass() = default;    PreservedAnalyses run(MachineFunction &F, MachineFunctionAnalysisManager &AM);  }; diff --git a/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h index 1064e57..dad94b8 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUArgumentUsageInfo.h @@ -96,7 +96,7 @@ inline raw_ostream &operator<<(raw_ostream &OS, const ArgDescriptor &Arg) {  }  struct KernArgPreloadDescriptor : public ArgDescriptor { -  KernArgPreloadDescriptor() {} +  KernArgPreloadDescriptor() = default;    SmallVector<MCRegister> Regs;  }; diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp index 9907c88f..8669978 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAttributor.cpp @@ -1555,7 +1555,7 @@ private:    AMDGPU::ClusterDimsAttr Attr; -  static constexpr const char AttrName[] = "amdgpu-cluster-dims"; +  static constexpr char AttrName[] = "amdgpu-cluster-dims";  };  AAAMDGPUClusterDims & diff --git a/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h b/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h index cf2ab825..a3be0f5 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUPerfHintAnalysis.h @@ -48,7 +48,7 @@ private:    FuncInfoMap FIM;  public: -  AMDGPUPerfHintAnalysis() {} +  AMDGPUPerfHintAnalysis() = default;    // OldPM    bool runOnSCC(const GCNTargetMachine &TM, CallGraphSCC &SCC); diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp index 103cdec..1e5885a2 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankLegalizeRules.cpp @@ -202,7 +202,7 @@ bool PredicateMapping::match(const MachineInstr &MI,    return true;  } -SetOfRulesForOpcode::SetOfRulesForOpcode() {} +SetOfRulesForOpcode::SetOfRulesForOpcode() = default;  SetOfRulesForOpcode::SetOfRulesForOpcode(FastRulesTypes FastTypes)      : FastTypes(FastTypes) {} @@ -913,6 +913,8 @@ RegBankLegalizeRules::RegBankLegalizeRules(const GCNSubtarget &_ST,    addRulesForGOpcs({G_ABS}, Standard).Uni(S16, {{Sgpr32Trunc}, {Sgpr32SExt}}); +  addRulesForGOpcs({G_FENCE}).Any({{{}}, {{}, {}}}); +    addRulesForGOpcs({G_READSTEADYCOUNTER, G_READCYCLECOUNTER}, Standard)        .Uni(S64, {{Sgpr64}, {}}); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp b/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp index 733c5d5..fe81a5e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp @@ -181,14 +181,52 @@ BasicBlock *AMDGPUUnifyDivergentExitNodesImpl::unifyReturnBlockSet(    return NewRetBlock;  } +static BasicBlock * +createDummyReturnBlock(Function &F, +                       SmallVector<BasicBlock *, 4> &ReturningBlocks) { +  BasicBlock *DummyReturnBB = +      BasicBlock::Create(F.getContext(), "DummyReturnBlock", &F); +  Type *RetTy = F.getReturnType(); +  Value *RetVal = RetTy->isVoidTy() ? nullptr : PoisonValue::get(RetTy); +  ReturnInst::Create(F.getContext(), RetVal, DummyReturnBB); +  ReturningBlocks.push_back(DummyReturnBB); +  return DummyReturnBB; +} + +/// Handle conditional branch instructions (-> 2 targets) and callbr +/// instructions with N targets. +static void handleNBranch(Function &F, BasicBlock *BB, Instruction *BI, +                          BasicBlock *DummyReturnBB, +                          std::vector<DominatorTree::UpdateType> &Updates) { +  SmallVector<BasicBlock *, 2> Successors(successors(BB)); + +  // Create a new transition block to hold the conditional branch. +  BasicBlock *TransitionBB = BB->splitBasicBlock(BI, "TransitionBlock"); + +  Updates.reserve(Updates.size() + 2 * Successors.size() + 2); + +  // 'Successors' become successors of TransitionBB instead of BB, +  // and TransitionBB becomes a single successor of BB. +  Updates.emplace_back(DominatorTree::Insert, BB, TransitionBB); +  for (BasicBlock *Successor : Successors) { +    Updates.emplace_back(DominatorTree::Insert, TransitionBB, Successor); +    Updates.emplace_back(DominatorTree::Delete, BB, Successor); +  } + +  // Create a branch that will always branch to the transition block and +  // references DummyReturnBB. +  BB->getTerminator()->eraseFromParent(); +  BranchInst::Create(TransitionBB, DummyReturnBB, +                     ConstantInt::getTrue(F.getContext()), BB); +  Updates.emplace_back(DominatorTree::Insert, BB, DummyReturnBB); +} +  bool AMDGPUUnifyDivergentExitNodesImpl::run(Function &F, DominatorTree *DT,                                              const PostDominatorTree &PDT,                                              const UniformityInfo &UA) { -  assert(hasOnlySimpleTerminator(F) && "Unsupported block terminator."); -    if (PDT.root_size() == 0 ||        (PDT.root_size() == 1 && -       !isa<BranchInst>(PDT.getRoot()->getTerminator()))) +       !isa<BranchInst, CallBrInst>(PDT.getRoot()->getTerminator())))      return false;    // Loop over all of the blocks in a function, tracking all of the blocks that @@ -222,46 +260,28 @@ bool AMDGPUUnifyDivergentExitNodesImpl::run(Function &F, DominatorTree *DT,        if (HasDivergentExitBlock)          UnreachableBlocks.push_back(BB);      } else if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) { - -      ConstantInt *BoolTrue = ConstantInt::getTrue(F.getContext()); -      if (DummyReturnBB == nullptr) { -        DummyReturnBB = BasicBlock::Create(F.getContext(), -                                           "DummyReturnBlock", &F); -        Type *RetTy = F.getReturnType(); -        Value *RetVal = RetTy->isVoidTy() ? nullptr : PoisonValue::get(RetTy); -        ReturnInst::Create(F.getContext(), RetVal, DummyReturnBB); -        ReturningBlocks.push_back(DummyReturnBB); -      } +      if (!DummyReturnBB) +        DummyReturnBB = createDummyReturnBlock(F, ReturningBlocks);        if (BI->isUnconditional()) {          BasicBlock *LoopHeaderBB = BI->getSuccessor(0);          BI->eraseFromParent(); // Delete the unconditional branch.          // Add a new conditional branch with a dummy edge to the return block. -        BranchInst::Create(LoopHeaderBB, DummyReturnBB, BoolTrue, BB); -        Updates.emplace_back(DominatorTree::Insert, BB, DummyReturnBB); -      } else { // Conditional branch. -        SmallVector<BasicBlock *, 2> Successors(successors(BB)); - -        // Create a new transition block to hold the conditional branch. -        BasicBlock *TransitionBB = BB->splitBasicBlock(BI, "TransitionBlock"); - -        Updates.reserve(Updates.size() + 2 * Successors.size() + 2); - -        // 'Successors' become successors of TransitionBB instead of BB, -        // and TransitionBB becomes a single successor of BB. -        Updates.emplace_back(DominatorTree::Insert, BB, TransitionBB); -        for (BasicBlock *Successor : Successors) { -          Updates.emplace_back(DominatorTree::Insert, TransitionBB, Successor); -          Updates.emplace_back(DominatorTree::Delete, BB, Successor); -        } - -        // Create a branch that will always branch to the transition block and -        // references DummyReturnBB. -        BB->getTerminator()->eraseFromParent(); -        BranchInst::Create(TransitionBB, DummyReturnBB, BoolTrue, BB); +        BranchInst::Create(LoopHeaderBB, DummyReturnBB, +                           ConstantInt::getTrue(F.getContext()), BB);          Updates.emplace_back(DominatorTree::Insert, BB, DummyReturnBB); +      } else { +        handleNBranch(F, BB, BI, DummyReturnBB, Updates);        }        Changed = true; +    } else if (CallBrInst *CBI = dyn_cast<CallBrInst>(BB->getTerminator())) { +      if (!DummyReturnBB) +        DummyReturnBB = createDummyReturnBlock(F, ReturningBlocks); + +      handleNBranch(F, BB, CBI, DummyReturnBB, Updates); +      Changed = true; +    } else { +      llvm_unreachable("unsupported block terminator");      }    } diff --git a/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp b/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp index 61c5dcd..ded2f5a 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUWaitSGPRHazards.cpp @@ -54,7 +54,7 @@ public:    bool CullSGPRHazardsAtMemWait;    unsigned CullSGPRHazardsMemWaitThreshold; -  AMDGPUWaitSGPRHazards() {} +  AMDGPUWaitSGPRHazards() = default;    // Return the numeric ID 0-127 for a given SGPR.    static std::optional<unsigned> sgprNumber(Register Reg, diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h index 975781f..f357981 100644 --- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h +++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h @@ -183,7 +183,7 @@ class ScheduleMetrics {    unsigned BubbleCycles;  public: -  ScheduleMetrics() {} +  ScheduleMetrics() = default;    ScheduleMetrics(unsigned L, unsigned BC)        : ScheduleLength(L), BubbleCycles(BC) {}    unsigned getLength() const { return ScheduleLength; } @@ -217,7 +217,7 @@ class RegionPressureMap {    bool IsLiveOut;  public: -  RegionPressureMap() {} +  RegionPressureMap() = default;    RegionPressureMap(GCNScheduleDAGMILive *GCNDAG, bool LiveOut)        : DAG(GCNDAG), IsLiveOut(LiveOut) {}    // Build the Instr->LiveReg and RegionIdx->Instr maps diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp index d9f76c9..45f5919 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -6153,7 +6153,7 @@ bool SIInstrInfo::isLegalRegOperand(const MachineInstr &MI, unsigned OpIdx,    // information.    if (AMDGPU::isPackedFP32Inst(MI.getOpcode()) && AMDGPU::isGFX12Plus(ST) &&        MO.isReg() && RI.isSGPRReg(MRI, MO.getReg())) { -    constexpr const AMDGPU::OpName OpNames[] = { +    constexpr AMDGPU::OpName OpNames[] = {          AMDGPU::OpName::src0, AMDGPU::OpName::src1, AMDGPU::OpName::src2};      for (auto [I, OpName] : enumerate(OpNames)) { @@ -6215,8 +6215,8 @@ bool SIInstrInfo::isLegalVSrcOperand(const MachineRegisterInfo &MRI,  bool SIInstrInfo::isLegalGFX12PlusPackedMathFP32Operand(      const MachineRegisterInfo &MRI, const MachineInstr &MI, unsigned SrcN,      const MachineOperand *MO) const { -  constexpr const unsigned NumOps = 3; -  constexpr const AMDGPU::OpName OpNames[NumOps * 2] = { +  constexpr unsigned NumOps = 3; +  constexpr AMDGPU::OpName OpNames[NumOps * 2] = {        AMDGPU::OpName::src0,           AMDGPU::OpName::src1,        AMDGPU::OpName::src2,           AMDGPU::OpName::src0_modifiers,        AMDGPU::OpName::src1_modifiers, AMDGPU::OpName::src2_modifiers}; diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 6b06534..3a00267 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -9869,32 +9869,12 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {    assert(Subtarget->isTargetDarwin());    Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); -  auto PtrVT = getPointerTy(DAG.getDataLayout()); - -  MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();    // Pair of floats / doubles used to pass the result.    Type *RetTy = StructType::get(ArgTy, ArgTy);    auto &DL = DAG.getDataLayout();    ArgListTy Args; -  bool ShouldUseSRet = getTM().isAPCS_ABI(); -  SDValue SRet; -  if (ShouldUseSRet) { -    // Create stack object for sret. -    const uint64_t ByteSize = DL.getTypeAllocSize(RetTy); -    const Align StackAlign = DL.getPrefTypeAlign(RetTy); -    int FrameIdx = MFI.CreateStackObject(ByteSize, StackAlign, false); -    SRet = DAG.getFrameIndex(FrameIdx, getPointerTy(DL)); - -    ArgListEntry Entry(SRet, PointerType::getUnqual(RetTy->getContext())); -    Entry.IsSExt = false; -    Entry.IsZExt = false; -    Entry.IsSRet = true; -    Args.push_back(Entry); -    RetTy = Type::getVoidTy(*DAG.getContext()); -  } -    Args.emplace_back(Arg, ArgTy);    StringRef LibcallName = getLibcallImplName(SincosStret); @@ -9904,25 +9884,10 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {    TargetLowering::CallLoweringInfo CLI(DAG);    CLI.setDebugLoc(dl)        .setChain(DAG.getEntryNode()) -      .setCallee(CC, RetTy, Callee, std::move(Args)) -      .setDiscardResult(ShouldUseSRet); +      .setCallee(CC, RetTy, Callee, std::move(Args));    std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI); -  if (!ShouldUseSRet) -    return CallResult.first; - -  SDValue LoadSin = -      DAG.getLoad(ArgVT, dl, CallResult.second, SRet, MachinePointerInfo()); - -  // Address of cos field. -  SDValue Add = DAG.getNode(ISD::ADD, dl, PtrVT, SRet, -                            DAG.getIntPtrConstant(ArgVT.getStoreSize(), dl)); -  SDValue LoadCos = -      DAG.getLoad(ArgVT, dl, LoadSin.getValue(1), Add, MachinePointerInfo()); - -  SDVTList Tys = DAG.getVTList(ArgVT, ArgVT); -  return DAG.getNode(ISD::MERGE_VALUES, dl, Tys, -                     LoadSin.getValue(0), LoadCos.getValue(0)); +  return CallResult.first;  }  SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG, diff --git a/llvm/lib/Target/BPF/BPFAsmPrinter.cpp b/llvm/lib/Target/BPF/BPFAsmPrinter.cpp index 77dc4a7..b2a8204 100644 --- a/llvm/lib/Target/BPF/BPFAsmPrinter.cpp +++ b/llvm/lib/Target/BPF/BPFAsmPrinter.cpp @@ -88,6 +88,16 @@ bool BPFAsmPrinter::doFinalization(Module &M) {      }    } +  for (GlobalObject &GO : M.global_objects()) { +    if (!GO.hasExternalWeakLinkage()) +      continue; + +    if (!SawTrapCall && GO.getName() == BPF_TRAP) { +      GO.eraseFromParent(); +      break; +    } +  } +    return AsmPrinter::doFinalization(M);  } @@ -160,6 +170,20 @@ bool BPFAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,  }  void BPFAsmPrinter::emitInstruction(const MachineInstr *MI) { +  if (MI->isCall()) { +    for (const MachineOperand &Op : MI->operands()) { +      if (Op.isGlobal()) { +        if (const GlobalValue *GV = Op.getGlobal()) +          if (GV->getName() == BPF_TRAP) +            SawTrapCall = true; +      } else if (Op.isSymbol()) { +        if (const MCSymbol *Sym = Op.getMCSymbol()) +          if (Sym->getName() == BPF_TRAP) +            SawTrapCall = true; +      } +    } +  } +    BPF_MC::verifyInstructionPredicates(MI->getOpcode(),                                        getSubtargetInfo().getFeatureBits()); diff --git a/llvm/lib/Target/BPF/BPFAsmPrinter.h b/llvm/lib/Target/BPF/BPFAsmPrinter.h index 90ef207..75a1d7e 100644 --- a/llvm/lib/Target/BPF/BPFAsmPrinter.h +++ b/llvm/lib/Target/BPF/BPFAsmPrinter.h @@ -39,6 +39,7 @@ public:  private:    BTFDebug *BTF;    TargetMachine &TM; +  bool SawTrapCall = false;    const BPFTargetMachine &getBTM() const;  }; diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp index 8ace2d2..eb4c884 100644 --- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp +++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp @@ -194,9 +194,10 @@ void DXContainerGlobals::addResourcesForPSV(Module &M, PSVRuntimeInfo &PSV) {          dxbc::PSV::v2::ResourceBindInfo BindInfo;          BindInfo.Type = Type;          BindInfo.LowerBound = Binding.LowerBound; -        assert(Binding.Size == UINT32_MAX || -               (uint64_t)Binding.LowerBound + Binding.Size - 1 <= UINT32_MAX && -                   "Resource range is too large"); +        assert( +            (Binding.Size == UINT32_MAX || +             (uint64_t)Binding.LowerBound + Binding.Size - 1 <= UINT32_MAX) && +            "Resource range is too large");          BindInfo.UpperBound = (Binding.Size == UINT32_MAX)                                    ? UINT32_MAX                                    : Binding.LowerBound + Binding.Size - 1; diff --git a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp index 7ee280d..eadf020 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.cpp @@ -1815,7 +1815,7 @@ struct WeightedLeaf {    int Weight;    int InsertionOrder; -  WeightedLeaf() {} +  WeightedLeaf() = default;    WeightedLeaf(SDValue Value, int Weight, int InsertionOrder) :      Value(Value), Weight(Weight), InsertionOrder(InsertionOrder) { diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp index 904aabed..fe700e1 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -375,6 +375,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,        setOperationAction(ISD::FFLOOR, VT, Legal);        setOperationAction(ISD::FTRUNC, VT, Legal);        setOperationAction(ISD::FROUNDEVEN, VT, Legal); +      setOperationAction(ISD::FMINNUM, VT, Legal); +      setOperationAction(ISD::FMAXNUM, VT, Legal);      }      setOperationAction(ISD::CTPOP, GRLenVT, Legal);      setOperationAction(ISD::FCEIL, {MVT::f32, MVT::f64}, Legal); @@ -461,6 +463,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,        setOperationAction(ISD::FFLOOR, VT, Legal);        setOperationAction(ISD::FTRUNC, VT, Legal);        setOperationAction(ISD::FROUNDEVEN, VT, Legal); +      setOperationAction(ISD::FMINNUM, VT, Legal); +      setOperationAction(ISD::FMAXNUM, VT, Legal);      }    } diff --git a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td index 610ba05..b502b056 100644 --- a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td +++ b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td @@ -1558,6 +1558,10 @@ defm : PatXrXrF<fmul, "XVFMUL">;  // XVFDIV_{S/D}  defm : PatXrXrF<fdiv, "XVFDIV">; +// XVFMAX_{S/D}, XVFMIN_{S/D} +defm : PatXrXrF<fmaxnum, "XVFMAX">; +defm : PatXrXrF<fminnum, "XVFMIN">; +  // XVFMADD_{S/D}  def : Pat<(fma v8f32:$xj, v8f32:$xk, v8f32:$xa),            (XVFMADD_S v8f32:$xj, v8f32:$xk, v8f32:$xa)>; diff --git a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td index 6470842..6b74a4b 100644 --- a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td +++ b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td @@ -1760,6 +1760,10 @@ defm : PatVrVrF<fmul, "VFMUL">;  // VFDIV_{S/D}  defm : PatVrVrF<fdiv, "VFDIV">; +// VFMAX_{S/D}, VFMIN_{S/D} +defm : PatVrVrF<fmaxnum, "VFMAX">; +defm : PatVrVrF<fminnum, "VFMIN">; +  // VFMADD_{S/D}  def : Pat<(fma v4f32:$vj, v4f32:$vk, v4f32:$va),            (VFMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>; diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp index 7d54565..6d69af5 100644 --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchELFObjectWriter.cpp @@ -39,7 +39,7 @@ LoongArchELFObjectWriter::LoongArchELFObjectWriter(uint8_t OSABI, bool Is64Bit)      : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_LOONGARCH,                                /*HasRelocationAddend=*/true) {} -LoongArchELFObjectWriter::~LoongArchELFObjectWriter() {} +LoongArchELFObjectWriter::~LoongArchELFObjectWriter() = default;  unsigned LoongArchELFObjectWriter::getRelocType(const MCFixup &Fixup,                                                  const MCValue &Target, diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp index f0e2bc4..08fa51d 100644 --- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp +++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp @@ -38,7 +38,7 @@ public:    LoongArchMCCodeEmitter(MCContext &ctx, MCInstrInfo const &MCII)        : Ctx(ctx), MCII(MCII) {} -  ~LoongArchMCCodeEmitter() override {} +  ~LoongArchMCCodeEmitter() override = default;    void encodeInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,                           SmallVectorImpl<MCFixup> &Fixups, diff --git a/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h b/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h index caef8fe7..b832b82 100644 --- a/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h +++ b/llvm/lib/Target/NVPTX/NVPTXAliasAnalysis.h @@ -20,7 +20,7 @@ class MemoryLocation;  class NVPTXAAResult : public AAResultBase {  public: -  NVPTXAAResult() {} +  NVPTXAAResult() = default;    NVPTXAAResult(NVPTXAAResult &&Arg) : AAResultBase(std::move(Arg)) {}    /// Handle invalidation events from the new pass manager. diff --git a/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp b/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp index c667a09..996d653 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp @@ -1836,7 +1836,7 @@ bool NVPTXDAGToDAGISel::tryFence(SDNode *N) {    return true;  } -NVPTXScopes::NVPTXScopes(LLVMContext &C) { +NVPTXScopes::NVPTXScopes(LLVMContext &C) : Context(&C) {    Scopes[C.getOrInsertSyncScopeID("singlethread")] = NVPTX::Scope::Thread;    Scopes[C.getOrInsertSyncScopeID("")] = NVPTX::Scope::System;    Scopes[C.getOrInsertSyncScopeID("block")] = NVPTX::Scope::Block; @@ -1851,11 +1851,21 @@ NVPTX::Scope NVPTXScopes::operator[](SyncScope::ID ID) const {    auto S = Scopes.find(ID);    if (S == Scopes.end()) { -    // TODO: -    // - Add API to LLVMContext to get the name of a single scope. -    // - Use that API here to print an error containing the name -    //   of this Unknown ID. -    report_fatal_error(formatv("Could not find scope ID={}.", int(ID))); +    auto scopeName = Context->getSyncScopeName(ID); +    assert(scopeName.has_value() && "Scope name must exist."); + +    // Build list of supported syncscopes programmatically +    SmallVector<StringRef> supportedScopes; +    for (const auto &Entry : Scopes) { +      if (auto name = Context->getSyncScopeName(Entry.first)) +        supportedScopes.push_back(name->empty() ? "<empty string>" : *name); +    } + +    reportFatalUsageError( +        formatv("NVPTX backend does not support syncscope \"{0}\" (ID={1}).\n" +                "Supported syncscopes are: {2}.", +                scopeName.value(), int(ID), +                make_range(supportedScopes.begin(), supportedScopes.end())));    }    return S->second;  } diff --git a/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h b/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h index 1cb579b..d525531 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h +++ b/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h @@ -35,6 +35,7 @@ struct NVPTXScopes {  private:    SmallMapVector<SyncScope::ID, NVPTX::Scope, 8> Scopes{}; +  LLVMContext *Context = nullptr;  };  class LLVM_LIBRARY_VISIBILITY NVPTXDAGToDAGISel : public SelectionDAGISel { diff --git a/llvm/lib/Target/PowerPC/PPCInstrFuture.td b/llvm/lib/Target/PowerPC/PPCInstrFuture.td index da3efdc..0c2e44e 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrFuture.td +++ b/llvm/lib/Target/PowerPC/PPCInstrFuture.td @@ -360,6 +360,10 @@ let Predicates = [HasVSX, IsISAFuture] in {      def LXVPRLL : XForm_XTp5_RAB5<31, 621, (outs vsrprc:$XTp),                                    (ins (memr $RA):$addr, g8rc:$RB),                                    "lxvprll $XTp, $addr, $RB", IIC_LdStLFD, []>; +    def LXVPB32X +        : XForm_XTp5_RAB5<31, 877, (outs vsrprc:$XTp), +                          (ins (memr $RA):$addr, g8rc:$RB), +                          "lxvpb32x $XTp, $addr, $RB", IIC_LdStLFD, []>;    }    let mayStore = 1 in { @@ -376,6 +380,10 @@ let Predicates = [HasVSX, IsISAFuture] in {          : XForm_XTp5_RAB5<31, 749, (outs),                            (ins vsrprc:$XTp, (memr $RA):$addr, g8rc:$RB),                            "stxvprll $XTp, $addr, $RB", IIC_LdStLFD, []>; +    def STXVPB32X +        : XForm_XTp5_RAB5<31, 1005, (outs), +                          (ins vsrprc:$XTp, (memr $RA):$addr, g8rc:$RB), +                          "stxvpb32x $XTp, $addr, $RB", IIC_LdStLFD, []>;    }    def VUPKHSNTOB : VXForm_VRTB5<387, 0, (outs vrrc:$VRT), (ins vrrc:$VRB), diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h index e75dfe3..5b8cfb2 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h @@ -407,7 +407,6 @@ enum OperandType : unsigned {    OPERAND_SIMM5_PLUS1,    OPERAND_SIMM6,    OPERAND_SIMM6_NONZERO, -  OPERAND_SIMM8,    OPERAND_SIMM8_UNSIGNED,    OPERAND_SIMM10,    OPERAND_SIMM10_LSB0000_NONZERO, diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index b25a054..9078335 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -371,8 +371,8 @@ void RISCVDAGToDAGISel::selectVLXSEG(SDNode *Node, unsigned NF, bool IsMasked,    RISCVVType::VLMUL IndexLMUL = RISCVTargetLowering::getLMUL(IndexVT);    unsigned IndexLog2EEW = Log2_32(IndexVT.getScalarSizeInBits());    if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) { -    report_fatal_error("The V extension does not support EEW=64 for index " -                       "values when XLEN=32"); +    reportFatalUsageError("The V extension does not support EEW=64 for index " +                          "values when XLEN=32");    }    const RISCV::VLXSEGPseudo *P = RISCV::getVLXSEGPseudo(        NF, IsMasked, IsOrdered, IndexLog2EEW, static_cast<unsigned>(LMUL), @@ -444,8 +444,8 @@ void RISCVDAGToDAGISel::selectVSXSEG(SDNode *Node, unsigned NF, bool IsMasked,    RISCVVType::VLMUL IndexLMUL = RISCVTargetLowering::getLMUL(IndexVT);    unsigned IndexLog2EEW = Log2_32(IndexVT.getScalarSizeInBits());    if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) { -    report_fatal_error("The V extension does not support EEW=64 for index " -                       "values when XLEN=32"); +    reportFatalUsageError("The V extension does not support EEW=64 for index " +                          "values when XLEN=32");    }    const RISCV::VSXSEGPseudo *P = RISCV::getVSXSEGPseudo(        NF, IsMasked, IsOrdered, IndexLog2EEW, static_cast<unsigned>(LMUL), @@ -2223,8 +2223,8 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {        RISCVVType::VLMUL IndexLMUL = RISCVTargetLowering::getLMUL(IndexVT);        unsigned IndexLog2EEW = Log2_32(IndexVT.getScalarSizeInBits());        if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) { -        report_fatal_error("The V extension does not support EEW=64 for index " -                           "values when XLEN=32"); +        reportFatalUsageError("The V extension does not support EEW=64 for " +                              "index values when XLEN=32");        }        const RISCV::VLX_VSXPseudo *P = RISCV::getVLXPseudo(            IsMasked, IsOrdered, IndexLog2EEW, static_cast<unsigned>(LMUL), @@ -2457,8 +2457,8 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {        RISCVVType::VLMUL IndexLMUL = RISCVTargetLowering::getLMUL(IndexVT);        unsigned IndexLog2EEW = Log2_32(IndexVT.getScalarSizeInBits());        if (IndexLog2EEW == 6 && !Subtarget->is64Bit()) { -        report_fatal_error("The V extension does not support EEW=64 for index " -                           "values when XLEN=32"); +        reportFatalUsageError("The V extension does not support EEW=64 for " +                              "index values when XLEN=32");        }        const RISCV::VLX_VSXPseudo *P = RISCV::getVSXPseudo(            IsMasked, IsOrdered, IndexLog2EEW, diff --git a/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp b/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp index a1c8e23..c58a5c0 100644 --- a/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp +++ b/llvm/lib/Target/RISCV/RISCVInsertWriteVXRM.cpp @@ -48,7 +48,7 @@ class VXRMInfo {    } State = Uninitialized;  public: -  VXRMInfo() {} +  VXRMInfo() = default;    static VXRMInfo getUnknown() {      VXRMInfo Info; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td index c31713e..1c6a5af 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td @@ -90,6 +90,7 @@ defvar ZfhminDExts = [ZfhminDExt, ZhinxminZdinxExt, ZhinxminZdinx32Ext];  //===----------------------------------------------------------------------===//  let Predicates = [HasHalfFPLoadStoreMove] in { +let canFoldAsLoad = 1 in  def FLH : FPLoad_r<0b001, "flh", FPR16, WriteFLD16>;  // Operands for stores are in the order srcreg, base, offset rather than diff --git a/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp b/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp index 0a318e0..ed6d355 100644 --- a/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp +++ b/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.cpp @@ -15,4 +15,4 @@  using namespace llvm;  SPIRVTargetStreamer::SPIRVTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} -SPIRVTargetStreamer::~SPIRVTargetStreamer() {} +SPIRVTargetStreamer::~SPIRVTargetStreamer() = default; diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp index 9e11c3a..dd57b74 100644 --- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp @@ -149,23 +149,23 @@ static FunctionType *getOriginalFunctionType(const Function &F) {          return isa<MDString>(N->getOperand(0)) &&                 cast<MDString>(N->getOperand(0))->getString() == F.getName();        }); -  // TODO: probably one function can have numerous type mutations, -  // so we should support this.    if (ThisFuncMDIt != NamedMD->op_end()) {      auto *ThisFuncMD = *ThisFuncMDIt; -    MDNode *MD = dyn_cast<MDNode>(ThisFuncMD->getOperand(1)); -    assert(MD && "MDNode operand is expected"); -    ConstantInt *Const = getConstInt(MD, 0); -    if (Const) { -      auto *CMeta = dyn_cast<ConstantAsMetadata>(MD->getOperand(1)); -      assert(CMeta && "ConstantAsMetadata operand is expected"); -      assert(Const->getSExtValue() >= -1); -      // Currently -1 indicates return value, greater values mean -      // argument numbers. -      if (Const->getSExtValue() == -1) -        RetTy = CMeta->getType(); -      else -        ArgTypes[Const->getSExtValue()] = CMeta->getType(); +    for (unsigned I = 1; I != ThisFuncMD->getNumOperands(); ++I) { +      MDNode *MD = dyn_cast<MDNode>(ThisFuncMD->getOperand(I)); +      assert(MD && "MDNode operand is expected"); +      ConstantInt *Const = getConstInt(MD, 0); +      if (Const) { +        auto *CMeta = dyn_cast<ConstantAsMetadata>(MD->getOperand(1)); +        assert(CMeta && "ConstantAsMetadata operand is expected"); +        assert(Const->getSExtValue() >= -1); +        // Currently -1 indicates return value, greater values mean +        // argument numbers. +        if (Const->getSExtValue() == -1) +          RetTy = CMeta->getType(); +        else +          ArgTypes[Const->getSExtValue()] = CMeta->getType(); +      }      }    } diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h index 2d19f6de..44b6c66 100644 --- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h +++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.h @@ -81,7 +81,7 @@ private:    void initAvailableCapabilitiesForVulkan(const SPIRVSubtarget &ST);  public: -  RequirementHandler() {} +  RequirementHandler() = default;    void clear() {      MinimalCaps.clear();      AllCaps.clear(); diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index 7dd0b95..5ba0356 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -69,7 +69,7 @@ static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {  }  // Pin SPIRVTargetObjectFile's vtables to this file. -SPIRVTargetObjectFile::~SPIRVTargetObjectFile() {} +SPIRVTargetObjectFile::~SPIRVTargetObjectFile() = default;  SPIRVTargetMachine::SPIRVTargetMachine(const Target &T, const Triple &TT,                                         StringRef CPU, StringRef FS, diff --git a/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h b/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h index 9d0adbb..87ec256 100644 --- a/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h +++ b/llvm/lib/Target/SystemZ/SystemZTargetObjectFile.h @@ -16,7 +16,7 @@ namespace llvm {  /// This implementation is used for SystemZ ELF targets.  class SystemZELFTargetObjectFile : public TargetLoweringObjectFileELF {  public: -  SystemZELFTargetObjectFile() {} +  SystemZELFTargetObjectFile() = default;    /// Describe a TLS variable address within debug info.    const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override; diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 133406b..b97b508 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -33034,12 +33034,13 @@ static SDValue LowerFSINCOS(SDValue Op, const X86Subtarget &Subtarget,        DAG.getExternalSymbol(LibcallName, TLI.getPointerTy(DAG.getDataLayout()));    Type *RetTy = isF64 ? (Type *)StructType::get(ArgTy, ArgTy) -                      : (Type *)FixedVectorType::get(ArgTy, 4); +                      : (Type *)FixedVectorType::get(ArgTy, 2);    TargetLowering::CallLoweringInfo CLI(DAG);    CLI.setDebugLoc(dl)        .setChain(DAG.getEntryNode()) -      .setLibCallee(CallingConv::C, RetTy, Callee, std::move(Args)); +      .setLibCallee(CallingConv::C, RetTy, Callee, std::move(Args)) +      .setIsPostTypeLegalization();    std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI); @@ -53347,6 +53348,80 @@ static SDValue combineMaskedStore(SDNode *N, SelectionDAG &DAG,    return SDValue();  } +// Look for a RMW operation that only touches one bit of a larger than legal +// type and fold it to a BTC/BTR/BTS pattern acting on a single i32 sub value. +static SDValue narrowBitOpRMW(StoreSDNode *St, const SDLoc &DL, +                              SelectionDAG &DAG, +                              const X86Subtarget &Subtarget) { +  using namespace SDPatternMatch; + +  // Only handle normal stores and its chain was a matching normal load. +  auto *Ld = dyn_cast<LoadSDNode>(St->getChain()); +  if (!ISD::isNormalStore(St) || !St->isSimple() || !Ld || +      !ISD::isNormalLoad(Ld) || !Ld->isSimple() || +      Ld->getBasePtr() != St->getBasePtr() || +      Ld->getOffset() != St->getOffset()) +    return SDValue(); + +  SDValue LoadVal(Ld, 0); +  SDValue StoredVal = St->getValue(); +  EVT VT = StoredVal.getValueType(); + +  // Only narrow larger than legal scalar integers. +  if (!VT.isScalarInteger() || +      VT.getSizeInBits() <= (Subtarget.is64Bit() ? 64 : 32)) +    return SDValue(); + +  // BTR: X & ~(1 << ShAmt) +  // BTS: X | (1 << ShAmt) +  // BTC: X ^ (1 << ShAmt) +  SDValue ShAmt; +  if (!StoredVal.hasOneUse() || +      !(sd_match(StoredVal, m_And(m_Specific(LoadVal), +                                  m_Not(m_Shl(m_One(), m_Value(ShAmt))))) || +        sd_match(StoredVal, +                 m_Or(m_Specific(LoadVal), m_Shl(m_One(), m_Value(ShAmt)))) || +        sd_match(StoredVal, +                 m_Xor(m_Specific(LoadVal), m_Shl(m_One(), m_Value(ShAmt)))))) +    return SDValue(); + +  // Ensure the shift amount is in bounds. +  KnownBits KnownAmt = DAG.computeKnownBits(ShAmt); +  if (KnownAmt.getMaxValue().uge(VT.getSizeInBits())) +    return SDValue(); + +  // Split the shift into an alignment shift that moves the active i32 block to +  // the bottom bits for truncation and a modulo shift that can act on the i32. +  EVT AmtVT = ShAmt.getValueType(); +  SDValue AlignAmt = DAG.getNode(ISD::AND, DL, AmtVT, ShAmt, +                                 DAG.getSignedConstant(-32LL, DL, AmtVT)); +  SDValue ModuloAmt = +      DAG.getNode(ISD::AND, DL, AmtVT, ShAmt, DAG.getConstant(31, DL, AmtVT)); + +  // Compute the byte offset for the i32 block that is changed by the RMW. +  // combineTruncate will adjust the load for us in a similar way. +  EVT PtrVT = St->getBasePtr().getValueType(); +  SDValue PtrBitOfs = DAG.getZExtOrTrunc(AlignAmt, DL, PtrVT); +  SDValue PtrByteOfs = DAG.getNode(ISD::SRL, DL, PtrVT, PtrBitOfs, +                                   DAG.getShiftAmountConstant(3, PtrVT, DL)); +  SDValue NewPtr = DAG.getMemBasePlusOffset(St->getBasePtr(), PtrByteOfs, DL, +                                            SDNodeFlags::NoUnsignedWrap); + +  // Reconstruct the BTC/BTR/BTS pattern for the i32 block and store. +  SDValue X = DAG.getNode(ISD::SRL, DL, VT, LoadVal, AlignAmt); +  X = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, X); + +  SDValue Mask = +      DAG.getNode(ISD::SHL, DL, MVT::i32, DAG.getConstant(1, DL, MVT::i32), +                  DAG.getZExtOrTrunc(ModuloAmt, DL, MVT::i8)); +  if (StoredVal.getOpcode() == ISD::AND) +    Mask = DAG.getNOT(DL, Mask, MVT::i32); + +  SDValue Res = DAG.getNode(StoredVal.getOpcode(), DL, MVT::i32, X, Mask); +  return DAG.getStore(St->getChain(), DL, Res, NewPtr, St->getPointerInfo(), +                      Align(), St->getMemOperand()->getFlags()); +} +  static SDValue combineStore(SDNode *N, SelectionDAG &DAG,                              TargetLowering::DAGCombinerInfo &DCI,                              const X86Subtarget &Subtarget) { @@ -53573,6 +53648,9 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,      }    } +  if (SDValue R = narrowBitOpRMW(St, dl, DAG, Subtarget)) +    return R; +    // Convert store(cmov(load(p), x, CC), p) to cstore(x, p, CC)    //         store(cmov(x, load(p), CC), p) to cstore(x, p, InvertCC)    if ((VT == MVT::i16 || VT == MVT::i32 || VT == MVT::i64) && @@ -54505,8 +54583,9 @@ static SDValue combineTruncate(SDNode *N, SelectionDAG &DAG,    // truncation, see if we can convert the shift into a pointer offset instead.    // Limit this to normal (non-ext) scalar integer loads.    if (SrcVT.isScalarInteger() && Src.getOpcode() == ISD::SRL && -      Src.hasOneUse() && Src.getOperand(0).hasOneUse() && -      ISD::isNormalLoad(Src.getOperand(0).getNode())) { +      Src.hasOneUse() && ISD::isNormalLoad(Src.getOperand(0).getNode()) && +      (Src.getOperand(0).hasOneUse() || +       !DAG.getTargetLoweringInfo().isOperationLegal(ISD::LOAD, SrcVT))) {      auto *Ld = cast<LoadSDNode>(Src.getOperand(0));      if (Ld->isSimple() && VT.isByteSized() &&          isPowerOf2_64(VT.getSizeInBits())) { @@ -54529,8 +54608,7 @@ static SDValue combineTruncate(SDNode *N, SelectionDAG &DAG,          SDValue NewLoad =              DAG.getLoad(VT, DL, Ld->getChain(), NewPtr, Ld->getPointerInfo(),                          Align(), Ld->getMemOperand()->getFlags()); -        DAG.ReplaceAllUsesOfValueWith(Src.getOperand(0).getValue(1), -                                      NewLoad.getValue(1)); +        DAG.makeEquivalentMemoryOrdering(Ld, NewLoad);          return NewLoad;        }      } @@ -56306,6 +56384,7 @@ static SDValue combineAVX512SetCCToKMOV(EVT VT, SDValue Op0, ISD::CondCode CC,  static SDValue combineSetCC(SDNode *N, SelectionDAG &DAG,                              TargetLowering::DAGCombinerInfo &DCI,                              const X86Subtarget &Subtarget) { +  using namespace SDPatternMatch;    const ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get();    const SDValue LHS = N->getOperand(0);    const SDValue RHS = N->getOperand(1); @@ -56364,6 +56443,37 @@ static SDValue combineSetCC(SDNode *N, SelectionDAG &DAG,        if (SDValue AndN = MatchAndCmpEq(RHS, LHS))          return DAG.getSetCC(DL, VT, AndN, DAG.getConstant(0, DL, OpVT), CC); +      // If we're performing a bit test on a larger than legal type, attempt +      // to (aligned) shift down the value to the bottom 32-bits and then +      // perform the bittest on the i32 value. +      // ICMP_ZERO(AND(X,SHL(1,IDX))) +      // --> ICMP_ZERO(AND(TRUNC(SRL(X,AND(IDX,-32))),SHL(1,AND(IDX,31)))) +      if (isNullConstant(RHS) && +          OpVT.getScalarSizeInBits() > (Subtarget.is64Bit() ? 64 : 32)) { +        SDValue X, ShAmt; +        if (sd_match(LHS, m_OneUse(m_And(m_Value(X), +                                         m_Shl(m_One(), m_Value(ShAmt)))))) { +          // Only attempt this if the shift amount is known to be in bounds. +          KnownBits KnownAmt = DAG.computeKnownBits(ShAmt); +          if (KnownAmt.getMaxValue().ult(OpVT.getScalarSizeInBits())) { +            EVT AmtVT = ShAmt.getValueType(); +            SDValue AlignAmt = +                DAG.getNode(ISD::AND, DL, AmtVT, ShAmt, +                            DAG.getSignedConstant(-32LL, DL, AmtVT)); +            SDValue ModuloAmt = DAG.getNode(ISD::AND, DL, AmtVT, ShAmt, +                                            DAG.getConstant(31, DL, AmtVT)); +            SDValue Mask = DAG.getNode( +                ISD::SHL, DL, MVT::i32, DAG.getConstant(1, DL, MVT::i32), +                DAG.getZExtOrTrunc(ModuloAmt, DL, MVT::i8)); +            X = DAG.getNode(ISD::SRL, DL, OpVT, X, AlignAmt); +            X = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, X); +            X = DAG.getNode(ISD::AND, DL, MVT::i32, X, Mask); +            return DAG.getSetCC(DL, VT, X, DAG.getConstant(0, DL, MVT::i32), +                                CC); +          } +        } +      } +        // cmpeq(trunc(x),C) --> cmpeq(x,C)        // cmpne(trunc(x),C) --> cmpne(x,C)        // iff x upper bits are zero. diff --git a/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp b/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp index b655183..3b96e70 100644 --- a/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp +++ b/llvm/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp @@ -227,9 +227,6 @@ struct DOTGraphTraits<MachineGadgetGraph *> : DefaultDOTGraphTraits {  } // end namespace llvm -constexpr MachineInstr *MachineGadgetGraph::ArgNodeSentinel; -constexpr int MachineGadgetGraph::GadgetEdgeSentinel; -  char X86LoadValueInjectionLoadHardeningPass::ID = 0;  void X86LoadValueInjectionLoadHardeningPass::getAnalysisUsage( diff --git a/llvm/lib/TextAPI/RecordVisitor.cpp b/llvm/lib/TextAPI/RecordVisitor.cpp index d333b33..24971a7 100644 --- a/llvm/lib/TextAPI/RecordVisitor.cpp +++ b/llvm/lib/TextAPI/RecordVisitor.cpp @@ -15,7 +15,7 @@  using namespace llvm;  using namespace llvm::MachO; -RecordVisitor::~RecordVisitor() {} +RecordVisitor::~RecordVisitor() = default;  void RecordVisitor::visitObjCInterface(const ObjCInterfaceRecord &) {}  void RecordVisitor::visitObjCCategory(const ObjCCategoryRecord &) {} diff --git a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp index d7eb745..2a87a0f 100644 --- a/llvm/lib/Transforms/IPO/OpenMPOpt.cpp +++ b/llvm/lib/Transforms/IPO/OpenMPOpt.cpp @@ -208,7 +208,7 @@ namespace KernelInfo {  // };  #define KERNEL_ENVIRONMENT_IDX(MEMBER, IDX)                                    \ -  constexpr const unsigned MEMBER##Idx = IDX; +  constexpr unsigned MEMBER##Idx = IDX;  KERNEL_ENVIRONMENT_IDX(Configuration, 0)  KERNEL_ENVIRONMENT_IDX(Ident, 1) @@ -216,7 +216,7 @@ KERNEL_ENVIRONMENT_IDX(Ident, 1)  #undef KERNEL_ENVIRONMENT_IDX  #define KERNEL_ENVIRONMENT_CONFIGURATION_IDX(MEMBER, IDX)                      \ -  constexpr const unsigned MEMBER##Idx = IDX; +  constexpr unsigned MEMBER##Idx = IDX;  KERNEL_ENVIRONMENT_CONFIGURATION_IDX(UseGenericStateMachine, 0)  KERNEL_ENVIRONMENT_CONFIGURATION_IDX(MayUseNestedParallelism, 1) @@ -258,7 +258,7 @@ KERNEL_ENVIRONMENT_CONFIGURATION_GETTER(MaxTeams)  GlobalVariable *  getKernelEnvironementGVFromKernelInitCB(CallBase *KernelInitCB) { -  constexpr const int InitKernelEnvironmentArgNo = 0; +  constexpr int InitKernelEnvironmentArgNo = 0;    return cast<GlobalVariable>(        KernelInitCB->getArgOperand(InitKernelEnvironmentArgNo)            ->stripPointerCasts()); diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 3ddf182..cbaff29 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -3997,6 +3997,27 @@ static Value *foldOrUnsignedUMulOverflowICmp(BinaryOperator &I,    return nullptr;  } +/// Fold select(X >s 0, 0, -X) | smax(X, 0) --> abs(X) +///      select(X <s 0, -X, 0) | smax(X, 0) --> abs(X) +static Value *FoldOrOfSelectSmaxToAbs(BinaryOperator &I, +                                      InstCombiner::BuilderTy &Builder) { +  Value *X; +  Value *Sel; +  if (match(&I, +            m_c_Or(m_Value(Sel), m_OneUse(m_SMax(m_Value(X), m_ZeroInt()))))) { +    auto NegX = m_Neg(m_Specific(X)); +    if (match(Sel, m_Select(m_SpecificICmp(ICmpInst::ICMP_SGT, m_Specific(X), +                                           m_ZeroInt()), +                            m_ZeroInt(), NegX)) || +        match(Sel, m_Select(m_SpecificICmp(ICmpInst::ICMP_SLT, m_Specific(X), +                                           m_ZeroInt()), +                            NegX, m_ZeroInt()))) +      return Builder.CreateBinaryIntrinsic(Intrinsic::abs, X, +                                           Builder.getFalse()); +  } +  return nullptr; +} +  // FIXME: We use commutative matchers (m_c_*) for some, but not all, matches  // here. We should standardize that construct where it is needed or choose some  // other way to ensure that commutated variants of patterns are not missed. @@ -4545,6 +4566,9 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {      if (Value *V = SimplifyAddWithRemainder(I))        return replaceInstUsesWith(I, V); +  if (Value *Res = FoldOrOfSelectSmaxToAbs(I, Builder)) +    return replaceInstUsesWith(I, Res); +    return nullptr;  } diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index f5130da..9572f9d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -3599,6 +3599,21 @@ Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) {                                   m_Not(m_Specific(SelCond->getTrueValue())));        if (MayNeedFreeze)          C = Builder.CreateFreeze(C); +      if (!ProfcheckDisableMetadataFixes) { +        Value *C2 = nullptr, *A2 = nullptr, *B2 = nullptr; +        if (match(CondVal, m_LogicalAnd(m_Specific(C), m_Value(A2))) && +            SelCond) { +          return SelectInst::Create(C, A, B, "", nullptr, SelCond); +        } else if (match(FalseVal, +                         m_LogicalAnd(m_Not(m_Value(C2)), m_Value(B2))) && +                   SelFVal) { +          SelectInst *NewSI = SelectInst::Create(C, A, B, "", nullptr, SelFVal); +          NewSI->swapProfMetadata(); +          return NewSI; +        } else { +          return createSelectInstWithUnknownProfile(C, A, B); +        } +      }        return SelectInst::Create(C, A, B);      } @@ -3615,6 +3630,20 @@ Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) {                                   m_Not(m_Specific(SelFVal->getTrueValue())));        if (MayNeedFreeze)          C = Builder.CreateFreeze(C); +      if (!ProfcheckDisableMetadataFixes) { +        Value *C2 = nullptr, *A2 = nullptr, *B2 = nullptr; +        if (match(CondVal, m_LogicalAnd(m_Not(m_Value(C2)), m_Value(A2))) && +            SelCond) { +          SelectInst *NewSI = SelectInst::Create(C, B, A, "", nullptr, SelCond); +          NewSI->swapProfMetadata(); +          return NewSI; +        } else if (match(FalseVal, m_LogicalAnd(m_Specific(C), m_Value(B2))) && +                   SelFVal) { +          return SelectInst::Create(C, B, A, "", nullptr, SelFVal); +        } else { +          return createSelectInstWithUnknownProfile(C, B, A); +        } +      }        return SelectInst::Create(C, B, A);      }    } diff --git a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp index 80e77e09..a2fad02 100644 --- a/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp @@ -161,7 +161,7 @@ template <char NsanTypeId>  class ShadowTypeConfigImpl : public ShadowTypeConfig {  public:    char getNsanTypeId() const override { return NsanTypeId; } -  static constexpr const char kNsanTypeId = NsanTypeId; +  static constexpr char kNsanTypeId = NsanTypeId;  };  // `double` (`d`) shadow type. diff --git a/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp b/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp index 89980d5..a577f51 100644 --- a/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp +++ b/llvm/lib/Transforms/Scalar/DropUnnecessaryAssumes.cpp @@ -122,7 +122,8 @@ DropUnnecessaryAssumesPass::run(Function &F, FunctionAnalysisManager &FAM) {      Value *Cond = Assume->getArgOperand(0);      // Don't drop type tests, which have special semantics. -    if (match(Cond, m_Intrinsic<Intrinsic::type_test>())) +    if (match(Cond, m_Intrinsic<Intrinsic::type_test>()) || +        match(Cond, m_Intrinsic<Intrinsic::public_type_test>()))        continue;      SmallVector<Value *> Affected; diff --git a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp index 5f6f66a..0a8f5ea 100644 --- a/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp +++ b/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp @@ -558,11 +558,10 @@ void StructurizeCFG::analyzeLoops(RegionNode *N) {    } else {      // Test for successors as back edge      BasicBlock *BB = N->getNodeAs<BasicBlock>(); -    BranchInst *Term = cast<BranchInst>(BB->getTerminator()); - -    for (BasicBlock *Succ : Term->successors()) -      if (Visited.count(Succ)) -        Loops[Succ] = BB; +    if (BranchInst *Term = dyn_cast<BranchInst>(BB->getTerminator())) +      for (BasicBlock *Succ : Term->successors()) +        if (Visited.count(Succ)) +          Loops[Succ] = BB;    }  } @@ -594,7 +593,7 @@ void StructurizeCFG::gatherPredicates(RegionNode *N) {    for (BasicBlock *P : predecessors(BB)) {      // Ignore it if it's a branch from outside into our region entry -    if (!ParentRegion->contains(P)) +    if (!ParentRegion->contains(P) || !dyn_cast<BranchInst>(P->getTerminator()))        continue;      Region *R = RI->getRegionFor(P); @@ -1402,13 +1401,17 @@ bool StructurizeCFG::makeUniformRegion(Region *R, UniformityInfo &UA) {  /// Run the transformation for each region found  bool StructurizeCFG::run(Region *R, DominatorTree *DT,                           const TargetTransformInfo *TTI) { -  if (R->isTopLevelRegion()) +  // CallBr and its corresponding direct target blocks are for now ignored by +  // this pass. This is not a limitation for the currently intended uses cases +  // of callbr in the AMDGPU backend. +  // Parent and child regions are not affected by this (current) restriction. +  // See `llvm/test/Transforms/StructurizeCFG/callbr.ll` for details. +  if (R->isTopLevelRegion() || isa<CallBrInst>(R->getEntry()->getTerminator()))      return false;    this->DT = DT;    this->TTI = TTI;    Func = R->getEntry()->getParent(); -  assert(hasOnlySimpleTerminator(*Func) && "Unsupported block terminator.");    ParentRegion = R; diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 46f2903..a03cf6e 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -3416,7 +3416,11 @@ DIExpression *llvm::getExpressionForConstant(DIBuilder &DIB, const Constant &C,    // Create integer constant expression.    auto createIntegerExpression = [&DIB](const Constant &CV) -> DIExpression * {      const APInt &API = cast<ConstantInt>(&CV)->getValue(); -    std::optional<int64_t> InitIntOpt = API.trySExtValue(); +    std::optional<int64_t> InitIntOpt; +    if (API.getBitWidth() == 1) +      InitIntOpt = API.tryZExtValue(); +    else +      InitIntOpt = API.trySExtValue();      return InitIntOpt ? DIB.createConstantValueExpression(                              static_cast<uint64_t>(*InitIntOpt))                        : nullptr; diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 8be471b..6e60b94 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -992,9 +992,12 @@ BranchProbability llvm::getBranchProbability(BranchInst *B,    uint64_t Weight0, Weight1;    if (!extractBranchWeights(*B, Weight0, Weight1))      return BranchProbability::getUnknown(); +  uint64_t Denominator = Weight0 + Weight1; +  if (Denominator == 0) +    return BranchProbability::getUnknown();    if (!ForFirstTarget)      std::swap(Weight0, Weight1); -  return BranchProbability::getBranchProbability(Weight0, Weight0 + Weight1); +  return BranchProbability::getBranchProbability(Weight0, Denominator);  }  bool llvm::setBranchProbability(BranchInst *B, BranchProbability P, diff --git a/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp b/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp index 94c5c170..e86ab13 100644 --- a/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp +++ b/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp @@ -158,6 +158,7 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {    SmallVector<BasicBlock *, 8> CallBrTargetBlocksToFix;    // Redirect exiting edges through a control flow hub.    ControlFlowHub CHub; +  bool Changed = false;    for (unsigned I = 0; I < ExitingBlocks.size(); ++I) {      BasicBlock *BB = ExitingBlocks[I]; @@ -182,6 +183,10 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {          bool UpdatedLI = false;          BasicBlock *NewSucc =              SplitCallBrEdge(BB, Succ, J, &DTU, nullptr, &LI, &UpdatedLI); +        // SplitCallBrEdge modifies the CFG because it creates an intermediate +        // block. So we need to set the changed flag no matter what the +        // ControlFlowHub is going to do later. +        Changed = true;          // Even if CallBr and Succ do not have a common parent loop, we need to          // add the new target block to the parent loop of the current loop.          if (!UpdatedLI) @@ -207,6 +212,7 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {    bool ChangedCFG;    std::tie(LoopExitBlock, ChangedCFG) = CHub.finalize(        &DTU, GuardBlocks, "loop.exit", MaxBooleansInControlFlowHub.getValue()); +  ChangedCFG |= Changed;    if (!ChangedCFG)      return false; diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 34b405c..bf3f52c 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -20975,6 +20975,27 @@ BoUpSLP::BlockScheduling::tryScheduleBundle(ArrayRef<Value *> VL, BoUpSLP *SLP,    if (isa<PHINode>(S.getMainOp()) ||        isVectorLikeInstWithConstOps(S.getMainOp()))      return nullptr; +  // If the parent node is non-schedulable and the current node is copyable, and +  // any of parent instructions are used outside several basic blocks or in +  // bin-op node - cancel scheduling, it may cause wrong def-use deps in +  // analysis, leading to a crash. +  // Non-scheduled nodes may not have related ScheduleData model, which may lead +  // to a skipped dep analysis. +  if (S.areInstructionsWithCopyableElements() && EI && EI.UserTE->hasState() && +      EI.UserTE->doesNotNeedToSchedule() && +      EI.UserTE->getOpcode() != Instruction::PHI && +      any_of(EI.UserTE->Scalars, [](Value *V) { +        auto *I = dyn_cast<Instruction>(V); +        if (!I || I->hasOneUser()) +          return false; +        for (User *U : I->users()) { +          auto *UI = cast<Instruction>(U); +          if (isa<BinaryOperator>(UI)) +            return true; +        } +        return false; +      })) +    return std::nullopt;    bool HasCopyables = S.areInstructionsWithCopyableElements();    if (((!HasCopyables && doesNotNeedToSchedule(VL)) ||         all_of(VL, [&](Value *V) { return S.isNonSchedulable(V); }))) { diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp index 9c869dd..d354933 100644 --- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp +++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/DependencyGraph.cpp @@ -92,7 +92,7 @@ void MemDGNode::print(raw_ostream &OS, bool PrintDeps) const {    DGNode::print(OS, false);    if (PrintDeps) {      // Print memory preds. -    static constexpr const unsigned Indent = 4; +    static constexpr unsigned Indent = 4;      for (auto *Pred : MemPreds)        OS.indent(Indent) << "<-" << *Pred->getInstruction() << "\n";    } diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp index 86dbd21..5534da9 100644 --- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp +++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.cpp @@ -25,14 +25,14 @@ static cl::opt<bool>                            "emit new instructions (*very* expensive)."));  #endif // NDEBUG -static constexpr const unsigned long StopAtDisabled = +static constexpr unsigned long StopAtDisabled =      std::numeric_limits<unsigned long>::max();  static cl::opt<unsigned long>      StopAt("sbvec-stop-at", cl::init(StopAtDisabled), cl::Hidden,             cl::desc("Vectorize if the invocation count is < than this. 0 "                      "disables vectorization.")); -static constexpr const unsigned long StopBundleDisabled = +static constexpr unsigned long StopBundleDisabled =      std::numeric_limits<unsigned long>::max();  static cl::opt<unsigned long>      StopBundle("sbvec-stop-bndl", cl::init(StopBundleDisabled), cl::Hidden, diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp index ed2f80b..2de6921 100644 --- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp @@ -43,7 +43,7 @@ cl::opt<std::string> AllowFiles(      "sbvec-allow-files", cl::init(".*"), cl::Hidden,      cl::desc("Run the vectorizer only on file paths that match any in the "               "list of comma-separated regex's.")); -static constexpr const char AllowFilesDelim = ','; +static constexpr char AllowFilesDelim = ',';  SandboxVectorizerPass::SandboxVectorizerPass() : FPM("fpm") {    if (UserDefinedPassPipeline == DefaultPipelineMagicStr) { diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h index aba6d35..cfe1f1e 100644 --- a/llvm/lib/Transforms/Vectorize/VPlan.h +++ b/llvm/lib/Transforms/Vectorize/VPlan.h @@ -1110,9 +1110,8 @@ public:    VP_CLASSOF_IMPL(VPDef::VPInstructionSC)    VPInstruction *clone() override { -    SmallVector<VPValue *, 2> Operands(operands()); -    auto *New = -        new VPInstruction(Opcode, Operands, *this, *this, getDebugLoc(), Name); +    auto *New = new VPInstruction(Opcode, operands(), *this, *this, +                                  getDebugLoc(), Name);      if (getUnderlyingValue())        New->setUnderlyingValue(getUnderlyingInstr());      return New; @@ -1226,10 +1225,9 @@ public:    }    VPInstruction *clone() override { -    SmallVector<VPValue *, 2> Operands(operands());      auto *New = -        new VPInstructionWithType(getOpcode(), Operands, getResultType(), *this, -                                  getDebugLoc(), getName()); +        new VPInstructionWithType(getOpcode(), operands(), getResultType(), +                                  *this, getDebugLoc(), getName());      New->setUnderlyingValue(getUnderlyingValue());      return New;    } @@ -3211,6 +3209,9 @@ protected:        : VPRecipeBase(SC, Operands, DL), VPIRMetadata(Metadata), Ingredient(I),          Alignment(Alignment), Consecutive(Consecutive), Reverse(Reverse) {      assert((Consecutive || !Reverse) && "Reverse implies consecutive"); +    assert(isa<VPVectorEndPointerRecipe>(getAddr()) || +           !Reverse && +               "Reversed acccess without VPVectorEndPointerRecipe address?");    }  public: diff --git a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h index b5b98c6..b57c448 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h +++ b/llvm/lib/Transforms/Vectorize/VPlanPatternMatch.h @@ -313,7 +313,8 @@ private:      // Check for recipes that do not have opcodes.      if constexpr (std::is_same_v<RecipeTy, VPScalarIVStepsRecipe> ||                    std::is_same_v<RecipeTy, VPCanonicalIVPHIRecipe> || -                  std::is_same_v<RecipeTy, VPDerivedIVRecipe>) +                  std::is_same_v<RecipeTy, VPDerivedIVRecipe> || +                  std::is_same_v<RecipeTy, VPVectorEndPointerRecipe>)        return DefR;      else        return DefR && DefR->getOpcode() == Opcode; @@ -686,6 +687,64 @@ m_DerivedIV(const Op0_t &Op0, const Op1_t &Op1, const Op2_t &Op2) {    return VPDerivedIV_match<Op0_t, Op1_t, Op2_t>({Op0, Op1, Op2});  } +template <typename Addr_t, typename Mask_t> struct Load_match { +  Addr_t Addr; +  Mask_t Mask; + +  Load_match(Addr_t Addr, Mask_t Mask) : Addr(Addr), Mask(Mask) {} + +  template <typename OpTy> bool match(const OpTy *V) const { +    auto *Load = dyn_cast<VPWidenLoadRecipe>(V); +    if (!Load || !Addr.match(Load->getAddr()) || !Load->isMasked() || +        !Mask.match(Load->getMask())) +      return false; +    return true; +  } +}; + +/// Match a (possibly reversed) masked load. +template <typename Addr_t, typename Mask_t> +inline Load_match<Addr_t, Mask_t> m_MaskedLoad(const Addr_t &Addr, +                                               const Mask_t &Mask) { +  return Load_match<Addr_t, Mask_t>(Addr, Mask); +} + +template <typename Addr_t, typename Val_t, typename Mask_t> struct Store_match { +  Addr_t Addr; +  Val_t Val; +  Mask_t Mask; + +  Store_match(Addr_t Addr, Val_t Val, Mask_t Mask) +      : Addr(Addr), Val(Val), Mask(Mask) {} + +  template <typename OpTy> bool match(const OpTy *V) const { +    auto *Store = dyn_cast<VPWidenStoreRecipe>(V); +    if (!Store || !Addr.match(Store->getAddr()) || +        !Val.match(Store->getStoredValue()) || !Store->isMasked() || +        !Mask.match(Store->getMask())) +      return false; +    return true; +  } +}; + +/// Match a (possibly reversed) masked store. +template <typename Addr_t, typename Val_t, typename Mask_t> +inline Store_match<Addr_t, Val_t, Mask_t> +m_MaskedStore(const Addr_t &Addr, const Val_t &Val, const Mask_t &Mask) { +  return Store_match<Addr_t, Val_t, Mask_t>(Addr, Val, Mask); +} + +template <typename Op0_t, typename Op1_t> +using VectorEndPointerRecipe_match = +    Recipe_match<std::tuple<Op0_t, Op1_t>, 0, +                 /*Commutative*/ false, VPVectorEndPointerRecipe>; + +template <typename Op0_t, typename Op1_t> +VectorEndPointerRecipe_match<Op0_t, Op1_t> m_VecEndPtr(const Op0_t &Op0, +                                                       const Op1_t &Op1) { +  return VectorEndPointerRecipe_match<Op0_t, Op1_t>(Op0, Op1); +} +  /// Match a call argument at a given argument index.  template <typename Opnd_t> struct Argument_match {    /// Call argument index to match. diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp index 3757a59..9d9bb14 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp @@ -151,7 +151,27 @@ static bool cannotHoistOrSinkRecipe(const VPRecipeBase &R) {  static bool sinkScalarOperands(VPlan &Plan) {    auto Iter = vp_depth_first_deep(Plan.getEntry()); +  bool ScalarVFOnly = Plan.hasScalarVFOnly();    bool Changed = false; + +  auto IsValidSinkCandidate = [ScalarVFOnly](VPBasicBlock *SinkTo, +                                             VPSingleDefRecipe *Candidate) { +    // We only know how to duplicate VPReplicateRecipes and +    // VPScalarIVStepsRecipes for now. +    if (!isa<VPReplicateRecipe, VPScalarIVStepsRecipe>(Candidate)) +      return false; + +    if (Candidate->getParent() == SinkTo || Candidate->mayHaveSideEffects() || +        Candidate->mayReadOrWriteMemory()) +      return false; + +    if (auto *RepR = dyn_cast<VPReplicateRecipe>(Candidate)) +      if (!ScalarVFOnly && RepR->isSingleScalar()) +        return false; + +    return true; +  }; +    // First, collect the operands of all recipes in replicate blocks as seeds for    // sinking.    SetVector<std::pair<VPBasicBlock *, VPSingleDefRecipe *>> WorkList; @@ -159,51 +179,37 @@ static bool sinkScalarOperands(VPlan &Plan) {      VPBasicBlock *EntryVPBB = VPR->getEntryBasicBlock();      if (!VPR->isReplicator() || EntryVPBB->getSuccessors().size() != 2)        continue; -    VPBasicBlock *VPBB = dyn_cast<VPBasicBlock>(EntryVPBB->getSuccessors()[0]); -    if (!VPBB || VPBB->getSingleSuccessor() != VPR->getExitingBasicBlock()) +    VPBasicBlock *VPBB = cast<VPBasicBlock>(EntryVPBB->getSuccessors().front()); +    if (VPBB->getSingleSuccessor() != VPR->getExitingBasicBlock())        continue;      for (auto &Recipe : *VPBB) { -      for (VPValue *Op : Recipe.operands()) +      for (VPValue *Op : Recipe.operands()) {          if (auto *Def =                  dyn_cast_or_null<VPSingleDefRecipe>(Op->getDefiningRecipe())) -          WorkList.insert({VPBB, Def}); +          if (IsValidSinkCandidate(VPBB, Def)) +            WorkList.insert({VPBB, Def}); +      }      }    } -  bool ScalarVFOnly = Plan.hasScalarVFOnly();    // Try to sink each replicate or scalar IV steps recipe in the worklist.    for (unsigned I = 0; I != WorkList.size(); ++I) {      VPBasicBlock *SinkTo;      VPSingleDefRecipe *SinkCandidate;      std::tie(SinkTo, SinkCandidate) = WorkList[I]; -    if (SinkCandidate->getParent() == SinkTo || -        SinkCandidate->mayHaveSideEffects() || -        SinkCandidate->mayReadOrWriteMemory()) -      continue; -    if (auto *RepR = dyn_cast<VPReplicateRecipe>(SinkCandidate)) { -      if (!ScalarVFOnly && RepR->isSingleScalar()) -        continue; -    } else if (!isa<VPScalarIVStepsRecipe>(SinkCandidate)) -      continue; -    bool NeedsDuplicating = false;      // All recipe users of the sink candidate must be in the same block SinkTo -    // or all users outside of SinkTo must be uniform-after-vectorization ( -    // i.e., only first lane is used) . In the latter case, we need to duplicate -    // SinkCandidate. -    auto CanSinkWithUser = [SinkTo, &NeedsDuplicating, -                            SinkCandidate](VPUser *U) { -      auto *UI = cast<VPRecipeBase>(U); -      if (UI->getParent() == SinkTo) -        return true; -      NeedsDuplicating = UI->onlyFirstLaneUsed(SinkCandidate); -      // We only know how to duplicate VPReplicateRecipes and -      // VPScalarIVStepsRecipes for now. -      return NeedsDuplicating && -             isa<VPReplicateRecipe, VPScalarIVStepsRecipe>(SinkCandidate); -    }; -    if (!all_of(SinkCandidate->users(), CanSinkWithUser)) +    // or all users outside of SinkTo must have only their first lane used. In +    // the latter case, we need to duplicate SinkCandidate. +    auto UsersOutsideSinkTo = +        make_filter_range(SinkCandidate->users(), [SinkTo](VPUser *U) { +          return cast<VPRecipeBase>(U)->getParent() != SinkTo; +        }); +    if (any_of(UsersOutsideSinkTo, [SinkCandidate](VPUser *U) { +          return !U->onlyFirstLaneUsed(SinkCandidate); +        }))        continue; +    bool NeedsDuplicating = !UsersOutsideSinkTo.empty();      if (NeedsDuplicating) {        if (ScalarVFOnly) @@ -230,7 +236,8 @@ static bool sinkScalarOperands(VPlan &Plan) {      for (VPValue *Op : SinkCandidate->operands())        if (auto *Def =                dyn_cast_or_null<VPSingleDefRecipe>(Op->getDefiningRecipe())) -        WorkList.insert({SinkTo, Def}); +        if (IsValidSinkCandidate(SinkTo, Def)) +          WorkList.insert({SinkTo, Def});      Changed = true;    }    return Changed; @@ -1056,13 +1063,9 @@ static VPValue *tryToFoldLiveIns(VPSingleDefRecipe &R,    return nullptr;  } -/// Try to simplify recipe \p R. -static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) { -  VPlan *Plan = R.getParent()->getPlan(); - -  auto *Def = dyn_cast<VPSingleDefRecipe>(&R); -  if (!Def) -    return; +/// Try to simplify VPSingleDefRecipe \p Def. +static void simplifyRecipe(VPSingleDefRecipe *Def, VPTypeAnalysis &TypeInfo) { +  VPlan *Plan = Def->getParent()->getPlan();    // Simplification of live-in IR values for SingleDef recipes using    // InstSimplifyFolder. @@ -1072,7 +1075,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {      return Def->replaceAllUsesWith(V);    // Fold PredPHI LiveIn -> LiveIn. -  if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(&R)) { +  if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(Def)) {      VPValue *Op = PredPHI->getOperand(0);      if (Op->isLiveIn())        PredPHI->replaceAllUsesWith(Op); @@ -1091,12 +1094,12 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {          return;        if (ATy->getScalarSizeInBits() < TruncTy->getScalarSizeInBits()) { -        unsigned ExtOpcode = match(R.getOperand(0), m_SExt(m_VPValue())) +        unsigned ExtOpcode = match(Def->getOperand(0), m_SExt(m_VPValue()))                                   ? Instruction::SExt                                   : Instruction::ZExt;          auto *Ext = Builder.createWidenCast(Instruction::CastOps(ExtOpcode), A,                                              TruncTy); -        if (auto *UnderlyingExt = R.getOperand(0)->getUnderlyingValue()) { +        if (auto *UnderlyingExt = Def->getOperand(0)->getUnderlyingValue()) {            // UnderlyingExt has distinct return type, used to retain legacy cost.            Ext->setUnderlyingValue(UnderlyingExt);          } @@ -1159,7 +1162,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {          Builder.createLogicalAnd(X, Builder.createOr(Y, Z)));    // x && !x -> 0 -  if (match(&R, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X))))) +  if (match(Def, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))      return Def->replaceAllUsesWith(Plan->getFalse());    if (match(Def, m_Select(m_VPValue(), m_VPValue(X), m_Deferred(X)))) @@ -1187,8 +1190,8 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {      return Def->replaceAllUsesWith(A);    if (match(Def, m_c_Mul(m_VPValue(A), m_ZeroInt()))) -    return Def->replaceAllUsesWith(R.getOperand(0) == A ? R.getOperand(1) -                                                        : R.getOperand(0)); +    return Def->replaceAllUsesWith( +        Def->getOperand(0) == A ? Def->getOperand(1) : Def->getOperand(0));    if (match(Def, m_Not(m_VPValue(A)))) {      if (match(A, m_Not(m_VPValue(A)))) @@ -1217,8 +1220,8 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {          }          // If Cmp doesn't have a debug location, use the one from the negation,          // to preserve the location. -        if (!Cmp->getDebugLoc() && R.getDebugLoc()) -          Cmp->setDebugLoc(R.getDebugLoc()); +        if (!Cmp->getDebugLoc() && Def->getDebugLoc()) +          Cmp->setDebugLoc(Def->getDebugLoc());        }      }    } @@ -1244,7 +1247,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {    if (match(Def, m_Intrinsic<Intrinsic::vp_merge>(m_True(), m_VPValue(A),                                                    m_VPValue(X), m_VPValue())) &&        match(A, m_c_BinaryOr(m_Specific(X), m_VPValue(Y))) && -      TypeInfo.inferScalarType(R.getVPSingleValue())->isIntegerTy(1)) { +      TypeInfo.inferScalarType(Def)->isIntegerTy(1)) {      Def->setOperand(1, Def->getOperand(0));      Def->setOperand(0, Y);      return; @@ -1252,36 +1255,36 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {    if (auto *Phi = dyn_cast<VPFirstOrderRecurrencePHIRecipe>(Def)) {      if (Phi->getOperand(0) == Phi->getOperand(1)) -      Def->replaceAllUsesWith(Phi->getOperand(0)); +      Phi->replaceAllUsesWith(Phi->getOperand(0));      return;    }    // Look through ExtractLastElement (BuildVector ....). -  if (match(&R, m_CombineOr(m_ExtractLastElement(m_BuildVector()), -                            m_ExtractLastLanePerPart(m_BuildVector())))) { -    auto *BuildVector = cast<VPInstruction>(R.getOperand(0)); +  if (match(Def, m_CombineOr(m_ExtractLastElement(m_BuildVector()), +                             m_ExtractLastLanePerPart(m_BuildVector())))) { +    auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));      Def->replaceAllUsesWith(          BuildVector->getOperand(BuildVector->getNumOperands() - 1));      return;    }    // Look through ExtractPenultimateElement (BuildVector ....). -  if (match(&R, m_VPInstruction<VPInstruction::ExtractPenultimateElement>( -                    m_BuildVector()))) { -    auto *BuildVector = cast<VPInstruction>(R.getOperand(0)); +  if (match(Def, m_VPInstruction<VPInstruction::ExtractPenultimateElement>( +                     m_BuildVector()))) { +    auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));      Def->replaceAllUsesWith(          BuildVector->getOperand(BuildVector->getNumOperands() - 2));      return;    }    uint64_t Idx; -  if (match(&R, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) { -    auto *BuildVector = cast<VPInstruction>(R.getOperand(0)); +  if (match(Def, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) { +    auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));      Def->replaceAllUsesWith(BuildVector->getOperand(Idx));      return;    } -  if (match(Def, m_BuildVector()) && all_equal(R.operands())) { +  if (match(Def, m_BuildVector()) && all_equal(Def->operands())) {      Def->replaceAllUsesWith(          Builder.createNaryOp(VPInstruction::Broadcast, Def->getOperand(0)));      return; @@ -1303,7 +1306,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {        isa<VPPhi>(X)) {      auto *Phi = cast<VPPhi>(X);      if (Phi->getOperand(1) != Def && match(Phi->getOperand(0), m_ZeroInt()) && -        Phi->getNumUsers() == 1 && (*Phi->user_begin() == &R)) { +        Phi->getNumUsers() == 1 && (*Phi->user_begin() == Def)) {        Phi->setOperand(0, Y);        Def->replaceAllUsesWith(Phi);        return; @@ -1311,7 +1314,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {    }    // VPVectorPointer for part 0 can be replaced by their start pointer. -  if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(&R)) { +  if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(Def)) {      if (VecPtr->isFirstPart()) {        VecPtr->replaceAllUsesWith(VecPtr->getOperand(0));        return; @@ -1366,9 +1369,9 @@ void VPlanTransforms::simplifyRecipes(VPlan &Plan) {        Plan.getEntry());    VPTypeAnalysis TypeInfo(Plan);    for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(RPOT)) { -    for (VPRecipeBase &R : make_early_inc_range(*VPBB)) { -      simplifyRecipe(R, TypeInfo); -    } +    for (VPRecipeBase &R : make_early_inc_range(*VPBB)) +      if (auto *Def = dyn_cast<VPSingleDefRecipe>(&R)) +        simplifyRecipe(Def, TypeInfo);    }  } @@ -2521,90 +2524,102 @@ void VPlanTransforms::addActiveLaneMask(    HeaderMask->eraseFromParent();  } +template <typename Op0_t, typename Op1_t> struct RemoveMask_match { +  Op0_t In; +  Op1_t &Out; + +  RemoveMask_match(const Op0_t &In, Op1_t &Out) : In(In), Out(Out) {} + +  template <typename OpTy> bool match(OpTy *V) const { +    if (m_Specific(In).match(V)) { +      Out = nullptr; +      return true; +    } +    if (m_LogicalAnd(m_Specific(In), m_VPValue(Out)).match(V)) +      return true; +    return false; +  } +}; + +/// Match a specific mask \p In, or a combination of it (logical-and In, Out). +/// Returns the remaining part \p Out if so, or nullptr otherwise. +template <typename Op0_t, typename Op1_t> +static inline RemoveMask_match<Op0_t, Op1_t> m_RemoveMask(const Op0_t &In, +                                                          Op1_t &Out) { +  return RemoveMask_match<Op0_t, Op1_t>(In, Out); +} +  /// Try to optimize a \p CurRecipe masked by \p HeaderMask to a corresponding  /// EVL-based recipe without the header mask. Returns nullptr if no EVL-based  /// recipe could be created.  /// \p HeaderMask  Header Mask.  /// \p CurRecipe   Recipe to be transform.  /// \p TypeInfo    VPlan-based type analysis. -/// \p AllOneMask  The vector mask parameter of vector-predication intrinsics.  /// \p EVL         The explicit vector length parameter of vector-predication  /// intrinsics.  static VPRecipeBase *optimizeMaskToEVL(VPValue *HeaderMask,                                         VPRecipeBase &CurRecipe, -                                       VPTypeAnalysis &TypeInfo, -                                       VPValue &AllOneMask, VPValue &EVL) { -  // FIXME: Don't transform recipes to EVL recipes if they're not masked by the -  // header mask. -  auto GetNewMask = [&](VPValue *OrigMask) -> VPValue * { -    assert(OrigMask && "Unmasked recipe when folding tail"); -    // HeaderMask will be handled using EVL. -    VPValue *Mask; -    if (match(OrigMask, m_LogicalAnd(m_Specific(HeaderMask), m_VPValue(Mask)))) -      return Mask; -    return HeaderMask == OrigMask ? nullptr : OrigMask; -  }; +                                       VPTypeAnalysis &TypeInfo, VPValue &EVL) { +  VPlan *Plan = CurRecipe.getParent()->getPlan(); +  VPValue *Addr, *Mask, *EndPtr;    /// Adjust any end pointers so that they point to the end of EVL lanes not VF. -  auto GetNewAddr = [&CurRecipe, &EVL](VPValue *Addr) -> VPValue * { -    auto *EndPtr = dyn_cast<VPVectorEndPointerRecipe>(Addr); -    if (!EndPtr) -      return Addr; -    assert(EndPtr->getOperand(1) == &EndPtr->getParent()->getPlan()->getVF() && -           "VPVectorEndPointerRecipe with non-VF VF operand?"); -    assert( -        all_of(EndPtr->users(), -               [](VPUser *U) { -                 return cast<VPWidenMemoryRecipe>(U)->isReverse(); -               }) && -        "VPVectorEndPointRecipe not used by reversed widened memory recipe?"); -    VPVectorEndPointerRecipe *EVLAddr = EndPtr->clone(); -    EVLAddr->insertBefore(&CurRecipe); -    EVLAddr->setOperand(1, &EVL); -    return EVLAddr; +  auto AdjustEndPtr = [&CurRecipe, &EVL](VPValue *EndPtr) { +    auto *EVLEndPtr = cast<VPVectorEndPointerRecipe>(EndPtr)->clone(); +    EVLEndPtr->insertBefore(&CurRecipe); +    EVLEndPtr->setOperand(1, &EVL); +    return EVLEndPtr;    }; -  return TypeSwitch<VPRecipeBase *, VPRecipeBase *>(&CurRecipe) -      .Case<VPWidenLoadRecipe>([&](VPWidenLoadRecipe *L) { -        VPValue *NewMask = GetNewMask(L->getMask()); -        VPValue *NewAddr = GetNewAddr(L->getAddr()); -        return new VPWidenLoadEVLRecipe(*L, NewAddr, EVL, NewMask); -      }) -      .Case<VPWidenStoreRecipe>([&](VPWidenStoreRecipe *S) { -        VPValue *NewMask = GetNewMask(S->getMask()); -        VPValue *NewAddr = GetNewAddr(S->getAddr()); -        return new VPWidenStoreEVLRecipe(*S, NewAddr, EVL, NewMask); -      }) -      .Case<VPInterleaveRecipe>([&](VPInterleaveRecipe *IR) { -        VPValue *NewMask = GetNewMask(IR->getMask()); -        return new VPInterleaveEVLRecipe(*IR, EVL, NewMask); -      }) -      .Case<VPReductionRecipe>([&](VPReductionRecipe *Red) { -        VPValue *NewMask = GetNewMask(Red->getCondOp()); -        return new VPReductionEVLRecipe(*Red, EVL, NewMask); -      }) -      .Case<VPInstruction>([&](VPInstruction *VPI) -> VPRecipeBase * { -        VPValue *LHS, *RHS; -        // Transform select with a header mask condition -        //   select(header_mask, LHS, RHS) -        // into vector predication merge. -        //   vp.merge(all-true, LHS, RHS, EVL) -        if (!match(VPI, m_Select(m_Specific(HeaderMask), m_VPValue(LHS), -                                 m_VPValue(RHS)))) -          return nullptr; -        // Use all true as the condition because this transformation is -        // limited to selects whose condition is a header mask. -        return new VPWidenIntrinsicRecipe( -            Intrinsic::vp_merge, {&AllOneMask, LHS, RHS, &EVL}, -            TypeInfo.inferScalarType(LHS), VPI->getDebugLoc()); -      }) -      .Default([&](VPRecipeBase *R) { return nullptr; }); +  if (match(&CurRecipe, +            m_MaskedLoad(m_VPValue(Addr), m_RemoveMask(HeaderMask, Mask))) && +      !cast<VPWidenLoadRecipe>(CurRecipe).isReverse()) +    return new VPWidenLoadEVLRecipe(cast<VPWidenLoadRecipe>(CurRecipe), Addr, +                                    EVL, Mask); + +  if (match(&CurRecipe, +            m_MaskedLoad(m_VPValue(EndPtr), m_RemoveMask(HeaderMask, Mask))) && +      match(EndPtr, m_VecEndPtr(m_VPValue(Addr), m_Specific(&Plan->getVF()))) && +      cast<VPWidenLoadRecipe>(CurRecipe).isReverse()) +    return new VPWidenLoadEVLRecipe(cast<VPWidenLoadRecipe>(CurRecipe), +                                    AdjustEndPtr(EndPtr), EVL, Mask); + +  if (match(&CurRecipe, m_MaskedStore(m_VPValue(Addr), m_VPValue(), +                                      m_RemoveMask(HeaderMask, Mask))) && +      !cast<VPWidenStoreRecipe>(CurRecipe).isReverse()) +    return new VPWidenStoreEVLRecipe(cast<VPWidenStoreRecipe>(CurRecipe), Addr, +                                     EVL, Mask); + +  if (match(&CurRecipe, m_MaskedStore(m_VPValue(EndPtr), m_VPValue(), +                                      m_RemoveMask(HeaderMask, Mask))) && +      match(EndPtr, m_VecEndPtr(m_VPValue(Addr), m_Specific(&Plan->getVF()))) && +      cast<VPWidenStoreRecipe>(CurRecipe).isReverse()) +    return new VPWidenStoreEVLRecipe(cast<VPWidenStoreRecipe>(CurRecipe), +                                     AdjustEndPtr(EndPtr), EVL, Mask); + +  if (auto *Rdx = dyn_cast<VPReductionRecipe>(&CurRecipe)) +    if (Rdx->isConditional() && +        match(Rdx->getCondOp(), m_RemoveMask(HeaderMask, Mask))) +      return new VPReductionEVLRecipe(*Rdx, EVL, Mask); + +  if (auto *Interleave = dyn_cast<VPInterleaveRecipe>(&CurRecipe)) +    if (Interleave->getMask() && +        match(Interleave->getMask(), m_RemoveMask(HeaderMask, Mask))) +      return new VPInterleaveEVLRecipe(*Interleave, EVL, Mask); + +  VPValue *LHS, *RHS; +  if (match(&CurRecipe, +            m_Select(m_Specific(HeaderMask), m_VPValue(LHS), m_VPValue(RHS)))) +    return new VPWidenIntrinsicRecipe( +        Intrinsic::vp_merge, {Plan->getTrue(), LHS, RHS, &EVL}, +        TypeInfo.inferScalarType(LHS), CurRecipe.getDebugLoc()); + +  return nullptr;  }  /// Replace recipes with their EVL variants.  static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {    VPTypeAnalysis TypeInfo(Plan); -  VPValue *AllOneMask = Plan.getTrue();    VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();    VPBasicBlock *Header = LoopRegion->getEntryBasicBlock(); @@ -2664,7 +2679,7 @@ static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {              ConstantInt::getSigned(Type::getInt32Ty(Plan.getContext()), -1));          VPWidenIntrinsicRecipe *VPSplice = new VPWidenIntrinsicRecipe(              Intrinsic::experimental_vp_splice, -            {V1, V2, Imm, AllOneMask, PrevEVL, &EVL}, +            {V1, V2, Imm, Plan.getTrue(), PrevEVL, &EVL},              TypeInfo.inferScalarType(R.getVPSingleValue()), R.getDebugLoc());          VPSplice->insertBefore(&R);          R.getVPSingleValue()->replaceAllUsesWith(VPSplice); @@ -2698,7 +2713,7 @@ static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {    for (VPUser *U : collectUsersRecursively(EVLMask)) {      auto *CurRecipe = cast<VPRecipeBase>(U);      VPRecipeBase *EVLRecipe = -        optimizeMaskToEVL(EVLMask, *CurRecipe, TypeInfo, *AllOneMask, EVL); +        optimizeMaskToEVL(EVLMask, *CurRecipe, TypeInfo, EVL);      if (!EVLRecipe)        continue; diff --git a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp index 8c23e78..c6380d3 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanUtils.cpp @@ -32,22 +32,17 @@ bool vputils::onlyScalarValuesUsed(const VPValue *Def) {  }  VPValue *vputils::getOrCreateVPValueForSCEVExpr(VPlan &Plan, const SCEV *Expr) { -  VPValue *Expanded = nullptr;    if (auto *E = dyn_cast<SCEVConstant>(Expr)) -    Expanded = Plan.getOrAddLiveIn(E->getValue()); -  else { -    auto *U = dyn_cast<SCEVUnknown>(Expr); -    // Skip SCEV expansion if Expr is a SCEVUnknown wrapping a non-instruction -    // value. Otherwise the value may be defined in a loop and using it directly -    // will break LCSSA form. The SCEV expansion takes care of preserving LCSSA -    // form. -    if (U && !isa<Instruction>(U->getValue())) { -      Expanded = Plan.getOrAddLiveIn(U->getValue()); -    } else { -      Expanded = new VPExpandSCEVRecipe(Expr); -      Plan.getEntry()->appendRecipe(Expanded->getDefiningRecipe()); -    } -  } +    return Plan.getOrAddLiveIn(E->getValue()); +  // Skip SCEV expansion if Expr is a SCEVUnknown wrapping a non-instruction +  // value. Otherwise the value may be defined in a loop and using it directly +  // will break LCSSA form. The SCEV expansion takes care of preserving LCSSA +  // form. +  auto *U = dyn_cast<SCEVUnknown>(Expr); +  if (U && !isa<Instruction>(U->getValue())) +    return Plan.getOrAddLiveIn(U->getValue()); +  auto *Expanded = new VPExpandSCEVRecipe(Expr); +  Plan.getEntry()->appendRecipe(Expanded);    return Expanded;  } diff --git a/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll b/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll index fa53a18..1920fc9 100644 --- a/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll +++ b/llvm/test/Analysis/CostModel/AArch64/masked_ldst_vls.ll @@ -1,17 +1,6 @@  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=256 | FileCheck %s -D#VBITS=256 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=384 | FileCheck %s -D#VBITS=256  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=512 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=640 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=768 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=896 | FileCheck %s -D#VBITS=512  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1024 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1152 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1280 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1408 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1536 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1664 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1792 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1920 | FileCheck %s -D#VBITS=1024  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=2048 | FileCheck %s -D#VBITS=2048  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" diff --git a/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll b/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll index df40a96..e128987 100644 --- a/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll +++ b/llvm/test/Analysis/CostModel/AArch64/sve-fixed-length.ll @@ -1,19 +1,8 @@  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output | FileCheck %s -D#VBITS=128  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=128 | FileCheck %s -D#VBITS=128  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=256 | FileCheck %s -D#VBITS=256 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=384 | FileCheck %s -D#VBITS=256  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=512 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=640 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=768 | FileCheck %s -D#VBITS=512 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=896 | FileCheck %s -D#VBITS=512  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1024 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1152 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1280 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1408 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1536 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1664 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1792 | FileCheck %s -D#VBITS=1024 -; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=1920 | FileCheck %s -D#VBITS=1024  ; RUN: opt < %s -passes="print<cost-model>" 2>&1 -disable-output -aarch64-sve-vector-bits-min=2048 | FileCheck %s -D#VBITS=2048  ; VBITS represents the useful bit size of a vector register from the code diff --git a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll index b54f262..4894932 100644 --- a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll +++ b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll @@ -755,199 +755,117 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none  ; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1  ; CHECK-SD-NEXT:    cbz w2, .LBB6_3  ; CHECK-SD-NEXT:  // %bb.1: // %iter.check -; CHECK-SD-NEXT:    str x25, [sp, #-64]! // 8-byte Folded Spill -; CHECK-SD-NEXT:    stp x24, x23, [sp, #16] // 16-byte Folded Spill -; CHECK-SD-NEXT:    stp x22, x21, [sp, #32] // 16-byte Folded Spill -; CHECK-SD-NEXT:    stp x20, x19, [sp, #48] // 16-byte Folded Spill -; CHECK-SD-NEXT:    .cfi_def_cfa_offset 64 -; CHECK-SD-NEXT:    .cfi_offset w19, -8 -; CHECK-SD-NEXT:    .cfi_offset w20, -16 -; CHECK-SD-NEXT:    .cfi_offset w21, -24 -; CHECK-SD-NEXT:    .cfi_offset w22, -32 -; CHECK-SD-NEXT:    .cfi_offset w23, -40 -; CHECK-SD-NEXT:    .cfi_offset w24, -48 -; CHECK-SD-NEXT:    .cfi_offset w25, -64 -; CHECK-SD-NEXT:    sxtb x9, w1  ; CHECK-SD-NEXT:    cmp w2, #3 -; CHECK-SD-NEXT:    mov w10, w2 +; CHECK-SD-NEXT:    mov w9, w2  ; CHECK-SD-NEXT:    b.hi .LBB6_4  ; CHECK-SD-NEXT:  // %bb.2: -; CHECK-SD-NEXT:    mov x11, xzr +; CHECK-SD-NEXT:    mov x10, xzr  ; CHECK-SD-NEXT:    mov x8, xzr  ; CHECK-SD-NEXT:    b .LBB6_13  ; CHECK-SD-NEXT:  .LBB6_3: -; CHECK-SD-NEXT:    mov x0, xzr +; CHECK-SD-NEXT:    mov x8, xzr +; CHECK-SD-NEXT:    mov x0, x8  ; CHECK-SD-NEXT:    ret  ; CHECK-SD-NEXT:  .LBB6_4: // %vector.main.loop.iter.check -; CHECK-SD-NEXT:    dup v0.2d, x9  ; CHECK-SD-NEXT:    cmp w2, #16  ; CHECK-SD-NEXT:    b.hs .LBB6_6  ; CHECK-SD-NEXT:  // %bb.5: -; CHECK-SD-NEXT:    mov x11, xzr +; CHECK-SD-NEXT:    mov x10, xzr  ; CHECK-SD-NEXT:    mov x8, xzr  ; CHECK-SD-NEXT:    b .LBB6_10  ; CHECK-SD-NEXT:  .LBB6_6: // %vector.ph +; CHECK-SD-NEXT:    mov w8, w1 +; CHECK-SD-NEXT:    movi v0.2d, #0000000000000000  ; CHECK-SD-NEXT:    movi v1.2d, #0000000000000000 -; CHECK-SD-NEXT:    mov x8, v0.d[1] -; CHECK-SD-NEXT:    and x12, x10, #0xc +; CHECK-SD-NEXT:    sxtb x8, w8 +; CHECK-SD-NEXT:    movi v3.2d, #0000000000000000  ; CHECK-SD-NEXT:    movi v2.2d, #0000000000000000 +; CHECK-SD-NEXT:    movi v6.2d, #0000000000000000  ; CHECK-SD-NEXT:    movi v4.2d, #0000000000000000 -; CHECK-SD-NEXT:    and x11, x10, #0xfffffff0 -; CHECK-SD-NEXT:    movi v3.2d, #0000000000000000 +; CHECK-SD-NEXT:    and x11, x9, #0xc  ; CHECK-SD-NEXT:    movi v7.2d, #0000000000000000 -; CHECK-SD-NEXT:    mov x15, x0  ; CHECK-SD-NEXT:    movi v5.2d, #0000000000000000 -; CHECK-SD-NEXT:    movi v16.2d, #0000000000000000 -; CHECK-SD-NEXT:    and x16, x10, #0xfffffff0 -; CHECK-SD-NEXT:    movi v6.2d, #0000000000000000 -; CHECK-SD-NEXT:    fmov x13, d0 -; CHECK-SD-NEXT:    fmov x14, d0 +; CHECK-SD-NEXT:    and x10, x9, #0xfffffff0 +; CHECK-SD-NEXT:    dup v16.4s, w8 +; CHECK-SD-NEXT:    mov x8, x0 +; CHECK-SD-NEXT:    and x12, x9, #0xfffffff0  ; CHECK-SD-NEXT:  .LBB6_7: // %vector.body  ; CHECK-SD-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-SD-NEXT:    ldr q17, [x15], #16 -; CHECK-SD-NEXT:    subs x16, x16, #16 +; CHECK-SD-NEXT:    ldr q17, [x8], #16 +; CHECK-SD-NEXT:    subs x12, x12, #16  ; CHECK-SD-NEXT:    ushll v18.8h, v17.8b, #0 -; CHECK-SD-NEXT:    ushll2 v19.8h, v17.16b, #0 -; CHECK-SD-NEXT:    ushll v17.4s, v18.4h, #0 -; CHECK-SD-NEXT:    ushll2 v20.4s, v19.8h, #0 -; CHECK-SD-NEXT:    ushll2 v18.4s, v18.8h, #0 -; CHECK-SD-NEXT:    ushll v19.4s, v19.4h, #0 -; CHECK-SD-NEXT:    ushll v21.2d, v17.2s, #0 -; CHECK-SD-NEXT:    ushll2 v22.2d, v20.4s, #0 -; CHECK-SD-NEXT:    ushll2 v17.2d, v17.4s, #0 -; CHECK-SD-NEXT:    ushll v23.2d, v18.2s, #0 -; CHECK-SD-NEXT:    ushll v20.2d, v20.2s, #0 -; CHECK-SD-NEXT:    ushll2 v18.2d, v18.4s, #0 -; CHECK-SD-NEXT:    fmov x17, d21 -; CHECK-SD-NEXT:    mov x2, v21.d[1] -; CHECK-SD-NEXT:    ushll v21.2d, v19.2s, #0 -; CHECK-SD-NEXT:    ushll2 v19.2d, v19.4s, #0 -; CHECK-SD-NEXT:    fmov x18, d22 -; CHECK-SD-NEXT:    fmov x1, d17 -; CHECK-SD-NEXT:    fmov x3, d23 -; CHECK-SD-NEXT:    fmov x21, d20 -; CHECK-SD-NEXT:    fmov x22, d18 -; CHECK-SD-NEXT:    fmov x19, d21 -; CHECK-SD-NEXT:    mul x17, x13, x17 -; CHECK-SD-NEXT:    mov x4, v22.d[1] -; CHECK-SD-NEXT:    fmov x24, d19 -; CHECK-SD-NEXT:    mov x5, v23.d[1] -; CHECK-SD-NEXT:    mov x6, v21.d[1] -; CHECK-SD-NEXT:    mov x7, v20.d[1] -; CHECK-SD-NEXT:    mov x20, v18.d[1] -; CHECK-SD-NEXT:    mov x23, v19.d[1] -; CHECK-SD-NEXT:    mov x25, v17.d[1] -; CHECK-SD-NEXT:    mul x18, x14, x18 -; CHECK-SD-NEXT:    mul x1, x13, x1 -; CHECK-SD-NEXT:    fmov d17, x17 -; CHECK-SD-NEXT:    mul x3, x13, x3 -; CHECK-SD-NEXT:    fmov d18, x18 -; CHECK-SD-NEXT:    mul x19, x13, x19 -; CHECK-SD-NEXT:    fmov d19, x1 -; CHECK-SD-NEXT:    mul x21, x13, x21 -; CHECK-SD-NEXT:    fmov d20, x3 -; CHECK-SD-NEXT:    mul x22, x13, x22 -; CHECK-SD-NEXT:    fmov d21, x19 -; CHECK-SD-NEXT:    mul x24, x13, x24 -; CHECK-SD-NEXT:    fmov d24, x21 -; CHECK-SD-NEXT:    mul x2, x8, x2 -; CHECK-SD-NEXT:    fmov d22, x22 -; CHECK-SD-NEXT:    mul x4, x8, x4 -; CHECK-SD-NEXT:    fmov d23, x24 -; CHECK-SD-NEXT:    mul x5, x8, x5 -; CHECK-SD-NEXT:    mov v17.d[1], x2 -; CHECK-SD-NEXT:    mul x6, x8, x6 -; CHECK-SD-NEXT:    mov v18.d[1], x4 -; CHECK-SD-NEXT:    mul x7, x8, x7 -; CHECK-SD-NEXT:    mov v20.d[1], x5 -; CHECK-SD-NEXT:    add v1.2d, v17.2d, v1.2d -; CHECK-SD-NEXT:    mul x20, x8, x20 -; CHECK-SD-NEXT:    mov v21.d[1], x6 -; CHECK-SD-NEXT:    add v6.2d, v18.2d, v6.2d -; CHECK-SD-NEXT:    mul x23, x8, x23 -; CHECK-SD-NEXT:    mov v24.d[1], x7 -; CHECK-SD-NEXT:    add v4.2d, v20.2d, v4.2d -; CHECK-SD-NEXT:    mul x17, x8, x25 -; CHECK-SD-NEXT:    mov v22.d[1], x20 -; CHECK-SD-NEXT:    add v7.2d, v21.2d, v7.2d -; CHECK-SD-NEXT:    mov v23.d[1], x23 -; CHECK-SD-NEXT:    add v16.2d, v24.2d, v16.2d -; CHECK-SD-NEXT:    mov v19.d[1], x17 -; CHECK-SD-NEXT:    add v3.2d, v22.2d, v3.2d -; CHECK-SD-NEXT:    add v5.2d, v23.2d, v5.2d -; CHECK-SD-NEXT:    add v2.2d, v19.2d, v2.2d +; CHECK-SD-NEXT:    ushll2 v17.8h, v17.16b, #0 +; CHECK-SD-NEXT:    ushll2 v19.4s, v18.8h, #0 +; CHECK-SD-NEXT:    ushll v20.4s, v17.4h, #0 +; CHECK-SD-NEXT:    ushll v18.4s, v18.4h, #0 +; CHECK-SD-NEXT:    ushll2 v17.4s, v17.8h, #0 +; CHECK-SD-NEXT:    smlal2 v2.2d, v16.4s, v19.4s +; CHECK-SD-NEXT:    smlal2 v4.2d, v16.4s, v20.4s +; CHECK-SD-NEXT:    smlal v6.2d, v16.2s, v20.2s +; CHECK-SD-NEXT:    smlal v3.2d, v16.2s, v19.2s +; CHECK-SD-NEXT:    smlal2 v1.2d, v16.4s, v18.4s +; CHECK-SD-NEXT:    smlal v7.2d, v16.2s, v17.2s +; CHECK-SD-NEXT:    smlal v0.2d, v16.2s, v18.2s +; CHECK-SD-NEXT:    smlal2 v5.2d, v16.4s, v17.4s  ; CHECK-SD-NEXT:    b.ne .LBB6_7  ; CHECK-SD-NEXT:  // %bb.8: // %middle.block -; CHECK-SD-NEXT:    add v1.2d, v1.2d, v7.2d -; CHECK-SD-NEXT:    add v4.2d, v4.2d, v16.2d -; CHECK-SD-NEXT:    cmp x11, x10 -; CHECK-SD-NEXT:    add v2.2d, v2.2d, v5.2d -; CHECK-SD-NEXT:    add v3.2d, v3.2d, v6.2d +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v6.2d +; CHECK-SD-NEXT:    add v3.2d, v3.2d, v7.2d +; CHECK-SD-NEXT:    cmp x10, x9  ; CHECK-SD-NEXT:    add v1.2d, v1.2d, v4.2d -; CHECK-SD-NEXT:    add v2.2d, v2.2d, v3.2d +; CHECK-SD-NEXT:    add v2.2d, v2.2d, v5.2d +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v3.2d  ; CHECK-SD-NEXT:    add v1.2d, v1.2d, v2.2d -; CHECK-SD-NEXT:    addp d1, v1.2d -; CHECK-SD-NEXT:    fmov x8, d1 +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-SD-NEXT:    addp d0, v0.2d +; CHECK-SD-NEXT:    fmov x8, d0  ; CHECK-SD-NEXT:    b.eq .LBB6_15  ; CHECK-SD-NEXT:  // %bb.9: // %vec.epilog.iter.check -; CHECK-SD-NEXT:    cbz x12, .LBB6_13 +; CHECK-SD-NEXT:    cbz x11, .LBB6_13  ; CHECK-SD-NEXT:  .LBB6_10: // %vec.epilog.ph +; CHECK-SD-NEXT:    movi v0.2d, #0000000000000000 +; CHECK-SD-NEXT:    mov w11, w1  ; CHECK-SD-NEXT:    movi v1.2d, #0000000000000000 -; CHECK-SD-NEXT:    movi v2.2d, #0000000000000000 -; CHECK-SD-NEXT:    mov x13, x11 +; CHECK-SD-NEXT:    sxtb x11, w11  ; CHECK-SD-NEXT:    movi v3.2d, #0x000000000000ff -; CHECK-SD-NEXT:    fmov x14, d0 -; CHECK-SD-NEXT:    and x11, x10, #0xfffffffc -; CHECK-SD-NEXT:    fmov x15, d0 -; CHECK-SD-NEXT:    sub x12, x13, x11 -; CHECK-SD-NEXT:    add x13, x0, x13 -; CHECK-SD-NEXT:    mov v1.d[0], x8 -; CHECK-SD-NEXT:    mov x8, v0.d[1] +; CHECK-SD-NEXT:    dup v2.2s, w11 +; CHECK-SD-NEXT:    mov x11, x10 +; CHECK-SD-NEXT:    and x10, x9, #0xfffffffc +; CHECK-SD-NEXT:    mov v0.d[0], x8 +; CHECK-SD-NEXT:    sub x8, x11, x10 +; CHECK-SD-NEXT:    add x11, x0, x11  ; CHECK-SD-NEXT:  .LBB6_11: // %vec.epilog.vector.body  ; CHECK-SD-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-SD-NEXT:    ldr s0, [x13], #4 -; CHECK-SD-NEXT:    adds x12, x12, #4 -; CHECK-SD-NEXT:    ushll v0.8h, v0.8b, #0 -; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0 -; CHECK-SD-NEXT:    ushll v4.2d, v0.2s, #0 -; CHECK-SD-NEXT:    ushll2 v0.2d, v0.4s, #0 +; CHECK-SD-NEXT:    ldr s4, [x11], #4 +; CHECK-SD-NEXT:    adds x8, x8, #4 +; CHECK-SD-NEXT:    ushll v4.8h, v4.8b, #0 +; CHECK-SD-NEXT:    ushll v4.4s, v4.4h, #0 +; CHECK-SD-NEXT:    ushll v5.2d, v4.2s, #0 +; CHECK-SD-NEXT:    ushll2 v4.2d, v4.4s, #0 +; CHECK-SD-NEXT:    and v5.16b, v5.16b, v3.16b  ; CHECK-SD-NEXT:    and v4.16b, v4.16b, v3.16b -; CHECK-SD-NEXT:    and v0.16b, v0.16b, v3.16b -; CHECK-SD-NEXT:    fmov x16, d4 -; CHECK-SD-NEXT:    fmov x18, d0 -; CHECK-SD-NEXT:    mov x17, v4.d[1] -; CHECK-SD-NEXT:    mov x1, v0.d[1] -; CHECK-SD-NEXT:    mul x16, x14, x16 -; CHECK-SD-NEXT:    mul x18, x15, x18 -; CHECK-SD-NEXT:    mul x17, x8, x17 -; CHECK-SD-NEXT:    fmov d0, x16 -; CHECK-SD-NEXT:    mul x1, x8, x1 -; CHECK-SD-NEXT:    fmov d4, x18 -; CHECK-SD-NEXT:    mov v0.d[1], x17 -; CHECK-SD-NEXT:    mov v4.d[1], x1 -; CHECK-SD-NEXT:    add v1.2d, v0.2d, v1.2d -; CHECK-SD-NEXT:    add v2.2d, v4.2d, v2.2d +; CHECK-SD-NEXT:    xtn v5.2s, v5.2d +; CHECK-SD-NEXT:    xtn v4.2s, v4.2d +; CHECK-SD-NEXT:    smlal v1.2d, v2.2s, v4.2s +; CHECK-SD-NEXT:    smlal v0.2d, v2.2s, v5.2s  ; CHECK-SD-NEXT:    b.ne .LBB6_11  ; CHECK-SD-NEXT:  // %bb.12: // %vec.epilog.middle.block -; CHECK-SD-NEXT:    add v0.2d, v1.2d, v2.2d -; CHECK-SD-NEXT:    cmp x11, x10 +; CHECK-SD-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-SD-NEXT:    cmp x10, x9  ; CHECK-SD-NEXT:    addp d0, v0.2d  ; CHECK-SD-NEXT:    fmov x8, d0  ; CHECK-SD-NEXT:    b.eq .LBB6_15  ; CHECK-SD-NEXT:  .LBB6_13: // %for.body.preheader -; CHECK-SD-NEXT:    sub x10, x10, x11 -; CHECK-SD-NEXT:    add x11, x0, x11 +; CHECK-SD-NEXT:    sxtb x11, w1 +; CHECK-SD-NEXT:    sub x9, x9, x10 +; CHECK-SD-NEXT:    add x10, x0, x10  ; CHECK-SD-NEXT:  .LBB6_14: // %for.body  ; CHECK-SD-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-SD-NEXT:    ldrb w12, [x11], #1 -; CHECK-SD-NEXT:    subs x10, x10, #1 -; CHECK-SD-NEXT:    smaddl x8, w12, w9, x8 +; CHECK-SD-NEXT:    ldrb w12, [x10], #1 +; CHECK-SD-NEXT:    subs x9, x9, #1 +; CHECK-SD-NEXT:    smaddl x8, w12, w11, x8  ; CHECK-SD-NEXT:    b.ne .LBB6_14 -; CHECK-SD-NEXT:  .LBB6_15: -; CHECK-SD-NEXT:    ldp x20, x19, [sp, #48] // 16-byte Folded Reload -; CHECK-SD-NEXT:    ldp x22, x21, [sp, #32] // 16-byte Folded Reload -; CHECK-SD-NEXT:    ldp x24, x23, [sp, #16] // 16-byte Folded Reload -; CHECK-SD-NEXT:    ldr x25, [sp], #64 // 8-byte Folded Reload +; CHECK-SD-NEXT:  .LBB6_15: // %for.cond.cleanup  ; CHECK-SD-NEXT:    mov x0, x8  ; CHECK-SD-NEXT:    ret  ; @@ -957,63 +875,64 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none  ; CHECK-GI-NEXT:    cbz w2, .LBB6_7  ; CHECK-GI-NEXT:  // %bb.1: // %iter.check  ; CHECK-GI-NEXT:    movi d0, #0000000000000000 -; CHECK-GI-NEXT:    sxtb x9, w1 -; CHECK-GI-NEXT:    mov x11, xzr +; CHECK-GI-NEXT:    mov x10, xzr  ; CHECK-GI-NEXT:    cmp w2, #4 -; CHECK-GI-NEXT:    mov w10, w2 +; CHECK-GI-NEXT:    mov w9, w2  ; CHECK-GI-NEXT:    b.lo .LBB6_12  ; CHECK-GI-NEXT:  // %bb.2: // %vector.main.loop.iter.check  ; CHECK-GI-NEXT:    movi d0, #0000000000000000 -; CHECK-GI-NEXT:    dup v1.2d, x9 -; CHECK-GI-NEXT:    mov x11, xzr +; CHECK-GI-NEXT:    mov x10, xzr  ; CHECK-GI-NEXT:    cmp w2, #16  ; CHECK-GI-NEXT:    b.lo .LBB6_9  ; CHECK-GI-NEXT:  // %bb.3: // %vector.ph +; CHECK-GI-NEXT:    mov w8, w1  ; CHECK-GI-NEXT:    movi v0.2d, #0000000000000000 -; CHECK-GI-NEXT:    xtn v2.2s, v1.2d -; CHECK-GI-NEXT:    and x8, x10, #0xc +; CHECK-GI-NEXT:    movi v1.2d, #0000000000000000 +; CHECK-GI-NEXT:    sxtb x8, w8 +; CHECK-GI-NEXT:    movi v2.2d, #0000000000000000  ; CHECK-GI-NEXT:    movi v3.2d, #0000000000000000  ; CHECK-GI-NEXT:    movi v4.2d, #0000000000000000 -; CHECK-GI-NEXT:    and x11, x10, #0xfffffff0 -; CHECK-GI-NEXT:    movi v5.2d, #0000000000000000  ; CHECK-GI-NEXT:    movi v6.2d, #0000000000000000 -; CHECK-GI-NEXT:    mov x12, x0 +; CHECK-GI-NEXT:    and x10, x9, #0xfffffff0 +; CHECK-GI-NEXT:    dup v5.2d, x8  ; CHECK-GI-NEXT:    movi v7.2d, #0000000000000000 -; CHECK-GI-NEXT:    movi v16.2d, #0000000000000000 -; CHECK-GI-NEXT:    and x13, x10, #0xfffffff0 -; CHECK-GI-NEXT:    movi v17.2d, #0000000000000000 +; CHECK-GI-NEXT:    and x8, x9, #0xc +; CHECK-GI-NEXT:    mov x11, x0 +; CHECK-GI-NEXT:    and x12, x9, #0xfffffff0 +; CHECK-GI-NEXT:    xtn v16.2s, v5.2d +; CHECK-GI-NEXT:    movi v5.2d, #0000000000000000  ; CHECK-GI-NEXT:  .LBB6_4: // %vector.body  ; CHECK-GI-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-GI-NEXT:    ldr q18, [x12], #16 -; CHECK-GI-NEXT:    subs x13, x13, #16 -; CHECK-GI-NEXT:    ushll v19.8h, v18.8b, #0 -; CHECK-GI-NEXT:    ushll2 v18.8h, v18.16b, #0 -; CHECK-GI-NEXT:    ushll v20.4s, v19.4h, #0 -; CHECK-GI-NEXT:    ushll2 v19.4s, v19.8h, #0 -; CHECK-GI-NEXT:    ushll v21.4s, v18.4h, #0 +; CHECK-GI-NEXT:    ldr q17, [x11], #16 +; CHECK-GI-NEXT:    subs x12, x12, #16 +; CHECK-GI-NEXT:    ushll v18.8h, v17.8b, #0 +; CHECK-GI-NEXT:    ushll2 v17.8h, v17.16b, #0 +; CHECK-GI-NEXT:    ushll v19.4s, v18.4h, #0  ; CHECK-GI-NEXT:    ushll2 v18.4s, v18.8h, #0 -; CHECK-GI-NEXT:    mov d22, v20.d[1] -; CHECK-GI-NEXT:    mov d23, v19.d[1] -; CHECK-GI-NEXT:    mov d24, v21.d[1] -; CHECK-GI-NEXT:    mov d25, v18.d[1] -; CHECK-GI-NEXT:    smlal v0.2d, v2.2s, v20.2s -; CHECK-GI-NEXT:    smlal v4.2d, v2.2s, v19.2s -; CHECK-GI-NEXT:    smlal v6.2d, v2.2s, v21.2s -; CHECK-GI-NEXT:    smlal v16.2d, v2.2s, v18.2s -; CHECK-GI-NEXT:    smlal v3.2d, v2.2s, v22.2s -; CHECK-GI-NEXT:    smlal v5.2d, v2.2s, v23.2s -; CHECK-GI-NEXT:    smlal v7.2d, v2.2s, v24.2s -; CHECK-GI-NEXT:    smlal v17.2d, v2.2s, v25.2s +; CHECK-GI-NEXT:    ushll v20.4s, v17.4h, #0 +; CHECK-GI-NEXT:    ushll2 v17.4s, v17.8h, #0 +; CHECK-GI-NEXT:    mov d21, v19.d[1] +; CHECK-GI-NEXT:    mov d22, v18.d[1] +; CHECK-GI-NEXT:    mov d23, v20.d[1] +; CHECK-GI-NEXT:    mov d24, v17.d[1] +; CHECK-GI-NEXT:    smlal v0.2d, v16.2s, v19.2s +; CHECK-GI-NEXT:    smlal v2.2d, v16.2s, v18.2s +; CHECK-GI-NEXT:    smlal v4.2d, v16.2s, v20.2s +; CHECK-GI-NEXT:    smlal v6.2d, v16.2s, v17.2s +; CHECK-GI-NEXT:    smlal v1.2d, v16.2s, v21.2s +; CHECK-GI-NEXT:    smlal v3.2d, v16.2s, v22.2s +; CHECK-GI-NEXT:    smlal v5.2d, v16.2s, v23.2s +; CHECK-GI-NEXT:    smlal v7.2d, v16.2s, v24.2s  ; CHECK-GI-NEXT:    b.ne .LBB6_4  ; CHECK-GI-NEXT:  // %bb.5: // %middle.block -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v3.2d +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-GI-NEXT:    add v1.2d, v2.2d, v3.2d +; CHECK-GI-NEXT:    cmp x10, x9  ; CHECK-GI-NEXT:    add v2.2d, v4.2d, v5.2d -; CHECK-GI-NEXT:    cmp x11, x10  ; CHECK-GI-NEXT:    add v3.2d, v6.2d, v7.2d -; CHECK-GI-NEXT:    add v4.2d, v16.2d, v17.2d -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v2.2d -; CHECK-GI-NEXT:    add v2.2d, v3.2d, v4.2d -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v2.2d +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-GI-NEXT:    add v1.2d, v2.2d, v3.2d +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d  ; CHECK-GI-NEXT:    addp d0, v0.2d  ; CHECK-GI-NEXT:    b.ne .LBB6_8  ; CHECK-GI-NEXT:  // %bb.6: @@ -1027,50 +946,54 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none  ; CHECK-GI-NEXT:  .LBB6_8: // %vec.epilog.iter.check  ; CHECK-GI-NEXT:    cbz x8, .LBB6_12  ; CHECK-GI-NEXT:  .LBB6_9: // %vec.epilog.ph +; CHECK-GI-NEXT:    mov w8, w1  ; CHECK-GI-NEXT:    mov v0.d[1], xzr -; CHECK-GI-NEXT:    movi v2.2d, #0000000000000000 -; CHECK-GI-NEXT:    mov x12, x11 -; CHECK-GI-NEXT:    xtn v1.2s, v1.2d -; CHECK-GI-NEXT:    and x11, x10, #0xfffffffc -; CHECK-GI-NEXT:    sub x8, x12, x11 -; CHECK-GI-NEXT:    add x12, x0, x12 +; CHECK-GI-NEXT:    movi v1.2d, #0000000000000000 +; CHECK-GI-NEXT:    sxtb x8, w8 +; CHECK-GI-NEXT:    mov x11, x10 +; CHECK-GI-NEXT:    and x10, x9, #0xfffffffc +; CHECK-GI-NEXT:    dup v2.2d, x8 +; CHECK-GI-NEXT:    sub x8, x11, x10 +; CHECK-GI-NEXT:    add x11, x0, x11 +; CHECK-GI-NEXT:    xtn v2.2s, v2.2d  ; CHECK-GI-NEXT:  .LBB6_10: // %vec.epilog.vector.body  ; CHECK-GI-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-GI-NEXT:    ldr w13, [x12], #4 +; CHECK-GI-NEXT:    ldr w12, [x11], #4  ; CHECK-GI-NEXT:    adds x8, x8, #4 -; CHECK-GI-NEXT:    fmov s3, w13 -; CHECK-GI-NEXT:    uxtb w13, w13 +; CHECK-GI-NEXT:    fmov s3, w12 +; CHECK-GI-NEXT:    uxtb w12, w12  ; CHECK-GI-NEXT:    mov b4, v3.b[2]  ; CHECK-GI-NEXT:    mov b5, v3.b[1]  ; CHECK-GI-NEXT:    mov b6, v3.b[3] -; CHECK-GI-NEXT:    fmov s3, w13 -; CHECK-GI-NEXT:    fmov w14, s4 -; CHECK-GI-NEXT:    fmov w15, s5 -; CHECK-GI-NEXT:    fmov w16, s6 +; CHECK-GI-NEXT:    fmov s3, w12 +; CHECK-GI-NEXT:    fmov w13, s4 +; CHECK-GI-NEXT:    fmov w14, s5 +; CHECK-GI-NEXT:    fmov w15, s6 +; CHECK-GI-NEXT:    uxtb w13, w13  ; CHECK-GI-NEXT:    uxtb w14, w14  ; CHECK-GI-NEXT:    uxtb w15, w15 -; CHECK-GI-NEXT:    uxtb w16, w16 -; CHECK-GI-NEXT:    fmov s4, w14 -; CHECK-GI-NEXT:    mov v3.s[1], w15 -; CHECK-GI-NEXT:    mov v4.s[1], w16 -; CHECK-GI-NEXT:    smlal v0.2d, v1.2s, v3.2s -; CHECK-GI-NEXT:    smlal v2.2d, v1.2s, v4.2s +; CHECK-GI-NEXT:    fmov s4, w13 +; CHECK-GI-NEXT:    mov v3.s[1], w14 +; CHECK-GI-NEXT:    mov v4.s[1], w15 +; CHECK-GI-NEXT:    smlal v0.2d, v2.2s, v3.2s +; CHECK-GI-NEXT:    smlal v1.2d, v2.2s, v4.2s  ; CHECK-GI-NEXT:    b.ne .LBB6_10  ; CHECK-GI-NEXT:  // %bb.11: // %vec.epilog.middle.block -; CHECK-GI-NEXT:    add v0.2d, v0.2d, v2.2d -; CHECK-GI-NEXT:    cmp x11, x10 +; CHECK-GI-NEXT:    add v0.2d, v0.2d, v1.2d +; CHECK-GI-NEXT:    cmp x10, x9  ; CHECK-GI-NEXT:    addp d0, v0.2d  ; CHECK-GI-NEXT:    fmov x8, d0  ; CHECK-GI-NEXT:    b.eq .LBB6_14  ; CHECK-GI-NEXT:  .LBB6_12: // %for.body.preheader -; CHECK-GI-NEXT:    sub x10, x10, x11 -; CHECK-GI-NEXT:    add x11, x0, x11 +; CHECK-GI-NEXT:    sxtb x11, w1 +; CHECK-GI-NEXT:    sub x9, x9, x10 +; CHECK-GI-NEXT:    add x10, x0, x10  ; CHECK-GI-NEXT:  .LBB6_13: // %for.body  ; CHECK-GI-NEXT:    // =>This Inner Loop Header: Depth=1 -; CHECK-GI-NEXT:    ldrb w8, [x11], #1 +; CHECK-GI-NEXT:    ldrb w8, [x10], #1  ; CHECK-GI-NEXT:    fmov x12, d0 -; CHECK-GI-NEXT:    subs x10, x10, #1 -; CHECK-GI-NEXT:    madd x8, x8, x9, x12 +; CHECK-GI-NEXT:    subs x9, x9, #1 +; CHECK-GI-NEXT:    madd x8, x8, x11, x12  ; CHECK-GI-NEXT:    fmov d0, x8  ; CHECK-GI-NEXT:    b.ne .LBB6_13  ; CHECK-GI-NEXT:  .LBB6_14: // %for.cond.cleanup diff --git a/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir b/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir index 35eafe8..f535e0f 100644 --- a/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir +++ b/llvm/test/CodeGen/AArch64/framelayout-split-sve.mir @@ -68,13 +68,9 @@  # CHECK:      early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.4)  # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1040 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg +# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0 +# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 2080 +# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg  # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22  #  # CHECK-NEXT: $x8 = ADDXri $sp, 1040, 0 @@ -83,14 +79,10 @@  # CHECK-NEXT: $x8 = ADDXri $sp, 2064, 0  # CHECK-NEXT: STR_PXI $p0, killed $x8, 18 :: (store (<vscale x 1 x s16>) into %stack.1)  # -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1056 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 +# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0 +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 +# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16  # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 @@ -100,38 +92,26 @@  # ASM:       str x29, [sp, #-16]!  # ASM-NEXT:  .cfi_def_cfa_offset 16  # ASM-NEXT:  .cfi_offset w29, -16 -# ASM-NEXT:  sub sp, sp, #1024 -# ASM-NEXT:  .cfi_def_cfa_offset 1040 -# ASM-NEXT:  addvl sp, sp, #-1 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1040 + 8 * VG -# ASM-NEXT:  sub sp, sp, #1040 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #-2 +# ASM-NEXT:  sub sp, sp, #2064 +# ASM-NEXT:  .cfi_def_cfa_offset 2080 +# ASM-NEXT:  addvl sp, sp, #-3  # ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 2080 + 24 * VG  # -# ASM:	     addvl sp, sp, #2 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  add sp, sp, #1024 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1056 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #1 -# ASM-NEXT:  .cfi_def_cfa wsp, 1056 -# ASM-NEXT:  add sp, sp, #1040 -# ASM-NEXT:  .cfi_def_cfa_offset 16 +# ASM:	     add sp, sp, #2064 +# ASM-NEXT:  .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG +# ASM-NEXT:  addvl   sp, sp, #3 +# ASM-NEXT:  .cfi_def_cfa wsp, 16  # ASM-NEXT:  ldr x29, [sp], #16  # ASM-NEXT:  .cfi_def_cfa_offset 0  # ASM-NEXT:  .cfi_restore w29  # UNWINDINFO:      DW_CFA_def_cfa_offset: +16  # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16 -# UNWINDINFO:      DW_CFA_def_cfa_offset: +1040 -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +1040, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus +# UNWINDINFO:      DW_CFA_def_cfa_offset: +2080  # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus  # -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +1056, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO:      DW_CFA_def_cfa: reg31 +1056 -# UNWINDINFO:      DW_CFA_def_cfa_offset: +16 +# UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus +# UNWINDINFO:      DW_CFA_def_cfa: reg31 +16  # UNWINDINFO:      DW_CFA_def_cfa_offset: +0  # UNWINDINFO-NEXT: DW_CFA_restore: reg29 @@ -270,13 +250,9 @@ body:             |  # CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.5)  # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1040 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0 -# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg +# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0 +# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 2080 +# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg  # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22  #  # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 1040, 0 @@ -286,14 +262,10 @@ body:             |  # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 2064, 0  # CHECK-NEXT: STR_PXI $p0, killed $[[TMP]], 23  # -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1056 -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0 -# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16 +# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0 +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 +# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg +# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16  # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.5)  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29 @@ -303,38 +275,27 @@ body:             |  # ASM:       str x29, [sp, #-16]!  # ASM-NEXT:  .cfi_def_cfa_offset 16  # ASM-NEXT:  .cfi_offset w29, -16 -# ASM-NEXT:  sub sp, sp, #1024 -# ASM-NEXT:  .cfi_def_cfa_offset 1040 -# ASM-NEXT:  addvl sp, sp, #-1 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1040 + 8 * VG -# ASM-NEXT:  sub sp, sp, #1040 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #-2 +# ASM-NEXT:  sub sp, sp, #2064 +# ASM-NEXT:  .cfi_def_cfa_offset 2080 +# ASM-NEXT:  addvl sp, sp, #-3  # ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 2080 + 24 * VG  # -# ASM:       addvl sp, sp, #2 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG -# ASM-NEXT:  add sp, sp, #1024 -# ASM-NEXT:  .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x08, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 1056 + 8 * VG -# ASM-NEXT:  addvl sp, sp, #1 -# ASM-NEXT:  .cfi_def_cfa wsp, 1056 -# ASM-NEXT:  add sp, sp, #1040 -# ASM-NEXT:  .cfi_def_cfa_offset 16 +# ASM:       add sp, sp, #2064 +# ASM-NEXT:  .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG +# ASM-NEXT:  addvl   sp, sp, #3 +# ASM-NEXT:  .cfi_def_cfa wsp, 16  # ASM-NEXT:  ldr x29, [sp], #16  # ASM-NEXT:  .cfi_def_cfa_offset 0  # ASM-NEXT:  .cfi_restore w29 +# ASM-NEXT:  ret  # UNWINDINFO: DW_CFA_def_cfa_offset: +16  # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16 -# UNWINDINFO: DW_CFA_def_cfa_offset: +1040 -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1040, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus +# UNWINDINFO: DW_CFA_def_cfa_offset: +2080  # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus  # -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +2080, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +1056, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus -# UNWINDINFO: DW_CFA_def_cfa: reg31 +1056 -# UNWINDINFO: DW_CFA_def_cfa_offset: +16 +# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus +# UNWINDINFO: DW_CFA_def_cfa: reg31 +16  # UNWINDINFO: DW_CFA_def_cfa_offset: +0  # UNWINDINFO-NEXT: DW_CFA_restore: reg29 @@ -385,10 +346,8 @@ body:             |  # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8  # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16 -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1024, 0 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg -# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 1040, 0 -# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg +# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 2064, 0 +# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg  #  # CHECK-NEXT: $[[TMP:x[0-9]+]] = SUBXri $fp, 1024, 0  # CHECK-NEXT: STR_ZXI $z0, killed $[[TMP]], -2 @@ -396,10 +355,8 @@ body:             |  # CHECK-NEXT: STR_ZXI $z1, killed $[[TMP]], -3  # CHECK-NEXT: STR_PXI $p0, $fp, -1  # -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1024, 0 -# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg -# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 1040, 0 +# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 2064, 0 +# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16  # CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.6), (load (s64) from %stack.5)  # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0 @@ -414,15 +371,11 @@ body:             |  # ASM-NEXT:  .cfi_def_cfa w29, 16  # ASM-NEXT:  .cfi_offset w30, -8  # ASM-NEXT:  .cfi_offset w29, -16 -# ASM-NEXT:  sub sp, sp, #1024 -# ASM-NEXT:  addvl sp, sp, #-1 -# ASM-NEXT:  sub sp, sp, #1040 -# ASM-NEXT:  addvl sp, sp, #-2 +# ASM-NEXT:  sub sp, sp, #2064 +# ASM-NEXT:  addvl sp, sp, #-3  # -# ASM:       addvl sp, sp, #2 -# ASM-NEXT:  add sp, sp, #1024 -# ASM-NEXT:  addvl sp, sp, #1 -# ASM-NEXT:  add sp, sp, #1040 +# ASM:       add sp, sp, #2064 +# ASM-NEXT:  addvl sp, sp, #3  # ASM-NEXT:  .cfi_def_cfa wsp, 16  # ASM-NEXT:  ldp x29, x30, [sp], #16  # ASM-NEXT:  .cfi_def_cfa_offset 0 diff --git a/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll b/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll index 690a39d..c13dd33 100644 --- a/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll +++ b/llvm/test/CodeGen/AArch64/split-sve-stack-frame-layout.ll @@ -19,20 +19,16 @@ define void @zpr_and_ppr_local(<vscale x 16 x i1> %pred, <vscale x 16 x i8> %vec  ; CHECK-LABEL: zpr_and_ppr_local:  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 +; CHECK-NEXT:    sub sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #-2  ; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0x90, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 2064 + 16 * VG  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    add x8, sp, #2048  ; CHECK-NEXT:    str p0, [x8, #15, mul vl]  ; CHECK-NEXT:    add x8, sp, #1024  ; CHECK-NEXT:    str z0, [x8] -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #2  ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -62,20 +58,16 @@ define void @zpr_and_ppr_local_fp(<vscale x 16 x i1> %pred, <vscale x 16 x i8> %  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill  ; CHECK-NEXT:    mov x29, sp -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 +; CHECK-NEXT:    sub sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #-2  ; CHECK-NEXT:    .cfi_def_cfa w29, 16  ; CHECK-NEXT:    .cfi_offset w30, -8  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    sub x8, x29, #1024  ; CHECK-NEXT:    str p0, [x29, #-1, mul vl]  ; CHECK-NEXT:    str z0, [x8, #-2, mul vl] -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2048 +; CHECK-NEXT:    addvl sp, sp, #2  ; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -103,17 +95,15 @@ define void @fpr_and_ppr_local(<vscale x 16 x i1> %pred, double %double) "aarch6  ; CHECK-LABEL: fpr_and_ppr_local:  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill -; CHECK-NEXT:    sub sp, sp, #1024 +; CHECK-NEXT:    sub sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1040  ; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0xa0, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 2080 + 8 * VG  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    add x8, sp, #2064  ; CHECK-NEXT:    str p0, [x8, #7, mul vl]  ; CHECK-NEXT:    str d0, [sp, #1032] -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1040  ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -144,17 +134,15 @@ define void @fpr_and_ppr_local_fp(<vscale x 16 x i1> %pred, double %double) "aar  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill  ; CHECK-NEXT:    mov x29, sp -; CHECK-NEXT:    sub sp, sp, #1024 +; CHECK-NEXT:    sub sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    sub sp, sp, #1040  ; CHECK-NEXT:    .cfi_def_cfa w29, 16  ; CHECK-NEXT:    .cfi_offset w30, -8  ; CHECK-NEXT:    .cfi_offset w29, -16  ; CHECK-NEXT:    str p0, [x29, #-1, mul vl]  ; CHECK-NEXT:    str d0, [sp, #1032] -; CHECK-NEXT:    add sp, sp, #1024 +; CHECK-NEXT:    add sp, sp, #2064  ; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1040  ; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload  ; CHECK-NEXT:    ret    %ppr_local = alloca <vscale x 16 x i1> @@ -793,11 +781,8 @@ define void @zpr_and_ppr_local_stack_probing(<vscale x 16 x i1> %pred, <vscale x  ; CHECK-LABEL: zpr_and_ppr_local_stack_probing:  ; CHECK:       // %bb.0:  ; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill -; CHECK-NEXT:    sub sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #-1 -; CHECK-NEXT:    str xzr, [sp] -; CHECK-NEXT:    sub sp, sp, #1824 -; CHECK-NEXT:    addvl sp, sp, #-1 +; CHECK-NEXT:    sub sp, sp, #2848 +; CHECK-NEXT:    addvl sp, sp, #-2  ; CHECK-NEXT:    str xzr, [sp]  ; CHECK-NEXT:    .cfi_escape 0x0f, 0x09, 0x8f, 0xb0, 0x16, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 2864 + 16 * VG  ; CHECK-NEXT:    .cfi_offset w29, -16 @@ -806,10 +791,8 @@ define void @zpr_and_ppr_local_stack_probing(<vscale x 16 x i1> %pred, <vscale x  ; CHECK-NEXT:    add x8, sp, #1824  ; CHECK-NEXT:    str z0, [x8]  ; CHECK-NEXT:    str x0, [sp] -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1024 -; CHECK-NEXT:    addvl sp, sp, #1 -; CHECK-NEXT:    add sp, sp, #1824 +; CHECK-NEXT:    add sp, sp, #2848 +; CHECK-NEXT:    addvl sp, sp, #2  ; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload  ; CHECK-NEXT:    ret    "probe-stack"="inline-asm" "stack-probe-size"="4096" "frame-pointer"="none" "aarch64_pstate_sm_compatible" diff --git a/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll b/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll index becddae..b2ed8de 100644 --- a/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll +++ b/llvm/test/CodeGen/AArch64/sve-fixed-length-loads-stores.ll @@ -1,19 +1,8 @@  ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py  ; RUN: llc -aarch64-sve-vector-bits-min=128  < %s | not grep ptrue  ; RUN: llc -aarch64-sve-vector-bits-min=256  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256 -; RUN: llc -aarch64-sve-vector-bits-min=384  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256  ; RUN: llc -aarch64-sve-vector-bits-min=512  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512 -; RUN: llc -aarch64-sve-vector-bits-min=640  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512 -; RUN: llc -aarch64-sve-vector-bits-min=768  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512 -; RUN: llc -aarch64-sve-vector-bits-min=896  < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512  ; RUN: llc -aarch64-sve-vector-bits-min=1024 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1152 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1280 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1408 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1536 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1664 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1792 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024 -; RUN: llc -aarch64-sve-vector-bits-min=1920 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_1024  ; RUN: llc -aarch64-sve-vector-bits-min=2048 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_2048  target triple = "aarch64-unknown-linux-gnu" diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll index e86f747..37b5422 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/memory-legalizer-atomic-fence.ll @@ -1,11 +1,11 @@  ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4 -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10WGP %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck -check-prefix=GFX10CU %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11WGP %s -; RUN: llc -global-isel -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck -check-prefix=GFX11CU %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx600 < %s | FileCheck -check-prefix=GFX6 %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd- -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 < %s | FileCheck -check-prefix=GFX8 %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10WGP %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck -check-prefix=GFX10CU %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11WGP %s +; RUN: llc -global-isel -new-reg-bank-select -stop-after=si-memory-legalizer -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck -check-prefix=GFX11CU %s  ; Note: we use MIR test checks + stop after legalizer to prevent  ; tests from being optimized out. diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll index 44b12a9..61a6137 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/mmra.ll @@ -1,5 +1,5 @@  ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 -; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 -stop-after=finalize-isel < %s | FileCheck %s +; RUN: llc -global-isel -new-reg-bank-select -mtriple=amdgcn -mcpu=gfx900 -stop-after=finalize-isel < %s | FileCheck %s  declare void @readsMem(ptr) #0  declare void @writesMem(ptr) #1 diff --git a/llvm/test/CodeGen/AMDGPU/callbr.ll b/llvm/test/CodeGen/AMDGPU/callbr.ll new file mode 100644 index 0000000..253a6ec --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/callbr.ll @@ -0,0 +1,54 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mtriple=amdgcn -mcpu=gfx90a < %s | FileCheck %s + +define void @callbr_inline_asm(ptr %src, ptr %dst1, ptr %dst2, i32 %c) { +; CHECK-LABEL: callbr_inline_asm: +; CHECK:       ; %bb.0: +; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; CHECK-NEXT:    flat_load_dword v0, v[0:1] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    v_cmp_gt_i32 vcc v6, 42; s_cbranch_vccnz .LBB0_2 +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  ; %bb.1: ; %fallthrough +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    flat_store_dword v[2:3], v0 +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    s_setpc_b64 s[30:31] +; CHECK-NEXT:  .LBB0_2: ; Inline asm indirect target +; CHECK-NEXT:    ; %indirect +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    flat_store_dword v[4:5], v0 +; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0) +; CHECK-NEXT:    s_setpc_b64 s[30:31] +	%a = load i32, ptr %src, align 4 +	callbr void asm "v_cmp_gt_i32 vcc $0, 42; s_cbranch_vccnz ${1:l}", "r,!i"(i32 %c) to label %fallthrough [label %indirect] +fallthrough: +	store i32 %a, ptr %dst1, align 4 +	br label %ret +indirect: +	store i32 %a, ptr %dst2, align 4 +	br label %ret +ret: +	ret void +} + +define void @callbr_self_loop(i1 %c) { +; CHECK-LABEL: callbr_self_loop: +; CHECK:       ; %bb.0: +; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; CHECK-NEXT:  .LBB1_1: ; %callbr +; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1 +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:    s_branch .LBB1_1 +; CHECK-NEXT:  .LBB1_2: ; Inline asm indirect target +; CHECK-NEXT:    ; %callbr.target.ret +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_setpc_b64 s[30:31] +  br label %callbr +callbr: +  callbr void asm "", "!i"() to label %callbr [label %ret] +ret: +  ret void +} diff --git a/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll b/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll index 007e3f0..076a99f 100644 --- a/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll +++ b/llvm/test/CodeGen/AMDGPU/do-not-unify-divergent-exit-nodes-with-musttail.ll @@ -3,6 +3,7 @@  declare void @foo(ptr)  declare i1 @bar(ptr) +declare i32 @bar32(ptr)  define void @musttail_call_without_return_value(ptr %p) {  ; CHECK-LABEL: define void @musttail_call_without_return_value( @@ -28,6 +29,31 @@ bb.1:    ret void  } +define void @musttail_call_without_return_value_callbr(ptr %p) { +; CHECK-LABEL: define void @musttail_call_without_return_value_callbr( +; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:  [[ENTRY:.*:]] +; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P]], align 1 +; CHECK-NEXT:    callbr void asm "", "r,!i"(i32 [[LOAD]]) +; CHECK-NEXT:            to label %[[BB_0:.*]] [label %bb.1] +; CHECK:       [[BB_0]]: +; CHECK-NEXT:    musttail call void @foo(ptr [[P]]) +; CHECK-NEXT:    ret void +; CHECK:       [[BB_1:.*:]] +; CHECK-NEXT:    ret void +; +entry: +  %load = load i32, ptr %p, align 1 +  callbr void asm "", "r,!i"(i32 %load) to label %bb.0 [label %bb.1] + +bb.0: +  musttail call void @foo(ptr %p) +  ret void + +bb.1: +  ret void +} +  define i1 @musttail_call_with_return_value(ptr %p) {  ; CHECK-LABEL: define i1 @musttail_call_with_return_value(  ; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] { @@ -51,3 +77,28 @@ bb.0:  bb.1:    ret i1 %load  } + +define i32 @musttail_call_with_return_value_callbr(ptr %p) { +; CHECK-LABEL: define i32 @musttail_call_with_return_value_callbr( +; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] { +; CHECK-NEXT:  [[ENTRY:.*:]] +; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[P]], align 1 +; CHECK-NEXT:    callbr void asm "", "r,!i"(i32 [[LOAD]]) +; CHECK-NEXT:            to label %[[BB_0:.*]] [label %bb.1] +; CHECK:       [[BB_0]]: +; CHECK-NEXT:    [[RET:%.*]] = musttail call i32 @bar32(ptr [[P]]) +; CHECK-NEXT:    ret i32 [[RET]] +; CHECK:       [[BB_1:.*:]] +; CHECK-NEXT:    ret i32 [[LOAD]] +; +entry: +  %load = load i32, ptr %p, align 1 +  callbr void asm "", "r,!i"(i32 %load) to label %bb.0 [label %bb.1] + +bb.0: +  %ret = musttail call i32 @bar32(ptr %p) +  ret i32 %ret + +bb.1: +  ret i32 %load +} diff --git a/llvm/test/CodeGen/AMDGPU/infinite-loop.ll b/llvm/test/CodeGen/AMDGPU/infinite-loop.ll index 3e2e43f..df63592 100644 --- a/llvm/test/CodeGen/AMDGPU/infinite-loop.ll +++ b/llvm/test/CodeGen/AMDGPU/infinite-loop.ll @@ -36,26 +36,60 @@ loop:    br label %loop  } +define amdgpu_kernel void @infinite_loop_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loop_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9 +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loop_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP:%.*]] [] +; IR:       loop: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[DUMMYRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP]] [] +; IR:       DummyReturnBlock: +; IR-NEXT:    ret void +; +entry: +  callbr void asm "", ""() to label %loop [] + +loop: +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop [] +} +  define amdgpu_kernel void @infinite_loop_ret(ptr addrspace(1) %out) {  ; SI-LABEL: infinite_loop_ret:  ; SI:       ; %bb.0: ; %entry  ; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0  ; SI-NEXT:    s_and_saveexec_b64 s[0:1], vcc -; SI-NEXT:    s_cbranch_execz .LBB1_3 +; SI-NEXT:    s_cbranch_execz .LBB2_3  ; SI-NEXT:  ; %bb.1: ; %loop.preheader  ; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9  ; SI-NEXT:    s_mov_b32 s3, 0xf000  ; SI-NEXT:    s_mov_b32 s2, -1  ; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7  ; SI-NEXT:    s_and_b64 vcc, exec, -1 -; SI-NEXT:  .LBB1_2: ; %loop +; SI-NEXT:  .LBB2_2: ; %loop  ; SI-NEXT:    ; =>This Inner Loop Header: Depth=1  ; SI-NEXT:    s_waitcnt lgkmcnt(0)  ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccnz .LBB1_2 -; SI-NEXT:  .LBB1_3: ; %UnifiedReturnBlock +; SI-NEXT:    s_cbranch_vccnz .LBB2_2 +; SI-NEXT:  .LBB2_3: ; %UnifiedReturnBlock  ; SI-NEXT:    s_endpgm  ; IR-LABEL: @infinite_loop_ret(  ; IR-NEXT:  entry: @@ -81,44 +115,93 @@ return:    ret void  } +define amdgpu_kernel void @infinite_loop_ret_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loop_ret_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0 +; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:  ; %bb.1: ; %loop.preheader +; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9 +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:  .LBB3_2: ; Inline asm indirect target +; SI-NEXT:    ; %UnifiedReturnBlock +; SI-NEXT:    ; Label of block must be emitted +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loop_ret_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    [[TMP:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() +; IR-NEXT:    [[COND:%.*]] = icmp eq i32 [[TMP]], 1 +; IR-NEXT:    [[COND32:%.*]] = zext i1 [[COND]] to i32 +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[COND32]]) +; IR-NEXT:            to label [[LOOP:%.*]] [label %UnifiedReturnBlock] +; IR:       loop: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[UNIFIEDRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP]] [] +; IR:       UnifiedReturnBlock: +; IR-NEXT:    ret void +; +entry: +  %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() +  %cond = icmp eq i32 %tmp, 1 +  %cond32 = zext i1 %cond to i32 +  callbr void asm "", "r,!i"(i32 %cond32) to label %loop [label %return] + +loop: +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop [] + +return: +  ret void +} +  define amdgpu_kernel void @infinite_loops(ptr addrspace(1) %out) {  ; SI-LABEL: infinite_loops:  ; SI:       ; %bb.0: ; %entry  ; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9  ; SI-NEXT:    s_mov_b64 s[2:3], -1 -; SI-NEXT:    s_cbranch_scc1 .LBB2_4 +; SI-NEXT:    s_cbranch_scc1 .LBB4_4  ; SI-NEXT:  ; %bb.1:  ; SI-NEXT:    s_mov_b32 s3, 0xf000  ; SI-NEXT:    s_mov_b32 s2, -1  ; SI-NEXT:    v_mov_b32_e32 v0, 0x378  ; SI-NEXT:    s_and_b64 vcc, exec, -1 -; SI-NEXT:  .LBB2_2: ; %loop2 +; SI-NEXT:  .LBB4_2: ; %loop2  ; SI-NEXT:    ; =>This Inner Loop Header: Depth=1  ; SI-NEXT:    s_waitcnt lgkmcnt(0)  ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccnz .LBB2_2 +; SI-NEXT:    s_cbranch_vccnz .LBB4_2  ; SI-NEXT:  ; %bb.3: ; %Flow  ; SI-NEXT:    s_mov_b64 s[2:3], 0 -; SI-NEXT:  .LBB2_4: ; %Flow2 +; SI-NEXT:  .LBB4_4: ; %Flow2  ; SI-NEXT:    s_and_b64 vcc, exec, s[2:3]  ; SI-NEXT:    s_waitcnt lgkmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccz .LBB2_7 +; SI-NEXT:    s_cbranch_vccz .LBB4_7  ; SI-NEXT:  ; %bb.5:  ; SI-NEXT:    s_mov_b32 s3, 0xf000  ; SI-NEXT:    s_mov_b32 s2, -1  ; SI-NEXT:    s_waitcnt expcnt(0)  ; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7  ; SI-NEXT:    s_and_b64 vcc, exec, 0 -; SI-NEXT:  .LBB2_6: ; %loop1 +; SI-NEXT:  .LBB4_6: ; %loop1  ; SI-NEXT:    ; =>This Inner Loop Header: Depth=1  ; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_mov_b64 vcc, vcc -; SI-NEXT:    s_cbranch_vccz .LBB2_6 -; SI-NEXT:  .LBB2_7: ; %DummyReturnBlock +; SI-NEXT:    s_cbranch_vccz .LBB4_6 +; SI-NEXT:  .LBB4_7: ; %DummyReturnBlock  ; SI-NEXT:    s_endpgm  ; IR-LABEL: @infinite_loops(  ; IR-NEXT:  entry: @@ -144,24 +227,78 @@ loop2:    br label %loop2  } +define amdgpu_kernel void @infinite_loops_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loops_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9 +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:  ; %bb.1: ; %loop1 +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_endpgm +; SI-NEXT:  .LBB5_2: ; Inline asm indirect target +; SI-NEXT:    ; %loop2.preheader +; SI-NEXT:    ; Label of block must be emitted +; SI-NEXT:    s_mov_b32 s3, 0xf000 +; SI-NEXT:    s_mov_b32 s2, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x378 +; SI-NEXT:    buffer_store_dword v0, off, s[0:3], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loops_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    callbr void asm "", "r,!i"(i32 poison) +; IR-NEXT:            to label [[LOOP1:%.*]] [label %loop2] +; IR:       loop1: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[DUMMYRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP1]] [] +; IR:       loop2: +; IR-NEXT:    store volatile i32 888, ptr addrspace(1) [[OUT]], align 4 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK1:%.*]], label [[DUMMYRETURNBLOCK]] +; IR:       TransitionBlock1: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[LOOP2:%.*]] [] +; IR:       DummyReturnBlock: +; IR-NEXT:    ret void +; +entry: +  callbr void asm "", "r,!i"(i32 poison) to label %loop1 [label %loop2] + +loop1: +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop1 [] + +loop2: +  store volatile i32 888, ptr addrspace(1) %out, align 4 +  callbr void asm "", ""() to label %loop2 [] +} +  define amdgpu_kernel void @infinite_loop_nest_ret(ptr addrspace(1) %out) {  ; SI-LABEL: infinite_loop_nest_ret:  ; SI:       ; %bb.0: ; %entry  ; SI-NEXT:    v_cmp_ne_u32_e32 vcc, 1, v0  ; SI-NEXT:    s_and_saveexec_b64 s[0:1], vcc -; SI-NEXT:    s_cbranch_execz .LBB3_5 +; SI-NEXT:    s_cbranch_execz .LBB6_5  ; SI-NEXT:  ; %bb.1: ; %outer_loop.preheader  ; SI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x9  ; SI-NEXT:    v_cmp_ne_u32_e64 s[0:1], 3, v0  ; SI-NEXT:    s_mov_b32 s7, 0xf000  ; SI-NEXT:    s_mov_b32 s6, -1  ; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 -; SI-NEXT:  .LBB3_2: ; %outer_loop +; SI-NEXT:  .LBB6_2: ; %outer_loop  ; SI-NEXT:    ; =>This Loop Header: Depth=1 -; SI-NEXT:    ; Child Loop BB3_3 Depth 2 +; SI-NEXT:    ; Child Loop BB6_3 Depth 2  ; SI-NEXT:    s_mov_b64 s[2:3], 0 -; SI-NEXT:  .LBB3_3: ; %inner_loop -; SI-NEXT:    ; Parent Loop BB3_2 Depth=1 +; SI-NEXT:  .LBB6_3: ; %inner_loop +; SI-NEXT:    ; Parent Loop BB6_2 Depth=1  ; SI-NEXT:    ; => This Inner Loop Header: Depth=2  ; SI-NEXT:    s_and_b64 s[8:9], exec, s[0:1]  ; SI-NEXT:    s_or_b64 s[2:3], s[8:9], s[2:3] @@ -169,13 +306,13 @@ define amdgpu_kernel void @infinite_loop_nest_ret(ptr addrspace(1) %out) {  ; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0  ; SI-NEXT:    s_waitcnt vmcnt(0)  ; SI-NEXT:    s_andn2_b64 exec, exec, s[2:3] -; SI-NEXT:    s_cbranch_execnz .LBB3_3 +; SI-NEXT:    s_cbranch_execnz .LBB6_3  ; SI-NEXT:  ; %bb.4: ; %loop.exit.guard -; SI-NEXT:    ; in Loop: Header=BB3_2 Depth=1 +; SI-NEXT:    ; in Loop: Header=BB6_2 Depth=1  ; SI-NEXT:    s_or_b64 exec, exec, s[2:3]  ; SI-NEXT:    s_mov_b64 vcc, 0 -; SI-NEXT:    s_branch .LBB3_2 -; SI-NEXT:  .LBB3_5: ; %UnifiedReturnBlock +; SI-NEXT:    s_branch .LBB6_2 +; SI-NEXT:  .LBB6_5: ; %UnifiedReturnBlock  ; SI-NEXT:    s_endpgm  ; IR-LABEL: @infinite_loop_nest_ret(  ; IR-NEXT:  entry: @@ -212,4 +349,82 @@ return:    ret void  } +define amdgpu_kernel void @infinite_loop_nest_ret_callbr(ptr addrspace(1) %out) { +; SI-LABEL: infinite_loop_nest_ret_callbr: +; SI:       ; %bb.0: ; %entry +; SI-NEXT:    v_cmp_ne_u32_e32 vcc, 1, v0 +; SI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:  ; %bb.1: ; %outer_loop.preheader +; SI-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x9 +; SI-NEXT:    s_mov_b32 s7, 0xf000 +; SI-NEXT:    s_mov_b32 s6, -1 +; SI-NEXT:    v_mov_b32_e32 v0, 0x3e7 +; SI-NEXT:    s_and_b64 s[0:1], exec, 0 +; SI-NEXT:    s_branch .LBB7_3 +; SI-NEXT:  .LBB7_2: ; %loop.exit.guard +; SI-NEXT:    ; in Loop: Header=BB7_3 Depth=1 +; SI-NEXT:    s_and_b64 vcc, exec, s[2:3] +; SI-NEXT:    s_cbranch_vccnz .LBB7_5 +; SI-NEXT:  .LBB7_3: ; %outer_loop +; SI-NEXT:    ; =>This Inner Loop Header: Depth=1 +; SI-NEXT:    ;;#ASMSTART +; SI-NEXT:    ;;#ASMEND +; SI-NEXT:    s_waitcnt lgkmcnt(0) +; SI-NEXT:    buffer_store_dword v0, off, s[4:7], 0 +; SI-NEXT:    s_waitcnt vmcnt(0) +; SI-NEXT:    s_mov_b64 s[2:3], -1 +; SI-NEXT:    s_mov_b64 vcc, s[0:1] +; SI-NEXT:    s_cbranch_vccz .LBB7_2 +; SI-NEXT:  ; %bb.4: ; %TransitionBlock.target.outer_loop +; SI-NEXT:    ; in Loop: Header=BB7_3 Depth=1 +; SI-NEXT:    s_mov_b64 s[2:3], 0 +; SI-NEXT:    s_branch .LBB7_2 +; SI-NEXT:  .LBB7_5: ; Inline asm indirect target +; SI-NEXT:    ; %UnifiedReturnBlock +; SI-NEXT:    ; Label of block must be emitted +; SI-NEXT:    s_endpgm +; IR-LABEL: @infinite_loop_nest_ret_callbr( +; IR-NEXT:  entry: +; IR-NEXT:    [[TMP:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() +; IR-NEXT:    [[COND1:%.*]] = icmp ne i32 [[TMP]], 1 +; IR-NEXT:    [[COND1_32:%.*]] = zext i1 [[COND1]] to i32 +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[COND1_32]]) +; IR-NEXT:            to label [[OUTER_LOOP:%.*]] [label %UnifiedReturnBlock] +; IR:       outer_loop: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[INNER_LOOP:%.*]] [] +; IR:       inner_loop: +; IR-NEXT:    store volatile i32 999, ptr addrspace(1) [[OUT:%.*]], align 4 +; IR-NEXT:    [[COND3:%.*]] = icmp eq i32 [[TMP]], 3 +; IR-NEXT:    [[COND3_32:%.*]] = zext i1 [[COND3]] to i32 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK:%.*]], label [[UNIFIEDRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[COND3_32]]) +; IR-NEXT:            to label [[INNER_LOOP]] [label %outer_loop] +; IR:       UnifiedReturnBlock: +; IR-NEXT:    ret void +; +entry: +  %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() +  %cond1 = icmp ne i32 %tmp, 1  ; avoid following BB optimizing away through the domination +  %cond1_32 = zext i1 %cond1 to i32 +  callbr void asm "", "r,!i"(i32 %cond1_32) to label %outer_loop [label %return] + +outer_loop: +  ; %cond2 = icmp eq i32 %tmp, 2 +  ; br i1 %cond2, label %outer_loop, label %inner_loop +  callbr void asm "", ""() to label %inner_loop [] + +inner_loop:                                     ; preds = %LeafBlock, %LeafBlock1 +  store volatile i32 999, ptr addrspace(1) %out, align 4 +  %cond3 = icmp eq i32 %tmp, 3 +  %cond3_32 = zext i1 %cond3 to i32 +  callbr void asm "", "r,!i"(i32 %cond3_32) to label %inner_loop [label %outer_loop] + +return: +  ret void +} +  declare i32 @llvm.amdgcn.workitem.id.x() diff --git a/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll b/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll index 34de1e4..01bcdad 100644 --- a/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll +++ b/llvm/test/CodeGen/AMDGPU/si-annotate-nested-control-flows.ll @@ -3,15 +3,16 @@  ; RUN: llc -mtriple=amdgcn-amd-amdhsa %s -o - | FileCheck %s --check-prefix=ISA  define void @nested_inf_loop(i1 %0, i1 %1) { -; OPT-LABEL: @nested_inf_loop( -; OPT-NEXT:  BB: -; OPT-NEXT:    br label [[BB1:%.*]] -; OPT:       BB1: -; OPT-NEXT:    [[BRMERGE:%.*]] = select i1 [[TMP0:%.*]], i1 true, i1 [[TMP1:%.*]] -; OPT-NEXT:    br i1 [[BRMERGE]], label [[BB1]], label [[INFLOOP:%.*]] -; OPT:       infloop: -; OPT-NEXT:    br i1 true, label [[INFLOOP]], label [[DUMMYRETURNBLOCK:%.*]] -; OPT:       DummyReturnBlock: +; OPT-LABEL: define void @nested_inf_loop( +; OPT-SAME: i1 [[TMP0:%.*]], i1 [[TMP1:%.*]]) { +; OPT-NEXT:  [[BB:.*:]] +; OPT-NEXT:    br label %[[BB1:.*]] +; OPT:       [[BB1]]: +; OPT-NEXT:    [[BRMERGE:%.*]] = select i1 [[TMP0]], i1 true, i1 [[TMP1]] +; OPT-NEXT:    br i1 [[BRMERGE]], label %[[BB1]], label %[[INFLOOP:.*]] +; OPT:       [[INFLOOP]]: +; OPT-NEXT:    br i1 true, label %[[INFLOOP]], label %[[DUMMYRETURNBLOCK:.*]] +; OPT:       [[DUMMYRETURNBLOCK]]:  ; OPT-NEXT:    ret void  ;  ; ISA-LABEL: nested_inf_loop: @@ -63,3 +64,84 @@ BB4:  BB3:    br label %BB1  } + +define void @nested_inf_loop_callbr(i32 %0, i32 %1) { +; OPT-LABEL: define void @nested_inf_loop_callbr( +; OPT-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { +; OPT-NEXT:  [[BB:.*:]] +; OPT-NEXT:    callbr void asm "", ""() +; OPT-NEXT:            to label %[[BB1:.*]] [] +; OPT:       [[BB1]]: +; OPT-NEXT:    callbr void asm "", "r,!i"(i32 [[TMP0]]) +; OPT-NEXT:            to label %[[BB3:.*]] [label %BB2] +; OPT:       [[BB2:.*:]] +; OPT-NEXT:    callbr void asm "", ""() +; OPT-NEXT:            to label %[[BB4:.*]] [] +; OPT:       [[BB4]]: +; OPT-NEXT:    br i1 true, label %[[TRANSITIONBLOCK:.*]], label %[[DUMMYRETURNBLOCK:.*]] +; OPT:       [[TRANSITIONBLOCK]]: +; OPT-NEXT:    callbr void asm "", "r,!i"(i32 [[TMP1]]) +; OPT-NEXT:            to label %[[BB3]] [label %BB4] +; OPT:       [[BB3]]: +; OPT-NEXT:    callbr void asm "", ""() +; OPT-NEXT:            to label %[[BB1]] [] +; OPT:       [[DUMMYRETURNBLOCK]]: +; OPT-NEXT:    ret void +; +; ISA-LABEL: nested_inf_loop_callbr: +; ISA:       ; %bb.0: ; %BB +; ISA-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    ; implicit-def: $sgpr6_sgpr7 +; ISA-NEXT:    ; implicit-def: $sgpr4_sgpr5 +; ISA-NEXT:  .LBB1_1: ; %BB1 +; ISA-NEXT:    ; =>This Inner Loop Header: Depth=1 +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    s_andn2_b64 s[6:7], s[6:7], exec +; ISA-NEXT:    s_and_b64 s[8:9], s[4:5], exec +; ISA-NEXT:    s_or_b64 s[6:7], s[6:7], s[8:9] +; ISA-NEXT:  .LBB1_2: ; %BB3 +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    s_andn2_b64 s[4:5], s[4:5], exec +; ISA-NEXT:    s_and_b64 s[8:9], s[6:7], exec +; ISA-NEXT:    s_or_b64 s[4:5], s[4:5], s[8:9] +; ISA-NEXT:    s_branch .LBB1_1 +; ISA-NEXT:  .LBB1_3: ; Inline asm indirect target +; ISA-NEXT:    ; %BB2 +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    ; Label of block must be emitted +; ISA-NEXT:    ;;#ASMSTART +; ISA-NEXT:    ;;#ASMEND +; ISA-NEXT:    s_mov_b64 s[6:7], -1 +; ISA-NEXT:    s_and_saveexec_b64 s[8:9], s[4:5] +; ISA-NEXT:    s_cbranch_execz .LBB1_5 +; ISA-NEXT:  ; %bb.4: ; %TransitionBlock.target.BB3 +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    s_xor_b64 s[6:7], exec, -1 +; ISA-NEXT:  .LBB1_5: ; %loop.exit.guard +; ISA-NEXT:    ; in Loop: Header=BB1_1 Depth=1 +; ISA-NEXT:    s_or_b64 exec, exec, s[8:9] +; ISA-NEXT:    s_and_b64 vcc, exec, s[6:7] +; ISA-NEXT:    s_mov_b64 s[6:7], 0 +; ISA-NEXT:    s_cbranch_vccz .LBB1_2 +; ISA-NEXT:  ; %bb.6: ; %DummyReturnBlock +; ISA-NEXT:    s_setpc_b64 s[30:31] +BB: +  callbr void asm "", ""() to label %BB1 [] + +BB1: +  callbr void asm "", "r,!i"(i32 %0) to label %BB3 [label %BB2] + +BB2: +  callbr void asm "", ""() to label %BB4 [] + +BB4: +  callbr void asm "", "r,!i"(i32 %1) to label %BB3 [label %BB4] + +BB3: +  callbr void asm "", ""() to label %BB1 [] +} diff --git a/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll b/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll index 4cbe682..004c279 100644 --- a/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll +++ b/llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll @@ -1,5 +1,5 @@ -; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -stop-after=amdgpu-unify-divergent-exit-nodes | FileCheck %s --check-prefix=UNIFY +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -stop-after=amdgpu-unify-divergent-exit-nodes | FileCheck %s --check-prefix=UNIFY  ; RUN: llc < %s -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 | FileCheck %s  declare void @llvm.trap() @@ -70,8 +70,33 @@ define amdgpu_kernel void @kernel(i32 %a, ptr addrspace(1) %x, i32 noundef %n) {  ; CHECK-NEXT:    s_mov_b64 s[2:3], -1  ; CHECK-NEXT:    s_trap 2  ; CHECK-NEXT:    s_branch .LBB0_4 - - +; UNIFY-LABEL: @kernel( +; UNIFY-NEXT:  entry: +; UNIFY-NEXT:    [[TID:%.*]] = call i32 @llvm.amdgcn.workitem.id.x() +; UNIFY-NEXT:    [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 256 +; UNIFY-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; UNIFY:       if.then: +; UNIFY-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; UNIFY-NEXT:    br i1 [[CMP1]], label [[IF_END6_SINK_SPLIT:%.*]], label [[COND_FALSE:%.*]] +; UNIFY:       cond.false: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.else: +; UNIFY-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[TID]], 10 +; UNIFY-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END6:%.*]] +; UNIFY:       if.then3: +; UNIFY-NEXT:    [[CMP1_I7:%.*]] = icmp eq i32 [[A]], 0 +; UNIFY-NEXT:    br i1 [[CMP1_I7]], label [[IF_END6_SINK_SPLIT]], label [[COND_FALSE_I8:%.*]] +; UNIFY:       cond.false.i8: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.end6.sink.split: +; UNIFY-NEXT:    [[X1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[X:%.*]], i32 [[TID]] +; UNIFY-NEXT:    store i32 [[A]], ptr addrspace(1) [[X1]], align 4 +; UNIFY-NEXT:    br label [[IF_END6]] +; UNIFY:       if.end6: +; UNIFY-NEXT:    ret void +;  entry:    %tid = call i32 @llvm.amdgcn.workitem.id.x()    %cmp = icmp eq i32 %n, 256 @@ -105,5 +130,129 @@ if.end6.sink.split:  if.end6:    ret void  } -;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: -; UNIFY: {{.*}} + +define amdgpu_kernel void @kernel_callbr(i32 %a, ptr addrspace(1) %x, i32 noundef %n) { +; CHECK-LABEL: kernel_callbr: +; CHECK:       ; %bb.0: ; %entry +; CHECK-NEXT:    s_load_dword s1, s[8:9], 0x10 +; CHECK-NEXT:    s_load_dword s0, s[8:9], 0x0 +; CHECK-NEXT:    s_waitcnt lgkmcnt(0) +; CHECK-NEXT:    s_cmpk_eq_i32 s1, 0x100 +; CHECK-NEXT:    s_cselect_b64 s[2:3], -1, 0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  ; %bb.1: ; %if.then +; CHECK-NEXT:    s_cmp_eq_u32 s0, 0 +; CHECK-NEXT:    s_cselect_b64 s[2:3], -1, 0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  .LBB1_2: ; %if.end6.sink.split +; CHECK-NEXT:    s_load_dwordx2 s[2:3], s[8:9], 0x8 +; CHECK-NEXT:    v_lshlrev_b32_e32 v0, 2, v0 +; CHECK-NEXT:    v_mov_b32_e32 v1, s0 +; CHECK-NEXT:    s_waitcnt lgkmcnt(0) +; CHECK-NEXT:    global_store_dword v0, v1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  .LBB1_3: ; Inline asm indirect target +; CHECK-NEXT:    ; %UnifiedReturnBlock +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_endpgm +; CHECK-NEXT:  .LBB1_4: ; Inline asm indirect target +; CHECK-NEXT:    ; %if.else +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    v_cmp_gt_u32_e32 vcc, 10, v0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:  ; %bb.5: ; %if.then3 +; CHECK-NEXT:    s_cmp_eq_u32 s0, 0 +; CHECK-NEXT:    s_cselect_b64 s[2:3], -1, 0 +; CHECK-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s[2:3] +; CHECK-NEXT:    ;;#ASMSTART +; CHECK-NEXT:    ;;#ASMEND +; CHECK-NEXT:    s_branch .LBB1_2 +; CHECK-NEXT:  .LBB1_6: ; Inline asm indirect target +; CHECK-NEXT:    ; %cond.false.i8 +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:  .LBB1_7: ; Inline asm indirect target +; CHECK-NEXT:    ; %cond.false +; CHECK-NEXT:    ; Label of block must be emitted +; CHECK-NEXT:    s_trap 2 +; CHECK-NEXT:    ; divergent unreachable +; CHECK-NEXT:    s_branch .LBB1_3 +; UNIFY-LABEL: @kernel_callbr( +; UNIFY-NEXT:  entry: +; UNIFY-NEXT:    [[TID:%.*]] = call i32 @llvm.amdgcn.workitem.id.x() +; UNIFY-NEXT:    [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 256 +; UNIFY-NEXT:    [[CMP32:%.*]] = zext i1 [[CMP]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP32]]) +; UNIFY-NEXT:            to label [[IF_THEN:%.*]] [label %if.else] +; UNIFY:       if.then: +; UNIFY-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0 +; UNIFY-NEXT:    [[CMP1_32:%.*]] = zext i1 [[CMP1]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP1_32]]) +; UNIFY-NEXT:            to label [[IF_END6_SINK_SPLIT:%.*]] [label %cond.false] +; UNIFY:       cond.false: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.else: +; UNIFY-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[TID]], 10 +; UNIFY-NEXT:    [[CMP2_32:%.*]] = zext i1 [[CMP2]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP2_32]]) +; UNIFY-NEXT:            to label [[IF_THEN3:%.*]] [label %if.end6] +; UNIFY:       if.then3: +; UNIFY-NEXT:    [[CMP1_I7:%.*]] = icmp eq i32 [[A]], 0 +; UNIFY-NEXT:    [[CMP1_I7_32:%.*]] = zext i1 [[CMP1_I7]] to i32 +; UNIFY-NEXT:    callbr void asm "", "r,!i"(i32 [[CMP1_I7_32]]) +; UNIFY-NEXT:            to label [[IF_END6_SINK_SPLIT]] [label %cond.false.i8] +; UNIFY:       cond.false.i8: +; UNIFY-NEXT:    call void @llvm.trap() +; UNIFY-NEXT:    unreachable +; UNIFY:       if.end6.sink.split: +; UNIFY-NEXT:    [[X1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[X:%.*]], i32 [[TID]] +; UNIFY-NEXT:    store i32 [[A]], ptr addrspace(1) [[X1]], align 4 +; UNIFY-NEXT:    callbr void asm "", ""() +; UNIFY-NEXT:            to label [[IF_END6:%.*]] [] +; UNIFY:       if.end6: +; UNIFY-NEXT:    ret void +; +entry: +  %tid = call i32 @llvm.amdgcn.workitem.id.x() +  %cmp = icmp eq i32 %n, 256 +  %cmp32 = zext i1 %cmp to i32 +  callbr void asm "", "r,!i"(i32 %cmp32) to label %if.then [label %if.else] + +if.then: +  %cmp1 = icmp eq i32 %a, 0 +  %cmp1_32 = zext i1 %cmp1 to i32 +  callbr void asm "", "r,!i"(i32 %cmp1_32) to label %if.end6.sink.split [label %cond.false] + +cond.false: +  call void @llvm.trap() +  unreachable + +if.else: +  %cmp2 = icmp ult i32 %tid, 10 +  %cmp2_32 = zext i1 %cmp2 to i32 +  callbr void asm "", "r,!i"(i32 %cmp2_32) to label %if.then3 [label %if.end6] + +if.then3: +  %cmp1.i7 = icmp eq i32 %a, 0 +  %cmp1.i7_32 = zext i1 %cmp1.i7 to i32 +  callbr void asm "", "r,!i"(i32 %cmp1.i7_32) to label %if.end6.sink.split [label %cond.false.i8] + +cond.false.i8: +  call void @llvm.trap() +  unreachable + +if.end6.sink.split: +  %x1 = getelementptr inbounds i32, ptr addrspace(1) %x, i32 %tid +  store i32 %a, ptr addrspace(1) %x1, align 4 +  callbr void asm "", ""() to label %if.end6 [] + +if.end6: +  ret void +} diff --git a/llvm/test/CodeGen/AMDGPU/update-phi.ll b/llvm/test/CodeGen/AMDGPU/update-phi.ll index 50666be..684dc1a 100644 --- a/llvm/test/CodeGen/AMDGPU/update-phi.ll +++ b/llvm/test/CodeGen/AMDGPU/update-phi.ll @@ -37,3 +37,42 @@ n28:                                               ; preds = %.loopexit, %n28  n31:                                               ; preds =    ret void  } + +define amdgpu_ps void @_amdgpu_ps_main_callbr() local_unnamed_addr #3 { +; IR-LABEL: @_amdgpu_ps_main_callbr( +; IR-NEXT:  .entry: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[DOTLOOPEXIT:%.*]] [] +; IR:       .loopexit: +; IR-NEXT:    callbr void asm "", ""() +; IR-NEXT:            to label [[N28:%.*]] [] +; IR:       n28: +; IR-NEXT:    [[DOT01:%.*]] = phi float [ 0.000000e+00, [[DOTLOOPEXIT]] ], [ [[N29:%.*]], [[TRANSITIONBLOCK:%.*]] ] +; IR-NEXT:    [[N29]] = fadd float [[DOT01]], 1.000000e+00 +; IR-NEXT:    [[N30:%.*]] = fcmp ogt float [[N29]], 4.000000e+00 +; IR-NEXT:    [[N30_32:%.*]] = zext i1 [[N30]] to i32 +; IR-NEXT:    br i1 true, label [[TRANSITIONBLOCK]], label [[DUMMYRETURNBLOCK:%.*]] +; IR:       TransitionBlock: +; IR-NEXT:    callbr void asm "", "r,!i"(i32 [[N30_32]]) +; IR-NEXT:            to label [[DOTLOOPEXIT]] [label %n28] +; IR:       n31: +; IR-NEXT:    ret void +; IR:       DummyReturnBlock: +; IR-NEXT:    ret void +; +.entry: +  callbr void asm "", ""() to label %.loopexit [] + +.loopexit:                                        ; preds = %n28, %.entry +  callbr void asm "", ""() to label %n28 [] + +n28:                                               ; preds = %.loopexit, %n28 +  %.01 = phi float [ 0.000000e+00, %.loopexit ], [ %n29, %n28 ] +  %n29 = fadd float %.01, 1.0 +  %n30 = fcmp ogt float %n29, 4.000000e+00 +  %n30.32 = zext i1 %n30 to i32 +  callbr void asm "", "r,!i"(i32 %n30.32) to label %.loopexit [label %n28] + +n31:                                               ; preds = +  ret void +} diff --git a/llvm/test/CodeGen/BPF/bpf_trap.ll b/llvm/test/CodeGen/BPF/bpf_trap.ll new file mode 100644 index 0000000..ab8df5f --- /dev/null +++ b/llvm/test/CodeGen/BPF/bpf_trap.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s | FileCheck %s +; +target triple = "bpf" + +define i32 @test(i8 %x) { +entry: +  %0 = and i8 %x, 3 +  switch i8 %0, label %default.unreachable4 [ +    i8 0, label %return +    i8 1, label %sw.bb1 +    i8 2, label %sw.bb2 +    i8 3, label %sw.bb3 +  ] + +sw.bb1:                                           ; preds = %entry +  br label %return + +sw.bb2:                                           ; preds = %entry +  br label %return + +sw.bb3:                                           ; preds = %entry +  br label %return + +default.unreachable4:                             ; preds = %entry +  unreachable + +return:                                           ; preds = %entry, %sw.bb3, %sw.bb2, %sw.bb1 +  %retval.0 = phi i32 [ 12, %sw.bb1 ], [ 43, %sw.bb2 ], [ 54, %sw.bb3 ], [ 32, %entry ] +  ret i32 %retval.0 +} + +; CHECK-NOT: __bpf_trap diff --git a/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll b/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll index 48ec98c..8e08e1e 100644 --- a/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll +++ b/llvm/test/CodeGen/LoongArch/lasx/fp-max-min.ll @@ -5,40 +5,10 @@  define void @minnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v8f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 5 -; CHECK-NEXT:    xvpickve.w $xr3, $xr1, 5 -; CHECK-NEXT:    fmin.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 4 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 4 -; CHECK-NEXT:    fmin.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 6 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 6 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 7 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 7 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 48 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 1 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.w $xr4, $xr0, 0 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 0 -; CHECK-NEXT:    fmin.s $fa4, $fa5, $fa4 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 2 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 2 -; CHECK-NEXT:    fmin.s $fa2, $fa5, $fa2 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    xvpickve.w $xr1, $xr1, 3 -; CHECK-NEXT:    fmin.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr4, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr4, $xr3, 2 -; CHECK-NEXT:    xvst $xr4, $a0, 0 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmin.s $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %x @@ -51,23 +21,9 @@ entry:  define void @minnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v4f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 3 -; CHECK-NEXT:    xvpickve.d $xr3, $xr1, 3 -; CHECK-NEXT:    fmin.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.d $xr3, $xr0, 2 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 2 -; CHECK-NEXT:    fmin.d $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.d $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 1 -; CHECK-NEXT:    fmin.d $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr1, 0 -; CHECK-NEXT:    fmin.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr3, 2 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmin.d $xr0, $xr0, $xr1  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -81,40 +37,10 @@ entry:  define void @maxnum_v8f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v8f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 5 -; CHECK-NEXT:    xvpickve.w $xr3, $xr1, 5 -; CHECK-NEXT:    fmax.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.w $xr3, $xr0, 4 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 4 -; CHECK-NEXT:    fmax.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 6 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 6 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 7 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 7 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 48 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.w $xr4, $xr1, 1 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.w $xr4, $xr0, 0 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 0 -; CHECK-NEXT:    fmax.s $fa4, $fa5, $fa4 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 16 -; CHECK-NEXT:    xvpickve.w $xr2, $xr0, 2 -; CHECK-NEXT:    xvpickve.w $xr5, $xr1, 2 -; CHECK-NEXT:    fmax.s $fa2, $fa5, $fa2 -; CHECK-NEXT:    vextrins.w $vr4, $vr2, 32 -; CHECK-NEXT:    xvpickve.w $xr0, $xr0, 3 -; CHECK-NEXT:    xvpickve.w $xr1, $xr1, 3 -; CHECK-NEXT:    fmax.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr4, $vr0, 48 -; CHECK-NEXT:    xvpermi.q $xr4, $xr3, 2 -; CHECK-NEXT:    xvst $xr4, $a0, 0 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmax.s $xr0, $xr0, $xr1 +; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <8 x float>, ptr %x @@ -127,23 +53,9 @@ entry:  define void @maxnum_v4f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v4f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    xvld $xr0, $a2, 0 -; CHECK-NEXT:    xvld $xr1, $a1, 0 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 3 -; CHECK-NEXT:    xvpickve.d $xr3, $xr1, 3 -; CHECK-NEXT:    fmax.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    xvpickve.d $xr3, $xr0, 2 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 2 -; CHECK-NEXT:    fmax.d $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.d $vr3, $vr2, 16 -; CHECK-NEXT:    xvpickve.d $xr2, $xr0, 1 -; CHECK-NEXT:    xvpickve.d $xr4, $xr1, 1 -; CHECK-NEXT:    fmax.d $fa2, $fa4, $fa2 -; CHECK-NEXT:    xvpickve.d $xr0, $xr0, 0 -; CHECK-NEXT:    xvpickve.d $xr1, $xr1, 0 -; CHECK-NEXT:    fmax.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 -; CHECK-NEXT:    xvpermi.q $xr0, $xr3, 2 +; CHECK-NEXT:    xvld $xr0, $a1, 0 +; CHECK-NEXT:    xvld $xr1, $a2, 0 +; CHECK-NEXT:    xvfmax.d $xr0, $xr0, $xr1  ; CHECK-NEXT:    xvst $xr0, $a0, 0  ; CHECK-NEXT:    ret  entry: diff --git a/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll b/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll index 27ecb75..c173092 100644 --- a/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll +++ b/llvm/test/CodeGen/LoongArch/lsx/fp-max-min.ll @@ -5,24 +5,10 @@  define void @minnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v4f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr3, $vr1, 1 -; CHECK-NEXT:    fmin.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.w $vr3, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 0 -; CHECK-NEXT:    fmin.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 2 -; CHECK-NEXT:    fmin.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 3 -; CHECK-NEXT:    fmin.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    vst $vr3, $a0, 0 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmin.s $vr0, $vr0, $vr1 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %x @@ -35,15 +21,9 @@ entry:  define void @minnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: minnum_v2f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr3, $vr1, 1 -; CHECK-NEXT:    fmin.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    fmin.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmin.d $vr0, $vr0, $vr1  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: @@ -57,24 +37,10 @@ entry:  define void @maxnum_v4f32(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v4f32:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.w $vr3, $vr1, 1 -; CHECK-NEXT:    fmax.s $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.w $vr3, $vr0, 0 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 0 -; CHECK-NEXT:    fmax.s $fa3, $fa4, $fa3 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 16 -; CHECK-NEXT:    vreplvei.w $vr2, $vr0, 2 -; CHECK-NEXT:    vreplvei.w $vr4, $vr1, 2 -; CHECK-NEXT:    fmax.s $fa2, $fa4, $fa2 -; CHECK-NEXT:    vextrins.w $vr3, $vr2, 32 -; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3 -; CHECK-NEXT:    vreplvei.w $vr1, $vr1, 3 -; CHECK-NEXT:    fmax.s $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.w $vr3, $vr0, 48 -; CHECK-NEXT:    vst $vr3, $a0, 0 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmax.s $vr0, $vr0, $vr1 +; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry:    %v0 = load <4 x float>, ptr %x @@ -87,15 +53,9 @@ entry:  define void @maxnum_v2f64(ptr %res, ptr %x, ptr %y) nounwind {  ; CHECK-LABEL: maxnum_v2f64:  ; CHECK:       # %bb.0: # %entry -; CHECK-NEXT:    vld $vr0, $a2, 0 -; CHECK-NEXT:    vld $vr1, $a1, 0 -; CHECK-NEXT:    vreplvei.d $vr2, $vr0, 1 -; CHECK-NEXT:    vreplvei.d $vr3, $vr1, 1 -; CHECK-NEXT:    fmax.d $fa2, $fa3, $fa2 -; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0 -; CHECK-NEXT:    vreplvei.d $vr1, $vr1, 0 -; CHECK-NEXT:    fmax.d $fa0, $fa1, $fa0 -; CHECK-NEXT:    vextrins.d $vr0, $vr2, 16 +; CHECK-NEXT:    vld $vr0, $a1, 0 +; CHECK-NEXT:    vld $vr1, $a2, 0 +; CHECK-NEXT:    vfmax.d $vr0, $vr0, $vr1  ; CHECK-NEXT:    vst $vr0, $a0, 0  ; CHECK-NEXT:    ret  entry: diff --git a/llvm/test/CodeGen/NVPTX/cmpxchg-unsupported-syncscope.err.ll b/llvm/test/CodeGen/NVPTX/cmpxchg-unsupported-syncscope.err.ll new file mode 100644 index 0000000..d3853e2 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/cmpxchg-unsupported-syncscope.err.ll @@ -0,0 +1,11 @@ +; RUN: not llc -mcpu=sm_100a -mtriple=nvptx64 -mattr=+ptx86 %s 2>&1 | FileCheck %s + +; Test that we get a clear error message when using an unsupported syncscope. + +; CHECK: NVPTX backend does not support syncscope "agent" +; CHECK: Supported syncscopes are: singlethread, <empty string>, block, cluster, device +define i32 @cmpxchg_unsupported_syncscope_agent(ptr %addr, i32 %cmp, i32 %new) { +  %result = cmpxchg ptr %addr, i32 %cmp, i32 %new syncscope("agent") monotonic monotonic +  %value = extractvalue { i32, i1 } %result, 0 +  ret i32 %value +} diff --git a/llvm/test/CodeGen/RISCV/rv64-stackmap-fp.ll b/llvm/test/CodeGen/RISCV/rv64-stackmap-fp.ll new file mode 100644 index 0000000..bf0a2e5 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rv64-stackmap-fp.ll @@ -0,0 +1,41 @@ +; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh < %s | FileCheck %s + +; CHECK-LABEL:  .section	.llvm_stackmaps +; CHECK-NEXT:  __LLVM_StackMaps: +; Header +; CHECK-NEXT:   .byte   3 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   0 +; Num Functions +; CHECK-NEXT:   .word   1 +; Num LargeConstants +; CHECK-NEXT:   .word   0 +; Num Callsites +; CHECK-NEXT:   .word   1 + +; Functions and stack size +; CHECK-NEXT:   .quad   liveArgs +; CHECK-NEXT:   .quad   0 +; CHECK-NEXT:   .quad   1 + +; Spilled stack map values. +; +; Verify 3 stack map entries. +; +; CHECK-LABEL:  .word   .L{{.*}}-liveArgs +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .half   25 +; +; Check that at least one is a spilled entry from SP. +; Location: Indirect SP + ... +; CHECK:        .byte   3 +; CHECK-NEXT:   .byte   0 +; CHECK-NEXT:   .half   8 +; CHECK-NEXT:   .half   2 +; CHECK-NEXT:   .half   0 +; CHECK-NEXT:   .word +define void @liveArgs(double %arg0, double %arg1, double %arg2, double %arg3, double %arg4, double %arg5, double %arg6, double %arg7, double %arg8, double %arg9, double %arg10, double %arg11, double %arg12, double %arg13, double %arg14, double %arg15, double %arg16, double %arg17, double %arg18, double %arg19, double %arg20, double %arg21, double %arg22, double %arg23, half %arg24, half %arg25, half %arg26, half %arg27, half %arg28, bfloat %arg29) { +entry: +  call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 11, i32 28, ptr null, i32 5, double %arg0, double %arg1, double %arg2, double %arg3, double %arg4, double %arg5, double %arg6, double %arg7, double %arg8, double %arg9, double %arg10, double %arg11, double %arg12, double %arg13, double %arg14, double %arg15, double %arg16, double %arg17, double %arg18, double %arg19, double %arg20, double %arg21, double %arg22, double %arg23, half %arg24, half %arg25, half %arg26, half %arg27, half %arg28, bfloat %arg29) +  ret void +} diff --git a/llvm/test/CodeGen/RISCV/rv64-stackmap.ll b/llvm/test/CodeGen/RISCV/rv64-stackmap.ll index c50a0fb3..320a3aa 100644 --- a/llvm/test/CodeGen/RISCV/rv64-stackmap.ll +++ b/llvm/test/CodeGen/RISCV/rv64-stackmap.ll @@ -286,8 +286,8 @@ define void @liveConstant() {  ; CHECK-NEXT:   .half   0  ; CHECK-NEXT:   .half   28  ; -; Check that at least one is a spilled entry from RBP. -; Location: Indirect RBP + ... +; Check that at least one is a spilled entry from SP. +; Location: Indirect SP + ...  ; CHECK:        .byte   3  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8 @@ -307,7 +307,7 @@ entry:  ; CHECK-NEXT:   .half   0  ; 1 location  ; CHECK-NEXT:   .half   1 -; Loc 0: Direct RBP - ofs +; Loc 0: Direct SP + ofs  ; CHECK-NEXT:   .byte   2  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8 @@ -320,14 +320,14 @@ entry:  ; CHECK-NEXT:   .half   0  ; 2 locations  ; CHECK-NEXT:   .half   2 -; Loc 0: Direct RBP - ofs +; Loc 0: Direct SP + ofs  ; CHECK-NEXT:   .byte   2  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8  ; CHECK-NEXT:   .half   2  ; CHECK-NEXT:   .half   0  ; CHECK-NEXT:   .word -; Loc 1: Direct RBP - ofs +; Loc 1: Direct SP + ofs  ; CHECK-NEXT:   .byte   2  ; CHECK-NEXT:   .byte   0  ; CHECK-NEXT:   .half   8 diff --git a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll index 73c46b1..c9b2968 100644 --- a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll +++ b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll @@ -10,6 +10,7 @@  ; CHECK-DAG: %[[#Int8:]] = OpTypeInt 8 0  ; CHECK-DAG: %[[#Half:]] = OpTypeFloat 16 +; CHECK-DAG: %[[#Float:]] = OpTypeFloat 32  ; CHECK-DAG: %[[#Struct:]] = OpTypeStruct %[[#Half]]  ; CHECK-DAG: %[[#Void:]] = OpTypeVoid  ; CHECK-DAG: %[[#PtrInt8:]] = OpTypePointer CrossWorkgroup %[[#Int8:]] @@ -17,12 +18,20 @@  ; CHECK-DAG: %[[#Int64:]] = OpTypeInt 64 0  ; CHECK-DAG: %[[#PtrInt64:]] = OpTypePointer CrossWorkgroup %[[#Int64]]  ; CHECK-DAG: %[[#BarType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt64]] %[[#Struct]] +; CHECK-DAG: %[[#BazType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt8]] %[[#Struct]] %[[#Int8]] %[[#Struct]] %[[#Float]] %[[#Struct]]  ; CHECK: OpFunction %[[#Void]] None %[[#FooType]]  ; CHECK: OpFunctionParameter %[[#PtrInt8]]  ; CHECK: OpFunctionParameter %[[#Struct]]  ; CHECK: OpFunction %[[#Void]] None %[[#BarType]]  ; CHECK: OpFunctionParameter %[[#PtrInt64]]  ; CHECK: OpFunctionParameter %[[#Struct]] +; CHECK: OpFunction %[[#Void]] None %[[#BazType]] +; CHECK: OpFunctionParameter %[[#PtrInt8]] +; CHECK: OpFunctionParameter %[[#Struct]] +; CHECK: OpFunctionParameter %[[#Int8]] +; CHECK: OpFunctionParameter %[[#Struct]] +; CHECK: OpFunctionParameter %[[#Float]] +; CHECK: OpFunctionParameter %[[#Struct]]  %t_half = type { half } @@ -38,4 +47,9 @@ entry:    ret void  } +define spir_kernel void @baz(ptr addrspace(1) %a, %t_half %b, i8 %c, %t_half %d, float %e, %t_half %f) { +entry: +  ret void +} +  declare spir_func %t_half @_Z29__spirv_SpecConstantComposite(half) diff --git a/llvm/test/CodeGen/X86/bittest-big-integer.ll b/llvm/test/CodeGen/X86/bittest-big-integer.ll index 8007d9d..c311ab8 100644 --- a/llvm/test/CodeGen/X86/bittest-big-integer.ll +++ b/llvm/test/CodeGen/X86/bittest-big-integer.ll @@ -203,24 +203,14 @@ define i1 @init_eq_i32(ptr %word, i32 %position, i1 zeroext %value) nounwind {  define i1 @test_ne_i64(ptr %word, i32 %position) nounwind {  ; X86-LABEL: test_ne_i64:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %esi  ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl $1, %edx -; X86-NEXT:    xorl %esi, %esi -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    shll %cl, %edx -; X86-NEXT:    testb $32, %cl -; X86-NEXT:    je .LBB5_2 -; X86-NEXT:  # %bb.1: -; X86-NEXT:    movl %edx, %esi -; X86-NEXT:    xorl %edx, %edx -; X86-NEXT:  .LBB5_2: -; X86-NEXT:    andl 4(%eax), %esi -; X86-NEXT:    andl (%eax), %edx -; X86-NEXT:    orl %esi, %edx -; X86-NEXT:    setne %al -; X86-NEXT:    popl %esi +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl %ecx, %edx +; X86-NEXT:    andl $32, %edx +; X86-NEXT:    shrl $3, %edx +; X86-NEXT:    movl (%eax,%edx), %eax +; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    setb %al  ; X86-NEXT:    retl  ;  ; X64-LABEL: test_ne_i64: @@ -242,38 +232,20 @@ define i1 @test_ne_i64(ptr %word, i32 %position) nounwind {  define i1 @complement_ne_i64(ptr %word, i32 %position) nounwind {  ; X86-LABEL: complement_ne_i64:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx  ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl $1, %eax -; X86-NEXT:    xorl %esi, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    shll %cl, %eax -; X86-NEXT:    testb $32, %cl -; X86-NEXT:    je .LBB6_2 -; X86-NEXT:  # %bb.1: -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    xorl %eax, %eax -; X86-NEXT:  .LBB6_2: -; X86-NEXT:    movl (%edx), %ecx -; X86-NEXT:    movl 4(%edx), %edi -; X86-NEXT:    movl %edi, %ebx -; X86-NEXT:    andl %esi, %ebx -; X86-NEXT:    movl %ecx, %ebp -; X86-NEXT:    andl %eax, %ebp -; X86-NEXT:    xorl %esi, %edi -; X86-NEXT:    xorl %eax, %ecx -; X86-NEXT:    orl %ebx, %ebp -; X86-NEXT:    setne %al -; X86-NEXT:    movl %ecx, (%edx) -; X86-NEXT:    movl %edi, 4(%edx) +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    andl $32, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setb %al +; X86-NEXT:    btcl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ;  ; X64-LABEL: complement_ne_i64: @@ -300,40 +272,20 @@ define i1 @complement_ne_i64(ptr %word, i32 %position) nounwind {  define i1 @reset_eq_i64(ptr %word, i32 %position) nounwind {  ; X86-LABEL: reset_eq_i64:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx  ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl $1, %esi -; X86-NEXT:    xorl %edi, %edi -; X86-NEXT:    shldl %cl, %esi, %edi -; X86-NEXT:    shll %cl, %esi -; X86-NEXT:    testb $32, %cl -; X86-NEXT:    je .LBB7_2 -; X86-NEXT:  # %bb.1: -; X86-NEXT:    movl %esi, %edi -; X86-NEXT:    xorl %esi, %esi -; X86-NEXT:  .LBB7_2: -; X86-NEXT:    movl (%edx), %eax -; X86-NEXT:    movl 4(%edx), %ecx -; X86-NEXT:    movl %ecx, %ebx -; X86-NEXT:    andl %edi, %ebx -; X86-NEXT:    notl %edi -; X86-NEXT:    movl %eax, %ebp -; X86-NEXT:    andl %esi, %ebp -; X86-NEXT:    notl %esi -; X86-NEXT:    andl %ecx, %edi -; X86-NEXT:    andl %eax, %esi -; X86-NEXT:    orl %ebx, %ebp -; X86-NEXT:    sete %al -; X86-NEXT:    movl %esi, (%edx) -; X86-NEXT:    movl %edi, 4(%edx) +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    andl $32, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setae %al +; X86-NEXT:    btrl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ;  ; X64-LABEL: reset_eq_i64: @@ -361,38 +313,20 @@ define i1 @reset_eq_i64(ptr %word, i32 %position) nounwind {  define i1 @set_ne_i64(ptr %word, i32 %position) nounwind {  ; X86-LABEL: set_ne_i64:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx  ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl $1, %eax -; X86-NEXT:    xorl %esi, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    shll %cl, %eax -; X86-NEXT:    testb $32, %cl -; X86-NEXT:    je .LBB8_2 -; X86-NEXT:  # %bb.1: -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    xorl %eax, %eax -; X86-NEXT:  .LBB8_2: -; X86-NEXT:    movl (%edx), %ecx -; X86-NEXT:    movl 4(%edx), %edi -; X86-NEXT:    movl %edi, %ebx -; X86-NEXT:    andl %esi, %ebx -; X86-NEXT:    movl %ecx, %ebp -; X86-NEXT:    andl %eax, %ebp -; X86-NEXT:    orl %esi, %edi -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    orl %ebx, %ebp -; X86-NEXT:    setne %al -; X86-NEXT:    movl %ecx, (%edx) -; X86-NEXT:    movl %edi, 4(%edx) +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    andl $32, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setb %al +; X86-NEXT:    btsl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ;  ; X64-LABEL: set_ne_i64: @@ -419,52 +353,47 @@ define i1 @set_ne_i64(ptr %word, i32 %position) nounwind {  define i1 @init_eq_i64(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-LABEL: init_eq_i64:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp  ; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl $1, %eax -; X86-NEXT:    xorl %edx, %edx -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    shll %cl, %eax -; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %esi +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl $1, %edx +; X86-NEXT:    xorl %esi, %esi +; X86-NEXT:    shldl %cl, %edx, %esi +; X86-NEXT:    shll %cl, %edx +; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax  ; X86-NEXT:    xorl %edi, %edi -; X86-NEXT:    shldl %cl, %esi, %edi -; X86-NEXT:    shll %cl, %esi +; X86-NEXT:    shldl %cl, %eax, %edi +; X86-NEXT:    shll %cl, %eax  ; X86-NEXT:    testb $32, %cl  ; X86-NEXT:    je .LBB9_2  ; X86-NEXT:  # %bb.1: -; X86-NEXT:    movl %eax, %edx -; X86-NEXT:    movl $0, %eax +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    movl $0, %edx  ; X86-NEXT:  .LBB9_2: -; X86-NEXT:    movl %edx, %ebx -; X86-NEXT:    notl %ebx -; X86-NEXT:    movl %eax, %ebp -; X86-NEXT:    notl %ebp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx +; X86-NEXT:    notl %esi +; X86-NEXT:    notl %edx  ; X86-NEXT:    je .LBB9_4  ; X86-NEXT:  # %bb.3: -; X86-NEXT:    movl %esi, %edi -; X86-NEXT:    xorl %esi, %esi +; X86-NEXT:    movl %eax, %edi +; X86-NEXT:    xorl %eax, %eax  ; X86-NEXT:  .LBB9_4: -; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT:    movl 4(%ecx), %ecx -; X86-NEXT:    andl %ecx, %edx -; X86-NEXT:    andl %ecx, %ebx -; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi -; X86-NEXT:    movl (%edi), %ecx -; X86-NEXT:    andl %ecx, %eax -; X86-NEXT:    andl %ecx, %ebp -; X86-NEXT:    orl %esi, %ebp -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl %ebp, (%edi) -; X86-NEXT:    movl %ebx, 4(%edi) -; X86-NEXT:    sete %al +; X86-NEXT:    andl 4(%ebx), %esi +; X86-NEXT:    orl %edi, %esi +; X86-NEXT:    andl (%ebx), %edx +; X86-NEXT:    orl %eax, %edx +; X86-NEXT:    movl %ecx, %eax +; X86-NEXT:    andl $32, %eax +; X86-NEXT:    shrl $3, %eax +; X86-NEXT:    movl (%ebx,%eax), %eax +; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    setae %al +; X86-NEXT:    movl %edx, (%ebx) +; X86-NEXT:    movl %esi, 4(%ebx)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi  ; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ;  ; SSE-LABEL: init_eq_i64: @@ -516,101 +445,25 @@ define i1 @init_eq_i64(ptr %word, i32 %position, i1 zeroext %value) nounwind {  define i1 @test_ne_i128(ptr %word, i32 %position) nounwind {  ; X86-LABEL: test_ne_i128:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx -; X86-NEXT:    pushl %edi -; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $48, %esp -; X86-NEXT:    movzbl 12(%ebp), %ecx -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, (%esp) -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrb $3, %al -; X86-NEXT:    andb $12, %al -; X86-NEXT:    negb %al -; X86-NEXT:    movsbl %al, %esi -; X86-NEXT:    movl 24(%esp,%esi), %edi -; X86-NEXT:    movl 28(%esp,%esi), %eax -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl 16(%esp,%esi), %edx -; X86-NEXT:    movl 20(%esp,%esi), %esi -; X86-NEXT:    shldl %cl, %esi, %edi -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    shll %cl, %edx -; X86-NEXT:    andl 8(%ebx), %edi -; X86-NEXT:    andl (%ebx), %edx -; X86-NEXT:    orl %edi, %edx -; X86-NEXT:    andl 12(%ebx), %eax -; X86-NEXT:    andl 4(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp -; X86-NEXT:    popl %esi -; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl %ecx, %edx +; X86-NEXT:    andl $96, %edx +; X86-NEXT:    shrl $3, %edx +; X86-NEXT:    movl (%eax,%edx), %eax +; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    setb %al  ; X86-NEXT:    retl  ; -; SSE-LABEL: test_ne_i128: -; SSE:       # %bb.0: -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    movl $1, %eax -; SSE-NEXT:    xorl %edx, %edx -; SSE-NEXT:    shldq %cl, %rax, %rdx -; SSE-NEXT:    xorl %esi, %esi -; SSE-NEXT:    shlq %cl, %rax -; SSE-NEXT:    testb $64, %cl -; SSE-NEXT:    cmovneq %rax, %rdx -; SSE-NEXT:    cmovneq %rsi, %rax -; SSE-NEXT:    andq 8(%rdi), %rdx -; SSE-NEXT:    andq (%rdi), %rax -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    setne %al -; SSE-NEXT:    retq -; -; AVX2-LABEL: test_ne_i128: -; AVX2:       # %bb.0: -; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    xorl %eax, %eax -; AVX2-NEXT:    movl $1, %edx -; AVX2-NEXT:    xorl %esi, %esi -; AVX2-NEXT:    shldq %cl, %rdx, %rsi -; AVX2-NEXT:    shlxq %rcx, %rdx, %rdx -; AVX2-NEXT:    testb $64, %cl -; AVX2-NEXT:    cmovneq %rdx, %rsi -; AVX2-NEXT:    cmovneq %rax, %rdx -; AVX2-NEXT:    andq 8(%rdi), %rsi -; AVX2-NEXT:    andq (%rdi), %rdx -; AVX2-NEXT:    orq %rsi, %rdx -; AVX2-NEXT:    setne %al -; AVX2-NEXT:    retq -; -; AVX512-LABEL: test_ne_i128: -; AVX512:       # %bb.0: -; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    movl $1, %eax -; AVX512-NEXT:    xorl %edx, %edx -; AVX512-NEXT:    shldq %cl, %rax, %rdx -; AVX512-NEXT:    xorl %esi, %esi -; AVX512-NEXT:    shlxq %rcx, %rax, %rax -; AVX512-NEXT:    testb $64, %cl -; AVX512-NEXT:    cmovneq %rax, %rdx -; AVX512-NEXT:    cmovneq %rsi, %rax -; AVX512-NEXT:    andq 8(%rdi), %rdx -; AVX512-NEXT:    andq (%rdi), %rax -; AVX512-NEXT:    orq %rdx, %rax -; AVX512-NEXT:    setne %al -; AVX512-NEXT:    retq +; X64-LABEL: test_ne_i128: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %eax +; X64-NEXT:    andl $96, %eax +; X64-NEXT:    shrl $3, %eax +; X64-NEXT:    movl (%rdi,%rax), %eax +; X64-NEXT:    btl %esi, %eax +; X64-NEXT:    setb %al +; X64-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128    %bit = shl nuw i128 1, %ofs @@ -623,124 +476,33 @@ define i1 @test_ne_i128(ptr %word, i32 %position) nounwind {  define i1 @complement_ne_i128(ptr %word, i32 %position) nounwind {  ; X86-LABEL: complement_ne_i128:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $80, %esp -; X86-NEXT:    movzbl 12(%ebp), %ecx -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrb $3, %al -; X86-NEXT:    andb $12, %al -; X86-NEXT:    negb %al -; X86-NEXT:    movsbl %al, %eax -; X86-NEXT:    movl 56(%esp,%eax), %esi -; X86-NEXT:    movl 60(%esp,%eax), %edx -; X86-NEXT:    shldl %cl, %esi, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%esp,%eax), %edi -; X86-NEXT:    movl 52(%esp,%eax), %ebx -; X86-NEXT:    shldl %cl, %ebx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %ebx -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    shll %cl, %edi -; X86-NEXT:    movl %eax, %ecx -; X86-NEXT:    movl 8(%eax), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %eax -; X86-NEXT:    movl (%ecx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %ecx, %esi -; X86-NEXT:    movl %edx, %ecx -; X86-NEXT:    andl %edi, %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl 12(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 4(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %eax -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    movl %edx, 8(%eax) -; X86-NEXT:    movl %esi, 12(%eax) -; X86-NEXT:    movl %edi, (%eax) -; X86-NEXT:    movl %ebx, 4(%eax) -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    andl $96, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setb %al +; X86-NEXT:    btcl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ; -; SSE-LABEL: complement_ne_i128: -; SSE:       # %bb.0: -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    movl $1, %edx -; SSE-NEXT:    xorl %esi, %esi -; SSE-NEXT:    shldq %cl, %rdx, %rsi -; SSE-NEXT:    shlq %cl, %rdx -; SSE-NEXT:    xorl %eax, %eax -; SSE-NEXT:    testb $64, %cl -; SSE-NEXT:    cmovneq %rdx, %rsi -; SSE-NEXT:    cmovneq %rax, %rdx -; SSE-NEXT:    movq (%rdi), %rax -; SSE-NEXT:    movq 8(%rdi), %rcx -; SSE-NEXT:    movq %rcx, %r8 -; SSE-NEXT:    andq %rsi, %r8 -; SSE-NEXT:    movq %rax, %r9 -; SSE-NEXT:    andq %rdx, %r9 -; SSE-NEXT:    xorq %rcx, %rsi -; SSE-NEXT:    xorq %rax, %rdx -; SSE-NEXT:    orq %r8, %r9 -; SSE-NEXT:    setne %al -; SSE-NEXT:    movq %rdx, (%rdi) -; SSE-NEXT:    movq %rsi, 8(%rdi) -; SSE-NEXT:    retq -; -; AVX-LABEL: complement_ne_i128: -; AVX:       # %bb.0: -; AVX-NEXT:    movl %esi, %ecx -; AVX-NEXT:    xorl %eax, %eax -; AVX-NEXT:    movl $1, %edx -; AVX-NEXT:    xorl %esi, %esi -; AVX-NEXT:    shldq %cl, %rdx, %rsi -; AVX-NEXT:    shlxq %rcx, %rdx, %rdx -; AVX-NEXT:    testb $64, %cl -; AVX-NEXT:    cmovneq %rdx, %rsi -; AVX-NEXT:    cmovneq %rax, %rdx -; AVX-NEXT:    movq (%rdi), %rax -; AVX-NEXT:    movq 8(%rdi), %rcx -; AVX-NEXT:    movq %rcx, %r8 -; AVX-NEXT:    andq %rsi, %r8 -; AVX-NEXT:    movq %rax, %r9 -; AVX-NEXT:    andq %rdx, %r9 -; AVX-NEXT:    xorq %rcx, %rsi -; AVX-NEXT:    xorq %rax, %rdx -; AVX-NEXT:    orq %r8, %r9 -; AVX-NEXT:    setne %al -; AVX-NEXT:    movq %rdx, (%rdi) -; AVX-NEXT:    movq %rsi, 8(%rdi) -; AVX-NEXT:    retq +; X64-LABEL: complement_ne_i128: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %ecx +; X64-NEXT:    andl $96, %ecx +; X64-NEXT:    shrl $3, %ecx +; X64-NEXT:    movl (%rdi,%rcx), %edx +; X64-NEXT:    btl %esi, %edx +; X64-NEXT:    setb %al +; X64-NEXT:    btcl %esi, %edx +; X64-NEXT:    movl %edx, (%rdi,%rcx) +; X64-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128    %bit = shl nuw i128 1, %ofs @@ -755,124 +517,33 @@ define i1 @complement_ne_i128(ptr %word, i32 %position) nounwind {  define i1 @reset_eq_i128(ptr %word, i32 %position) nounwind {  ; X86-LABEL: reset_eq_i128:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $80, %esp -; X86-NEXT:    movzbl 12(%ebp), %ecx -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrb $3, %al -; X86-NEXT:    andb $12, %al -; X86-NEXT:    negb %al -; X86-NEXT:    movsbl %al, %eax -; X86-NEXT:    movl 56(%esp,%eax), %edx -; X86-NEXT:    movl 60(%esp,%eax), %esi -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%esp,%eax), %esi -; X86-NEXT:    movl 52(%esp,%eax), %edi -; X86-NEXT:    shldl %cl, %edi, %edx -; X86-NEXT:    shldl %cl, %esi, %edi -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    shll %cl, %esi -; X86-NEXT:    movl 8(%ebx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %eax -; X86-NEXT:    movl (%ebx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%ebx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl %edi, %ecx -; X86-NEXT:    movl 4(%ebx), %ebx -; X86-NEXT:    andl %ebx, %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    notl %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    notl %ecx -; X86-NEXT:    andl %ebx, %ecx -; X86-NEXT:    notl %esi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl 8(%ebp), %edi -; X86-NEXT:    movl %edx, 8(%edi) -; X86-NEXT:    movl %eax, 12(%edi) -; X86-NEXT:    movl %esi, (%edi) -; X86-NEXT:    movl %ecx, 4(%edi) -; X86-NEXT:    sete %al -; X86-NEXT:    leal -12(%ebp), %esp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    andl $96, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setae %al +; X86-NEXT:    btrl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ; -; SSE-LABEL: reset_eq_i128: -; SSE:       # %bb.0: -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    movl $1, %edx -; SSE-NEXT:    xorl %esi, %esi -; SSE-NEXT:    shldq %cl, %rdx, %rsi -; SSE-NEXT:    xorl %eax, %eax -; SSE-NEXT:    shlq %cl, %rdx -; SSE-NEXT:    testb $64, %cl -; SSE-NEXT:    cmovneq %rdx, %rsi -; SSE-NEXT:    cmovneq %rax, %rdx -; SSE-NEXT:    movq (%rdi), %rax -; SSE-NEXT:    movq 8(%rdi), %rcx -; SSE-NEXT:    movq %rcx, %r8 -; SSE-NEXT:    andq %rsi, %r8 -; SSE-NEXT:    notq %rsi -; SSE-NEXT:    movq %rax, %r9 -; SSE-NEXT:    andq %rdx, %r9 -; SSE-NEXT:    notq %rdx -; SSE-NEXT:    andq %rcx, %rsi -; SSE-NEXT:    andq %rax, %rdx -; SSE-NEXT:    orq %r8, %r9 -; SSE-NEXT:    sete %al -; SSE-NEXT:    movq %rdx, (%rdi) -; SSE-NEXT:    movq %rsi, 8(%rdi) -; SSE-NEXT:    retq -; -; AVX-LABEL: reset_eq_i128: -; AVX:       # %bb.0: -; AVX-NEXT:    movl %esi, %ecx -; AVX-NEXT:    xorl %eax, %eax -; AVX-NEXT:    movl $1, %edx -; AVX-NEXT:    xorl %esi, %esi -; AVX-NEXT:    shldq %cl, %rdx, %rsi -; AVX-NEXT:    shlxq %rcx, %rdx, %rdx -; AVX-NEXT:    testb $64, %cl -; AVX-NEXT:    cmovneq %rdx, %rsi -; AVX-NEXT:    cmovneq %rax, %rdx -; AVX-NEXT:    movq (%rdi), %rax -; AVX-NEXT:    movq 8(%rdi), %rcx -; AVX-NEXT:    andnq %rcx, %rsi, %r8 -; AVX-NEXT:    andq %rsi, %rcx -; AVX-NEXT:    andnq %rax, %rdx, %rsi -; AVX-NEXT:    andq %rdx, %rax -; AVX-NEXT:    orq %rcx, %rax -; AVX-NEXT:    sete %al -; AVX-NEXT:    movq %rsi, (%rdi) -; AVX-NEXT:    movq %r8, 8(%rdi) -; AVX-NEXT:    retq +; X64-LABEL: reset_eq_i128: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %ecx +; X64-NEXT:    andl $96, %ecx +; X64-NEXT:    shrl $3, %ecx +; X64-NEXT:    movl (%rdi,%rcx), %edx +; X64-NEXT:    btl %esi, %edx +; X64-NEXT:    setae %al +; X64-NEXT:    btrl %esi, %edx +; X64-NEXT:    movl %edx, (%rdi,%rcx) +; X64-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128    %bit = shl nuw i128 1, %ofs @@ -888,124 +559,33 @@ define i1 @reset_eq_i128(ptr %word, i32 %position) nounwind {  define i1 @set_ne_i128(ptr %word, i32 %position) nounwind {  ; X86-LABEL: set_ne_i128:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $80, %esp -; X86-NEXT:    movzbl 12(%ebp), %ecx -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrb $3, %al -; X86-NEXT:    andb $12, %al -; X86-NEXT:    negb %al -; X86-NEXT:    movsbl %al, %eax -; X86-NEXT:    movl 56(%esp,%eax), %esi -; X86-NEXT:    movl 60(%esp,%eax), %edx -; X86-NEXT:    shldl %cl, %esi, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%esp,%eax), %edi -; X86-NEXT:    movl 52(%esp,%eax), %ebx -; X86-NEXT:    shldl %cl, %ebx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %ebx -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    shll %cl, %edi -; X86-NEXT:    movl %eax, %ecx -; X86-NEXT:    movl 8(%eax), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %eax -; X86-NEXT:    movl (%ecx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %ecx, %esi -; X86-NEXT:    movl %edx, %ecx -; X86-NEXT:    andl %edi, %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl 12(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 4(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %eax -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    movl %edx, 8(%eax) -; X86-NEXT:    movl %esi, 12(%eax) -; X86-NEXT:    movl %edi, (%eax) -; X86-NEXT:    movl %ebx, 4(%eax) -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    andl $96, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setb %al +; X86-NEXT:    btsl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ; -; SSE-LABEL: set_ne_i128: -; SSE:       # %bb.0: -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    movl $1, %edx -; SSE-NEXT:    xorl %esi, %esi -; SSE-NEXT:    shldq %cl, %rdx, %rsi -; SSE-NEXT:    shlq %cl, %rdx -; SSE-NEXT:    xorl %eax, %eax -; SSE-NEXT:    testb $64, %cl -; SSE-NEXT:    cmovneq %rdx, %rsi -; SSE-NEXT:    cmovneq %rax, %rdx -; SSE-NEXT:    movq (%rdi), %rax -; SSE-NEXT:    movq 8(%rdi), %rcx -; SSE-NEXT:    movq %rcx, %r8 -; SSE-NEXT:    andq %rsi, %r8 -; SSE-NEXT:    movq %rax, %r9 -; SSE-NEXT:    andq %rdx, %r9 -; SSE-NEXT:    orq %rcx, %rsi -; SSE-NEXT:    orq %rax, %rdx -; SSE-NEXT:    orq %r8, %r9 -; SSE-NEXT:    setne %al -; SSE-NEXT:    movq %rdx, (%rdi) -; SSE-NEXT:    movq %rsi, 8(%rdi) -; SSE-NEXT:    retq -; -; AVX-LABEL: set_ne_i128: -; AVX:       # %bb.0: -; AVX-NEXT:    movl %esi, %ecx -; AVX-NEXT:    xorl %eax, %eax -; AVX-NEXT:    movl $1, %edx -; AVX-NEXT:    xorl %esi, %esi -; AVX-NEXT:    shldq %cl, %rdx, %rsi -; AVX-NEXT:    shlxq %rcx, %rdx, %rdx -; AVX-NEXT:    testb $64, %cl -; AVX-NEXT:    cmovneq %rdx, %rsi -; AVX-NEXT:    cmovneq %rax, %rdx -; AVX-NEXT:    movq (%rdi), %rax -; AVX-NEXT:    movq 8(%rdi), %rcx -; AVX-NEXT:    movq %rcx, %r8 -; AVX-NEXT:    andq %rsi, %r8 -; AVX-NEXT:    movq %rax, %r9 -; AVX-NEXT:    andq %rdx, %r9 -; AVX-NEXT:    orq %rcx, %rsi -; AVX-NEXT:    orq %rax, %rdx -; AVX-NEXT:    orq %r8, %r9 -; AVX-NEXT:    setne %al -; AVX-NEXT:    movq %rdx, (%rdi) -; AVX-NEXT:    movq %rsi, 8(%rdi) -; AVX-NEXT:    retq +; X64-LABEL: set_ne_i128: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %ecx +; X64-NEXT:    andl $96, %ecx +; X64-NEXT:    shrl $3, %ecx +; X64-NEXT:    movl (%rdi,%rcx), %edx +; X64-NEXT:    btl %esi, %edx +; X64-NEXT:    setb %al +; X64-NEXT:    btsl %esi, %edx +; X64-NEXT:    movl %edx, (%rdi,%rcx) +; X64-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128    %bit = shl nuw i128 1, %ofs @@ -1026,9 +606,9 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi  ; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $128, %esp -; X86-NEXT:    movzbl 12(%ebp), %ecx -; X86-NEXT:    movzbl 16(%ebp), %eax +; X86-NEXT:    subl $96, %esp +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    movzbl 16(%ebp), %ebx  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) @@ -1037,25 +617,30 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl %ecx, %edx -; X86-NEXT:    shrb $3, %dl -; X86-NEXT:    andb $12, %dl -; X86-NEXT:    negb %dl -; X86-NEXT:    movsbl %dl, %esi -; X86-NEXT:    movl 64(%esp,%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 68(%esp,%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 72(%esp,%esi), %ebx +; X86-NEXT:    movl %ecx, %eax +; X86-NEXT:    shrb $3, %al +; X86-NEXT:    andb $12, %al +; X86-NEXT:    negb %al +; X86-NEXT:    movsbl %al, %eax +; X86-NEXT:    movl 64(%esp,%eax), %edx +; X86-NEXT:    movl 68(%esp,%eax), %esi  ; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movzbl %al, %eax -; X86-NEXT:    movl 76(%esp,%esi), %edi +; X86-NEXT:    movl %eax, %esi +; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill +; X86-NEXT:    movzbl %bl, %eax +; X86-NEXT:    movl 72(%esp,%esi), %ebx +; X86-NEXT:    movl 76(%esp,%esi), %esi  ; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp) -; X86-NEXT:    movl %ebx, %eax +; X86-NEXT:    movl %ebx, %edi +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %edi +; X86-NEXT:    shldl %cl, %ebx, %esi +; X86-NEXT:    movl %edx, %ebx +; X86-NEXT:    shll %cl, %ebx +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx  ; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    shldl %cl, %ebx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shll %cl, %edx +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    notl %edi  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) @@ -1063,72 +648,59 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 8(%ebp), %esi +; X86-NEXT:    movl (%esp), %ecx # 4-byte Reload +; X86-NEXT:    movl 36(%esp,%ecx), %eax  ; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%esi), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %eax +; X86-NEXT:    movl 40(%esp,%ecx), %edx  ; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%esi), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    shldl %cl, %eax, %edx +; X86-NEXT:    movl 8(%ebp), %eax +; X86-NEXT:    andl 8(%eax), %edi +; X86-NEXT:    orl %edx, %edi +; X86-NEXT:    notl %esi +; X86-NEXT:    movl (%esp), %eax # 4-byte Reload +; X86-NEXT:    movl 44(%esp,%eax), %eax +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload  ; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %edi, %esi  ; X86-NEXT:    movl 8(%ebp), %ecx -; X86-NEXT:    movl 12(%ecx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %edi -; X86-NEXT:    movl %eax, %ebx -; X86-NEXT:    movl %eax, %edx -; X86-NEXT:    movl 4(%ecx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %ebx -; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    notl %ecx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl 100(%esp,%ecx), %edi -; X86-NEXT:    movl 104(%esp,%ecx), %ecx -; X86-NEXT:    movl %ecx, %ebx -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    movzbl 12(%ebp), %ecx -; X86-NEXT:    shldl %cl, %edi, %ebx -; X86-NEXT:    orl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    notl %esi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    movl 108(%esp,%ebx), %ebx -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    notl %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    movl 96(%esp,%ebx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shll %cl, %ebx -; X86-NEXT:    orl %ebx, %eax +; X86-NEXT:    andl 12(%ecx), %esi +; X86-NEXT:    orl %eax, %esi +; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl (%esp), %eax # 4-byte Reload +; X86-NEXT:    movl 32(%esp,%eax), %edx +; X86-NEXT:    movl %edx, (%esp) # 4-byte Spill +; X86-NEXT:    movl 12(%ebp), %ecx +; X86-NEXT:    shll %cl, %edx +; X86-NEXT:    movl 8(%ebp), %eax +; X86-NEXT:    andl (%eax), %ebx +; X86-NEXT:    orl %edx, %ebx +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload  ; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    shldl %cl, %ebx, %edi -; X86-NEXT:    orl %edi, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload +; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl (%esp), %esi # 4-byte Reload +; X86-NEXT:    shldl %cl, %esi, %eax  ; X86-NEXT:    movl 8(%ebp), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload +; X86-NEXT:    andl 4(%ecx), %edx +; X86-NEXT:    orl %eax, %edx +; X86-NEXT:    movl 12(%ebp), %esi +; X86-NEXT:    movl %esi, %eax +; X86-NEXT:    andl $96, %eax +; X86-NEXT:    shrl $3, %eax +; X86-NEXT:    movl (%ecx,%eax), %eax +; X86-NEXT:    btl %esi, %eax +; X86-NEXT:    movl %ecx, %eax  ; X86-NEXT:    movl %edi, 8(%ecx) -; X86-NEXT:    movl %esi, 12(%ecx) -; X86-NEXT:    movl %eax, (%ecx) -; X86-NEXT:    movl %edx, 4(%ecx) -; X86-NEXT:    sete %al +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT:    movl %ecx, 12(%eax) +; X86-NEXT:    movl %ebx, (%eax) +; X86-NEXT:    movl %edx, 4(%eax) +; X86-NEXT:    setae %al  ; X86-NEXT:    leal -12(%ebp), %esp  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi @@ -1151,22 +723,20 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; SSE-NEXT:    testb $64, %cl  ; SSE-NEXT:    cmovneq %rsi, %r8  ; SSE-NEXT:    cmovneq %r9, %rsi +; SSE-NEXT:    notq %r8  ; SSE-NEXT:    cmovneq %rax, %rdx  ; SSE-NEXT:    cmovneq %r9, %rax -; SSE-NEXT:    movq (%rdi), %rcx -; SSE-NEXT:    movq 8(%rdi), %r9 -; SSE-NEXT:    movq %r9, %r10 -; SSE-NEXT:    andq %r8, %r10 -; SSE-NEXT:    notq %r8 -; SSE-NEXT:    movq %rcx, %r11 -; SSE-NEXT:    andq %rsi, %r11  ; SSE-NEXT:    notq %rsi -; SSE-NEXT:    andq %r9, %r8 +; SSE-NEXT:    andq 8(%rdi), %r8  ; SSE-NEXT:    orq %rdx, %r8 -; SSE-NEXT:    andq %rcx, %rsi +; SSE-NEXT:    andq (%rdi), %rsi  ; SSE-NEXT:    orq %rax, %rsi -; SSE-NEXT:    orq %r10, %r11 -; SSE-NEXT:    sete %al +; SSE-NEXT:    movl %ecx, %eax +; SSE-NEXT:    andl $96, %eax +; SSE-NEXT:    shrl $3, %eax +; SSE-NEXT:    movl (%rdi,%rax), %eax +; SSE-NEXT:    btl %ecx, %eax +; SSE-NEXT:    setae %al  ; SSE-NEXT:    movq %rsi, (%rdi)  ; SSE-NEXT:    movq %r8, 8(%rdi)  ; SSE-NEXT:    retq @@ -1174,63 +744,63 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; AVX2-LABEL: init_eq_i128:  ; AVX2:       # %bb.0:  ; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    movl $1, %esi -; AVX2-NEXT:    xorl %eax, %eax -; AVX2-NEXT:    shldq %cl, %rsi, %rax -; AVX2-NEXT:    xorl %r8d, %r8d +; AVX2-NEXT:    movl $1, %eax +; AVX2-NEXT:    xorl %esi, %esi +; AVX2-NEXT:    shldq %cl, %rax, %rsi  ; AVX2-NEXT:    movl %edx, %edx +; AVX2-NEXT:    xorl %r8d, %r8d +; AVX2-NEXT:    shldq %cl, %rdx, %r8  ; AVX2-NEXT:    xorl %r9d, %r9d -; AVX2-NEXT:    shldq %cl, %rdx, %r9 -; AVX2-NEXT:    shlxq %rcx, %rsi, %rsi +; AVX2-NEXT:    shlxq %rcx, %rax, %rax  ; AVX2-NEXT:    testb $64, %cl -; AVX2-NEXT:    cmovneq %rsi, %rax -; AVX2-NEXT:    cmovneq %r8, %rsi -; AVX2-NEXT:    shlxq %rcx, %rdx, %rcx -; AVX2-NEXT:    cmovneq %rcx, %r9 -; AVX2-NEXT:    cmovneq %r8, %rcx -; AVX2-NEXT:    movq (%rdi), %rdx -; AVX2-NEXT:    movq 8(%rdi), %r8 -; AVX2-NEXT:    andnq %r8, %rax, %r10 -; AVX2-NEXT:    andq %rax, %r8 -; AVX2-NEXT:    andnq %rdx, %rsi, %r11 -; AVX2-NEXT:    andq %rsi, %rdx -; AVX2-NEXT:    orq %r9, %r10 -; AVX2-NEXT:    orq %rcx, %r11 -; AVX2-NEXT:    orq %r8, %rdx -; AVX2-NEXT:    sete %al -; AVX2-NEXT:    movq %r11, (%rdi) -; AVX2-NEXT:    movq %r10, 8(%rdi) +; AVX2-NEXT:    cmovneq %rax, %rsi +; AVX2-NEXT:    cmovneq %r9, %rax +; AVX2-NEXT:    shlxq %rcx, %rdx, %rdx +; AVX2-NEXT:    cmovneq %rdx, %r8 +; AVX2-NEXT:    cmovneq %r9, %rdx +; AVX2-NEXT:    andnq 8(%rdi), %rsi, %rsi +; AVX2-NEXT:    orq %r8, %rsi +; AVX2-NEXT:    andnq (%rdi), %rax, %r8 +; AVX2-NEXT:    orq %rdx, %r8 +; AVX2-NEXT:    movl %ecx, %eax +; AVX2-NEXT:    andl $96, %eax +; AVX2-NEXT:    shrl $3, %eax +; AVX2-NEXT:    movl (%rdi,%rax), %eax +; AVX2-NEXT:    btl %ecx, %eax +; AVX2-NEXT:    setae %al +; AVX2-NEXT:    movq %r8, (%rdi) +; AVX2-NEXT:    movq %rsi, 8(%rdi)  ; AVX2-NEXT:    retq  ;  ; AVX512-LABEL: init_eq_i128:  ; AVX512:       # %bb.0:  ; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    xorl %eax, %eax -; AVX512-NEXT:    movl $1, %esi +; AVX512-NEXT:    movl $1, %eax +; AVX512-NEXT:    xorl %esi, %esi +; AVX512-NEXT:    shldq %cl, %rax, %rsi  ; AVX512-NEXT:    xorl %r8d, %r8d -; AVX512-NEXT:    shldq %cl, %rsi, %r8 -; AVX512-NEXT:    shlxq %rcx, %rsi, %rsi +; AVX512-NEXT:    shlxq %rcx, %rax, %rax  ; AVX512-NEXT:    movl %edx, %edx  ; AVX512-NEXT:    xorl %r9d, %r9d  ; AVX512-NEXT:    shldq %cl, %rdx, %r9  ; AVX512-NEXT:    testb $64, %cl -; AVX512-NEXT:    cmovneq %rsi, %r8  ; AVX512-NEXT:    cmovneq %rax, %rsi -; AVX512-NEXT:    shlxq %rcx, %rdx, %rcx -; AVX512-NEXT:    cmovneq %rcx, %r9 -; AVX512-NEXT:    cmovneq %rax, %rcx -; AVX512-NEXT:    movq (%rdi), %rax -; AVX512-NEXT:    movq 8(%rdi), %rdx -; AVX512-NEXT:    andnq %rdx, %r8, %r10 -; AVX512-NEXT:    andq %r8, %rdx -; AVX512-NEXT:    andnq %rax, %rsi, %r8 -; AVX512-NEXT:    andq %rsi, %rax -; AVX512-NEXT:    orq %r9, %r10 -; AVX512-NEXT:    orq %rcx, %r8 -; AVX512-NEXT:    orq %rdx, %rax -; AVX512-NEXT:    sete %al +; AVX512-NEXT:    cmovneq %r8, %rax +; AVX512-NEXT:    shlxq %rcx, %rdx, %rdx +; AVX512-NEXT:    cmovneq %rdx, %r9 +; AVX512-NEXT:    cmovneq %r8, %rdx +; AVX512-NEXT:    andnq 8(%rdi), %rsi, %rsi +; AVX512-NEXT:    orq %r9, %rsi +; AVX512-NEXT:    andnq (%rdi), %rax, %r8 +; AVX512-NEXT:    orq %rdx, %r8 +; AVX512-NEXT:    movl %ecx, %eax +; AVX512-NEXT:    andl $96, %eax +; AVX512-NEXT:    shrl $3, %eax +; AVX512-NEXT:    movl (%rdi,%rax), %eax +; AVX512-NEXT:    btl %ecx, %eax +; AVX512-NEXT:    setae %al  ; AVX512-NEXT:    movq %r8, (%rdi) -; AVX512-NEXT:    movq %r10, 8(%rdi) +; AVX512-NEXT:    movq %rsi, 8(%rdi)  ; AVX512-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128 @@ -1252,344 +822,25 @@ define i1 @init_eq_i128(ptr %word, i32 %position, i1 zeroext %value) nounwind {  define i1 @test_ne_i512(ptr %word, i32 %position) nounwind {  ; X86-LABEL: test_ne_i512:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx -; X86-NEXT:    pushl %edi -; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $224, %esp -; X86-NEXT:    movl 12(%ebp), %ecx -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrl $3, %eax -; X86-NEXT:    andl $60, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    leal {{[0-9]+}}(%esp), %edx -; X86-NEXT:    subl %eax, %edx -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 24(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl $31, %ecx -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 56(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%edx), %eax -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%edx), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%edx), %edi -; X86-NEXT:    movl %edi, %ebx -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%edx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %esi, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 52(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 4(%edx), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    shldl %cl, %edi, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    andl 40(%ebx), %eax -; X86-NEXT:    andl 8(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 56(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 24(%ebx), %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl %esi, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %ebx, %edi -; X86-NEXT:    andl 44(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 12(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    movl %esi, %ebx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 60(%edi), %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 28(%edi), %eax -; X86-NEXT:    orl %esi, %eax -; X86-NEXT:    orl %ebx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%edx), %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    negl %edx -; X86-NEXT:    movl 192(%esp,%edx), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    shldl %cl, %ebx, %edx -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    andl 32(%ebx), %ecx -; X86-NEXT:    andl (%ebx), %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    andl 16(%ebx), %edi -; X86-NEXT:    andl 48(%ebx), %edx -; X86-NEXT:    orl %edi, %edx -; X86-NEXT:    orl %esi, %edx -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 36(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 4(%ebx), %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 20(%ebx), %ecx -; X86-NEXT:    andl 52(%ebx), %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    orl %esi, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp -; X86-NEXT:    popl %esi -; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl %ecx, %edx +; X86-NEXT:    shrl $3, %edx +; X86-NEXT:    andl $60, %edx +; X86-NEXT:    movl (%eax,%edx), %eax +; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    setb %al  ; X86-NEXT:    retl  ; -; SSE-LABEL: test_ne_i512: -; SSE:       # %bb.0: -; SSE-NEXT:    pushq %r15 -; SSE-NEXT:    pushq %r14 -; SSE-NEXT:    pushq %rbx -; SSE-NEXT:    xorps %xmm0, %xmm0 -; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $1, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    andl $63, %ecx -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    andl $56, %esi -; SSE-NEXT:    negl %esi -; SSE-NEXT:    movslq %esi, %rbx -; SSE-NEXT:    movq -48(%rsp,%rbx), %rdx -; SSE-NEXT:    movq -40(%rsp,%rbx), %r14 -; SSE-NEXT:    movq %r14, %rax -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq -16(%rsp,%rbx), %r11 -; SSE-NEXT:    movq -8(%rsp,%rbx), %r10 -; SSE-NEXT:    shldq %cl, %r11, %r10 -; SSE-NEXT:    movq -32(%rsp,%rbx), %r9 -; SSE-NEXT:    movq -24(%rsp,%rbx), %r15 -; SSE-NEXT:    movq %r15, %r8 -; SSE-NEXT:    shldq %cl, %r9, %r8 -; SSE-NEXT:    movq -56(%rsp,%rbx), %rsi -; SSE-NEXT:    shldq %cl, %rsi, %rdx -; SSE-NEXT:    shldq %cl, %r15, %r11 -; SSE-NEXT:    shldq %cl, %r14, %r9 -; SSE-NEXT:    movq -64(%rsp,%rbx), %rbx -; SSE-NEXT:    shldq %cl, %rbx, %rsi -; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx -; SSE-NEXT:    shlq %cl, %rbx -; SSE-NEXT:    andq 32(%rdi), %r9 -; SSE-NEXT:    andq 48(%rdi), %r11 -; SSE-NEXT:    andq 16(%rdi), %rdx -; SSE-NEXT:    orq %r11, %rdx -; SSE-NEXT:    andq 40(%rdi), %r8 -; SSE-NEXT:    andq 56(%rdi), %r10 -; SSE-NEXT:    andq 24(%rdi), %rax -; SSE-NEXT:    orq %r10, %rax -; SSE-NEXT:    andq (%rdi), %rbx -; SSE-NEXT:    orq %r9, %rbx -; SSE-NEXT:    orq %rdx, %rbx -; SSE-NEXT:    andq 8(%rdi), %rsi -; SSE-NEXT:    orq %r8, %rsi -; SSE-NEXT:    orq %rax, %rsi -; SSE-NEXT:    orq %rbx, %rsi -; SSE-NEXT:    setne %al -; SSE-NEXT:    popq %rbx -; SSE-NEXT:    popq %r14 -; SSE-NEXT:    popq %r15 -; SSE-NEXT:    retq -; -; AVX2-LABEL: test_ne_i512: -; AVX2:       # %bb.0: -; AVX2-NEXT:    pushq %r15 -; AVX2-NEXT:    pushq %r14 -; AVX2-NEXT:    pushq %rbx -; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [1,0,0,0] -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    andl $63, %ecx -; AVX2-NEXT:    shrl $3, %esi -; AVX2-NEXT:    andl $56, %esi -; AVX2-NEXT:    negl %esi -; AVX2-NEXT:    movslq %esi, %rsi -; AVX2-NEXT:    movq -48(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq -40(%rsp,%rsi), %rbx -; AVX2-NEXT:    movq %rbx, %rax -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq -16(%rsp,%rsi), %r11 -; AVX2-NEXT:    movq -8(%rsp,%rsi), %r10 -; AVX2-NEXT:    shldq %cl, %r11, %r10 -; AVX2-NEXT:    movq -32(%rsp,%rsi), %r9 -; AVX2-NEXT:    movq -24(%rsp,%rsi), %r14 -; AVX2-NEXT:    movq %r14, %r8 -; AVX2-NEXT:    shldq %cl, %r9, %r8 -; AVX2-NEXT:    movq -64(%rsp,%rsi), %r15 -; AVX2-NEXT:    movq -56(%rsp,%rsi), %rsi -; AVX2-NEXT:    shldq %cl, %rsi, %rdx -; AVX2-NEXT:    shldq %cl, %r14, %r11 -; AVX2-NEXT:    shldq %cl, %rbx, %r9 -; AVX2-NEXT:    shldq %cl, %r15, %rsi -; AVX2-NEXT:    shlxq %rcx, %r15, %rcx -; AVX2-NEXT:    andq 32(%rdi), %r9 -; AVX2-NEXT:    andq 48(%rdi), %r11 -; AVX2-NEXT:    andq 16(%rdi), %rdx -; AVX2-NEXT:    andq 40(%rdi), %r8 -; AVX2-NEXT:    andq 56(%rdi), %r10 -; AVX2-NEXT:    andq 24(%rdi), %rax -; AVX2-NEXT:    orq %r11, %rdx -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    andq (%rdi), %rcx -; AVX2-NEXT:    orq %r9, %rcx -; AVX2-NEXT:    orq %rdx, %rcx -; AVX2-NEXT:    andq 8(%rdi), %rsi -; AVX2-NEXT:    orq %r8, %rsi -; AVX2-NEXT:    orq %rax, %rsi -; AVX2-NEXT:    orq %rcx, %rsi -; AVX2-NEXT:    setne %al -; AVX2-NEXT:    popq %rbx -; AVX2-NEXT:    popq %r14 -; AVX2-NEXT:    popq %r15 -; AVX2-NEXT:    vzeroupper -; AVX2-NEXT:    retq -; -; AVX512-LABEL: test_ne_i512: -; AVX512:       # %bb.0: -; AVX512-NEXT:    pushq %r15 -; AVX512-NEXT:    pushq %r14 -; AVX512-NEXT:    pushq %rbx -; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovaps {{.*#+}} xmm0 = [1,0,0,0] -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    andl $63, %ecx -; AVX512-NEXT:    shrl $3, %esi -; AVX512-NEXT:    andl $56, %esi -; AVX512-NEXT:    negl %esi -; AVX512-NEXT:    movslq %esi, %rbx -; AVX512-NEXT:    movq -48(%rsp,%rbx), %rdx -; AVX512-NEXT:    movq -40(%rsp,%rbx), %r14 -; AVX512-NEXT:    movq %r14, %rax -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq -16(%rsp,%rbx), %r11 -; AVX512-NEXT:    movq -8(%rsp,%rbx), %r10 -; AVX512-NEXT:    shldq %cl, %r11, %r10 -; AVX512-NEXT:    movq -32(%rsp,%rbx), %r9 -; AVX512-NEXT:    movq -24(%rsp,%rbx), %r15 -; AVX512-NEXT:    movq %r15, %r8 -; AVX512-NEXT:    shldq %cl, %r9, %r8 -; AVX512-NEXT:    movq -56(%rsp,%rbx), %rsi -; AVX512-NEXT:    shldq %cl, %rsi, %rdx -; AVX512-NEXT:    shldq %cl, %r15, %r11 -; AVX512-NEXT:    shldq %cl, %r14, %r9 -; AVX512-NEXT:    movq -64(%rsp,%rbx), %rbx -; AVX512-NEXT:    shldq %cl, %rbx, %rsi -; AVX512-NEXT:    shlxq %rcx, %rbx, %rcx -; AVX512-NEXT:    andq 32(%rdi), %r9 -; AVX512-NEXT:    andq 48(%rdi), %r11 -; AVX512-NEXT:    andq 16(%rdi), %rdx -; AVX512-NEXT:    andq 40(%rdi), %r8 -; AVX512-NEXT:    andq 56(%rdi), %r10 -; AVX512-NEXT:    andq 24(%rdi), %rax -; AVX512-NEXT:    orq %r11, %rdx -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    andq (%rdi), %rcx -; AVX512-NEXT:    orq %r9, %rcx -; AVX512-NEXT:    orq %rdx, %rcx -; AVX512-NEXT:    andq 8(%rdi), %rsi -; AVX512-NEXT:    orq %r8, %rsi -; AVX512-NEXT:    orq %rax, %rsi -; AVX512-NEXT:    orq %rcx, %rsi -; AVX512-NEXT:    setne %al -; AVX512-NEXT:    popq %rbx -; AVX512-NEXT:    popq %r14 -; AVX512-NEXT:    popq %r15 -; AVX512-NEXT:    vzeroupper -; AVX512-NEXT:    retq +; X64-LABEL: test_ne_i512: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %eax +; X64-NEXT:    shrl $3, %eax +; X64-NEXT:    andl $60, %eax +; X64-NEXT:    movl (%rdi,%rax), %eax +; X64-NEXT:    btl %esi, %eax +; X64-NEXT:    setb %al +; X64-NEXT:    retq    %rem = and i32 %position, 511    %ofs = zext nneg i32 %rem to i512    %bit = shl nuw i512 1, %ofs @@ -1602,572 +853,33 @@ define i1 @test_ne_i512(ptr %word, i32 %position) nounwind {  define i1 @complement_ne_i512(ptr %word, i32 %position) nounwind {  ; X86-LABEL: complement_ne_i512:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $272, %esp # imm = 0x110 -; X86-NEXT:    movl 12(%ebp), %ecx -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrl $3, %eax -; X86-NEXT:    andl $60, %eax -; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill -; X86-NEXT:    leal {{[0-9]+}}(%esp), %edx -; X86-NEXT:    subl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 24(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl $31, %ecx -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 56(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%edx), %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%edx), %ebx -; X86-NEXT:    movl %ebx, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%edx), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 52(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    shldl %cl, %esi, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 4(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebp), %edx -; X86-NEXT:    movl 40(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %eax -; X86-NEXT:    movl 8(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    movl %edx, %eax -; X86-NEXT:    movl 56(%edx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edi, %ebx -; X86-NEXT:    movl 24(%edx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    orl %esi, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%eax), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl 12(%eax), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    orl %esi, %ebx -; X86-NEXT:    movl 60(%eax), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    movl %edx, %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl 28(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl (%eax), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%esp), %eax # 4-byte Reload -; X86-NEXT:    negl %eax -; X86-NEXT:    movl 240(%esp,%eax), %esi -; X86-NEXT:    shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, (%esp) # 4-byte Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebp), %esi -; X86-NEXT:    movl 32(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edi, %eax -; X86-NEXT:    movl (%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl 16(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %eax -; X86-NEXT:    movl 48(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl (%esp), %edx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 36(%esi), %ebx -; X86-NEXT:    movl %ebx, %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl 4(%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl %esi, %eax -; X86-NEXT:    movl 20(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl %esi, %edi -; X86-NEXT:    movl 52(%eax), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    orl %edi, %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    xorl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, (%esp) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl 8(%ebp), %edx -; X86-NEXT:    movl %ebx, 60(%edx) -; X86-NEXT:    movl %edi, 56(%edx) -; X86-NEXT:    movl %ecx, 52(%edx) -; X86-NEXT:    movl %esi, 44(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 40(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 36(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 32(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 28(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 24(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 20(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 16(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 12(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 8(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 4(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, (%edx) -; X86-NEXT:    movl (%esp), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 48(%edx) -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    andl $60, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setb %al +; X86-NEXT:    btcl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ; -; SSE-LABEL: complement_ne_i512: -; SSE:       # %bb.0: -; SSE-NEXT:    pushq %rbp -; SSE-NEXT:    pushq %r15 -; SSE-NEXT:    pushq %r14 -; SSE-NEXT:    pushq %r13 -; SSE-NEXT:    pushq %r12 -; SSE-NEXT:    pushq %rbx -; SSE-NEXT:    subq $56, %rsp -; SSE-NEXT:    xorps %xmm0, %xmm0 -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $1, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    andl $63, %ecx -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    andl $56, %esi -; SSE-NEXT:    negl %esi -; SSE-NEXT:    movslq %esi, %rbx -; SSE-NEXT:    movq (%rsp,%rbx), %rsi -; SSE-NEXT:    movq 8(%rsp,%rbx), %r14 -; SSE-NEXT:    movq %r14, %rax -; SSE-NEXT:    shldq %cl, %rsi, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 32(%rsp,%rbx), %r8 -; SSE-NEXT:    movq 40(%rsp,%rbx), %rbp -; SSE-NEXT:    shldq %cl, %r8, %rbp -; SSE-NEXT:    movq 16(%rsp,%rbx), %r9 -; SSE-NEXT:    movq 24(%rsp,%rbx), %r15 -; SSE-NEXT:    movq %r15, %r10 -; SSE-NEXT:    shldq %cl, %r9, %r10 -; SSE-NEXT:    movq -8(%rsp,%rbx), %r11 -; SSE-NEXT:    shldq %cl, %r11, %rsi -; SSE-NEXT:    shldq %cl, %r15, %r8 -; SSE-NEXT:    shldq %cl, %r14, %r9 -; SSE-NEXT:    movq -16(%rsp,%rbx), %rbx -; SSE-NEXT:    shldq %cl, %rbx, %r11 -; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx -; SSE-NEXT:    shlq %cl, %rbx -; SSE-NEXT:    movq 24(%rdi), %r15 -; SSE-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 56(%rdi), %rcx -; SSE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 16(%rdi), %r12 -; SSE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 48(%rdi), %r13 -; SSE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %r8, %r13 -; SSE-NEXT:    andq %rsi, %r12 -; SSE-NEXT:    orq %r13, %r12 -; SSE-NEXT:    movq %rcx, %r13 -; SSE-NEXT:    andq %rbp, %r13 -; SSE-NEXT:    andq %rax, %r15 -; SSE-NEXT:    orq %r13, %r15 -; SSE-NEXT:    movq 32(%rdi), %r14 -; SSE-NEXT:    movq %r14, %rcx -; SSE-NEXT:    andq %r9, %rcx -; SSE-NEXT:    movq (%rdi), %r13 -; SSE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rbx, %r13 -; SSE-NEXT:    orq %rcx, %r13 -; SSE-NEXT:    orq %r12, %r13 -; SSE-NEXT:    movq 40(%rdi), %rcx -; SSE-NEXT:    movq %rcx, %r12 -; SSE-NEXT:    andq %r10, %r12 -; SSE-NEXT:    movq 8(%rdi), %rdx -; SSE-NEXT:    movq %rdx, %rax -; SSE-NEXT:    andq %r11, %rax -; SSE-NEXT:    orq %r12, %rax -; SSE-NEXT:    orq %r15, %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload -; SSE-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; SSE-NEXT:    xorq %rcx, %r10 -; SSE-NEXT:    xorq %r14, %r9 -; SSE-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload -; SSE-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload -; SSE-NEXT:    xorq %rdx, %r11 -; SSE-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; SSE-NEXT:    orq %r13, %rax -; SSE-NEXT:    movq %r8, 48(%rdi) -; SSE-NEXT:    movq %rbp, 56(%rdi) -; SSE-NEXT:    movq %r9, 32(%rdi) -; SSE-NEXT:    movq %r10, 40(%rdi) -; SSE-NEXT:    movq %rsi, 16(%rdi) -; SSE-NEXT:    movq %r15, 24(%rdi) -; SSE-NEXT:    movq %rbx, (%rdi) -; SSE-NEXT:    movq %r11, 8(%rdi) -; SSE-NEXT:    setne %al -; SSE-NEXT:    addq $56, %rsp -; SSE-NEXT:    popq %rbx -; SSE-NEXT:    popq %r12 -; SSE-NEXT:    popq %r13 -; SSE-NEXT:    popq %r14 -; SSE-NEXT:    popq %r15 -; SSE-NEXT:    popq %rbp -; SSE-NEXT:    retq -; -; AVX2-LABEL: complement_ne_i512: -; AVX2:       # %bb.0: -; AVX2-NEXT:    pushq %rbp -; AVX2-NEXT:    pushq %r15 -; AVX2-NEXT:    pushq %r14 -; AVX2-NEXT:    pushq %r13 -; AVX2-NEXT:    pushq %r12 -; AVX2-NEXT:    pushq %rbx -; AVX2-NEXT:    subq $72, %rsp -; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [1,0,0,0] -; AVX2-NEXT:    vmovups %ymm0, (%rsp) -; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    andl $63, %ecx -; AVX2-NEXT:    shrl $3, %esi -; AVX2-NEXT:    andl $56, %esi -; AVX2-NEXT:    negl %esi -; AVX2-NEXT:    movslq %esi, %rbx -; AVX2-NEXT:    movq 16(%rsp,%rbx), %rsi -; AVX2-NEXT:    movq 24(%rsp,%rbx), %rbp -; AVX2-NEXT:    movq %rbp, %rax -; AVX2-NEXT:    shldq %cl, %rsi, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 48(%rsp,%rbx), %r8 -; AVX2-NEXT:    movq 56(%rsp,%rbx), %r13 -; AVX2-NEXT:    shldq %cl, %r8, %r13 -; AVX2-NEXT:    movq 32(%rsp,%rbx), %r9 -; AVX2-NEXT:    movq 40(%rsp,%rbx), %r14 -; AVX2-NEXT:    movq %r14, %r10 -; AVX2-NEXT:    shldq %cl, %r9, %r10 -; AVX2-NEXT:    movq 8(%rsp,%rbx), %r11 -; AVX2-NEXT:    shldq %cl, %r11, %rsi -; AVX2-NEXT:    shldq %cl, %r14, %r8 -; AVX2-NEXT:    movq 16(%rdi), %r12 -; AVX2-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 48(%rdi), %r14 -; AVX2-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r8, %r14 -; AVX2-NEXT:    andq %rsi, %r12 -; AVX2-NEXT:    orq %r14, %r12 -; AVX2-NEXT:    movq 56(%rdi), %r15 -; AVX2-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r13, %r15 -; AVX2-NEXT:    movq 24(%rdi), %r14 -; AVX2-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %rax, %r14 -; AVX2-NEXT:    orq %r15, %r14 -; AVX2-NEXT:    shldq %cl, %rbp, %r9 -; AVX2-NEXT:    movq (%rsp,%rbx), %rdx -; AVX2-NEXT:    movq 32(%rdi), %r15 -; AVX2-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r9, %r15 -; AVX2-NEXT:    shlxq %rcx, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq (%rdi), %rbx -; AVX2-NEXT:    movq %rbx, %rbp -; AVX2-NEXT:    andq %rax, %rbp -; AVX2-NEXT:    orq %r15, %rbp -; AVX2-NEXT:    orq %r12, %rbp -; AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx -; AVX2-NEXT:    shldq %cl, %rdx, %r11 -; AVX2-NEXT:    movq 40(%rdi), %rax -; AVX2-NEXT:    movq %rax, %rcx -; AVX2-NEXT:    andq %r10, %rcx -; AVX2-NEXT:    movq 8(%rdi), %r15 -; AVX2-NEXT:    movq %r15, %r12 -; AVX2-NEXT:    andq %r11, %r12 -; AVX2-NEXT:    orq %rcx, %r12 -; AVX2-NEXT:    orq %r14, %r12 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; AVX2-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload -; AVX2-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; AVX2-NEXT:    xorq %rax, %r10 -; AVX2-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload -; AVX2-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; AVX2-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload -; AVX2-NEXT:    xorq %r15, %r11 -; AVX2-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; AVX2-NEXT:    orq %rbp, %r12 -; AVX2-NEXT:    movq %r8, 48(%rdi) -; AVX2-NEXT:    movq %r13, 56(%rdi) -; AVX2-NEXT:    movq %r9, 32(%rdi) -; AVX2-NEXT:    movq %r10, 40(%rdi) -; AVX2-NEXT:    movq %rsi, 16(%rdi) -; AVX2-NEXT:    movq %rcx, 24(%rdi) -; AVX2-NEXT:    movq %rbx, (%rdi) -; AVX2-NEXT:    movq %r11, 8(%rdi) -; AVX2-NEXT:    setne %al -; AVX2-NEXT:    addq $72, %rsp -; AVX2-NEXT:    popq %rbx -; AVX2-NEXT:    popq %r12 -; AVX2-NEXT:    popq %r13 -; AVX2-NEXT:    popq %r14 -; AVX2-NEXT:    popq %r15 -; AVX2-NEXT:    popq %rbp -; AVX2-NEXT:    vzeroupper -; AVX2-NEXT:    retq -; -; AVX512-LABEL: complement_ne_i512: -; AVX512:       # %bb.0: -; AVX512-NEXT:    pushq %rbp -; AVX512-NEXT:    pushq %r15 -; AVX512-NEXT:    pushq %r14 -; AVX512-NEXT:    pushq %r13 -; AVX512-NEXT:    pushq %r12 -; AVX512-NEXT:    pushq %rbx -; AVX512-NEXT:    subq $72, %rsp -; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovaps {{.*#+}} xmm0 = [1,0,0,0] -; AVX512-NEXT:    vmovups %ymm0, (%rsp) -; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    andl $63, %ecx -; AVX512-NEXT:    shrl $3, %esi -; AVX512-NEXT:    andl $56, %esi -; AVX512-NEXT:    negl %esi -; AVX512-NEXT:    movslq %esi, %rbx -; AVX512-NEXT:    movq 16(%rsp,%rbx), %rsi -; AVX512-NEXT:    movq 24(%rsp,%rbx), %rbp -; AVX512-NEXT:    movq %rbp, %rax -; AVX512-NEXT:    shldq %cl, %rsi, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 48(%rsp,%rbx), %r8 -; AVX512-NEXT:    movq 56(%rsp,%rbx), %r13 -; AVX512-NEXT:    shldq %cl, %r8, %r13 -; AVX512-NEXT:    movq 32(%rsp,%rbx), %r9 -; AVX512-NEXT:    movq 40(%rsp,%rbx), %r14 -; AVX512-NEXT:    movq %r14, %r10 -; AVX512-NEXT:    shldq %cl, %r9, %r10 -; AVX512-NEXT:    movq 8(%rsp,%rbx), %r11 -; AVX512-NEXT:    shldq %cl, %r11, %rsi -; AVX512-NEXT:    shldq %cl, %r14, %r8 -; AVX512-NEXT:    movq 16(%rdi), %r12 -; AVX512-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 48(%rdi), %r14 -; AVX512-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r8, %r14 -; AVX512-NEXT:    andq %rsi, %r12 -; AVX512-NEXT:    orq %r14, %r12 -; AVX512-NEXT:    movq 56(%rdi), %r15 -; AVX512-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r13, %r15 -; AVX512-NEXT:    movq 24(%rdi), %r14 -; AVX512-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %rax, %r14 -; AVX512-NEXT:    orq %r15, %r14 -; AVX512-NEXT:    shldq %cl, %rbp, %r9 -; AVX512-NEXT:    movq (%rsp,%rbx), %rdx -; AVX512-NEXT:    movq 32(%rdi), %r15 -; AVX512-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r9, %r15 -; AVX512-NEXT:    shlxq %rcx, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq (%rdi), %rbx -; AVX512-NEXT:    movq %rbx, %rbp -; AVX512-NEXT:    andq %rax, %rbp -; AVX512-NEXT:    orq %r15, %rbp -; AVX512-NEXT:    orq %r12, %rbp -; AVX512-NEXT:    # kill: def $cl killed $cl killed $rcx -; AVX512-NEXT:    shldq %cl, %rdx, %r11 -; AVX512-NEXT:    movq 40(%rdi), %rax -; AVX512-NEXT:    movq %rax, %rcx -; AVX512-NEXT:    andq %r10, %rcx -; AVX512-NEXT:    movq 8(%rdi), %r15 -; AVX512-NEXT:    movq %r15, %r12 -; AVX512-NEXT:    andq %r11, %r12 -; AVX512-NEXT:    orq %rcx, %r12 -; AVX512-NEXT:    orq %r14, %r12 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; AVX512-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload -; AVX512-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; AVX512-NEXT:    xorq %rax, %r10 -; AVX512-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload -; AVX512-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; AVX512-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload -; AVX512-NEXT:    xorq %r15, %r11 -; AVX512-NEXT:    xorq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; AVX512-NEXT:    orq %rbp, %r12 -; AVX512-NEXT:    movq %r8, 48(%rdi) -; AVX512-NEXT:    movq %r13, 56(%rdi) -; AVX512-NEXT:    movq %r9, 32(%rdi) -; AVX512-NEXT:    movq %r10, 40(%rdi) -; AVX512-NEXT:    movq %rsi, 16(%rdi) -; AVX512-NEXT:    movq %rcx, 24(%rdi) -; AVX512-NEXT:    movq %rbx, (%rdi) -; AVX512-NEXT:    movq %r11, 8(%rdi) -; AVX512-NEXT:    setne %al -; AVX512-NEXT:    addq $72, %rsp -; AVX512-NEXT:    popq %rbx -; AVX512-NEXT:    popq %r12 -; AVX512-NEXT:    popq %r13 -; AVX512-NEXT:    popq %r14 -; AVX512-NEXT:    popq %r15 -; AVX512-NEXT:    popq %rbp -; AVX512-NEXT:    vzeroupper -; AVX512-NEXT:    retq +; X64-LABEL: complement_ne_i512: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %ecx +; X64-NEXT:    shrl $3, %ecx +; X64-NEXT:    andl $60, %ecx +; X64-NEXT:    movl (%rdi,%rcx), %edx +; X64-NEXT:    btl %esi, %edx +; X64-NEXT:    setb %al +; X64-NEXT:    btcl %esi, %edx +; X64-NEXT:    movl %edx, (%rdi,%rcx) +; X64-NEXT:    retq    %rem = and i32 %position, 511    %ofs = zext nneg i32 %rem to i512    %bit = shl nuw i512 1, %ofs @@ -2182,606 +894,33 @@ define i1 @complement_ne_i512(ptr %word, i32 %position) nounwind {  define i1 @reset_eq_i512(ptr %word, i32 %position) nounwind {  ; X86-LABEL: reset_eq_i512:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $288, %esp # imm = 0x120 -; X86-NEXT:    movl 12(%ebp), %ecx -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrl $3, %eax -; X86-NEXT:    andl $60, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    leal {{[0-9]+}}(%esp), %edi -; X86-NEXT:    subl %eax, %edi -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 4(%edi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%edi), %eax -; X86-NEXT:    andl $31, %ecx -; X86-NEXT:    movl %eax, %ebx -; X86-NEXT:    shldl %cl, %edx, %ebx -; X86-NEXT:    movl 12(%edi), %edx -; X86-NEXT:    movl %edx, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%edi), %eax -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%edi), %edx -; X86-NEXT:    movl %edx, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 24(%edi), %eax -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%edi), %edx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx  ; X86-NEXT:    movl %edx, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%edi), %eax -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%edi), %esi -; X86-NEXT:    movl %esi, %edx -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%edi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %esi, %edx -; X86-NEXT:    movl 8(%ebp), %esi -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %edx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %ebx -; X86-NEXT:    orl %edx, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%edi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl 52(%edi), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 56(%edi), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shldl %cl, %esi, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebp), %esi -; X86-NEXT:    movl 56(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %ebx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 24(%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %eax -; X86-NEXT:    orl %ebx, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %esi, %ebx -; X86-NEXT:    movl 44(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %eax -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%edi), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%edi), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    negl %eax -; X86-NEXT:    movl 256(%esp,%eax), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl %esi, %edi -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %ebx, %esi -; X86-NEXT:    movl 32(%ebx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %edx -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%ebx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %ebx -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %eax -; X86-NEXT:    orl %ebx, %eax -; X86-NEXT:    orl %edi, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%esi), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %edx -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 4(%esi), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    shldl %cl, %edi, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%esi), %edi -; X86-NEXT:    andl %edi, %ecx -; X86-NEXT:    movl %ecx, %esi -; X86-NEXT:    movl %edx, %ecx -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    movl 52(%ebx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %edx -; X86-NEXT:    orl %esi, %edx -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    notl %ebx -; X86-NEXT:    andl %edi, %ebx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    notl %esi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    notl %edi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    notl %edi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    notl %edi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    notl %ecx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    movl %edx, 60(%eax) -; X86-NEXT:    movl %esi, 56(%eax) -; X86-NEXT:    movl %ecx, 52(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 44(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 40(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 36(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 32(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 28(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 24(%eax) -; X86-NEXT:    movl %ebx, 20(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 16(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 12(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 8(%eax) -; X86-NEXT:    movl %edi, 4(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, (%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, 48(%eax) -; X86-NEXT:    sete %al -; X86-NEXT:    leal -12(%ebp), %esp +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    andl $60, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setae %al +; X86-NEXT:    btrl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ; -; SSE-LABEL: reset_eq_i512: -; SSE:       # %bb.0: -; SSE-NEXT:    pushq %rbp -; SSE-NEXT:    pushq %r15 -; SSE-NEXT:    pushq %r14 -; SSE-NEXT:    pushq %r13 -; SSE-NEXT:    pushq %r12 -; SSE-NEXT:    pushq %rbx -; SSE-NEXT:    subq $56, %rsp -; SSE-NEXT:    xorps %xmm0, %xmm0 -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $1, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    andl $63, %ecx -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    andl $56, %esi -; SSE-NEXT:    negl %esi -; SSE-NEXT:    movslq %esi, %rdx -; SSE-NEXT:    movq (%rsp,%rdx), %r9 -; SSE-NEXT:    movq 8(%rsp,%rdx), %r8 -; SSE-NEXT:    movq %r8, %rsi -; SSE-NEXT:    shldq %cl, %r9, %rsi -; SSE-NEXT:    movq -8(%rsp,%rdx), %rax -; SSE-NEXT:    shldq %cl, %rax, %r9 -; SSE-NEXT:    movq 16(%rsp,%rdx), %r14 -; SSE-NEXT:    movq 24(%rsp,%rdx), %r10 -; SSE-NEXT:    movq %r10, %rbx -; SSE-NEXT:    shldq %cl, %r14, %rbx -; SSE-NEXT:    shldq %cl, %r8, %r14 -; SSE-NEXT:    movq 32(%rsp,%rdx), %r13 -; SSE-NEXT:    movq 40(%rsp,%rdx), %r12 -; SSE-NEXT:    shldq %cl, %r13, %r12 -; SSE-NEXT:    shldq %cl, %r10, %r13 -; SSE-NEXT:    movq -16(%rsp,%rdx), %rdx -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx -; SSE-NEXT:    shlq %cl, %rdx -; SSE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq %r12, %rbp -; SSE-NEXT:    movq %r9, %r15 -; SSE-NEXT:    movq %rsi, %r11 -; SSE-NEXT:    movq 16(%rdi), %r8 -; SSE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 48(%rdi), %rcx -; SSE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rcx, %r13 -; SSE-NEXT:    andq %r8, %r9 -; SSE-NEXT:    orq %r13, %r9 -; SSE-NEXT:    movq 56(%rdi), %rcx -; SSE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rcx, %r12 -; SSE-NEXT:    movq 24(%rdi), %r10 -; SSE-NEXT:    andq %r10, %rsi -; SSE-NEXT:    orq %r12, %rsi -; SSE-NEXT:    movq %r14, %r13 -; SSE-NEXT:    movq 32(%rdi), %rcx -; SSE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rcx, %r14 -; SSE-NEXT:    movq %rdx, %r12 -; SSE-NEXT:    movq (%rdi), %rcx -; SSE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rcx, %rdx -; SSE-NEXT:    orq %r14, %rdx -; SSE-NEXT:    orq %r9, %rdx -; SSE-NEXT:    movq %rbx, %r14 -; SSE-NEXT:    movq 40(%rdi), %rcx -; SSE-NEXT:    andq %rcx, %rbx -; SSE-NEXT:    movq %rax, %r9 -; SSE-NEXT:    movq 8(%rdi), %r8 -; SSE-NEXT:    andq %r8, %rax -; SSE-NEXT:    orq %rbx, %rax -; SSE-NEXT:    orq %rsi, %rax -; SSE-NEXT:    notq %r11 -; SSE-NEXT:    andq %r10, %r11 -; SSE-NEXT:    notq %r15 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload -; SSE-NEXT:    notq %r14 -; SSE-NEXT:    andq %rcx, %r14 -; SSE-NEXT:    notq %r13 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; SSE-NEXT:    notq %rbp -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; SSE-NEXT:    notq %rcx -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload -; SSE-NEXT:    notq %r9 -; SSE-NEXT:    andq %r8, %r9 -; SSE-NEXT:    notq %r12 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Folded Reload -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    movq %rcx, 48(%rdi) -; SSE-NEXT:    movq %rbp, 56(%rdi) -; SSE-NEXT:    movq %r13, 32(%rdi) -; SSE-NEXT:    movq %r14, 40(%rdi) -; SSE-NEXT:    movq %r15, 16(%rdi) -; SSE-NEXT:    movq %r11, 24(%rdi) -; SSE-NEXT:    movq %r12, (%rdi) -; SSE-NEXT:    movq %r9, 8(%rdi) -; SSE-NEXT:    sete %al -; SSE-NEXT:    addq $56, %rsp -; SSE-NEXT:    popq %rbx -; SSE-NEXT:    popq %r12 -; SSE-NEXT:    popq %r13 -; SSE-NEXT:    popq %r14 -; SSE-NEXT:    popq %r15 -; SSE-NEXT:    popq %rbp -; SSE-NEXT:    retq -; -; AVX2-LABEL: reset_eq_i512: -; AVX2:       # %bb.0: -; AVX2-NEXT:    pushq %rbp -; AVX2-NEXT:    pushq %r15 -; AVX2-NEXT:    pushq %r14 -; AVX2-NEXT:    pushq %r13 -; AVX2-NEXT:    pushq %r12 -; AVX2-NEXT:    pushq %rbx -; AVX2-NEXT:    pushq %rax -; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [1,0,0,0] -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    andl $63, %ecx -; AVX2-NEXT:    shrl $3, %esi -; AVX2-NEXT:    andl $56, %esi -; AVX2-NEXT:    negl %esi -; AVX2-NEXT:    movslq %esi, %rdx -; AVX2-NEXT:    movq -48(%rsp,%rdx), %r8 -; AVX2-NEXT:    movq -40(%rsp,%rdx), %rbx -; AVX2-NEXT:    movq %rbx, %rax -; AVX2-NEXT:    shldq %cl, %r8, %rax -; AVX2-NEXT:    movq -16(%rsp,%rdx), %r10 -; AVX2-NEXT:    movq -8(%rsp,%rdx), %rsi -; AVX2-NEXT:    shldq %cl, %r10, %rsi -; AVX2-NEXT:    movq -32(%rsp,%rdx), %r11 -; AVX2-NEXT:    movq -24(%rsp,%rdx), %r14 -; AVX2-NEXT:    movq %r14, %r9 -; AVX2-NEXT:    shldq %cl, %r11, %r9 -; AVX2-NEXT:    movq -64(%rsp,%rdx), %r15 -; AVX2-NEXT:    movq -56(%rsp,%rdx), %rdx -; AVX2-NEXT:    shldq %cl, %rdx, %r8 -; AVX2-NEXT:    shldq %cl, %r14, %r10 -; AVX2-NEXT:    shldq %cl, %rbx, %r11 -; AVX2-NEXT:    shldq %cl, %r15, %rdx -; AVX2-NEXT:    shlxq %rcx, %r15, %rcx -; AVX2-NEXT:    movq 24(%rdi), %rbx -; AVX2-NEXT:    movq 56(%rdi), %r14 -; AVX2-NEXT:    movq 16(%rdi), %r15 -; AVX2-NEXT:    movq 48(%rdi), %r13 -; AVX2-NEXT:    movq 32(%rdi), %rbp -; AVX2-NEXT:    andnq %rbp, %r11, %r12 -; AVX2-NEXT:    andq %r11, %rbp -; AVX2-NEXT:    andnq %r13, %r10, %r11 -; AVX2-NEXT:    andq %r10, %r13 -; AVX2-NEXT:    andnq %r15, %r8, %r10 -; AVX2-NEXT:    andq %r8, %r15 -; AVX2-NEXT:    movq 40(%rdi), %r8 -; AVX2-NEXT:    orq %r13, %r15 -; AVX2-NEXT:    andnq %r8, %r9, %r13 -; AVX2-NEXT:    andq %r9, %r8 -; AVX2-NEXT:    andnq %r14, %rsi, %r9 -; AVX2-NEXT:    andq %rsi, %r14 -; AVX2-NEXT:    andnq %rbx, %rax, %rsi -; AVX2-NEXT:    andq %rax, %rbx -; AVX2-NEXT:    movq (%rdi), %rax -; AVX2-NEXT:    orq %r14, %rbx -; AVX2-NEXT:    andnq %rax, %rcx, %r14 -; AVX2-NEXT:    andq %rcx, %rax -; AVX2-NEXT:    orq %rbp, %rax -; AVX2-NEXT:    movq 8(%rdi), %rcx -; AVX2-NEXT:    orq %r15, %rax -; AVX2-NEXT:    andnq %rcx, %rdx, %r15 -; AVX2-NEXT:    andq %rdx, %rcx -; AVX2-NEXT:    orq %r8, %rcx -; AVX2-NEXT:    orq %rbx, %rcx -; AVX2-NEXT:    orq %rax, %rcx -; AVX2-NEXT:    movq %r11, 48(%rdi) -; AVX2-NEXT:    movq %r9, 56(%rdi) -; AVX2-NEXT:    movq %r12, 32(%rdi) -; AVX2-NEXT:    movq %r13, 40(%rdi) -; AVX2-NEXT:    movq %r10, 16(%rdi) -; AVX2-NEXT:    movq %rsi, 24(%rdi) -; AVX2-NEXT:    movq %r14, (%rdi) -; AVX2-NEXT:    movq %r15, 8(%rdi) -; AVX2-NEXT:    sete %al -; AVX2-NEXT:    addq $8, %rsp -; AVX2-NEXT:    popq %rbx -; AVX2-NEXT:    popq %r12 -; AVX2-NEXT:    popq %r13 -; AVX2-NEXT:    popq %r14 -; AVX2-NEXT:    popq %r15 -; AVX2-NEXT:    popq %rbp -; AVX2-NEXT:    vzeroupper -; AVX2-NEXT:    retq -; -; AVX512-LABEL: reset_eq_i512: -; AVX512:       # %bb.0: -; AVX512-NEXT:    pushq %rbp -; AVX512-NEXT:    pushq %r15 -; AVX512-NEXT:    pushq %r14 -; AVX512-NEXT:    pushq %r13 -; AVX512-NEXT:    pushq %r12 -; AVX512-NEXT:    pushq %rbx -; AVX512-NEXT:    pushq %rax -; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovaps {{.*#+}} xmm0 = [1,0,0,0] -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    andl $63, %ecx -; AVX512-NEXT:    shrl $3, %esi -; AVX512-NEXT:    andl $56, %esi -; AVX512-NEXT:    negl %esi -; AVX512-NEXT:    movslq %esi, %rbx -; AVX512-NEXT:    movq -48(%rsp,%rbx), %r8 -; AVX512-NEXT:    movq -40(%rsp,%rbx), %r14 -; AVX512-NEXT:    movq %r14, %rax -; AVX512-NEXT:    shldq %cl, %r8, %rax -; AVX512-NEXT:    movq -16(%rsp,%rbx), %r10 -; AVX512-NEXT:    movq -8(%rsp,%rbx), %rsi -; AVX512-NEXT:    shldq %cl, %r10, %rsi -; AVX512-NEXT:    movq -32(%rsp,%rbx), %r11 -; AVX512-NEXT:    movq -24(%rsp,%rbx), %r15 -; AVX512-NEXT:    movq %r15, %r9 -; AVX512-NEXT:    shldq %cl, %r11, %r9 -; AVX512-NEXT:    movq -56(%rsp,%rbx), %rdx -; AVX512-NEXT:    shldq %cl, %rdx, %r8 -; AVX512-NEXT:    shldq %cl, %r15, %r10 -; AVX512-NEXT:    shldq %cl, %r14, %r11 -; AVX512-NEXT:    movq -64(%rsp,%rbx), %rbx -; AVX512-NEXT:    shldq %cl, %rbx, %rdx -; AVX512-NEXT:    shlxq %rcx, %rbx, %rcx -; AVX512-NEXT:    movq 24(%rdi), %rbx -; AVX512-NEXT:    movq 56(%rdi), %r14 -; AVX512-NEXT:    movq 16(%rdi), %r15 -; AVX512-NEXT:    movq 48(%rdi), %r13 -; AVX512-NEXT:    movq 32(%rdi), %rbp -; AVX512-NEXT:    andnq %rbp, %r11, %r12 -; AVX512-NEXT:    andq %r11, %rbp -; AVX512-NEXT:    andnq %r13, %r10, %r11 -; AVX512-NEXT:    andq %r10, %r13 -; AVX512-NEXT:    andnq %r15, %r8, %r10 -; AVX512-NEXT:    andq %r8, %r15 -; AVX512-NEXT:    movq 40(%rdi), %r8 -; AVX512-NEXT:    orq %r13, %r15 -; AVX512-NEXT:    andnq %r8, %r9, %r13 -; AVX512-NEXT:    andq %r9, %r8 -; AVX512-NEXT:    andnq %r14, %rsi, %r9 -; AVX512-NEXT:    andq %rsi, %r14 -; AVX512-NEXT:    andnq %rbx, %rax, %rsi -; AVX512-NEXT:    andq %rax, %rbx -; AVX512-NEXT:    movq (%rdi), %rax -; AVX512-NEXT:    orq %r14, %rbx -; AVX512-NEXT:    andnq %rax, %rcx, %r14 -; AVX512-NEXT:    andq %rcx, %rax -; AVX512-NEXT:    orq %rbp, %rax -; AVX512-NEXT:    movq 8(%rdi), %rcx -; AVX512-NEXT:    orq %r15, %rax -; AVX512-NEXT:    andnq %rcx, %rdx, %r15 -; AVX512-NEXT:    andq %rdx, %rcx -; AVX512-NEXT:    orq %r8, %rcx -; AVX512-NEXT:    orq %rbx, %rcx -; AVX512-NEXT:    orq %rax, %rcx -; AVX512-NEXT:    movq %r11, 48(%rdi) -; AVX512-NEXT:    movq %r9, 56(%rdi) -; AVX512-NEXT:    movq %r12, 32(%rdi) -; AVX512-NEXT:    movq %r13, 40(%rdi) -; AVX512-NEXT:    movq %r10, 16(%rdi) -; AVX512-NEXT:    movq %rsi, 24(%rdi) -; AVX512-NEXT:    movq %r14, (%rdi) -; AVX512-NEXT:    movq %r15, 8(%rdi) -; AVX512-NEXT:    sete %al -; AVX512-NEXT:    addq $8, %rsp -; AVX512-NEXT:    popq %rbx -; AVX512-NEXT:    popq %r12 -; AVX512-NEXT:    popq %r13 -; AVX512-NEXT:    popq %r14 -; AVX512-NEXT:    popq %r15 -; AVX512-NEXT:    popq %rbp -; AVX512-NEXT:    vzeroupper -; AVX512-NEXT:    retq +; X64-LABEL: reset_eq_i512: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %ecx +; X64-NEXT:    shrl $3, %ecx +; X64-NEXT:    andl $60, %ecx +; X64-NEXT:    movl (%rdi,%rcx), %edx +; X64-NEXT:    btl %esi, %edx +; X64-NEXT:    setae %al +; X64-NEXT:    btrl %esi, %edx +; X64-NEXT:    movl %edx, (%rdi,%rcx) +; X64-NEXT:    retq    %rem = and i32 %position, 511    %ofs = zext nneg i32 %rem to i512    %bit = shl nuw i512 1, %ofs @@ -2797,572 +936,33 @@ define i1 @reset_eq_i512(ptr %word, i32 %position) nounwind {  define i1 @set_ne_i512(ptr %word, i32 %position) nounwind {  ; X86-LABEL: set_ne_i512:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $272, %esp # imm = 0x110 -; X86-NEXT:    movl 12(%ebp), %ecx -; X86-NEXT:    movl %ecx, %eax -; X86-NEXT:    shrl $3, %eax -; X86-NEXT:    andl $60, %eax -; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill -; X86-NEXT:    leal {{[0-9]+}}(%esp), %edx -; X86-NEXT:    subl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 24(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl $31, %ecx -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 56(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%edx), %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%edx), %ebx -; X86-NEXT:    movl %ebx, %esi -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%edx), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 52(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    shldl %cl, %esi, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 4(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebp), %edx -; X86-NEXT:    movl 40(%edx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %eax -; X86-NEXT:    movl 8(%edx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    movl %edx, %eax -; X86-NEXT:    movl 56(%edx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edi, %ebx -; X86-NEXT:    movl 24(%edx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    orl %esi, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%eax), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl 12(%eax), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    orl %esi, %ebx -; X86-NEXT:    movl 60(%eax), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %eax, %esi -; X86-NEXT:    movl %edx, %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl 28(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl (%eax), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%esp), %eax # 4-byte Reload -; X86-NEXT:    negl %eax -; X86-NEXT:    movl 240(%esp,%eax), %esi -; X86-NEXT:    shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, (%esp) # 4-byte Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebp), %esi -; X86-NEXT:    movl 32(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edi, %eax -; X86-NEXT:    movl (%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl 16(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %eax -; X86-NEXT:    movl 48(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl (%esp), %edx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 36(%esi), %ebx -; X86-NEXT:    movl %ebx, %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl 4(%esi), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl %esi, %eax -; X86-NEXT:    movl 20(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl %esi, %edi -; X86-NEXT:    movl 52(%eax), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    orl %edi, %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    orl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, (%esp) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl 8(%ebp), %edx -; X86-NEXT:    movl %ebx, 60(%edx) -; X86-NEXT:    movl %edi, 56(%edx) -; X86-NEXT:    movl %ecx, 52(%edx) -; X86-NEXT:    movl %esi, 44(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 40(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 36(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 32(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 28(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 24(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 20(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 16(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 12(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 8(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 4(%edx) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, (%edx) -; X86-NEXT:    movl (%esp), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, 48(%edx) -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx +; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    shrl $3, %esi +; X86-NEXT:    andl $60, %esi +; X86-NEXT:    movl (%ecx,%esi), %edi +; X86-NEXT:    btl %edx, %edi +; X86-NEXT:    setb %al +; X86-NEXT:    btsl %edx, %edi +; X86-NEXT:    movl %edi, (%ecx,%esi)  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp  ; X86-NEXT:    retl  ; -; SSE-LABEL: set_ne_i512: -; SSE:       # %bb.0: -; SSE-NEXT:    pushq %rbp -; SSE-NEXT:    pushq %r15 -; SSE-NEXT:    pushq %r14 -; SSE-NEXT:    pushq %r13 -; SSE-NEXT:    pushq %r12 -; SSE-NEXT:    pushq %rbx -; SSE-NEXT:    subq $56, %rsp -; SSE-NEXT:    xorps %xmm0, %xmm0 -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $1, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    andl $63, %ecx -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    andl $56, %esi -; SSE-NEXT:    negl %esi -; SSE-NEXT:    movslq %esi, %rbx -; SSE-NEXT:    movq (%rsp,%rbx), %rsi -; SSE-NEXT:    movq 8(%rsp,%rbx), %r14 -; SSE-NEXT:    movq %r14, %rax -; SSE-NEXT:    shldq %cl, %rsi, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 32(%rsp,%rbx), %r8 -; SSE-NEXT:    movq 40(%rsp,%rbx), %rbp -; SSE-NEXT:    shldq %cl, %r8, %rbp -; SSE-NEXT:    movq 16(%rsp,%rbx), %r9 -; SSE-NEXT:    movq 24(%rsp,%rbx), %r15 -; SSE-NEXT:    movq %r15, %r10 -; SSE-NEXT:    shldq %cl, %r9, %r10 -; SSE-NEXT:    movq -8(%rsp,%rbx), %r11 -; SSE-NEXT:    shldq %cl, %r11, %rsi -; SSE-NEXT:    shldq %cl, %r15, %r8 -; SSE-NEXT:    shldq %cl, %r14, %r9 -; SSE-NEXT:    movq -16(%rsp,%rbx), %rbx -; SSE-NEXT:    shldq %cl, %rbx, %r11 -; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx -; SSE-NEXT:    shlq %cl, %rbx -; SSE-NEXT:    movq 24(%rdi), %r15 -; SSE-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 56(%rdi), %rcx -; SSE-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 16(%rdi), %r12 -; SSE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 48(%rdi), %r13 -; SSE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %r8, %r13 -; SSE-NEXT:    andq %rsi, %r12 -; SSE-NEXT:    orq %r13, %r12 -; SSE-NEXT:    movq %rcx, %r13 -; SSE-NEXT:    andq %rbp, %r13 -; SSE-NEXT:    andq %rax, %r15 -; SSE-NEXT:    orq %r13, %r15 -; SSE-NEXT:    movq 32(%rdi), %r14 -; SSE-NEXT:    movq %r14, %rcx -; SSE-NEXT:    andq %r9, %rcx -; SSE-NEXT:    movq (%rdi), %r13 -; SSE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rbx, %r13 -; SSE-NEXT:    orq %rcx, %r13 -; SSE-NEXT:    orq %r12, %r13 -; SSE-NEXT:    movq 40(%rdi), %rcx -; SSE-NEXT:    movq %rcx, %r12 -; SSE-NEXT:    andq %r10, %r12 -; SSE-NEXT:    movq 8(%rdi), %rdx -; SSE-NEXT:    movq %rdx, %rax -; SSE-NEXT:    andq %r11, %rax -; SSE-NEXT:    orq %r12, %rax -; SSE-NEXT:    orq %r15, %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; SSE-NEXT:    orq %rcx, %r10 -; SSE-NEXT:    orq %r14, %r9 -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload -; SSE-NEXT:    orq %rdx, %r11 -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; SSE-NEXT:    orq %r13, %rax -; SSE-NEXT:    movq %r8, 48(%rdi) -; SSE-NEXT:    movq %rbp, 56(%rdi) -; SSE-NEXT:    movq %r9, 32(%rdi) -; SSE-NEXT:    movq %r10, 40(%rdi) -; SSE-NEXT:    movq %rsi, 16(%rdi) -; SSE-NEXT:    movq %r15, 24(%rdi) -; SSE-NEXT:    movq %rbx, (%rdi) -; SSE-NEXT:    movq %r11, 8(%rdi) -; SSE-NEXT:    setne %al -; SSE-NEXT:    addq $56, %rsp -; SSE-NEXT:    popq %rbx -; SSE-NEXT:    popq %r12 -; SSE-NEXT:    popq %r13 -; SSE-NEXT:    popq %r14 -; SSE-NEXT:    popq %r15 -; SSE-NEXT:    popq %rbp -; SSE-NEXT:    retq -; -; AVX2-LABEL: set_ne_i512: -; AVX2:       # %bb.0: -; AVX2-NEXT:    pushq %rbp -; AVX2-NEXT:    pushq %r15 -; AVX2-NEXT:    pushq %r14 -; AVX2-NEXT:    pushq %r13 -; AVX2-NEXT:    pushq %r12 -; AVX2-NEXT:    pushq %rbx -; AVX2-NEXT:    subq $72, %rsp -; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [1,0,0,0] -; AVX2-NEXT:    vmovups %ymm0, (%rsp) -; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    andl $63, %ecx -; AVX2-NEXT:    shrl $3, %esi -; AVX2-NEXT:    andl $56, %esi -; AVX2-NEXT:    negl %esi -; AVX2-NEXT:    movslq %esi, %rbx -; AVX2-NEXT:    movq 16(%rsp,%rbx), %rsi -; AVX2-NEXT:    movq 24(%rsp,%rbx), %rbp -; AVX2-NEXT:    movq %rbp, %rax -; AVX2-NEXT:    shldq %cl, %rsi, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 48(%rsp,%rbx), %r8 -; AVX2-NEXT:    movq 56(%rsp,%rbx), %r13 -; AVX2-NEXT:    shldq %cl, %r8, %r13 -; AVX2-NEXT:    movq 32(%rsp,%rbx), %r9 -; AVX2-NEXT:    movq 40(%rsp,%rbx), %r14 -; AVX2-NEXT:    movq %r14, %r10 -; AVX2-NEXT:    shldq %cl, %r9, %r10 -; AVX2-NEXT:    movq 8(%rsp,%rbx), %r11 -; AVX2-NEXT:    shldq %cl, %r11, %rsi -; AVX2-NEXT:    shldq %cl, %r14, %r8 -; AVX2-NEXT:    movq 16(%rdi), %r12 -; AVX2-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 48(%rdi), %r14 -; AVX2-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r8, %r14 -; AVX2-NEXT:    andq %rsi, %r12 -; AVX2-NEXT:    orq %r14, %r12 -; AVX2-NEXT:    movq 56(%rdi), %r15 -; AVX2-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r13, %r15 -; AVX2-NEXT:    movq 24(%rdi), %r14 -; AVX2-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %rax, %r14 -; AVX2-NEXT:    orq %r15, %r14 -; AVX2-NEXT:    shldq %cl, %rbp, %r9 -; AVX2-NEXT:    movq (%rsp,%rbx), %rdx -; AVX2-NEXT:    movq 32(%rdi), %r15 -; AVX2-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r9, %r15 -; AVX2-NEXT:    shlxq %rcx, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq (%rdi), %rbx -; AVX2-NEXT:    movq %rbx, %rbp -; AVX2-NEXT:    andq %rax, %rbp -; AVX2-NEXT:    orq %r15, %rbp -; AVX2-NEXT:    orq %r12, %rbp -; AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx -; AVX2-NEXT:    shldq %cl, %rdx, %r11 -; AVX2-NEXT:    movq 40(%rdi), %rax -; AVX2-NEXT:    movq %rax, %rcx -; AVX2-NEXT:    andq %r10, %rcx -; AVX2-NEXT:    movq 8(%rdi), %r15 -; AVX2-NEXT:    movq %r15, %r12 -; AVX2-NEXT:    andq %r11, %r12 -; AVX2-NEXT:    orq %rcx, %r12 -; AVX2-NEXT:    orq %r14, %r12 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; AVX2-NEXT:    orq %rax, %r10 -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload -; AVX2-NEXT:    orq %r15, %r11 -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; AVX2-NEXT:    orq %rbp, %r12 -; AVX2-NEXT:    movq %r8, 48(%rdi) -; AVX2-NEXT:    movq %r13, 56(%rdi) -; AVX2-NEXT:    movq %r9, 32(%rdi) -; AVX2-NEXT:    movq %r10, 40(%rdi) -; AVX2-NEXT:    movq %rsi, 16(%rdi) -; AVX2-NEXT:    movq %rcx, 24(%rdi) -; AVX2-NEXT:    movq %rbx, (%rdi) -; AVX2-NEXT:    movq %r11, 8(%rdi) -; AVX2-NEXT:    setne %al -; AVX2-NEXT:    addq $72, %rsp -; AVX2-NEXT:    popq %rbx -; AVX2-NEXT:    popq %r12 -; AVX2-NEXT:    popq %r13 -; AVX2-NEXT:    popq %r14 -; AVX2-NEXT:    popq %r15 -; AVX2-NEXT:    popq %rbp -; AVX2-NEXT:    vzeroupper -; AVX2-NEXT:    retq -; -; AVX512-LABEL: set_ne_i512: -; AVX512:       # %bb.0: -; AVX512-NEXT:    pushq %rbp -; AVX512-NEXT:    pushq %r15 -; AVX512-NEXT:    pushq %r14 -; AVX512-NEXT:    pushq %r13 -; AVX512-NEXT:    pushq %r12 -; AVX512-NEXT:    pushq %rbx -; AVX512-NEXT:    subq $72, %rsp -; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovaps {{.*#+}} xmm0 = [1,0,0,0] -; AVX512-NEXT:    vmovups %ymm0, (%rsp) -; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    andl $63, %ecx -; AVX512-NEXT:    shrl $3, %esi -; AVX512-NEXT:    andl $56, %esi -; AVX512-NEXT:    negl %esi -; AVX512-NEXT:    movslq %esi, %rbx -; AVX512-NEXT:    movq 16(%rsp,%rbx), %rsi -; AVX512-NEXT:    movq 24(%rsp,%rbx), %rbp -; AVX512-NEXT:    movq %rbp, %rax -; AVX512-NEXT:    shldq %cl, %rsi, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 48(%rsp,%rbx), %r8 -; AVX512-NEXT:    movq 56(%rsp,%rbx), %r13 -; AVX512-NEXT:    shldq %cl, %r8, %r13 -; AVX512-NEXT:    movq 32(%rsp,%rbx), %r9 -; AVX512-NEXT:    movq 40(%rsp,%rbx), %r14 -; AVX512-NEXT:    movq %r14, %r10 -; AVX512-NEXT:    shldq %cl, %r9, %r10 -; AVX512-NEXT:    movq 8(%rsp,%rbx), %r11 -; AVX512-NEXT:    shldq %cl, %r11, %rsi -; AVX512-NEXT:    shldq %cl, %r14, %r8 -; AVX512-NEXT:    movq 16(%rdi), %r12 -; AVX512-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 48(%rdi), %r14 -; AVX512-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r8, %r14 -; AVX512-NEXT:    andq %rsi, %r12 -; AVX512-NEXT:    orq %r14, %r12 -; AVX512-NEXT:    movq 56(%rdi), %r15 -; AVX512-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r13, %r15 -; AVX512-NEXT:    movq 24(%rdi), %r14 -; AVX512-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %rax, %r14 -; AVX512-NEXT:    orq %r15, %r14 -; AVX512-NEXT:    shldq %cl, %rbp, %r9 -; AVX512-NEXT:    movq (%rsp,%rbx), %rdx -; AVX512-NEXT:    movq 32(%rdi), %r15 -; AVX512-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r9, %r15 -; AVX512-NEXT:    shlxq %rcx, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq (%rdi), %rbx -; AVX512-NEXT:    movq %rbx, %rbp -; AVX512-NEXT:    andq %rax, %rbp -; AVX512-NEXT:    orq %r15, %rbp -; AVX512-NEXT:    orq %r12, %rbp -; AVX512-NEXT:    # kill: def $cl killed $cl killed $rcx -; AVX512-NEXT:    shldq %cl, %rdx, %r11 -; AVX512-NEXT:    movq 40(%rdi), %rax -; AVX512-NEXT:    movq %rax, %rcx -; AVX512-NEXT:    andq %r10, %rcx -; AVX512-NEXT:    movq 8(%rdi), %r15 -; AVX512-NEXT:    movq %r15, %r12 -; AVX512-NEXT:    andq %r11, %r12 -; AVX512-NEXT:    orq %rcx, %r12 -; AVX512-NEXT:    orq %r14, %r12 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; AVX512-NEXT:    orq %rax, %r10 -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Folded Reload -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload -; AVX512-NEXT:    orq %r15, %r11 -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Folded Reload -; AVX512-NEXT:    orq %rbp, %r12 -; AVX512-NEXT:    movq %r8, 48(%rdi) -; AVX512-NEXT:    movq %r13, 56(%rdi) -; AVX512-NEXT:    movq %r9, 32(%rdi) -; AVX512-NEXT:    movq %r10, 40(%rdi) -; AVX512-NEXT:    movq %rsi, 16(%rdi) -; AVX512-NEXT:    movq %rcx, 24(%rdi) -; AVX512-NEXT:    movq %rbx, (%rdi) -; AVX512-NEXT:    movq %r11, 8(%rdi) -; AVX512-NEXT:    setne %al -; AVX512-NEXT:    addq $72, %rsp -; AVX512-NEXT:    popq %rbx -; AVX512-NEXT:    popq %r12 -; AVX512-NEXT:    popq %r13 -; AVX512-NEXT:    popq %r14 -; AVX512-NEXT:    popq %r15 -; AVX512-NEXT:    popq %rbp -; AVX512-NEXT:    vzeroupper -; AVX512-NEXT:    retq +; X64-LABEL: set_ne_i512: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %ecx +; X64-NEXT:    shrl $3, %ecx +; X64-NEXT:    andl $60, %ecx +; X64-NEXT:    movl (%rdi,%rcx), %edx +; X64-NEXT:    btl %esi, %edx +; X64-NEXT:    setb %al +; X64-NEXT:    btsl %esi, %edx +; X64-NEXT:    movl %edx, (%rdi,%rcx) +; X64-NEXT:    retq    %rem = and i32 %position, 511    %ofs = zext nneg i32 %rem to i512    %bit = shl nuw i512 1, %ofs @@ -3383,13 +983,14 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi  ; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $432, %esp # imm = 0x1B0 +; X86-NEXT:    subl $352, %esp # imm = 0x160  ; X86-NEXT:    movl 12(%ebp), %ecx  ; X86-NEXT:    movl %ecx, %edx  ; X86-NEXT:    shrl $3, %edx  ; X86-NEXT:    andl $60, %edx -; X86-NEXT:    leal {{[0-9]+}}(%esp), %esi -; X86-NEXT:    subl %edx, %esi +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax +; X86-NEXT:    subl %edx, %eax  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) @@ -3422,60 +1023,58 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 56(%esi), %eax +; X86-NEXT:    movl 56(%eax), %esi +; X86-NEXT:    movl 60(%eax), %ebx +; X86-NEXT:    movl 52(%eax), %edi +; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 48(%eax), %edi +; X86-NEXT:    movl 44(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 40(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 36(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 32(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 28(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 24(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 20(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 16(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 12(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 8(%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl (%eax), %edx +; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 4(%eax), %eax  ; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%esi), %eax +; X86-NEXT:    movzbl 16(%ebp), %eax +; X86-NEXT:    movzbl %al, %eax +; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp) +; X86-NEXT:    andl $31, %ecx +; X86-NEXT:    shldl %cl, %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    shldl %cl, %eax, %esi +; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    shldl %cl, %edi, %eax  ; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 52(%esi), %eax -; X86-NEXT:    movl 48(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 24(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%esi), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%esi), %edi +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    shldl %cl, %ebx, %edi  ; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 4(%esi), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movzbl 16(%ebp), %ebx -; X86-NEXT:    movzbl %bl, %esi -; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp) -; X86-NEXT:    leal {{[0-9]+}}(%esp), %esi -; X86-NEXT:    subl %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl $31, %ecx  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-NEXT:    shldl %cl, %edx, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload  ; X86-NEXT:    shldl %cl, %eax, %edx  ; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    shldl %cl, %ebx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    shldl %cl, %edx, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload  ; X86-NEXT:    shldl %cl, %eax, %edx  ; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill @@ -3500,9 +1099,12 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload  ; X86-NEXT:    shldl %cl, %eax, %esi  ; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    movl %ebx, %edx -; X86-NEXT:    shldl %cl, %edi, %edx +; X86-NEXT:    shll %cl, %eax +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax +; X86-NEXT:    subl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) @@ -3534,273 +1136,148 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %edx +; X86-NEXT:    movl 56(%eax), %esi +; X86-NEXT:    movl 60(%eax), %edi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    movl 8(%ebp), %edx +; X86-NEXT:    andl 60(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 52(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 56(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 48(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 52(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 44(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 48(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 40(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 44(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 36(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 40(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 32(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 36(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 28(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 32(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 24(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 28(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 20(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 24(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 16(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 20(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 12(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 16(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 8(%eax), %esi +; X86-NEXT:    shldl %cl, %esi, %edi +; X86-NEXT:    andl 12(%edx), %ebx +; X86-NEXT:    orl %edi, %ebx +; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    notl %ebx +; X86-NEXT:    movl 4(%eax), %edi +; X86-NEXT:    shldl %cl, %edi, %esi +; X86-NEXT:    andl 8(%edx), %ebx +; X86-NEXT:    orl %esi, %ebx  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%ebx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%ebx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %edx -; X86-NEXT:    movl %edx, %esi +; X86-NEXT:    notl %esi +; X86-NEXT:    movl (%eax), %eax +; X86-NEXT:    shldl %cl, %eax, %edi +; X86-NEXT:    andl 4(%edx), %esi +; X86-NEXT:    orl %edi, %esi +; X86-NEXT:    movl %esi, %edi +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-NEXT:    notl %esi +; X86-NEXT:    shll %cl, %eax +; X86-NEXT:    andl (%edx), %esi +; X86-NEXT:    orl %eax, %esi  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %eax -; X86-NEXT:    orl %esi, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 56(%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %edx -; X86-NEXT:    movl %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 24(%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %edx -; X86-NEXT:    orl %edi, %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl (%edx,%eax), %eax +; X86-NEXT:    btl %ecx, %eax  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 52(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %eax -; X86-NEXT:    movl %eax, %edx +; X86-NEXT:    movl %eax, 60(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %eax -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl %eax, 56(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%ebx), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %eax, %edx -; X86-NEXT:    orl %esi, %edx -; X86-NEXT:    orl %edi, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload +; X86-NEXT:    movl %eax, 52(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %ecx -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl (%ebx), %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edi, %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl %eax, 48(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%ebx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ecx, %eax -; X86-NEXT:    movl %eax, %ecx -; X86-NEXT:    movl %edx, %eax -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 4(%ebx), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edx, %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl 56(%edi), %ebx -; X86-NEXT:    movl 60(%edi), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    shldl %cl, %ebx, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 52(%edi), %eax -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 48(%edi), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl %eax, 44(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    notl %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl %eax, %edx -; X86-NEXT:    movl 40(%edi), %ebx -; X86-NEXT:    movl 44(%edi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %ebx, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 36(%edi), %eax -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 32(%edi), %ebx -; X86-NEXT:    shldl %cl, %ebx, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 28(%edi), %eax -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 24(%edi), %ebx -; X86-NEXT:    shldl %cl, %ebx, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 20(%edi), %eax -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 16(%edi), %ebx -; X86-NEXT:    shldl %cl, %ebx, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl 12(%edi), %eax -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    notl %esi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    movl 8(%edi), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl %eax, 40(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    notl %eax -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl 4(%edi), %ebx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    shldl %cl, %ebx, %edx -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx +; X86-NEXT:    movl %eax, 36(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    shldl %cl, %esi, %eax -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl %edx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    movl (%edi), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %ebx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    notl %edi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %eax -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    movl %edi, %ecx +; X86-NEXT:    movl %eax, 32(%edx)  ; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 60(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 56(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 52(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 44(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 40(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 36(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 32(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 28(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 24(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 20(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 16(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 12(%eax) -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl %edi, 8(%eax) -; X86-NEXT:    movl %edx, 4(%eax) -; X86-NEXT:    movl %ecx, (%eax) -; X86-NEXT:    movl %esi, 48(%eax) -; X86-NEXT:    sete %al +; X86-NEXT:    movl %eax, 28(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 24(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 20(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 16(%edx) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    movl %eax, 12(%edx) +; X86-NEXT:    movl %ebx, 8(%edx) +; X86-NEXT:    movl %edi, 4(%edx) +; X86-NEXT:    movl %esi, (%edx) +; X86-NEXT:    setae %al  ; X86-NEXT:    leal -12(%ebp), %esp  ; X86-NEXT:    popl %esi  ; X86-NEXT:    popl %edi @@ -3816,7 +1293,8 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; SSE-NEXT:    pushq %r13  ; SSE-NEXT:    pushq %r12  ; SSE-NEXT:    pushq %rbx -; SSE-NEXT:    subq $216, %rsp +; SSE-NEXT:    subq $168, %rsp +; SSE-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill  ; SSE-NEXT:    xorps %xmm0, %xmm0  ; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp)  ; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) @@ -3829,139 +1307,107 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; SSE-NEXT:    movq $1, {{[0-9]+}}(%rsp)  ; SSE-NEXT:    movl %esi, %ecx  ; SSE-NEXT:    andl $63, %ecx -; SSE-NEXT:    shrl $3, %esi -; SSE-NEXT:    andl $56, %esi -; SSE-NEXT:    negl %esi -; SSE-NEXT:    movslq %esi, %r10 -; SSE-NEXT:    movq 184(%rsp,%r10), %r11 -; SSE-NEXT:    movq 192(%rsp,%r10), %rsi -; SSE-NEXT:    movq %rsi, %r13 -; SSE-NEXT:    shldq %cl, %r11, %r13 -; SSE-NEXT:    movq 200(%rsp,%r10), %r15 -; SSE-NEXT:    shldq %cl, %rsi, %r15 -; SSE-NEXT:    movq 168(%rsp,%r10), %rbx -; SSE-NEXT:    movq 176(%rsp,%r10), %rsi -; SSE-NEXT:    movq %rsi, %r14 -; SSE-NEXT:    shldq %cl, %rbx, %r14 -; SSE-NEXT:    shldq %cl, %rsi, %r11 -; SSE-NEXT:    movq 152(%rsp,%r10), %rax -; SSE-NEXT:    movq 160(%rsp,%r10), %r8 -; SSE-NEXT:    movq %r8, %r12 -; SSE-NEXT:    shldq %cl, %rax, %r12 -; SSE-NEXT:    shldq %cl, %r8, %rbx -; SSE-NEXT:    movq 144(%rsp,%r10), %r9 -; SSE-NEXT:    movq %r9, %r8 -; SSE-NEXT:    shlq %cl, %r8 -; SSE-NEXT:    shldq %cl, %r9, %rax -; SSE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movl %edx, %edx -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movl %esi, %eax +; SSE-NEXT:    shrl $3, %eax +; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    # kill: def $eax killed $eax killed $rax +; SSE-NEXT:    andl $56, %eax +; SSE-NEXT:    negl %eax +; SSE-NEXT:    movslq %eax, %r12 +; SSE-NEXT:    movq 136(%rsp,%r12), %r9 +; SSE-NEXT:    movq 144(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %rsi +; SSE-NEXT:    shldq %cl, %r9, %rsi +; SSE-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    movq 152(%rsp,%r12), %r11 +; SSE-NEXT:    shldq %cl, %rax, %r11 +; SSE-NEXT:    movq 120(%rsp,%r12), %r10 +; SSE-NEXT:    movq 128(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %rbx +; SSE-NEXT:    shldq %cl, %r10, %rbx +; SSE-NEXT:    shldq %cl, %rax, %r9 +; SSE-NEXT:    movq 104(%rsp,%r12), %r14 +; SSE-NEXT:    movq 112(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %r15 +; SSE-NEXT:    shldq %cl, %r14, %r15 +; SSE-NEXT:    shldq %cl, %rax, %r10 +; SSE-NEXT:    movq 96(%rsp,%r12), %rax +; SSE-NEXT:    movq %rax, %r13 +; SSE-NEXT:    shlq %cl, %r13 +; SSE-NEXT:    shldq %cl, %rax, %r14 +; SSE-NEXT:    movl %edx, %eax  ; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, (%rsp) +; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movups %xmm0, -{{[0-9]+}}(%rsp) +; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)  ; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)  ; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)  ; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE-NEXT:    movq %rdx, {{[0-9]+}}(%rsp) +; SSE-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)  ; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movq 16(%rdi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 48(%rdi), %rsi -; SSE-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rsi, %r13 -; SSE-NEXT:    andq %rdx, %r12 -; SSE-NEXT:    orq %r13, %r12 -; SSE-NEXT:    movq %r15, %rsi -; SSE-NEXT:    movq 56(%rdi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rdx, %r15 -; SSE-NEXT:    movq %rbx, %r13 -; SSE-NEXT:    movq 24(%rdi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rdx, %rbx -; SSE-NEXT:    orq %r15, %rbx -; SSE-NEXT:    movq %r14, %rbp -; SSE-NEXT:    movq 32(%rdi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rdx, %r14 -; SSE-NEXT:    movq %r8, %r15 -; SSE-NEXT:    movq (%rdi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rdx, %r8 -; SSE-NEXT:    orq %r14, %r8 -; SSE-NEXT:    orq %r12, %r8 -; SSE-NEXT:    movq %r11, %r12 -; SSE-NEXT:    movq 40(%rdi), %r9 -; SSE-NEXT:    andq %r9, %r11 -; SSE-NEXT:    movq %rax, %r14 -; SSE-NEXT:    movq 8(%rdi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq %rdx, %rax -; SSE-NEXT:    orq %r11, %rax -; SSE-NEXT:    orq %rbx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    movq 8(%rsp,%r12), %r8 +; SSE-NEXT:    movq 16(%rsp,%r12), %rsi +; SSE-NEXT:    movq %rsi, %rbp +; SSE-NEXT:    shldq %cl, %r8, %rbp  ; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload  ; SSE-NEXT:    notq %rax -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload -; SSE-NEXT:    movq %rax, %rdx -; SSE-NEXT:    movq 56(%rsp,%r10), %r11 -; SSE-NEXT:    movq 64(%rsp,%r10), %rax -; SSE-NEXT:    movq %rax, %rbx -; SSE-NEXT:    shldq %cl, %r11, %rbx -; SSE-NEXT:    orq %rbx, %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    notq %rsi -; SSE-NEXT:    movq 72(%rsp,%r10), %rbx -; SSE-NEXT:    shldq %cl, %rax, %rbx -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; SSE-NEXT:    orq %rbx, %rsi -; SSE-NEXT:    notq %rbp -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Folded Reload -; SSE-NEXT:    movq 40(%rsp,%r10), %rax -; SSE-NEXT:    movq 48(%rsp,%r10), %rdx -; SSE-NEXT:    movq %rdx, %rbx -; SSE-NEXT:    shldq %cl, %rax, %rbx -; SSE-NEXT:    orq %rbx, %rbp -; SSE-NEXT:    notq %r12 -; SSE-NEXT:    andq %r9, %r12 -; SSE-NEXT:    shldq %cl, %rdx, %r11 -; SSE-NEXT:    movq 24(%rsp,%r10), %r9 -; SSE-NEXT:    movq 32(%rsp,%r10), %rdx -; SSE-NEXT:    movq %rdx, %rbx -; SSE-NEXT:    shldq %cl, %r9, %rbx -; SSE-NEXT:    orq %r11, %r12 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload +; SSE-NEXT:    andq 48(%rdi), %rax +; SSE-NEXT:    orq %rbp, %rax +; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; SSE-NEXT:    notq %rbx  ; SSE-NEXT:    notq %r11 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Folded Reload -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    orq %rbx, %r11 -; SSE-NEXT:    notq %r13 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Folded Reload -; SSE-NEXT:    orq %rax, %r13 +; SSE-NEXT:    movq 24(%rsp,%r12), %rax +; SSE-NEXT:    shldq %cl, %rsi, %rax +; SSE-NEXT:    movq -8(%rsp,%r12), %rbp +; SSE-NEXT:    movq (%rsp,%r12), %rdx +; SSE-NEXT:    movq %rdx, %rsi +; SSE-NEXT:    shldq %cl, %rbp, %rsi +; SSE-NEXT:    andq 56(%rdi), %r11 +; SSE-NEXT:    andq 32(%rdi), %rbx +; SSE-NEXT:    orq %rax, %r11 +; SSE-NEXT:    orq %rsi, %rbx  ; SSE-NEXT:    notq %r15 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Folded Reload -; SSE-NEXT:    movq 16(%rsp,%r10), %rax -; SSE-NEXT:    movq %rax, %rdx -; SSE-NEXT:    shlq %cl, %rdx -; SSE-NEXT:    orq %rdx, %r15 +; SSE-NEXT:    shldq %cl, %rdx, %r8 +; SSE-NEXT:    notq %r9 +; SSE-NEXT:    andq 40(%rdi), %r9 +; SSE-NEXT:    orq %r8, %r9 +; SSE-NEXT:    movq -24(%rsp,%r12), %rax +; SSE-NEXT:    movq -16(%rsp,%r12), %rdx +; SSE-NEXT:    movq %rdx, %rsi +; SSE-NEXT:    shldq %cl, %rax, %rsi +; SSE-NEXT:    andq 16(%rdi), %r15 +; SSE-NEXT:    orq %rsi, %r15 +; SSE-NEXT:    shldq %cl, %rdx, %rbp +; SSE-NEXT:    notq %r10 +; SSE-NEXT:    notq %r13 +; SSE-NEXT:    movq -32(%rsp,%r12), %rdx +; SSE-NEXT:    movq %rdx, %rsi +; SSE-NEXT:    shlq %cl, %rsi +; SSE-NEXT:    andq 24(%rdi), %r10 +; SSE-NEXT:    andq (%rdi), %r13 +; SSE-NEXT:    orq %rbp, %r10 +; SSE-NEXT:    orq %rsi, %r13  ; SSE-NEXT:    notq %r14 -; SSE-NEXT:    andq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Folded Reload  ; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx -; SSE-NEXT:    shldq %cl, %rax, %r9 -; SSE-NEXT:    orq %r9, %r14 -; SSE-NEXT:    orq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill +; SSE-NEXT:    shldq %cl, %rdx, %rax +; SSE-NEXT:    andq 8(%rdi), %r14 +; SSE-NEXT:    orq %rax, %r14 +; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload +; SSE-NEXT:    andl $60, %eax +; SSE-NEXT:    movl (%rdi,%rax), %eax +; SSE-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload +; SSE-NEXT:    btl %ecx, %eax  ; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload  ; SSE-NEXT:    movq %rax, 48(%rdi) -; SSE-NEXT:    movq %rsi, 56(%rdi) -; SSE-NEXT:    movq %rbp, 32(%rdi) -; SSE-NEXT:    movq %r12, 40(%rdi) -; SSE-NEXT:    movq %r11, 16(%rdi) -; SSE-NEXT:    movq %r13, 24(%rdi) -; SSE-NEXT:    movq %r15, (%rdi) +; SSE-NEXT:    movq %r11, 56(%rdi) +; SSE-NEXT:    movq %rbx, 32(%rdi) +; SSE-NEXT:    movq %r9, 40(%rdi) +; SSE-NEXT:    movq %r15, 16(%rdi) +; SSE-NEXT:    movq %r10, 24(%rdi) +; SSE-NEXT:    movq %r13, (%rdi)  ; SSE-NEXT:    movq %r14, 8(%rdi) -; SSE-NEXT:    sete %al -; SSE-NEXT:    addq $216, %rsp +; SSE-NEXT:    setae %al +; SSE-NEXT:    addq $168, %rsp  ; SSE-NEXT:    popq %rbx  ; SSE-NEXT:    popq %r12  ; SSE-NEXT:    popq %r13 @@ -3978,132 +1424,105 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; AVX2-NEXT:    pushq %r13  ; AVX2-NEXT:    pushq %r12  ; AVX2-NEXT:    pushq %rbx -; AVX2-NEXT:    subq $200, %rsp +; AVX2-NEXT:    subq $184, %rsp  ; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0  ; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [1,0,0,0]  ; AVX2-NEXT:    vmovups %ymm1, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    movl %esi, %r8d -; AVX2-NEXT:    andl $63, %r8d -; AVX2-NEXT:    shrl $3, %esi -; AVX2-NEXT:    andl $56, %esi -; AVX2-NEXT:    negl %esi -; AVX2-NEXT:    movslq %esi, %rsi -; AVX2-NEXT:    movq 144(%rsp,%rsi), %r11 -; AVX2-NEXT:    movq 152(%rsp,%rsi), %r12 -; AVX2-NEXT:    movq %r12, %r10 -; AVX2-NEXT:    movl %r8d, %ecx -; AVX2-NEXT:    shldq %cl, %r11, %r10 -; AVX2-NEXT:    movq 176(%rsp,%rsi), %r14 -; AVX2-NEXT:    movq 184(%rsp,%rsi), %r9 +; AVX2-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; AVX2-NEXT:    movl %esi, %ecx +; AVX2-NEXT:    andl $63, %ecx +; AVX2-NEXT:    movl %esi, %ebx +; AVX2-NEXT:    shrl $3, %ebx +; AVX2-NEXT:    movl %ebx, %eax +; AVX2-NEXT:    andl $56, %eax +; AVX2-NEXT:    negl %eax +; AVX2-NEXT:    movslq %eax, %r11 +; AVX2-NEXT:    movq 128(%rsp,%r11), %r15 +; AVX2-NEXT:    movq 136(%rsp,%r11), %rax +; AVX2-NEXT:    movq %rax, %rsi +; AVX2-NEXT:    shldq %cl, %r15, %rsi +; AVX2-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    movq 120(%rsp,%r11), %r8 +; AVX2-NEXT:    shldq %cl, %r8, %r15 +; AVX2-NEXT:    movq 144(%rsp,%r11), %r14 +; AVX2-NEXT:    movq 152(%rsp,%r11), %rsi +; AVX2-NEXT:    movq %rsi, %r9  ; AVX2-NEXT:    shldq %cl, %r14, %r9 -; AVX2-NEXT:    movq 160(%rsp,%rsi), %r15 -; AVX2-NEXT:    movq 168(%rsp,%rsi), %r13 -; AVX2-NEXT:    movq %r13, %rbx -; AVX2-NEXT:    shldq %cl, %r15, %rbx -; AVX2-NEXT:    movq 128(%rsp,%rsi), %rbp -; AVX2-NEXT:    movq %rbp, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 136(%rsp,%rsi), %rax -; AVX2-NEXT:    shldq %cl, %rax, %r11 -; AVX2-NEXT:    shldq %cl, %r13, %r14 -; AVX2-NEXT:    shldq %cl, %r12, %r15 -; AVX2-NEXT:    shldq %cl, %rbp, %rax +; AVX2-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    shldq %cl, %rax, %r14 +; AVX2-NEXT:    movq 112(%rsp,%r11), %rax  ; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movl %edx, %edx +; AVX2-NEXT:    movq 160(%rsp,%r11), %r13 +; AVX2-NEXT:    movq 168(%rsp,%r11), %r12 +; AVX2-NEXT:    shldq %cl, %r13, %r12 +; AVX2-NEXT:    shldq %cl, %rsi, %r13 +; AVX2-NEXT:    shldq %cl, %rax, %r8 +; AVX2-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill +; AVX2-NEXT:    movl %edx, %eax  ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1  ; AVX2-NEXT:    vmovups %xmm1, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp)  ; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) -; AVX2-NEXT:    movq %rdx, (%rsp) +; AVX2-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp) +; AVX2-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)  ; AVX2-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    movq 16(%rdi), %r12 -; AVX2-NEXT:    movq 48(%rdi), %rbp -; AVX2-NEXT:    movq 32(%rdi), %r13 -; AVX2-NEXT:    andnq %r13, %r15, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r15, %r13 -; AVX2-NEXT:    andnq %rbp, %r14, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r14, %rbp -; AVX2-NEXT:    andnq %r12, %r11, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r11, %r12 -; AVX2-NEXT:    movq 40(%rdi), %rax -; AVX2-NEXT:    orq %rbp, %r12 -; AVX2-NEXT:    andnq %rax, %rbx, %rcx -; AVX2-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq %rax, %rbp -; AVX2-NEXT:    andq %rbx, %rbp -; AVX2-NEXT:    movq 56(%rdi), %rcx -; AVX2-NEXT:    andnq %rcx, %r9, %rbx -; AVX2-NEXT:    andq %r9, %rcx -; AVX2-NEXT:    movq 24(%rdi), %rax -; AVX2-NEXT:    andnq %rax, %r10, %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq %r10, %rax -; AVX2-NEXT:    orq %rcx, %rax -; AVX2-NEXT:    shlxq %r8, {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Folded Reload -; AVX2-NEXT:    movq (%rdi), %r10 -; AVX2-NEXT:    andnq %r10, %rcx, %r15 -; AVX2-NEXT:    andq %rcx, %r10 -; AVX2-NEXT:    movq 40(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq 48(%rsp,%rsi), %r11 -; AVX2-NEXT:    movq %r11, %r9 -; AVX2-NEXT:    movl %r8d, %ecx -; AVX2-NEXT:    shldq %cl, %rdx, %r9 -; AVX2-NEXT:    orq %r13, %r10 -; AVX2-NEXT:    orq %r12, %r10 -; AVX2-NEXT:    movq 8(%rdi), %r13 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; AVX2-NEXT:    andnq %r13, %rcx, %r12 -; AVX2-NEXT:    andq %rcx, %r13 -; AVX2-NEXT:    orq %rbp, %r13 +; AVX2-NEXT:    movq 24(%rsp,%r11), %rbp +; AVX2-NEXT:    movq 32(%rsp,%r11), %rdx +; AVX2-NEXT:    movq %rdx, %rax +; AVX2-NEXT:    shldq %cl, %rbp, %rax +; AVX2-NEXT:    movq 40(%rsp,%r11), %r10 +; AVX2-NEXT:    shldq %cl, %rdx, %r10 +; AVX2-NEXT:    movq 8(%rsp,%r11), %r9 +; AVX2-NEXT:    movq 16(%rsp,%r11), %rdx +; AVX2-NEXT:    movq %rdx, %r8 +; AVX2-NEXT:    shldq %cl, %r9, %r8 +; AVX2-NEXT:    shldq %cl, %rdx, %rbp +; AVX2-NEXT:    andnq 48(%rdi), %r13, %r13  ; AVX2-NEXT:    orq %rax, %r13 -; AVX2-NEXT:    movq 56(%rsp,%rsi), %rax -; AVX2-NEXT:    movl %r8d, %ecx -; AVX2-NEXT:    shldq %cl, %r11, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    orq %r9, %r14 -; AVX2-NEXT:    orq %rax, %rbx -; AVX2-NEXT:    movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 24(%rsp,%rsi), %rax -; AVX2-NEXT:    movq 32(%rsp,%rsi), %r9 -; AVX2-NEXT:    movq %r9, %r11 -; AVX2-NEXT:    shldq %cl, %rax, %r11 -; AVX2-NEXT:    shldq %cl, %r9, %rdx -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; AVX2-NEXT:    orq %r11, %rbp -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX2-NEXT:    orq %rdx, %rbx -; AVX2-NEXT:    movq 8(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq 16(%rsp,%rsi), %r9 -; AVX2-NEXT:    movq %r9, %r11 -; AVX2-NEXT:    shldq %cl, %rdx, %r11 -; AVX2-NEXT:    shldq %cl, %r9, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX2-NEXT:    orq %r11, %r9 -; AVX2-NEXT:    movq (%rsp,%rsi), %rsi -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX2-NEXT:    orq %rax, %r11 -; AVX2-NEXT:    shlxq %r8, %rsi, %rax -; AVX2-NEXT:    shldq %cl, %rsi, %rdx -; AVX2-NEXT:    orq %rax, %r15 -; AVX2-NEXT:    orq %rdx, %r12 -; AVX2-NEXT:    orq %r10, %r13 -; AVX2-NEXT:    movq %r14, 48(%rdi) -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    movq %rax, 56(%rdi) -; AVX2-NEXT:    movq %rbp, 32(%rdi) -; AVX2-NEXT:    movq %rbx, 40(%rdi) -; AVX2-NEXT:    movq %r9, 16(%rdi) -; AVX2-NEXT:    movq %r11, 24(%rdi) -; AVX2-NEXT:    movq %r15, (%rdi) -; AVX2-NEXT:    movq %r12, 8(%rdi) -; AVX2-NEXT:    sete %al -; AVX2-NEXT:    addq $200, %rsp +; AVX2-NEXT:    movq -8(%rsp,%r11), %rax +; AVX2-NEXT:    movq (%rsp,%r11), %rdx +; AVX2-NEXT:    movq %rdx, %rsi +; AVX2-NEXT:    shldq %cl, %rax, %rsi +; AVX2-NEXT:    shldq %cl, %rdx, %r9 +; AVX2-NEXT:    andnq 56(%rdi), %r12, %r12 +; AVX2-NEXT:    andnq 32(%rdi), %r14, %r14 +; AVX2-NEXT:    orq %r10, %r12 +; AVX2-NEXT:    orq %r8, %r14 +; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload +; AVX2-NEXT:    andnq 40(%rdi), %rdx, %rdx +; AVX2-NEXT:    orq %rbp, %rdx +; AVX2-NEXT:    shlxq %rcx, {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Folded Reload +; AVX2-NEXT:    movq -16(%rsp,%r11), %r10 +; AVX2-NEXT:    shlxq %rcx, %r10, %r11 +; AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx +; AVX2-NEXT:    shldq %cl, %r10, %rax +; AVX2-NEXT:    andnq 16(%rdi), %r15, %rcx +; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload +; AVX2-NEXT:    andnq 24(%rdi), %r10, %r10 +; AVX2-NEXT:    orq %rsi, %rcx +; AVX2-NEXT:    orq %r9, %r10 +; AVX2-NEXT:    andnq (%rdi), %r8, %rsi +; AVX2-NEXT:    orq %r11, %rsi +; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload +; AVX2-NEXT:    andnq 8(%rdi), %r8, %r8 +; AVX2-NEXT:    orq %rax, %r8 +; AVX2-NEXT:    andl $60, %ebx +; AVX2-NEXT:    movl (%rdi,%rbx), %eax +; AVX2-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Reload +; AVX2-NEXT:    btl %r9d, %eax +; AVX2-NEXT:    movq %r13, 48(%rdi) +; AVX2-NEXT:    movq %r12, 56(%rdi) +; AVX2-NEXT:    movq %r14, 32(%rdi) +; AVX2-NEXT:    movq %rdx, 40(%rdi) +; AVX2-NEXT:    movq %rcx, 16(%rdi) +; AVX2-NEXT:    movq %r10, 24(%rdi) +; AVX2-NEXT:    movq %rsi, (%rdi) +; AVX2-NEXT:    movq %r8, 8(%rdi) +; AVX2-NEXT:    setae %al +; AVX2-NEXT:    addq $184, %rsp  ; AVX2-NEXT:    popq %rbx  ; AVX2-NEXT:    popq %r12  ; AVX2-NEXT:    popq %r13 @@ -4121,39 +1540,41 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; AVX512-NEXT:    pushq %r13  ; AVX512-NEXT:    pushq %r12  ; AVX512-NEXT:    pushq %rbx -; AVX512-NEXT:    subq $184, %rsp +; AVX512-NEXT:    subq $168, %rsp  ; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0  ; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp)  ; AVX512-NEXT:    vmovaps {{.*#+}} xmm1 = [1,0,0,0]  ; AVX512-NEXT:    vmovups %ymm1, {{[0-9]+}}(%rsp) +; AVX512-NEXT:    movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill  ; AVX512-NEXT:    movl %esi, %ecx  ; AVX512-NEXT:    andl $63, %ecx -; AVX512-NEXT:    shrl $3, %esi -; AVX512-NEXT:    andl $56, %esi -; AVX512-NEXT:    negl %esi -; AVX512-NEXT:    movslq %esi, %rsi -; AVX512-NEXT:    movq 128(%rsp,%rsi), %r10 -; AVX512-NEXT:    movq 136(%rsp,%rsi), %r12 -; AVX512-NEXT:    movq %r12, %rax -; AVX512-NEXT:    shldq %cl, %r10, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 160(%rsp,%rsi), %r14 -; AVX512-NEXT:    movq 168(%rsp,%rsi), %rax -; AVX512-NEXT:    shldq %cl, %r14, %rax +; AVX512-NEXT:    movl %esi, %r10d +; AVX512-NEXT:    shrl $3, %r10d +; AVX512-NEXT:    movl %r10d, %r8d +; AVX512-NEXT:    andl $56, %r8d +; AVX512-NEXT:    negl %r8d +; AVX512-NEXT:    movslq %r8d, %r9 +; AVX512-NEXT:    movq 112(%rsp,%r9), %r11 +; AVX512-NEXT:    movq 120(%rsp,%r9), %r14 +; AVX512-NEXT:    movq %r14, %rax +; AVX512-NEXT:    shldq %cl, %r11, %rax  ; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 144(%rsp,%rsi), %r15 -; AVX512-NEXT:    movq 152(%rsp,%rsi), %r11 -; AVX512-NEXT:    movq %r11, %rbx +; AVX512-NEXT:    movq 104(%rsp,%r9), %rax +; AVX512-NEXT:    shldq %cl, %rax, %r11 +; AVX512-NEXT:    movq 128(%rsp,%r9), %r15 +; AVX512-NEXT:    movq 136(%rsp,%r9), %rbp +; AVX512-NEXT:    movq %rbp, %rbx  ; AVX512-NEXT:    shldq %cl, %r15, %rbx -; AVX512-NEXT:    movq 120(%rsp,%rsi), %rax +; AVX512-NEXT:    shldq %cl, %r14, %r15 +; AVX512-NEXT:    movq 144(%rsp,%r9), %r13 +; AVX512-NEXT:    movq 152(%rsp,%r9), %r12 +; AVX512-NEXT:    shldq %cl, %r13, %r12 +; AVX512-NEXT:    movq 96(%rsp,%r9), %r14 +; AVX512-NEXT:    shldq %cl, %rbp, %r13 +; AVX512-NEXT:    shldq %cl, %r14, %rax  ; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rax, %r10 -; AVX512-NEXT:    shldq %cl, %r11, %r14 -; AVX512-NEXT:    movq %rdi, %r9 -; AVX512-NEXT:    movq 112(%rsp,%rsi), %r11 -; AVX512-NEXT:    shldq %cl, %r12, %r15  ; AVX512-NEXT:    movl %edx, %edx  ; AVX512-NEXT:    vxorps %xmm1, %xmm1, %xmm1  ; AVX512-NEXT:    vmovups %xmm1, {{[0-9]+}}(%rsp) @@ -4162,90 +1583,59 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  ; AVX512-NEXT:    vmovups %ymm0, -{{[0-9]+}}(%rsp)  ; AVX512-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)  ; AVX512-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    movq 16(%rdi), %r12 -; AVX512-NEXT:    movq 48(%rdi), %r13 -; AVX512-NEXT:    movq 32(%rdi), %rbp -; AVX512-NEXT:    andnq %rbp, %r15, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r15, %rbp -; AVX512-NEXT:    andnq %r13, %r14, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r14, %r13 -; AVX512-NEXT:    andnq %r12, %r10, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq %r10, %r12 -; AVX512-NEXT:    movq 40(%rdi), %r8 -; AVX512-NEXT:    orq %r13, %r12 -; AVX512-NEXT:    andnq %r8, %rbx, %rdi -; AVX512-NEXT:    andq %rbx, %r8 -; AVX512-NEXT:    movq 56(%r9), %r13 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; AVX512-NEXT:    andnq %r13, %rdx, %r10 -; AVX512-NEXT:    andq %rdx, %r13 -; AVX512-NEXT:    movq 24(%r9), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; AVX512-NEXT:    andnq %rax, %rdx, %r15 -; AVX512-NEXT:    andq %rdx, %rax -; AVX512-NEXT:    orq %r13, %rax -; AVX512-NEXT:    shlxq %rcx, %r11, %r13 -; AVX512-NEXT:    movq (%r9), %rdx -; AVX512-NEXT:    andnq %rdx, %r13, %r14 -; AVX512-NEXT:    andq %r13, %rdx -; AVX512-NEXT:    orq %rbp, %rdx -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r11, %rbp -; AVX512-NEXT:    orq %r12, %rdx -; AVX512-NEXT:    movq 8(%r9), %r13 -; AVX512-NEXT:    andnq %r13, %rbp, %rbx -; AVX512-NEXT:    andq %rbp, %r13 -; AVX512-NEXT:    orq %r8, %r13 -; AVX512-NEXT:    movq 24(%rsp,%rsi), %r8 -; AVX512-NEXT:    orq %rax, %r13 -; AVX512-NEXT:    movq 32(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, %r12 -; AVX512-NEXT:    shldq %cl, %r8, %r12 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX512-NEXT:    orq %r12, %r11 -; AVX512-NEXT:    movq 40(%rsp,%rsi), %r12 -; AVX512-NEXT:    shldq %cl, %rax, %r12 -; AVX512-NEXT:    orq %r12, %r10 -; AVX512-NEXT:    movq %r10, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 8(%rsp,%rsi), %rax -; AVX512-NEXT:    movq 16(%rsp,%rsi), %r12 -; AVX512-NEXT:    movq %r12, %rbp -; AVX512-NEXT:    shldq %cl, %rax, %rbp -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX512-NEXT:    orq %rbp, %r10 -; AVX512-NEXT:    shldq %cl, %r12, %r8 -; AVX512-NEXT:    orq %r8, %rdi -; AVX512-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq -8(%rsp,%rsi), %r8 -; AVX512-NEXT:    movq (%rsp,%rsi), %r12 -; AVX512-NEXT:    movq %r12, %rbp +; AVX512-NEXT:    movq 8(%rsp,%r9), %r8 +; AVX512-NEXT:    movq 16(%rsp,%r9), %rax +; AVX512-NEXT:    movq %rax, %rbp  ; AVX512-NEXT:    shldq %cl, %r8, %rbp -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdi # 8-byte Reload -; AVX512-NEXT:    orq %rbp, %rdi -; AVX512-NEXT:    movq -16(%rsp,%rsi), %rsi -; AVX512-NEXT:    shldq %cl, %r12, %rax -; AVX512-NEXT:    orq %rax, %r15 -; AVX512-NEXT:    shlxq %rcx, %rsi, %rax -; AVX512-NEXT:    # kill: def $cl killed $cl killed $rcx +; AVX512-NEXT:    andnq 48(%rdi), %r13, %r13 +; AVX512-NEXT:    orq %rbp, %r13 +; AVX512-NEXT:    movq 24(%rsp,%r9), %rbp +; AVX512-NEXT:    shldq %cl, %rax, %rbp +; AVX512-NEXT:    movq -8(%rsp,%r9), %rax +; AVX512-NEXT:    movq (%rsp,%r9), %rsi +; AVX512-NEXT:    movq %rsi, %rdx +; AVX512-NEXT:    shldq %cl, %rax, %rdx +; AVX512-NEXT:    andnq 56(%rdi), %r12, %r12 +; AVX512-NEXT:    orq %rbp, %r12 +; AVX512-NEXT:    andnq 32(%rdi), %r15, %r15 +; AVX512-NEXT:    orq %rdx, %r15  ; AVX512-NEXT:    shldq %cl, %rsi, %r8 -; AVX512-NEXT:    orq %rax, %r14 +; AVX512-NEXT:    movq -24(%rsp,%r9), %rdx +; AVX512-NEXT:    movq -16(%rsp,%r9), %rsi +; AVX512-NEXT:    movq %rsi, %rbp +; AVX512-NEXT:    shldq %cl, %rdx, %rbp +; AVX512-NEXT:    andnq 40(%rdi), %rbx, %rbx  ; AVX512-NEXT:    orq %r8, %rbx -; AVX512-NEXT:    orq %rdx, %r13 -; AVX512-NEXT:    movq %r11, 48(%r9) -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    movq %rax, 56(%r9) -; AVX512-NEXT:    movq %r10, 32(%r9) +; AVX512-NEXT:    andnq 16(%rdi), %r11, %r8 +; AVX512-NEXT:    orq %rbp, %r8 +; AVX512-NEXT:    shlxq %rcx, %r14, %r11 +; AVX512-NEXT:    movq -32(%rsp,%r9), %r9 +; AVX512-NEXT:    shldq %cl, %rsi, %rax +; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload +; AVX512-NEXT:    andnq 24(%rdi), %rsi, %rsi +; AVX512-NEXT:    orq %rax, %rsi +; AVX512-NEXT:    shlxq %rcx, %r9, %rax +; AVX512-NEXT:    # kill: def $cl killed $cl killed $rcx +; AVX512-NEXT:    shldq %cl, %r9, %rdx +; AVX512-NEXT:    andnq (%rdi), %r11, %rcx +; AVX512-NEXT:    orq %rax, %rcx  ; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    movq %rax, 40(%r9) -; AVX512-NEXT:    movq %rdi, 16(%r9) -; AVX512-NEXT:    movq %r15, 24(%r9) -; AVX512-NEXT:    movq %r14, (%r9) -; AVX512-NEXT:    movq %rbx, 8(%r9) -; AVX512-NEXT:    sete %al -; AVX512-NEXT:    addq $184, %rsp +; AVX512-NEXT:    andnq 8(%rdi), %rax, %rax +; AVX512-NEXT:    orq %rdx, %rax +; AVX512-NEXT:    andl $60, %r10d +; AVX512-NEXT:    movl (%rdi,%r10), %edx +; AVX512-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %r9d # 4-byte Reload +; AVX512-NEXT:    btl %r9d, %edx +; AVX512-NEXT:    movq %r13, 48(%rdi) +; AVX512-NEXT:    movq %r12, 56(%rdi) +; AVX512-NEXT:    movq %r15, 32(%rdi) +; AVX512-NEXT:    movq %rbx, 40(%rdi) +; AVX512-NEXT:    movq %r8, 16(%rdi) +; AVX512-NEXT:    movq %rsi, 24(%rdi) +; AVX512-NEXT:    movq %rcx, (%rdi) +; AVX512-NEXT:    movq %rax, 8(%rdi) +; AVX512-NEXT:    setae %al +; AVX512-NEXT:    addq $168, %rsp  ; AVX512-NEXT:    popq %rbx  ; AVX512-NEXT:    popq %r12  ; AVX512-NEXT:    popq %r13 @@ -4274,2749 +1664,25 @@ define i1 @init_eq_i512(ptr %word, i32 %position, i1 zeroext %value) nounwind {  define i1 @test_ne_i4096(ptr %word, i32 %position) nounwind {  ; X86-LABEL: test_ne_i4096:  ; X86:       # %bb.0: -; X86-NEXT:    pushl %ebp -; X86-NEXT:    movl %esp, %ebp -; X86-NEXT:    pushl %ebx -; X86-NEXT:    pushl %edi -; X86-NEXT:    pushl %esi -; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $1792, %esp # imm = 0x700 -; X86-NEXT:    movl 12(%ebp), %ebx -; X86-NEXT:    movl %ebx, %ecx -; X86-NEXT:    shrl $3, %ecx -; X86-NEXT:    andl $508, %ecx # imm = 0x1FC -; X86-NEXT:    leal {{[0-9]+}}(%esp), %esi -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    subl %ecx, %esi -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $1, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) -; X86-NEXT:    movl 248(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 252(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl $31, %ebx -; X86-NEXT:    movl %ebx, %ecx -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 504(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 508(%esi), %edx -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 120(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 124(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 376(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 380(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 184(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 188(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 440(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 444(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 56(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 60(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 312(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 316(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 216(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 220(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 472(%esi), %edi -; X86-NEXT:    movl 476(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 88(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 92(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 344(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 348(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 152(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 156(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 408(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 412(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 24(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 28(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 280(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 284(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 232(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 236(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 488(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 492(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 104(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 108(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 360(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 364(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 168(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 172(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 424(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 428(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 40(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 44(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 296(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 300(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 200(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 204(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 456(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 460(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 72(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 76(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 328(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 332(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 136(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 140(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 392(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 396(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 12(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 264(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 268(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 240(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 244(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 496(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 500(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 112(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 116(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 368(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 372(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 176(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 180(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 432(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 436(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 52(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 304(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 308(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 208(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 212(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 464(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 468(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 80(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 84(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 336(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 340(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 144(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 148(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 400(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 404(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 16(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 20(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 272(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 276(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 224(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 228(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 480(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 484(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 96(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 100(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 352(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 356(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 160(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 164(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 416(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 420(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 32(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 36(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 288(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 292(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 192(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 196(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 448(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 452(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 64(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 68(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 320(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 324(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 128(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 132(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %edi, %edx -; X86-NEXT:    movl 256(%esi), %edi -; X86-NEXT:    movl 260(%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 388(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl 4(%esi), %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shrdl $1, %eax, %edi -; X86-NEXT:    shrl %eax -; X86-NEXT:    movl %ebx, %edx -; X86-NEXT:    movl %eax, %ebx -; X86-NEXT:    notb %cl -; X86-NEXT:    shrdl %cl, %eax, %edi -; X86-NEXT:    shrl %cl, %ebx -; X86-NEXT:    movb $32, %cl -; X86-NEXT:    testb %cl, %cl -; X86-NEXT:    movl (%esi), %eax -; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 8(%ebp), %eax -; X86-NEXT:    jne .LBB20_2 -; X86-NEXT:  # %bb.1: -; X86-NEXT:    movl %edi, %ebx -; X86-NEXT:  .LBB20_2: -; X86-NEXT:    movl %edx, %ecx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shll %cl, %edx -; X86-NEXT:    orl %ebx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 320(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 64(%eax), %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 448(%eax), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 192(%eax), %ecx -; X86-NEXT:    orl %edx, %ecx -; X86-NEXT:    orl %esi, %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 288(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 32(%eax), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 416(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 160(%eax), %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 352(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 96(%eax), %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 480(%eax), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 224(%eax), %ecx -; X86-NEXT:    orl %edx, %ecx -; X86-NEXT:    orl %esi, %ecx -; X86-NEXT:    orl %edi, %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 272(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 16(%eax), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 400(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 144(%eax), %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 336(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 80(%eax), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 464(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 208(%eax), %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    orl %esi, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 304(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 48(%eax), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 432(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 176(%eax), %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 368(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 112(%eax), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 496(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    andl 240(%eax), %ebx -; X86-NEXT:    orl %ecx, %ebx -; X86-NEXT:    orl %edx, %ebx -; X86-NEXT:    orl %esi, %ebx -; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 264(%eax), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 8(%eax), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl %eax, %ebx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 392(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 136(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    orl %edx, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 328(%ebx), %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 72(%ebx), %eax -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 456(%ebx), %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 200(%ebx), %esi -; X86-NEXT:    orl %edi, %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 296(%ebx), %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 40(%ebx), %eax -; X86-NEXT:    orl %edi, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 424(%ebx), %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 168(%ebx), %edx -; X86-NEXT:    orl %edi, %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 360(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 104(%ebx), %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 488(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 232(%ebx), %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    orl %esi, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 280(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 24(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 408(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 152(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 344(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 88(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 472(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 216(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 312(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 56(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 440(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 184(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 376(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 120(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 504(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 248(%ebx), %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    orl %esi, %edi -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 324(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 68(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 452(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 196(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 292(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 36(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 420(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 164(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 356(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 100(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 484(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 228(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 276(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 20(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 404(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 148(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 340(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 84(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 468(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 212(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 308(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 52(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 436(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 180(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 372(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 116(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 500(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 244(%ebx), %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    orl %esi, %edi -; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 268(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 12(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 396(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 140(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 332(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 76(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 460(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 204(%ebx), %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 300(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 44(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 428(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 172(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 364(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 108(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 492(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    andl 236(%ebx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl %edx, %esi -; X86-NEXT:    orl %edi, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 284(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 28(%ebx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 412(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 156(%ebx), %edi -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 348(%ebx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 92(%ebx), %edx -; X86-NEXT:    orl %eax, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 476(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 220(%ebx), %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    orl %edx, %eax -; X86-NEXT:    orl %edi, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 316(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 60(%ebx), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 444(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload -; X86-NEXT:    andl 188(%ebx), %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    orl %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 380(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    andl 124(%ebx), %edx -; X86-NEXT:    orl %ecx, %edx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 508(%ebx), %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-NEXT:    movl 8(%ebp), %esi -; X86-NEXT:    andl 252(%esi), %ebx -; X86-NEXT:    orl %ecx, %ebx -; X86-NEXT:    orl %edx, %ebx -; X86-NEXT:    orl %edi, %ebx -; X86-NEXT:    orl %eax, %ebx -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    negl %ecx -; X86-NEXT:    movl 1648(%esp,%ecx), %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-NEXT:    shldl %cl, %edi, %esi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    shldl %cl, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload -; X86-NEXT:    shldl %cl, %edx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    movl 8(%ebp), %edx -; X86-NEXT:    andl 128(%edx), %ecx -; X86-NEXT:    andl 384(%edx), %edi -; X86-NEXT:    orl %ecx, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    # kill: def $cl killed $cl killed $ecx -; X86-NEXT:    shll %cl, %eax -; X86-NEXT:    andl (%edx), %eax -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 256(%edx), %eax -; X86-NEXT:    orl %eax, %edi -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 260(%edx), %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    andl 4(%edx), %ecx -; X86-NEXT:    orl %eax, %ecx -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-NEXT:    andl 132(%edx), %eax -; X86-NEXT:    andl 388(%edx), %esi -; X86-NEXT:    orl %eax, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload -; X86-NEXT:    orl %ebx, %esi -; X86-NEXT:    orl %edi, %esi -; X86-NEXT:    setne %al -; X86-NEXT:    leal -12(%ebp), %esp -; X86-NEXT:    popl %esi -; X86-NEXT:    popl %edi -; X86-NEXT:    popl %ebx -; X86-NEXT:    popl %ebp +; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax +; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT:    movl %ecx, %edx +; X86-NEXT:    andl $4064, %edx # imm = 0xFE0 +; X86-NEXT:    shrl $3, %edx +; X86-NEXT:    movl (%eax,%edx), %eax +; X86-NEXT:    btl %ecx, %eax +; X86-NEXT:    setb %al  ; X86-NEXT:    retl  ; -; SSE-LABEL: test_ne_i4096: -; SSE:       # %bb.0: -; SSE-NEXT:    pushq %rbp -; SSE-NEXT:    pushq %r15 -; SSE-NEXT:    pushq %r14 -; SSE-NEXT:    pushq %r13 -; SSE-NEXT:    pushq %r12 -; SSE-NEXT:    pushq %rbx -; SSE-NEXT:    subq $1576, %rsp # imm = 0x628 -; SSE-NEXT:    movl %esi, %ecx -; SSE-NEXT:    movl %esi, %eax -; SSE-NEXT:    andl $4032, %eax # imm = 0xFC0 -; SSE-NEXT:    xorps %xmm0, %xmm0 -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movups %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $0, {{[0-9]+}}(%rsp) -; SSE-NEXT:    movq $1, {{[0-9]+}}(%rsp) -; SSE-NEXT:    andl $63, %ecx -; SSE-NEXT:    shrl $3, %eax -; SSE-NEXT:    negl %eax -; SSE-NEXT:    movslq %eax, %rsi -; SSE-NEXT:    movq 1296(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1304(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1552(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1560(%rsp,%rsi), %rax -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1168(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1176(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1424(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1432(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1232(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1240(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1488(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1496(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1104(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1112(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1360(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, (%rsp) # 8-byte Spill -; SSE-NEXT:    movq 1368(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1264(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1272(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1520(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1528(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1136(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1144(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1392(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1400(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1200(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1208(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1456(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1464(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1072(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1080(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1328(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1336(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1280(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1288(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1536(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1544(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1152(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1160(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1408(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1416(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1216(%rsp,%rsi), %r11 -; SSE-NEXT:    movq 1224(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %r11, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1472(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1480(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1088(%rsp,%rsi), %r9 -; SSE-NEXT:    movq 1096(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %r9, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1344(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1352(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1248(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1256(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rax, %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1504(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1512(%rsp,%rsi), %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rdx, %rax -; SSE-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1120(%rsp,%rsi), %rax -; SSE-NEXT:    movq 1128(%rsp,%rsi), %r8 -; SSE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    shldq %cl, %rax, %r8 -; SSE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1376(%rsp,%rsi), %r13 -; SSE-NEXT:    movq 1384(%rsp,%rsi), %rbx -; SSE-NEXT:    movq %rbx, %r8 -; SSE-NEXT:    shldq %cl, %r13, %r8 -; SSE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1184(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1192(%rsp,%rsi), %r15 -; SSE-NEXT:    movq %r15, %r14 -; SSE-NEXT:    shldq %cl, %rdx, %r14 -; SSE-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1440(%rsp,%rsi), %r10 -; SSE-NEXT:    movq 1448(%rsp,%rsi), %rdx -; SSE-NEXT:    movq %rdx, %r14 -; SSE-NEXT:    shldq %cl, %r10, %r14 -; SSE-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1312(%rsp,%rsi), %r14 -; SSE-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq 1320(%rsp,%rsi), %rbp -; SSE-NEXT:    movq %rbp, %r12 -; SSE-NEXT:    shldq %cl, %r14, %r12 -; SSE-NEXT:    movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, (%rsp) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq 1064(%rsp,%rsi), %rbx -; SSE-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %rbp, %r14 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    shldq %cl, %rdx, %r11 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %r9 -; SSE-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %rbp -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %r9 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r15, %r13 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r12, %r15 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload -; SSE-NEXT:    shldq %cl, %r12, %r10 -; SSE-NEXT:    andq 384(%rdi), %r10 -; SSE-NEXT:    andq 128(%rdi), %r15 -; SSE-NEXT:    andq 320(%rdi), %r13 -; SSE-NEXT:    andq 64(%rdi), %rax -; SSE-NEXT:    orq %r10, %r15 -; SSE-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    orq %r13, %rax -; SSE-NEXT:    andq 448(%rdi), %r9 -; SSE-NEXT:    andq 192(%rdi), %rbp -; SSE-NEXT:    orq %r9, %rbp -; SSE-NEXT:    orq %rax, %rbp -; SSE-NEXT:    movq %rbp, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    andq 288(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; SSE-NEXT:    andq 32(%rdi), %r9 -; SSE-NEXT:    andq 416(%rdi), %rdx -; SSE-NEXT:    andq 160(%rdi), %r11 -; SSE-NEXT:    orq %r8, %r9 -; SSE-NEXT:    orq %rdx, %r11 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    andq 352(%rdi), %rdx -; SSE-NEXT:    orq %r9, %r11 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 96(%rdi), %rax -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    movq %rax, %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 480(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 224(%rdi), %r8 -; SSE-NEXT:    orq %rax, %r8 -; SSE-NEXT:    orq %rdx, %r8 -; SSE-NEXT:    andq 272(%rdi), %r14 -; SSE-NEXT:    orq %r11, %r8 -; SSE-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 16(%rdi), %rax -; SSE-NEXT:    orq %r14, %rax -; SSE-NEXT:    movq %rax, %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    andq 400(%rdi), %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 144(%rdi), %rax -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    orq %r8, %rax -; SSE-NEXT:    movq %rax, %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; SSE-NEXT:    andq 336(%rdi), %r9 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 80(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    andq 464(%rdi), %rdx -; SSE-NEXT:    orq %r9, %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; SSE-NEXT:    andq 208(%rdi), %r11 -; SSE-NEXT:    orq %rdx, %r11 -; SSE-NEXT:    orq %rax, %r11 -; SSE-NEXT:    orq %r8, %r11 -; SSE-NEXT:    movq (%rsp), %rdx # 8-byte Reload -; SSE-NEXT:    andq 304(%rdi), %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 48(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; SSE-NEXT:    andq 432(%rdi), %r9 -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    movq %rax, %r10 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 176(%rdi), %r8 -; SSE-NEXT:    orq %r9, %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; SSE-NEXT:    andq 368(%rdi), %r9 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 112(%rdi), %rax -; SSE-NEXT:    orq %r10, %r8 -; SSE-NEXT:    movq %r8, %r10 -; SSE-NEXT:    orq %r9, %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 496(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; SSE-NEXT:    andq 240(%rdi), %rbp -; SSE-NEXT:    orq %r8, %rbp -; SSE-NEXT:    orq %rax, %rbp -; SSE-NEXT:    orq %r10, %rbp -; SSE-NEXT:    orq %r11, %rbp -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 392(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload -; SSE-NEXT:    andq 136(%rdi), %r12 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    andq 328(%rdi), %rdx -; SSE-NEXT:    orq %rax, %r12 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 72(%rdi), %rax -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    movq %rax, %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 456(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; SSE-NEXT:    andq 200(%rdi), %r13 -; SSE-NEXT:    orq %rax, %r13 -; SSE-NEXT:    orq %rdx, %r13 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    andq 296(%rdi), %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 40(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 424(%rdi), %r8 -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    movq %rax, %r9 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    andq 168(%rdi), %rdx -; SSE-NEXT:    orq %r8, %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 360(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 104(%rdi), %rax -; SSE-NEXT:    orq %r9, %rdx -; SSE-NEXT:    orq %r8, %rax -; SSE-NEXT:    movq %rax, %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 488(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; SSE-NEXT:    andq 232(%rdi), %r15 -; SSE-NEXT:    orq %rax, %r15 -; SSE-NEXT:    orq %r8, %r15 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 280(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 24(%rdi), %rax -; SSE-NEXT:    orq %rdx, %r15 -; SSE-NEXT:    orq %r8, %rax -; SSE-NEXT:    movq %rax, %r10 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 408(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 152(%rdi), %rax -; SSE-NEXT:    orq %r8, %rax -; SSE-NEXT:    orq %r10, %rax -; SSE-NEXT:    movq %rax, %r10 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; SSE-NEXT:    andq 344(%rdi), %r11 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 88(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 472(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; SSE-NEXT:    andq 216(%rdi), %r14 -; SSE-NEXT:    orq %r11, %r8 -; SSE-NEXT:    orq %rax, %r14 -; SSE-NEXT:    orq %r8, %r14 -; SSE-NEXT:    orq %r10, %r14 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; SSE-NEXT:    andq 312(%rdi), %r11 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; SSE-NEXT:    andq 56(%rdi), %r10 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 440(%rdi), %r8 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; SSE-NEXT:    andq 184(%rdi), %r9 -; SSE-NEXT:    orq %r11, %r10 -; SSE-NEXT:    orq %r8, %r9 -; SSE-NEXT:    orq %r10, %r9 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload -; SSE-NEXT:    shldq %cl, %rax, %rdx -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; SSE-NEXT:    andq 376(%rdi), %r10 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; SSE-NEXT:    andq 120(%rdi), %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; SSE-NEXT:    andq 504(%rdi), %r11 -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; SSE-NEXT:    andq 248(%rdi), %r8 -; SSE-NEXT:    orq %r10, %rax -; SSE-NEXT:    movq %rax, %r10 -; SSE-NEXT:    orq %r11, %r8 -; SSE-NEXT:    movq 1056(%rsp,%rsi), %rax -; SSE-NEXT:    shldq %cl, %rax, %rbx -; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx -; SSE-NEXT:    shlq %cl, %rax -; SSE-NEXT:    orq %r10, %r8 -; SSE-NEXT:    orq %r9, %r8 -; SSE-NEXT:    andq 256(%rdi), %rdx -; SSE-NEXT:    orq %r14, %r8 -; SSE-NEXT:    andq (%rdi), %rax -; SSE-NEXT:    orq %rdx, %rax -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload -; SSE-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload -; SSE-NEXT:    orq %rbp, %rax -; SSE-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; SSE-NEXT:    andq 264(%rdi), %rcx -; SSE-NEXT:    andq 8(%rdi), %rbx -; SSE-NEXT:    orq %rcx, %rbx -; SSE-NEXT:    orq %r12, %rbx -; SSE-NEXT:    orq %r13, %rbx -; SSE-NEXT:    orq %r15, %rbx -; SSE-NEXT:    orq %r8, %rbx -; SSE-NEXT:    orq %rax, %rbx -; SSE-NEXT:    setne %al -; SSE-NEXT:    addq $1576, %rsp # imm = 0x628 -; SSE-NEXT:    popq %rbx -; SSE-NEXT:    popq %r12 -; SSE-NEXT:    popq %r13 -; SSE-NEXT:    popq %r14 -; SSE-NEXT:    popq %r15 -; SSE-NEXT:    popq %rbp -; SSE-NEXT:    retq -; -; AVX2-LABEL: test_ne_i4096: -; AVX2:       # %bb.0: -; AVX2-NEXT:    pushq %rbp -; AVX2-NEXT:    pushq %r15 -; AVX2-NEXT:    pushq %r14 -; AVX2-NEXT:    pushq %r13 -; AVX2-NEXT:    pushq %r12 -; AVX2-NEXT:    pushq %rbx -; AVX2-NEXT:    subq $1560, %rsp # imm = 0x618 -; AVX2-NEXT:    movl %esi, %ecx -; AVX2-NEXT:    movl %esi, %eax -; AVX2-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    andl $4032, %eax # imm = 0xFC0 -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [1,0,0,0] -; AVX2-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX2-NEXT:    andl $63, %ecx -; AVX2-NEXT:    shrl $3, %eax -; AVX2-NEXT:    negl %eax -; AVX2-NEXT:    movslq %eax, %rsi -; AVX2-NEXT:    movq 1280(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1288(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1536(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1544(%rsp,%rsi), %rax -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1152(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1160(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1408(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1416(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1216(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, (%rsp) # 8-byte Spill -; AVX2-NEXT:    movq 1224(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1472(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1480(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1088(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1096(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1344(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1352(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1248(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1256(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1504(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1512(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1120(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1128(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1376(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1384(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1184(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1192(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1440(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1448(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1056(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1064(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1312(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1320(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1264(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1272(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1520(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1528(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1136(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1144(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1392(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1400(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1200(%rsp,%rsi), %r11 -; AVX2-NEXT:    movq 1208(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %r11, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1456(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1464(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1072(%rsp,%rsi), %r12 -; AVX2-NEXT:    movq 1080(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %r12, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1328(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1336(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rdx, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1232(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1240(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rax, %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1488(%rsp,%rsi), %rbp -; AVX2-NEXT:    movq 1496(%rsp,%rsi), %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rbp, %rax -; AVX2-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1104(%rsp,%rsi), %rax -; AVX2-NEXT:    movq 1112(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    shldq %cl, %rax, %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1360(%rsp,%rsi), %r10 -; AVX2-NEXT:    movq 1368(%rsp,%rsi), %r8 -; AVX2-NEXT:    movq %r8, %rdx -; AVX2-NEXT:    shldq %cl, %r10, %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1168(%rsp,%rsi), %r9 -; AVX2-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1176(%rsp,%rsi), %rbx -; AVX2-NEXT:    movq %rbx, %rdx -; AVX2-NEXT:    shldq %cl, %r9, %rdx -; AVX2-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1424(%rsp,%rsi), %r9 -; AVX2-NEXT:    movq 1432(%rsp,%rsi), %rdx -; AVX2-NEXT:    movq %rdx, %r14 -; AVX2-NEXT:    shldq %cl, %r9, %r14 -; AVX2-NEXT:    movq %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1296(%rsp,%rsi), %r15 -; AVX2-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq 1304(%rsp,%rsi), %r14 -; AVX2-NEXT:    movq %r14, %r13 -; AVX2-NEXT:    shldq %cl, %r15, %r13 -; AVX2-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, (%rsp) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq 1048(%rsp,%rsi), %rdx -; AVX2-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    shldq %cl, %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %rbx -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %r11 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %r12 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %r13 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %rbp -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r14, %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, %r14 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r15, %r9 -; AVX2-NEXT:    andq 384(%rdi), %r9 -; AVX2-NEXT:    andq 128(%rdi), %r14 -; AVX2-NEXT:    andq 320(%rdi), %r10 -; AVX2-NEXT:    orq %r9, %r14 -; AVX2-NEXT:    movq %r14, %r15 -; AVX2-NEXT:    andq 64(%rdi), %rax -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    andq 448(%rdi), %rbp -; AVX2-NEXT:    andq 192(%rdi), %r13 -; AVX2-NEXT:    orq %rbp, %r13 -; AVX2-NEXT:    orq %rax, %r13 -; AVX2-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX2-NEXT:    andq 288(%rdi), %r8 -; AVX2-NEXT:    andq 32(%rdi), %r12 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 416(%rdi), %rax -; AVX2-NEXT:    orq %r8, %r12 -; AVX2-NEXT:    andq 160(%rdi), %r11 -; AVX2-NEXT:    orq %rax, %r11 -; AVX2-NEXT:    andq 352(%rdi), %rbx -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 96(%rdi), %rax -; AVX2-NEXT:    orq %r12, %r11 -; AVX2-NEXT:    orq %rbx, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 480(%rdi), %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX2-NEXT:    andq 224(%rdi), %r13 -; AVX2-NEXT:    orq %r10, %r13 -; AVX2-NEXT:    orq %rax, %r13 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 272(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 16(%rdi), %rax -; AVX2-NEXT:    orq %r11, %r13 -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq %rax, %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX2-NEXT:    andq 400(%rdi), %r9 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 144(%rdi), %rax -; AVX2-NEXT:    orq %r9, %rax -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq %rax, %r9 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 336(%rdi), %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 80(%rdi), %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 464(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX2-NEXT:    andq 208(%rdi), %r11 -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    orq %r8, %r11 -; AVX2-NEXT:    orq %rax, %r11 -; AVX2-NEXT:    orq %r9, %r11 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX2-NEXT:    andq 304(%rdi), %r9 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 48(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 432(%rdi), %r10 -; AVX2-NEXT:    movq (%rsp), %rax # 8-byte Reload -; AVX2-NEXT:    andq 176(%rdi), %rax -; AVX2-NEXT:    orq %r9, %r8 -; AVX2-NEXT:    movq %r8, %r9 -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 368(%rdi), %r8 -; AVX2-NEXT:    orq %r9, %rax -; AVX2-NEXT:    movq %rax, %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 112(%rdi), %rax -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 496(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX2-NEXT:    andq 240(%rdi), %r9 -; AVX2-NEXT:    orq %r8, %r9 -; AVX2-NEXT:    orq %rax, %r9 -; AVX2-NEXT:    orq %r10, %r9 -; AVX2-NEXT:    orq %r11, %r9 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 392(%rdi), %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; AVX2-NEXT:    andq 136(%rdi), %rbp -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 328(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 72(%rdi), %rax -; AVX2-NEXT:    orq %r10, %rbp -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq %rax, %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 456(%rdi), %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload -; AVX2-NEXT:    andq 200(%rdi), %r12 -; AVX2-NEXT:    orq %rax, %r12 -; AVX2-NEXT:    orq %r8, %r12 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 296(%rdi), %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 40(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX2-NEXT:    andq 424(%rdi), %r11 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 168(%rdi), %rax -; AVX2-NEXT:    orq %r10, %r8 -; AVX2-NEXT:    movq %r8, %r10 -; AVX2-NEXT:    orq %r11, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 360(%rdi), %r8 -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    movq %rax, %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 104(%rdi), %rax -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq %rax, %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 488(%rdi), %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX2-NEXT:    andq 232(%rdi), %r14 -; AVX2-NEXT:    orq %rax, %r14 -; AVX2-NEXT:    orq %r8, %r14 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 280(%rdi), %r8 -; AVX2-NEXT:    orq %r10, %r14 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 24(%rdi), %rax -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq %rax, %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 408(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 152(%rdi), %rax -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    movq %rax, %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX2-NEXT:    andq 344(%rdi), %r11 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 88(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 472(%rdi), %rax -; AVX2-NEXT:    orq %r11, %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX2-NEXT:    andq 216(%rdi), %rbx -; AVX2-NEXT:    orq %rax, %rbx -; AVX2-NEXT:    orq %r8, %rbx -; AVX2-NEXT:    orq %r10, %rbx -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 312(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 56(%rdi), %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 440(%rdi), %r10 -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    movq %rax, %r11 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 184(%rdi), %r8 -; AVX2-NEXT:    orq %r10, %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    andq 376(%rdi), %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 120(%rdi), %rax -; AVX2-NEXT:    orq %r11, %r8 -; AVX2-NEXT:    movq %r8, %r11 -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    movq %rax, %r10 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    andq 504(%rdi), %r8 -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX2-NEXT:    andq 248(%rdi), %rax -; AVX2-NEXT:    orq %r8, %rax -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX2-NEXT:    shldq %cl, %r8, %r10 -; AVX2-NEXT:    orq %r11, %rax -; AVX2-NEXT:    movq 1040(%rsp,%rsi), %rsi -; AVX2-NEXT:    orq %rbx, %rax -; AVX2-NEXT:    movq %rax, %r8 -; AVX2-NEXT:    shlxq %rcx, %rsi, %rax -; AVX2-NEXT:    andq 256(%rdi), %r10 -; AVX2-NEXT:    andq (%rdi), %rax -; AVX2-NEXT:    orq %r10, %rax -; AVX2-NEXT:    orq %r15, %rax -; AVX2-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload -; AVX2-NEXT:    orq %r13, %rax -; AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx -; AVX2-NEXT:    shldq %cl, %rsi, %rdx -; AVX2-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload -; AVX2-NEXT:    andq 264(%rdi), %rcx -; AVX2-NEXT:    andq 8(%rdi), %rdx -; AVX2-NEXT:    orq %r9, %rax -; AVX2-NEXT:    orq %rcx, %rdx -; AVX2-NEXT:    orq %rbp, %rdx -; AVX2-NEXT:    orq %r12, %rdx -; AVX2-NEXT:    orq %r14, %rdx -; AVX2-NEXT:    orq %r8, %rdx -; AVX2-NEXT:    orq %rax, %rdx -; AVX2-NEXT:    setne %al -; AVX2-NEXT:    addq $1560, %rsp # imm = 0x618 -; AVX2-NEXT:    popq %rbx -; AVX2-NEXT:    popq %r12 -; AVX2-NEXT:    popq %r13 -; AVX2-NEXT:    popq %r14 -; AVX2-NEXT:    popq %r15 -; AVX2-NEXT:    popq %rbp -; AVX2-NEXT:    vzeroupper -; AVX2-NEXT:    retq -; -; AVX512-LABEL: test_ne_i4096: -; AVX512:       # %bb.0: -; AVX512-NEXT:    pushq %rbp -; AVX512-NEXT:    pushq %r15 -; AVX512-NEXT:    pushq %r14 -; AVX512-NEXT:    pushq %r13 -; AVX512-NEXT:    pushq %r12 -; AVX512-NEXT:    pushq %rbx -; AVX512-NEXT:    subq $1560, %rsp # imm = 0x618 -; AVX512-NEXT:    movl %esi, %ecx -; AVX512-NEXT:    movl %esi, %eax -; AVX512-NEXT:    andl $4032, %eax # imm = 0xFC0 -; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    vmovaps {{.*#+}} xmm0 = [1,0,0,0] -; AVX512-NEXT:    vmovups %ymm0, {{[0-9]+}}(%rsp) -; AVX512-NEXT:    andl $63, %ecx -; AVX512-NEXT:    shrl $3, %eax -; AVX512-NEXT:    negl %eax -; AVX512-NEXT:    movslq %eax, %rsi -; AVX512-NEXT:    movq 1280(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1288(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1536(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1544(%rsp,%rsi), %rax -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1152(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1160(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1408(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1416(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1216(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, (%rsp) # 8-byte Spill -; AVX512-NEXT:    movq 1224(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1472(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1480(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1088(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1096(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1344(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1352(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1248(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1256(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1504(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1512(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1120(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1128(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1376(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1384(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1184(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1192(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1440(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1448(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1056(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1064(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1312(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1320(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1264(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1272(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1520(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1528(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1136(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1144(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1392(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1400(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1200(%rsp,%rsi), %r10 -; AVX512-NEXT:    movq 1208(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %r10, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1456(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1464(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1072(%rsp,%rsi), %r14 -; AVX512-NEXT:    movq 1080(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %r14, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1328(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1336(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rdx, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1232(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1240(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rax, %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1488(%rsp,%rsi), %r12 -; AVX512-NEXT:    movq 1496(%rsp,%rsi), %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %r12, %rax -; AVX512-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1104(%rsp,%rsi), %rax -; AVX512-NEXT:    movq 1112(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    shldq %cl, %rax, %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1360(%rsp,%rsi), %r11 -; AVX512-NEXT:    movq 1368(%rsp,%rsi), %rbx -; AVX512-NEXT:    movq %rbx, %rdx -; AVX512-NEXT:    shldq %cl, %r11, %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1168(%rsp,%rsi), %r9 -; AVX512-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1176(%rsp,%rsi), %r8 -; AVX512-NEXT:    movq %r8, %rdx -; AVX512-NEXT:    shldq %cl, %r9, %rdx -; AVX512-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1424(%rsp,%rsi), %r9 -; AVX512-NEXT:    movq 1432(%rsp,%rsi), %rdx -; AVX512-NEXT:    movq %rdx, %r15 -; AVX512-NEXT:    shldq %cl, %r9, %r15 -; AVX512-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1296(%rsp,%rsi), %rbp -; AVX512-NEXT:    movq %rbp, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq 1304(%rsp,%rsi), %r15 -; AVX512-NEXT:    movq %r15, %r13 -; AVX512-NEXT:    shldq %cl, %rbp, %r13 -; AVX512-NEXT:    movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, (%rsp) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    shldq %cl, %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq 1048(%rsp,%rsi), %rdx -; AVX512-NEXT:    shldq %cl, %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %rbx -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Folded Spill -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %r14 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %r13 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %r12 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %r15, %r11 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %rbp, %r15 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %rbp, %r9 -; AVX512-NEXT:    andq 384(%rdi), %r9 -; AVX512-NEXT:    andq 128(%rdi), %r15 -; AVX512-NEXT:    orq %r9, %r15 -; AVX512-NEXT:    movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill -; AVX512-NEXT:    andq 320(%rdi), %r11 -; AVX512-NEXT:    andq 64(%rdi), %rax -; AVX512-NEXT:    orq %r11, %rax -; AVX512-NEXT:    andq 448(%rdi), %r12 -; AVX512-NEXT:    andq 192(%rdi), %r13 -; AVX512-NEXT:    orq %r12, %r13 -; AVX512-NEXT:    orq %rax, %r13 -; AVX512-NEXT:    andq 288(%rdi), %r8 -; AVX512-NEXT:    andq 32(%rdi), %r14 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 416(%rdi), %rax -; AVX512-NEXT:    orq %r8, %r14 -; AVX512-NEXT:    andq 160(%rdi), %r10 -; AVX512-NEXT:    orq %rax, %r10 -; AVX512-NEXT:    andq 352(%rdi), %rbx -; AVX512-NEXT:    orq %r14, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 96(%rdi), %rax -; AVX512-NEXT:    orq %rbx, %rax -; AVX512-NEXT:    movq %rax, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 480(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r15 # 8-byte Reload -; AVX512-NEXT:    andq 224(%rdi), %r15 -; AVX512-NEXT:    orq %rax, %r15 -; AVX512-NEXT:    orq %r8, %r15 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 272(%rdi), %r8 -; AVX512-NEXT:    orq %r10, %r15 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 16(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX512-NEXT:    andq 400(%rdi), %r9 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 144(%rdi), %rax -; AVX512-NEXT:    orq %r9, %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r9 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX512-NEXT:    andq 336(%rdi), %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 80(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 464(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX512-NEXT:    andq 208(%rdi), %r11 -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    orq %r8, %r11 -; AVX512-NEXT:    orq %rax, %r11 -; AVX512-NEXT:    orq %r9, %r11 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX512-NEXT:    andq 304(%rdi), %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 48(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX512-NEXT:    andq 432(%rdi), %r9 -; AVX512-NEXT:    movq (%rsp), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 176(%rdi), %r8 -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    orq %r9, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX512-NEXT:    andq 368(%rdi), %r9 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 112(%rdi), %rax -; AVX512-NEXT:    orq %r10, %r8 -; AVX512-NEXT:    movq %r8, %r10 -; AVX512-NEXT:    orq %r9, %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 496(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload -; AVX512-NEXT:    andq 240(%rdi), %r9 -; AVX512-NEXT:    orq %r8, %r9 -; AVX512-NEXT:    orq %rax, %r9 -; AVX512-NEXT:    orq %r10, %r9 -; AVX512-NEXT:    orq %r11, %r9 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX512-NEXT:    andq 392(%rdi), %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload -; AVX512-NEXT:    andq 136(%rdi), %rbp -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 328(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 72(%rdi), %rax -; AVX512-NEXT:    orq %r10, %rbp -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 456(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r12 # 8-byte Reload -; AVX512-NEXT:    andq 200(%rdi), %r12 -; AVX512-NEXT:    orq %rax, %r12 -; AVX512-NEXT:    orq %r8, %r12 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 296(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 40(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 424(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 168(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 360(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 104(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 488(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r14 # 8-byte Reload -; AVX512-NEXT:    andq 232(%rdi), %r14 -; AVX512-NEXT:    orq %rax, %r14 -; AVX512-NEXT:    orq %r8, %r14 -; AVX512-NEXT:    orq %r10, %r14 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 280(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 24(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 408(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 152(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r11 # 8-byte Reload -; AVX512-NEXT:    andq 344(%rdi), %r11 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 88(%rdi), %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 472(%rdi), %rax -; AVX512-NEXT:    orq %r11, %r8 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload -; AVX512-NEXT:    andq 216(%rdi), %rbx -; AVX512-NEXT:    orq %rax, %rbx -; AVX512-NEXT:    orq %r8, %rbx -; AVX512-NEXT:    orq %r10, %rbx -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX512-NEXT:    andq 312(%rdi), %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 56(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 440(%rdi), %r8 -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 184(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 376(%rdi), %r8 -; AVX512-NEXT:    orq %r10, %rax -; AVX512-NEXT:    movq %rax, %r11 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 120(%rdi), %rax -; AVX512-NEXT:    orq %r8, %rax -; AVX512-NEXT:    movq %rax, %r10 -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 504(%rdi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r8 # 8-byte Reload -; AVX512-NEXT:    andq 248(%rdi), %r8 -; AVX512-NEXT:    orq %rax, %r8 -; AVX512-NEXT:    orq %r10, %r8 -; AVX512-NEXT:    orq %r11, %r8 -; AVX512-NEXT:    movq 1040(%rsp,%rsi), %rax -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload -; AVX512-NEXT:    shldq %cl, %rsi, %r10 -; AVX512-NEXT:    orq %rbx, %r8 -; AVX512-NEXT:    shlxq %rcx, %rax, %rsi -; AVX512-NEXT:    andq 256(%rdi), %r10 -; AVX512-NEXT:    andq (%rdi), %rsi -; AVX512-NEXT:    orq %r10, %rsi -; AVX512-NEXT:    orq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload -; AVX512-NEXT:    orq %r13, %rsi -; AVX512-NEXT:    orq %r15, %rsi -; AVX512-NEXT:    # kill: def $cl killed $cl killed $rcx -; AVX512-NEXT:    shldq %cl, %rax, %rdx -; AVX512-NEXT:    orq %r9, %rsi -; AVX512-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload -; AVX512-NEXT:    andq 264(%rdi), %rax -; AVX512-NEXT:    andq 8(%rdi), %rdx -; AVX512-NEXT:    orq %rax, %rdx -; AVX512-NEXT:    orq %rbp, %rdx -; AVX512-NEXT:    orq %r12, %rdx -; AVX512-NEXT:    orq %r14, %rdx -; AVX512-NEXT:    orq %r8, %rdx -; AVX512-NEXT:    orq %rsi, %rdx -; AVX512-NEXT:    setne %al -; AVX512-NEXT:    addq $1560, %rsp # imm = 0x618 -; AVX512-NEXT:    popq %rbx -; AVX512-NEXT:    popq %r12 -; AVX512-NEXT:    popq %r13 -; AVX512-NEXT:    popq %r14 -; AVX512-NEXT:    popq %r15 -; AVX512-NEXT:    popq %rbp -; AVX512-NEXT:    vzeroupper -; AVX512-NEXT:    retq +; X64-LABEL: test_ne_i4096: +; X64:       # %bb.0: +; X64-NEXT:    movl %esi, %eax +; X64-NEXT:    andl $4064, %eax # imm = 0xFE0 +; X64-NEXT:    shrl $3, %eax +; X64-NEXT:    movl (%rdi,%rax), %eax +; X64-NEXT:    btl %esi, %eax +; X64-NEXT:    setb %al +; X64-NEXT:    retq    %rem = and i32 %position, 4095    %ofs = zext nneg i32 %rem to i4096    %bit = shl nuw i4096 1, %ofs @@ -7161,8 +1827,8 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; X86-NEXT:    pushl %edi  ; X86-NEXT:    pushl %esi  ; X86-NEXT:    andl $-16, %esp -; X86-NEXT:    subl $80, %esp -; X86-NEXT:    movzbl 12(%ebp), %ecx +; X86-NEXT:    subl $64, %esp +; X86-NEXT:    movl 12(%ebp), %ecx  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)  ; X86-NEXT:    movl $0, {{[0-9]+}}(%esp) @@ -7176,51 +1842,33 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; X86-NEXT:    andb $12, %al  ; X86-NEXT:    negb %al  ; X86-NEXT:    movsbl %al, %eax -; X86-NEXT:    movl 56(%esp,%eax), %esi -; X86-NEXT:    movl 60(%esp,%eax), %edx -; X86-NEXT:    shldl %cl, %esi, %edx -; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    movl 48(%esp,%eax), %edi -; X86-NEXT:    movl 52(%esp,%eax), %eax -; X86-NEXT:    shldl %cl, %eax, %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    shldl %cl, %edi, %eax -; X86-NEXT:    movl 8(%ebp), %ebx -; X86-NEXT:    shll %cl, %edi -; X86-NEXT:    movl 8(%ebx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %esi, %ecx -; X86-NEXT:    movl (%ebx), %esi -; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %edi, %esi -; X86-NEXT:    orl %ecx, %esi -; X86-NEXT:    movl 12(%ebx), %ecx -; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl %eax, %edx -; X86-NEXT:    movl 4(%ebx), %ebx -; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-NEXT:    andl %ebx, %eax -; X86-NEXT:    orl %ecx, %eax -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload -; X86-NEXT:    notl %ecx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload -; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-NEXT:    movl 40(%esp,%eax), %edx +; X86-NEXT:    movl 44(%esp,%eax), %esi +; X86-NEXT:    shldl %cl, %edx, %esi +; X86-NEXT:    movl 32(%esp,%eax), %edi +; X86-NEXT:    movl 36(%esp,%eax), %ebx +; X86-NEXT:    shldl %cl, %ebx, %edx +; X86-NEXT:    shldl %cl, %edi, %ebx  ; X86-NEXT:    notl %ebx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload -; X86-NEXT:    notl %edx -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload -; X86-NEXT:    notl %edi -; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload -; X86-NEXT:    orl %esi, %eax  ; X86-NEXT:    movl 16(%ebp), %eax  ; X86-NEXT:    movl (%eax), %eax -; X86-NEXT:    movl 8(%ebp), %esi -; X86-NEXT:    movl %ebx, 8(%esi) -; X86-NEXT:    movl %ecx, 12(%esi) -; X86-NEXT:    movl %edi, (%esi) -; X86-NEXT:    movl %edx, 4(%esi) -; X86-NEXT:    je .LBB22_2 +; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-NEXT:    movl 8(%ebp), %eax +; X86-NEXT:    andl %ebx, 4(%eax) +; X86-NEXT:    shll %cl, %edi +; X86-NEXT:    notl %edi +; X86-NEXT:    movl %ecx, %ebx +; X86-NEXT:    andl $96, %ebx +; X86-NEXT:    shrl $3, %ebx +; X86-NEXT:    movl (%eax,%ebx), %ebx +; X86-NEXT:    andl %edi, (%eax) +; X86-NEXT:    notl %esi +; X86-NEXT:    andl %esi, 12(%eax) +; X86-NEXT:    notl %edx +; X86-NEXT:    andl %edx, 8(%eax) +; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-NEXT:    btl %ecx, %ebx +; X86-NEXT:    jae .LBB22_2  ; X86-NEXT:  # %bb.1:  ; X86-NEXT:    xorl %eax, %eax  ; X86-NEXT:  .LBB22_2: @@ -7242,52 +1890,75 @@ define i32 @reset_multiload_i128(ptr %word, i32 %position, ptr %p) nounwind {  ; SSE-NEXT:    testb $64, %cl  ; SSE-NEXT:    cmovneq %rsi, %r8  ; SSE-NEXT:    cmovneq %rax, %rsi -; SSE-NEXT:    movq (%rdi), %rcx -; SSE-NEXT:    movq 8(%rdi), %r9 -; SSE-NEXT:    movq %r9, %r10 -; SSE-NEXT:    andq %r8, %r10  ; SSE-NEXT:    notq %r8 -; SSE-NEXT:    movq %rcx, %r11 -; SSE-NEXT:    andq %rsi, %r11  ; SSE-NEXT:    notq %rsi -; SSE-NEXT:    andq %r9, %r8 -; SSE-NEXT:    andq %rcx, %rsi -; SSE-NEXT:    orq %r10, %r11 -; SSE-NEXT:    jne .LBB22_2 +; SSE-NEXT:    movl %ecx, %r9d +; SSE-NEXT:    andl $96, %r9d +; SSE-NEXT:    shrl $3, %r9d +; SSE-NEXT:    movl (%rdi,%r9), %r9d +; SSE-NEXT:    btl %ecx, %r9d +; SSE-NEXT:    jb .LBB22_2  ; SSE-NEXT:  # %bb.1:  ; SSE-NEXT:    movl (%rdx), %eax  ; SSE-NEXT:  .LBB22_2: -; SSE-NEXT:    movq %rsi, (%rdi) -; SSE-NEXT:    movq %r8, 8(%rdi) +; SSE-NEXT:    andq %rsi, (%rdi) +; SSE-NEXT:    andq %r8, 8(%rdi)  ; SSE-NEXT:    # kill: def $eax killed $eax killed $rax  ; SSE-NEXT:    retq  ; -; AVX-LABEL: reset_multiload_i128: -; AVX:       # %bb.0: -; AVX-NEXT:    movl %esi, %ecx -; AVX-NEXT:    movl $1, %esi -; AVX-NEXT:    xorl %r8d, %r8d -; AVX-NEXT:    shldq %cl, %rsi, %r8 -; AVX-NEXT:    xorl %eax, %eax -; AVX-NEXT:    shlxq %rcx, %rsi, %r9 -; AVX-NEXT:    testb $64, %cl -; AVX-NEXT:    cmovneq %r9, %r8 -; AVX-NEXT:    cmovneq %rax, %r9 -; AVX-NEXT:    movq (%rdi), %r10 -; AVX-NEXT:    movq 8(%rdi), %r11 -; AVX-NEXT:    andnq %r11, %r8, %rcx -; AVX-NEXT:    andq %r8, %r11 -; AVX-NEXT:    andnq %r10, %r9, %rsi -; AVX-NEXT:    andq %r9, %r10 -; AVX-NEXT:    orq %r11, %r10 -; AVX-NEXT:    jne .LBB22_2 -; AVX-NEXT:  # %bb.1: -; AVX-NEXT:    movl (%rdx), %eax -; AVX-NEXT:  .LBB22_2: -; AVX-NEXT:    movq %rsi, (%rdi) -; AVX-NEXT:    movq %rcx, 8(%rdi) -; AVX-NEXT:    # kill: def $eax killed $eax killed $rax -; AVX-NEXT:    retq +; AVX2-LABEL: reset_multiload_i128: +; AVX2:       # %bb.0: +; AVX2-NEXT:    movl %esi, %ecx +; AVX2-NEXT:    xorl %eax, %eax +; AVX2-NEXT:    movl $1, %r8d +; AVX2-NEXT:    xorl %esi, %esi +; AVX2-NEXT:    shldq %cl, %r8, %rsi +; AVX2-NEXT:    shlxq %rcx, %r8, %r8 +; AVX2-NEXT:    testb $64, %cl +; AVX2-NEXT:    cmovneq %r8, %rsi +; AVX2-NEXT:    cmovneq %rax, %r8 +; AVX2-NEXT:    notq %rsi +; AVX2-NEXT:    notq %r8 +; AVX2-NEXT:    movl %ecx, %r9d +; AVX2-NEXT:    andl $96, %r9d +; AVX2-NEXT:    shrl $3, %r9d +; AVX2-NEXT:    movl (%rdi,%r9), %r9d +; AVX2-NEXT:    btl %ecx, %r9d +; AVX2-NEXT:    jb .LBB22_2 +; AVX2-NEXT:  # %bb.1: +; AVX2-NEXT:    movl (%rdx), %eax +; AVX2-NEXT:  .LBB22_2: +; AVX2-NEXT:    andq %r8, (%rdi) +; AVX2-NEXT:    andq %rsi, 8(%rdi) +; AVX2-NEXT:    # kill: def $eax killed $eax killed $rax +; AVX2-NEXT:    retq +; +; AVX512-LABEL: reset_multiload_i128: +; AVX512:       # %bb.0: +; AVX512-NEXT:    movl %esi, %ecx +; AVX512-NEXT:    movl $1, %r8d +; AVX512-NEXT:    xorl %esi, %esi +; AVX512-NEXT:    shldq %cl, %r8, %rsi +; AVX512-NEXT:    xorl %eax, %eax +; AVX512-NEXT:    shlxq %rcx, %r8, %r8 +; AVX512-NEXT:    testb $64, %cl +; AVX512-NEXT:    cmovneq %r8, %rsi +; AVX512-NEXT:    cmovneq %rax, %r8 +; AVX512-NEXT:    notq %rsi +; AVX512-NEXT:    notq %r8 +; AVX512-NEXT:    movl %ecx, %r9d +; AVX512-NEXT:    andl $96, %r9d +; AVX512-NEXT:    shrl $3, %r9d +; AVX512-NEXT:    movl (%rdi,%r9), %r9d +; AVX512-NEXT:    btl %ecx, %r9d +; AVX512-NEXT:    jb .LBB22_2 +; AVX512-NEXT:  # %bb.1: +; AVX512-NEXT:    movl (%rdx), %eax +; AVX512-NEXT:  .LBB22_2: +; AVX512-NEXT:    andq %r8, (%rdi) +; AVX512-NEXT:    andq %rsi, 8(%rdi) +; AVX512-NEXT:    # kill: def $eax killed $eax killed $rax +; AVX512-NEXT:    retq    %rem = and i32 %position, 127    %ofs = zext nneg i32 %rem to i128    %bit = shl nuw i128 1, %ofs diff --git a/llvm/test/DebugInfo/debug-bool-const-value.ll b/llvm/test/DebugInfo/debug-bool-const-value.ll new file mode 100644 index 0000000..84cf993 --- /dev/null +++ b/llvm/test/DebugInfo/debug-bool-const-value.ll @@ -0,0 +1,29 @@ +; REQUIRES: object-emission +; RUN: %llc_dwarf %s -filetype=obj -o - | llvm-dwarfdump - | FileCheck %s + +; CHECK: {{.*}}DW_TAG_variable +; CHECK-NEXT: {{.*}} DW_AT_const_value     (1) +; CHECK-NEXT: {{.*}} DW_AT_name    ("arg") + +define void @test() !dbg !5 +{ +entry: +  call void @"llvm.dbg.value"(metadata i1 true, metadata !7, metadata !8), !dbg !6 +  ret void, !dbg !6 +} + +declare void @"llvm.dbg.value"(metadata %".1", metadata %".2", metadata %".3") + +!llvm.dbg.cu = !{ !2 } +!llvm.module.flags = !{ !9, !10 } + +!1 = !DIFile(directory: "", filename: "test") +!2 = distinct !DICompileUnit(emissionKind: FullDebug, file: !1, isOptimized: false, language: DW_LANG_C_plus_plus, runtimeVersion: 0) +!3 = !DIBasicType(encoding: DW_ATE_boolean, name: "bool", size: 8) +!4 = !DISubroutineType(types: !{null}) +!5 = distinct !DISubprogram(file: !1, isDefinition: true, isLocal: false, isOptimized: false, line: 5, linkageName: "test", name: "test", scope: !1, scopeLine: 5, type: !4, unit: !2) +!6 = !DILocation(column: 1, line: 5, scope: !5) +!7 = !DILocalVariable(arg: 0, file: !1, line: 5, name: "arg", scope: !5, type: !3) +!8 = !DIExpression() +!9 = !{ i32 2, !"Dwarf Version", i32 4 } +!10 = !{ i32 2, !"Debug Info Version", i32 3 } diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt b/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt index f5cb4b7..2661ed5 100644 --- a/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt @@ -82,12 +82,18 @@  #CHECK: lxvprll 6, 2, 1  0x7c 0xc2 0x0c 0xda +#CHECK: lxvpb32x 2, 15, 16 +0x7c,0x4f,0x86,0xda +  #CHECK: stxvprl 0, 1, 2  0x7c 0x01 0x15 0x9a  #CHECK: stxvprll 6, 0, 1  0x7c 0xc0 0x0d 0xda +#CHECK: stxvpb32x 2, 15, 16 +0x7c,0x4f,0x87,0xda +  #CHECK: dmxvi8gerx4 1, 2, 4  0xec,0x82,0x20,0x58 diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt index f0df8ce..7fb8254 100644 --- a/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt @@ -76,12 +76,18 @@  #CHECK: lxvprll 6, 2, 1  0xda 0x0c 0xc2 0x7c +#CHECK: lxvpb32x 2, 15, 16 +0xda,0x86,0x4f,0x7c +  #CHECK: stxvprl 0, 1, 2  0x9a 0x15 0x01 0x7c  #CHECK: stxvprll 6, 0, 1  0xda 0x0d 0xc0 0x7c +#CHECK: stxvpb32x 2, 15, 16 +0xda,0x87,0x4f,0x7c +  #CHECK: dmxvi8gerx4 1, 2, 4  0x58,0x20,0x82,0xec diff --git a/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s b/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s index bc0683e..40059c4 100644 --- a/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s +++ b/llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s @@ -105,6 +105,10 @@  # CHECK-LE: lxvprll 6, 2, 1               # encoding: [0xda,0x0c,0xc2,0x7c]              lxvprll 6, 2, 1 +           lxvpb32x 2, 15, 16 +#CHECK-BE: lxvpb32x 2, 15, 16            # encoding: [0x7c,0x4f,0x86,0xda] +#CHECK-LE: lxvpb32x 2, 15, 16            # encoding: [0xda,0x86,0x4f,0x7c] +  # CHECK-BE: stxvprl 0, 1, 2               # encoding: [0x7c,0x01,0x15,0x9a]  # CHECK-LE: stxvprl 0, 1, 2               # encoding: [0x9a,0x15,0x01,0x7c]              stxvprl 0, 1, 2 @@ -113,6 +117,10 @@  # CHECK-LE: stxvprll 6, 0, 1              # encoding: [0xda,0x0d,0xc0,0x7c]              stxvprll 6, 0, 1 +           stxvpb32x 2, 15, 16 +#CHECK-BE: stxvpb32x 2, 15, 16            # encoding: [0x7c,0x4f,0x87,0xda] +#CHECK-LE: stxvpb32x 2, 15, 16            # encoding: [0xda,0x87,0x4f,0x7c] +              dmxvi8gerx4 1, 2, 4  # CHECK-BE: dmxvi8gerx4 1, 2, 4                     # encoding: [0xec,0x82,0x20,0x58]  # CHECK-LE: dmxvi8gerx4 1, 2, 4                     # encoding: [0x58,0x20,0x82,0xec] diff --git a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll index 8a6f60b..87aed77 100644 --- a/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll +++ b/llvm/test/Transforms/DropUnnecessaryAssumes/basic.ll @@ -184,6 +184,18 @@ define void @type_test(ptr %x) {    ret void  } +define void @public_type_test(ptr %x) { +; CHECK-LABEL: define void @public_type_test( +; CHECK-SAME: ptr [[X:%.*]]) { +; CHECK-NEXT:    [[TEST:%.*]] = call i1 @llvm.public.type.test(ptr [[X]], metadata !"typeid") +; CHECK-NEXT:    call void @llvm.assume(i1 [[TEST]]) +; CHECK-NEXT:    ret void +; +  %test = call i1 @llvm.public.type.test(ptr %x, metadata !"typeid") +  call void @llvm.assume(i1 %test) +  ret void +} +  define void @multiple_dead_conds(i32 %x) {  ; CHECK-LABEL: define void @multiple_dead_conds(  ; CHECK-SAME: i32 [[X:%.*]]) { diff --git a/llvm/test/Transforms/InstCombine/or.ll b/llvm/test/Transforms/InstCombine/or.ll index 6b090e9..f61a197 100644 --- a/llvm/test/Transforms/InstCombine/or.ll +++ b/llvm/test/Transforms/InstCombine/or.ll @@ -2113,3 +2113,98 @@ define <4 x i32> @or_zext_nneg_minus_constant_splat(<4 x i8> %a) {    %or = or <4 x i32> %zext, splat (i32 -9)    ret <4 x i32> %or  } + +define i8 @or_positive_minus_non_positive_to_abs(i8 %a){ +; CHECK-LABEL: @or_positive_minus_non_positive_to_abs( +; CHECK-NEXT:    [[TMP2:%.*]] = call i8 @llvm.abs.i8(i8 [[A:%.*]], i1 false) +; CHECK-NEXT:    ret i8 [[TMP2]] +; +  %b = icmp sgt i8 %a, 0 +  %mask = sext i1 %b to i8 +  %neg = sub i8 0, %a +  %mask_inv = xor i8 %mask, -1 +  %c = and i8 %neg, %mask_inv +  %d = and i8 %a, %mask +  %or = or i8 %c, %d +  ret i8 %or +} + +; TODO: Fold to smax https://alive2.llvm.org/ce/z/wDiDh2 +define i8 @or_select_smax_neg_to_abs(i8 %a){ +; CHECK-LABEL: @or_select_smax_neg_to_abs( +; CHECK-NEXT:    [[SGT0:%.*]] = icmp sgt i8 [[A:%.*]], 0 +; CHECK-NEXT:    [[NEG:%.*]] = sub nsw i8 0, [[A]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[SGT0]], i8 0, i8 [[NEG]] +; CHECK-NEXT:    ret i8 [[OR]] +; +  %sgt0 = icmp sgt i8 %a, 0 +  %neg = sub nsw i8 0, %a +  %sel = select i1 %sgt0, i8 0, i8 %neg +  ret i8 %sel +} + +; TODO: Fold to abs https://alive2.llvm.org/ce/z/DybfHG +define i8 @or_select_smax_smax_to_abs(i8 %a){ +; CHECK-LABEL: @or_select_smax_smax_to_abs( +; CHECK-NEXT:    [[NEG:%.*]] = sub nsw i8 0, [[A:%.*]] +; CHECK-NEXT:    [[SEL:%.*]] = call i8 @llvm.smax.i8(i8 [[NEG]], i8 0) +; CHECK-NEXT:    [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[A]], i8 0) +; CHECK-NEXT:    [[OR:%.*]] = or i8 [[SEL]], [[MAX]] +; CHECK-NEXT:    ret i8 [[OR]] +; +  %neg = sub nsw i8 0, %a +  %sel = call i8 @llvm.smax.i8(i8 %neg, i8 0) +  %max = call i8 @llvm.smax.i8(i8 %a, i8 0) +  %or = or i8 %sel, %max +  ret i8 %or +} + +declare i8 @llvm.abs.i8(i8, i1) +declare <2 x i8> @llvm.abs.v2i8(<2 x i8>, i1) + +define <2 x i8> @or_sgt_select_smax_to_abs(<2 x i8> %a){ +; CHECK-LABEL: @or_sgt_select_smax_to_abs( +; CHECK-NEXT:    [[OR:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[A:%.*]], i1 false) +; CHECK-NEXT:    ret <2 x i8> [[OR]] +; +  %sgt0 = icmp sgt <2 x i8> %a, zeroinitializer +  %neg = sub <2 x i8> zeroinitializer, %a +  %sel = select <2 x i1> %sgt0, <2 x i8> zeroinitializer, <2 x i8> %neg +  %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) +  %or = or <2 x i8> %sel, %max +  ret <2 x i8> %or +} + +define <2 x i8> @or_slt_select_smax_to_abs(<2 x i8> %a){ +; CHECK-LABEL: @or_slt_select_smax_to_abs( +; CHECK-NEXT:    [[OR:%.*]] = call <2 x i8> @llvm.abs.v2i8(<2 x i8> [[A:%.*]], i1 false) +; CHECK-NEXT:    ret <2 x i8> [[OR]] +; +  %slt0 = icmp slt <2 x i8> %a, zeroinitializer +  %neg = sub <2 x i8> zeroinitializer, %a +  %sel = select <2 x i1> %slt0, <2 x i8> %neg, <2 x i8> zeroinitializer +  %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) +  %or = or <2 x i8> %sel, %max +  ret <2 x i8> %or +} + +; negative test - %d has multiple uses. %or is not folded to abs. + +define <2 x i8> @or_select_smax_multi_uses(<2 x i8> %a){ +; CHECK-LABEL: @or_select_smax_multi_uses( +; CHECK-NEXT:    [[B:%.*]] = icmp sgt <2 x i8> [[A:%.*]], zeroinitializer +; CHECK-NEXT:    [[NEG:%.*]] = sub <2 x i8> zeroinitializer, [[A]] +; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[B]], <2 x i8> zeroinitializer, <2 x i8> [[NEG]] +; CHECK-NEXT:    [[D:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[A]], <2 x i8> zeroinitializer) +; CHECK-NEXT:    [[OR1:%.*]] = or <2 x i8> [[C]], [[D]] +; CHECK-NEXT:    [[OR:%.*]] = add <2 x i8> [[OR1]], [[D]] +; CHECK-NEXT:    ret <2 x i8> [[OR]] +; +  %sgt0 = icmp sgt <2 x i8> %a, zeroinitializer +  %neg = sub <2 x i8> zeroinitializer, %a +  %sel = select <2 x i1> %sgt0, <2 x i8> zeroinitializer, <2 x i8> %neg +  %max = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %a, <2 x i8> zeroinitializer) +  %or = or <2 x i8> %sel, %max +  %add = add <2 x i8> %or, %max +  ret <2 x i8> %add +} diff --git a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll index 3d97048..8b3c050 100644 --- a/llvm/test/Transforms/InstCombine/select-safe-transforms.ll +++ b/llvm/test/Transforms/InstCombine/select-safe-transforms.ll @@ -256,27 +256,27 @@ define <2 x i1> @not_logical_or2(i1 %b, <2 x i32> %a) {    ret <2 x i1> %and  } -define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) { +define i1 @bools_logical_commute0(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools_logical_commute0( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF2]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1 -  %and1 = select i1 %not, i1 %a, i1 false -  %and2 = select i1 %c, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and1 = select i1 %not, i1 %a, i1 false, !prof!1 +  %and2 = select i1 %c, i1 %b, i1 false, !prof !2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !3    ret i1 %or  } -define i1 @bools_logical_commute0_and1(i1 %a, i1 %b, i1 %c) { +define i1 @bools_logical_commute0_and1(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools_logical_commute0_and1( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF1]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %not, %a -  %and2 = select i1 %c, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and2 = select i1 %c, i1 %b, i1 false, !prof !1 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !2    ret i1 %or  } @@ -292,15 +292,15 @@ define i1 @bools_logical_commute0_and2(i1 %a, i1 %b, i1 %c) {    ret i1 %or  } -define i1 @bools_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) { +define i1 @bools_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools_logical_commute0_and1_and2( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]], !prof [[PROF3:![0-9]+]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %not, %a    %and2 = and i1 %c, %b -  %or = select i1 %and1, i1 true, i1 %and2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !1    ret i1 %or  } @@ -457,27 +457,27 @@ define i1 @bools_logical_commute3_and1_and2(i1 %b, i1 %c) {    ret i1 %or  } -define i1 @bools2_logical_commute0(i1 %a, i1 %b, i1 %c) { +define i1 @bools2_logical_commute0(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools2_logical_commute0( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF1]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1 -  %and1 = select i1 %c, i1 %a, i1 false -  %and2 = select i1 %not, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and1 = select i1 %c, i1 %a, i1 false, !prof !1 +  %and2 = select i1 %not, i1 %b, i1 false, !prof !2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !3    ret i1 %or  } -define i1 @bools2_logical_commute0_and1(i1 %a, i1 %b, i1 %c) { +define i1 @bools2_logical_commute0_and1(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools2_logical_commute0_and1( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF2]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %c, %a -  %and2 = select i1 %not, i1 %b, i1 false -  %or = select i1 %and1, i1 true, i1 %and2 +  %and2 = select i1 %not, i1 %b, i1 false, !prof !1 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !2    ret i1 %or  } @@ -493,15 +493,15 @@ define i1 @bools2_logical_commute0_and2(i1 %a, i1 %b, i1 %c) {    ret i1 %or  } -define i1 @bools2_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) { +define i1 @bools2_logical_commute0_and1_and2(i1 %a, i1 %b, i1 %c) !prof !0 {  ; CHECK-LABEL: @bools2_logical_commute0_and1_and2( -; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]] +; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 [[B:%.*]], !prof [[PROF3]]  ; CHECK-NEXT:    ret i1 [[OR]]  ;    %not = xor i1 %c, -1    %and1 = and i1 %c, %a    %and2 = and i1 %not, %b -  %or = select i1 %and1, i1 true, i1 %and2 +  %or = select i1 %and1, i1 true, i1 %and2, !prof !1    ret i1 %or  } @@ -799,8 +799,11 @@ define <2 x i1> @not_logical_and2(i1 %b, <2 x i32> %a) {  !0 = !{!"function_entry_count", i64 1000}  !1 = !{!"branch_weights", i32 2, i32 3} +!2 = !{!"branch_weights", i32 5, i32 7} +!3 = !{!"branch_weights", i32 11, i32 13}  ;.  ; CHECK: [[META0:![0-9]+]] = !{!"function_entry_count", i64 1000}  ; CHECK: [[PROF1]] = !{!"branch_weights", i32 2, i32 3}  ; CHECK: [[PROF2]] = !{!"branch_weights", i32 3, i32 2} +; CHECK: [[PROF3]] = !{!"unknown", !"instcombine"}  ;. diff --git a/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll b/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll new file mode 100644 index 0000000..4d378b0 --- /dev/null +++ b/llvm/test/Transforms/LoopUnroll/zeroed-branch-weights.ll @@ -0,0 +1,30 @@ +; Check that zeroed branch weights do not crash or otherwise break basic +; LoopUnroll behavior when it tries to compute a probability from them. + +; RUN: opt < %s -S -unroll-count=2 -passes='loop-unroll' 2>&1 | FileCheck %s + +define void @test() { +entry: +  br label %loop + +loop: +  br i1 false, label %end, label %loop, !prof !0 + +end: +  ret void +} + +!0 = !{!"branch_weights", i32 0, i32 0} + +; CHECK: define void @test() { +; CHECK: entry: +; CHECK:   br label %loop +; CHECK: loop: +; CHECK:   br i1 false, label %end, label %loop.1, !prof !0 +; CHECK: loop.1: +; CHECK:   br i1 false, label %end, label %loop, !prof !0, !llvm.loop !1 +; CHECK-NOT: loop.2 +; CHECK: end: +; CHECK:   ret void +; CHECK: } +; CHECK: !0 = !{!"branch_weights", i32 0, i32 0} diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll b/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll index 49f663f..62e248b 100644 --- a/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll +++ b/llvm/test/Transforms/LoopVectorize/AArch64/vplan-printing.ll @@ -1,12 +1,12 @@  ; REQUIRES: asserts -; RUN: opt -mattr=+neon,+dotprod -passes=loop-vectorize -debug-only=loop-vectorize -force-vector-interleave=1 -enable-epilogue-vectorization -epilogue-vectorization-force-VF=2 -disable-output %s 2>&1 | FileCheck %s +; RUN: opt -passes=loop-vectorize -debug-only=loop-vectorize -disable-output %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"  target triple = "aarch64-none-unknown-elf"  ; Tests for printing VPlans that are enabled under AArch64 -define i32 @print_partial_reduction(ptr %a, ptr %b) { +define i32 @print_partial_reduction(ptr %a, ptr %b) "target-features"="+neon,+dotprod" {  ; CHECK:      VPlan 'Initial VPlan for VF={8,16},UF>=1' {  ; CHECK-NEXT: Live-in vp<[[VF:%.]]> = VF  ; CHECK-NEXT: Live-in vp<[[VFxUF:%.]]> = VF * UF @@ -69,60 +69,37 @@ define i32 @print_partial_reduction(ptr %a, ptr %b) {  ; CHECK-NEXT: No successors  ; CHECK-NEXT: }  ; CHECK: VPlan 'Final VPlan for VF={8,16},UF={1}' { +; CHECK-NEXT: Live-in ir<1024> = vector-trip-count  ; CHECK-NEXT: Live-in ir<1024> = original trip-count  ; CHECK-EMPTY:  ; CHECK-NEXT: ir-bb<entry>: -; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.main.loop.iter.check> +; CHECK-NEXT: Successor(s): vector.ph  ; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<vector.main.loop.iter.check>: -; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.ph> -; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<vector.ph>: -; CHECK-NEXT:  EMIT vp<[[RDX_START:%.+]]> = reduction-start-vector ir<0>, ir<0>, ir<4> +; CHECK-NEXT: vector.ph: +; CHECK-NEXT:   EMIT vp<%1> = reduction-start-vector ir<0>, ir<0>, ir<4>  ; CHECK-NEXT: Successor(s): vector.body  ; CHECK-EMPTY:  ; CHECK-NEXT: vector.body: -; CHECK-NEXT:   EMIT-SCALAR vp<[[EP_IV:%.+]]> = phi [ ir<0>, ir-bb<vector.ph> ], [ vp<%index.next>, vector.body ] -; CHECK-NEXT:   WIDEN-REDUCTION-PHI ir<%accum> = phi vp<[[RDX_START]]>, ir<%add> (VF scaled by 1/4) -; CHECK-NEXT:   CLONE ir<%gep.a> = getelementptr ir<%a>, vp<[[EP_IV]]> +; CHECK-NEXT:   EMIT-SCALAR vp<%index> = phi [ ir<0>, vector.ph ], [ vp<%index.next>, vector.body ] +; CHECK-NEXT:   WIDEN-REDUCTION-PHI ir<%accum> = phi vp<%1>, ir<%add> (VF scaled by 1/4) +; CHECK-NEXT:   CLONE ir<%gep.a> = getelementptr ir<%a>, vp<%index>  ; CHECK-NEXT:   WIDEN ir<%load.a> = load ir<%gep.a> -; CHECK-NEXT:   CLONE ir<%gep.b> = getelementptr ir<%b>, vp<[[EP_IV]]> +; CHECK-NEXT:   CLONE ir<%gep.b> = getelementptr ir<%b>, vp<%index>  ; CHECK-NEXT:   WIDEN ir<%load.b> = load ir<%gep.b>  ; CHECK-NEXT:   WIDEN-CAST ir<%ext.b> = zext ir<%load.b> to i32  ; CHECK-NEXT:   WIDEN-CAST ir<%ext.a> = zext ir<%load.a> to i32  ; CHECK-NEXT:   WIDEN ir<%mul> = mul ir<%ext.b>, ir<%ext.a>  ; CHECK-NEXT:   PARTIAL-REDUCE ir<%add> = add ir<%accum>, ir<%mul> -; CHECK-NEXT:   EMIT vp<[[EP_IV_NEXT:%.+]]> = add nuw vp<[[EP_IV]]>, ir<16> -; CHECK-NEXT:   EMIT branch-on-count vp<[[EP_IV_NEXT]]>, ir<1024> +; CHECK-NEXT:   EMIT vp<%index.next> = add nuw vp<%index>, ir<16> +; CHECK-NEXT:   EMIT branch-on-count vp<%index.next>, ir<1024>  ; CHECK-NEXT: Successor(s): middle.block, vector.body  ; CHECK-EMPTY:  ; CHECK-NEXT: middle.block: -; CHECK-NEXT:   EMIT vp<[[RED_RESULT:%.+]]> = compute-reduction-result ir<%accum>, ir<%add> -; CHECK-NEXT:   EMIT branch-on-cond ir<true> -; CHECK-NEXT: Successor(s): ir-bb<exit>, ir-bb<scalar.ph> +; CHECK-NEXT:   EMIT vp<%3> = compute-reduction-result ir<%accum>, ir<%add> +; CHECK-NEXT: Successor(s): ir-bb<exit>  ; CHECK-EMPTY:  ; CHECK-NEXT: ir-bb<exit>: -; CHECK-NEXT:   IR   %add.lcssa = phi i32 [ %add, %for.body ] (extra operand: vp<[[RED_RESULT]]> from middle.block) -; CHECK-NEXT: No successors -; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<scalar.ph>: -; CHECK-NEXT:   EMIT-SCALAR vp<[[EP_RESUME:%.+]]> = phi [ ir<1024>, middle.block ], [ ir<0>, ir-bb<entry> ] -; CHECK-NEXT:   EMIT-SCALAR vp<[[EP_MERGE:%.+]]> = phi [ vp<[[RED_RESULT]]>, middle.block ], [ ir<0>, ir-bb<entry> ] -; CHECK-NEXT:   EMIT-SCALAR vp<%6> = resume-for-epilogue vp<%vec.epilog.resume.val> -; CHECK-NEXT: Successor(s): ir-bb<for.body> -; CHECK-EMPTY: -; CHECK-NEXT: ir-bb<for.body>: -; CHECK-NEXT:   IR   %accum = phi i32 [ 0, %scalar.ph ], [ %add, %for.body ] (extra operand: vp<[[EP_MERGE]]> from ir-bb<scalar.ph>) -; CHECK-NEXT:   IR   %gep.a = getelementptr i8, ptr %a, i64 %iv -; CHECK-NEXT:   IR   %load.a = load i8, ptr %gep.a, align 1 -; CHECK-NEXT:   IR   %ext.a = zext i8 %load.a to i32 -; CHECK-NEXT:   IR   %gep.b = getelementptr i8, ptr %b, i64 %iv -; CHECK-NEXT:   IR   %load.b = load i8, ptr %gep.b, align 1 -; CHECK-NEXT:   IR   %ext.b = zext i8 %load.b to i32 -; CHECK-NEXT:   IR   %mul = mul i32 %ext.b, %ext.a -; CHECK-NEXT:   IR   %add = add i32 %mul, %accum -; CHECK-NEXT:   IR   %iv.next = add i64 %iv, 1 -; CHECK-NEXT:   IR   %exitcond.not = icmp eq i64 %iv.next, 1024 +; CHECK-NEXT:   IR   %add.lcssa = phi i32 [ %add, %for.body ] (extra operand: vp<%3> from middle.block)  ; CHECK-NEXT: No successors  ; CHECK-NEXT: }  entry: @@ -141,8 +118,12 @@ for.body:                                         ; preds = %for.body, %entry    %add = add i32 %mul, %accum    %iv.next = add i64 %iv, 1    %exitcond.not = icmp eq i64 %iv.next, 1024 -  br i1 %exitcond.not, label %exit, label %for.body +  br i1 %exitcond.not, label %exit, label %for.body, !llvm.loop !0  exit:    ret i32 %add  } + +!0 = distinct !{!0, !2, !3} +!2 = !{!"llvm.loop.interleave.count", i32 1} +!3 = !{!"llvm.loop.vectorize.predicate.enable", i1 false} diff --git a/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll b/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll index 9deab90..fe230fa 100644 --- a/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll +++ b/llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll @@ -102,7 +102,7 @@ exit:    ret void  } -define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize { +define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr, i32 %z) optsize {  ; CHECK-LABEL: sink_replicate_region_2  ; CHECK:      VPlan 'Initial VPlan for VF={2},UF>=1' {  ; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF @@ -125,16 +125,18 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {  ; CHECK-NEXT:   ir<%iv> = WIDEN-INDUCTION ir<0>, ir<1>, vp<[[VF]]>  ; CHECK-NEXT:   EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv>, vp<[[BTC]]>  ; CHECK-NEXT:   EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur>, ir<%recur.next> +; CHECK-NEXT:   WIDEN ir<%cond> = icmp eq ir<%iv>, ir<%z> +; CHECK-NEXT:   EMIT vp<[[AND:%.+]]> = logical-and vp<[[MASK]]>, ir<%cond>  ; CHECK-NEXT:   Successor(s): pred.store  ; CHECK-EMPTY:  ; CHECK-NEXT: <xVFxUF> pred.store: {  ; CHECK-NEXT:  pred.store.entry: -; CHECK-NEXT:    BRANCH-ON-MASK vp<[[MASK]]> +; CHECK-NEXT:    BRANCH-ON-MASK vp<[[AND]]>  ; CHECK-NEXT:  Successor(s): pred.store.if, pred.store.continue  ; CHECK-EMPTY:  ; CHECK-NEXT:  pred.store.if: -; CHECK-NEXT:     vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>  ; CHECK-NEXT:     REPLICATE ir<%rem> = srem vp<[[SPLICE]]>, ir<%x> +; CHECK-NEXT:     vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>  ; CHECK-NEXT:     REPLICATE ir<%gep> = getelementptr ir<%ptr>, vp<[[STEPS]]>  ; CHECK-NEXT:     REPLICATE ir<%add> = add ir<%rem>, ir<%recur.next>  ; CHECK-NEXT:     REPLICATE store ir<%add>, ir<%gep> @@ -143,9 +145,9 @@ define void @sink_replicate_region_2(i32 %x, i8 %y, ptr %ptr) optsize {  ; CHECK-NEXT:   pred.store.continue:  ; CHECK-NEXT:   No successors  ; CHECK-NEXT: } -; CHECK-NEXT: Successor(s): loop.0 +; CHECK-NEXT: Successor(s): if.1  ; CHECK-EMPTY: -; CHECK-NEXT: loop.0: +; CHECK-NEXT: if.1:  ; CHECK-NEXT:   EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>  ; CHECK-NEXT:   EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]>  ; CHECK-NEXT: No successors @@ -162,13 +164,20 @@ entry:    br label %loop  loop: -  %recur = phi i32 [ 0, %entry ], [ %recur.next, %loop ] -  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] -  %rem = srem i32 %recur, %x +  %recur = phi i32 [ 0, %entry ], [ %recur.next, %latch ] +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]    %recur.next = sext i8 %y to i32 +  %cond = icmp eq i32 %iv, %z +  br i1 %cond, label %if, label %latch + +if: +  %rem = srem i32 %recur, %x    %add = add i32 %rem, %recur.next    %gep = getelementptr i32, ptr %ptr, i32 %iv    store i32 %add, ptr %gep +  br label %latch + +latch:    %iv.next = add nsw i32 %iv, 1    %ec = icmp eq i32 %iv.next, 20001    br i1 %ec, label %exit, label %loop diff --git a/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll b/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll index 994e9c1..2dd6a04 100644 --- a/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll +++ b/llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll @@ -29,11 +29,13 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3  ; CHECK-NEXT:   EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION  ; CHECK-NEXT:   ir<%iv> = WIDEN-INDUCTION ir<0>, ir<1>, vp<[[VF]]>  ; CHECK-NEXT:   EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv>, vp<[[BTC]]> +; CHECK-NEXT:   WIDEN ir<%cond> = icmp eq ir<%iv>, ir<%x> +; CHECK-NEXT:   EMIT vp<[[AND:%.+]]> = logical-and vp<[[MASK]]>, ir<%cond>  ; CHECK-NEXT: Successor(s): pred.store  ; CHECK:      <xVFxUF> pred.store: {  ; CHECK-NEXT:   pred.store.entry: -; CHECK-NEXT:     BRANCH-ON-MASK vp<[[MASK]]> +; CHECK-NEXT:     BRANCH-ON-MASK vp<[[AND]]>  ; CHECK-NEXT:   Successor(s): pred.store.if, pred.store.continue  ; CHECK:      pred.store.if: @@ -50,24 +52,31 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3  ; CHECK-NEXT:   No successors  ; CHECK-NEXT: } -; CHECK:      loop.1: +; CHECK:      if.1:  ; CHECK-NEXT:   EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>  ; CHECK-NEXT:   EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]>  ; CHECK-NEXT: No successors  ; CHECK-NEXT: }  ; -define void @sink1(i32 %k) { +define void @sink1(i32 %k, i32 %x) {  entry:    br label %loop  loop: -  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] +  %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] +  %cond = icmp eq i32 %iv, %x +  br i1 %cond, label %if, label %latch + +if:    %gep.b = getelementptr inbounds [2048 x i32], ptr @b, i32 0, i32 %iv    %lv.b  = load i32, ptr %gep.b, align 4    %add = add i32 %lv.b, 10    %mul = mul i32 2, %add    %gep.a = getelementptr inbounds [2048 x i32], ptr @a, i32 0, i32 %iv    store i32 %mul, ptr %gep.a, align 4 +  br label %latch + +latch:    %iv.next = add i32 %iv, 1    %large = icmp sge i32 %iv, 8    %exitcond = icmp eq i32 %iv, %k diff --git a/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll b/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll new file mode 100644 index 0000000..590b0be --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/parent-non-schedule-multi-use-in-binop.ll @@ -0,0 +1,40 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt -passes=slp-vectorizer -S --mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +@a = common global [100 x i64] zeroinitializer, align 64 + +define void @test() { +; CHECK-LABEL: define void @test() { +; CHECK-NEXT:  [[ENTRY:.*]]: +; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i64>, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +; CHECK-NEXT:    [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1) +; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x i64> [[TMP0]], <2 x i64> [[TMP1]], <2 x i32> <i32 0, i32 3> +; CHECK-NEXT:    [[TMP3:%.*]] = add <2 x i64> [[TMP2]], splat (i64 1) +; CHECK-NEXT:    br i1 false, label %[[LOP_RHSCNT_I_PEEL:.*]], label %[[LAND_END_I_PEEL:.*]] +; CHECK:       [[LOP_RHSCNT_I_PEEL]]: +; CHECK-NEXT:    [[TMP4:%.*]] = or <2 x i64> [[TMP1]], <i64 1, i64 0> +; CHECK-NEXT:    br label %[[LAND_END_I_PEEL]] +; CHECK:       [[LAND_END_I_PEEL]]: +; CHECK-NEXT:    [[TMP5:%.*]] = phi <2 x i64> [ [[TMP3]], %[[ENTRY]] ], [ [[TMP4]], %[[LOP_RHSCNT_I_PEEL]] ] +; CHECK-NEXT:    store <2 x i64> [[TMP5]], ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +; CHECK-NEXT:    ret void +; +entry: +  %.promoted104.i = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 56), align 8 +  %.promoted103.i = load i64, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +  %0 = add i64 %.promoted104.i, 1 +  %1 = add i64 %.promoted103.i, 1 +  %2 = add i64 %0, 1 +  br i1 false, label %lop.rhscnt.i.peel, label %land.end.i.peel + +lop.rhscnt.i.peel: +  %3 = or i64 %1, 1 +  br label %land.end.i.peel + +land.end.i.peel: +  %4 = phi i64 [ %2, %entry ], [ %0, %lop.rhscnt.i.peel ] +  %5 = phi i64 [ %1, %entry ], [ %3, %lop.rhscnt.i.peel ] +  store i64 %5, ptr getelementptr inbounds nuw (i8, ptr @a, i64 48), align 8 +  store i64 %4, ptr getelementptr inbounds nuw (i8, ptr @a, i64 56), align 8 +  ret void +} diff --git a/llvm/test/Transforms/StructurizeCFG/callbr.ll b/llvm/test/Transforms/StructurizeCFG/callbr.ll new file mode 100644 index 0000000..42f9519 --- /dev/null +++ b/llvm/test/Transforms/StructurizeCFG/callbr.ll @@ -0,0 +1,235 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -passes=structurizecfg %s -o - | FileCheck %s + +; Structurize as usual, but don't tear callbr and its destination blocks apart. +; +; Note: currently, callbr blocks and their corresponding target blocks +; themselves are not handled by the structurizer.* If the CFG turns out to be +; unstructured at the end, the CFG lowering (si-annotate-control-flow) will +; detect this. For the currently intended use cases of callbr in the context of +; the AMDGPU backend, this is not a limitation (cf. +; https://discourse.llvm.org/t/rfc-add-callbr-intrinsic-support/86087). +; +; Note 2: while callbr and its targets remain untouched, everything else is +; handled as usual, even if it is nested in a callbr region. +; +; *FIXME: this will be fixed in the future. Callbr can be handled as follows: +; Input IR: +; ``` +; define void @foo_callbr() { +;   callbr void asm "", "!i"() to label %fallthrough [label %indirect, ...] +; fallthrough: +;   br label %exit +; indirect: +;   br label %exit +; ... +; exit: +;   ret void +; } +; ``` +; +; Output IR: +; ``` +; define void @foo_callbr() { +;   callbr void asm "", "!i"() +;          to label %fallthrough [label %fake.indirect, label %fake.indirect1, label %fake.indirect2, ...] +; fake.indirect:                                    ; preds = %0 +;   br label %Flow +; fake.indirect1:                                   ; preds = %0 +;   br label %Flow +; fake.indirect2:                                   ; preds = %0 +;   br label %Flow +; ... +; Flow:                                             ; preds = %fallthrough, %fake.indirect[0-N] +;   %1 = phi i1 [ false, %fallthrough ], [ true, %fake.indirect ], [ false, %fake.indirect[1-N] ] +;   br i1 %1, label %indirect, label %Flow1 +; Flow1:                                            ; preds = %Flow, %indirect +;   %2 = phi i1 [ false, %Flow], [ true, %fake.indirect1 ], [ false, %indirect ] +;   br i1 %2, label %indirect1, label %Flow2 +; Flow2:                                            ; preds = %Flow, %indirect1 +;   %2 = phi i1 [ false, %Flow], [ true, %fake.indirect2 ], [ false, %indirect1 ] +;   br i1 %2, label %indirect2, label %Flow3 +; ... +; fallthrough:                                      ; preds = %0 +;   br label %Flow +; indirect:                                         ; preds = %Flow +;   br label %Flow1 +; indirect1:                                        ; preds = %Flow1 +;   br label %Flow2 +; indirect2:                                        : preds = %Flow2 +;   br label %Flow3 +; ... +; exit:                                             ; preds = %indirectN, %FlowN +;   ret void +; } +; ``` +; +; Output IR as ASCII-art: +;          %0 +; --------------------- +; |     |     |     | +; v     v     v     v +; f    f.i   f.i1  f.i2 +; |     |     |     | +; v     v     v     v +; --------------------- +;        %Flow +;          |   \ +;          |    %indirect +;          |   / +;       %Flow1 +;          |   \ +;          |    %indirect1 +;          |   / +;       %Flow2 +;          |   \ +;          |    %indirect2 +;          |   / +;        %exit +; + +; Only callbr, nothing to do. +define void @callbr_simple() { +; CHECK-LABEL: define void @callbr_simple() { +; CHECK-NEXT:  [[CALLBR:.*:]] +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br label %[[EXIT:.*]] +; CHECK:       [[INDIRECT1:.*:]] +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +callbr: +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br label %exit +indirect: +  br label %exit +exit: +  ret void +} + +; Callbr nested in non-callbr: non-callbr is transformed +define void @callbr_in_non_callbr(i1 %c) { +; CHECK-LABEL: define void @callbr_in_non_callbr( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT:    [[C_INV:%.*]] = xor i1 [[C]], true +; CHECK-NEXT:    br i1 [[C_INV]], label %[[NOCALLBR:.*]], label %[[FLOW:.*]] +; CHECK:       [[FLOW]]: +; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, %[[NOCALLBR]] ], [ true, [[TMP0:%.*]] ] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[CALLBR:.*]], label %[[EXIT:.*]] +; CHECK:       [[CALLBR]]: +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[INDIRECT1:.*:]] +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[NOCALLBR]]: +; CHECK-NEXT:    br label %[[FLOW]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +  br i1 %c, label %callbr, label %nocallbr +callbr: +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br label %exit +indirect: +  br label %exit +nocallbr: +  br label %exit +exit: +  ret void +} + +; Callbr parent of non-callbr: non-callbr is transformed +define void @non_callbr_in_callbr(i1 %c) { +; CHECK-LABEL: define void @non_callbr_in_callbr( +; CHECK-SAME: i1 [[C:%.*]]) { +; CHECK-NEXT:    [[C_INV:%.*]] = xor i1 [[C]], true +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br i1 [[C_INV]], label %[[FALLTHROUGH2:.*]], label %[[FLOW:.*]] +; CHECK:       [[FLOW]]: +; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, %[[FALLTHROUGH2]] ], [ true, %[[INDIRECT]] ] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[FALLTHROUGH1:.*]], label %[[FLOW1:.*]] +; CHECK:       [[FALLTHROUGH1]]: +; CHECK-NEXT:    br label %[[FLOW1]] +; CHECK:       [[FALLTHROUGH2]]: +; CHECK-NEXT:    br label %[[FLOW]] +; CHECK:       [[INDIRECT1:.*:]] +; CHECK-NEXT:    br label %[[EXIT:.*]] +; CHECK:       [[FLOW1]]: +; CHECK-NEXT:    br label %[[EXIT]] +; CHECK:       [[EXIT]]: +; CHECK-NEXT:    ret void +; +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br i1 %c, label %fallthrough1, label %fallthrough2 +fallthrough1: +  br label %exit +fallthrough2: +  br label %exit +indirect: +  br label %exit +exit: +  ret void +} + +; Callbr surrounded by non-callbr: all three regular branches are handled +; correctly +define void @callbr_nested_in_non_callbr(i1 %c, i1 %d, i1 %e, i1 %f) { +; CHECK-LABEL: define void @callbr_nested_in_non_callbr( +; CHECK-SAME: i1 [[C:%.*]], i1 [[D:%.*]], i1 [[E:%.*]], i1 [[F:%.*]]) { +; CHECK-NEXT:    [[C_INV:%.*]] = xor i1 [[C]], true +; CHECK-NEXT:    br i1 [[C_INV]], label %[[NOCALLBR:.*]], label %[[FLOW3:.*]] +; CHECK:       [[FLOW3]]: +; CHECK-NEXT:    [[TMP1:%.*]] = phi i1 [ false, %[[FLOW:.*]] ], [ true, [[TMP0:%.*]] ] +; CHECK-NEXT:    br i1 [[TMP1]], label %[[CALLBR:.*]], label %[[RET:.*]] +; CHECK:       [[CALLBR]]: +; CHECK-NEXT:    callbr void asm "", "!i"() +; CHECK-NEXT:            to label %[[INDIRECT:.*]] [label %indirect] +; CHECK:       [[INDIRECT]]: +; CHECK-NEXT:    br i1 [[D]], label %[[FALLTHROUGH1:.*]], label %[[FLOW2:.*]] +; CHECK:       [[FALLTHROUGH1]]: +; CHECK-NEXT:    br label %[[FLOW2]] +; CHECK:       [[INDIRECT2:.*:]] +; CHECK-NEXT:    br i1 [[E]], label %[[INDIRECT1:.*]], label %[[FLOW1:.*]] +; CHECK:       [[INDIRECT1]]: +; CHECK-NEXT:    br label %[[FLOW1]] +; CHECK:       [[NOCALLBR]]: +; CHECK-NEXT:    br i1 [[F]], label %[[NOCALLBR1:.*]], label %[[FLOW]] +; CHECK:       [[NOCALLBR1]]: +; CHECK-NEXT:    br label %[[FLOW]] +; CHECK:       [[FLOW]]: +; CHECK-NEXT:    br label %[[FLOW3]] +; CHECK:       [[FLOW1]]: +; CHECK-NEXT:    br label %[[RET]] +; CHECK:       [[FLOW2]]: +; CHECK-NEXT:    br label %[[RET]] +; CHECK:       [[RET]]: +; CHECK-NEXT:    ret void +; +  br i1 %c, label %callbr, label %nocallbr +callbr: +  callbr void asm "", "!i"() to label %fallthrough [label %indirect] +fallthrough: +  br i1 %d, label %fallthrough1, label %ret +fallthrough1: +  br label %ret +indirect: +  br i1 %e, label %indirect1, label %ret +indirect1: +  br label %ret +nocallbr: +  br i1 %f, label %nocallbr1, label %ret +nocallbr1: +  br label %ret +ret: +  ret void +} diff --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py index 11a5a57..cadf781 100644 --- a/llvm/test/lit.cfg.py +++ b/llvm/test/lit.cfg.py @@ -57,8 +57,13 @@ if config.enable_profcheck:      # so we just exclude llvm-reduce tests from this config altogether. This should      # be fine though as profcheck config tests are mostly concerned with opt.      config.excludes.append("llvm-reduce") +    # Exclude llvm-objcopy tests - not the target of this effort, and some use +    # cat in ways that conflict with how profcheck uses it. +    config.excludes.append("llvm-objcopy")      # (Issue #161235) Temporarily exclude LoopVectorize.      config.excludes.append("LoopVectorize") +    # exclude UpdateTestChecks - they fail because of inserted prof annotations +    config.excludes.append("UpdateTestChecks")  # test_source_root: The root path where tests are located.  config.test_source_root = os.path.dirname(__file__) @@ -474,7 +479,7 @@ if config.host_ldflags.find("-m32") < 0 and any(  config.available_features.add("host-byteorder-" + sys.byteorder + "-endian")  if config.target_triple:      if re.match( -        r"(aarch64_be|arc|armeb|bpfeb|lanai|m68k|mips|mips64|powerpc|powerpc64|sparc|sparcv9|s390x|s390|tce|thumbeb)-.*", +        r"(aarch64_be|arc|armeb|bpfeb|lanai|m68k|mips|mips64|powerpc|powerpc64|sparc|sparcv9|sparc64|s390x|s390|tce|thumbeb)-.*",          config.target_triple,      ):          config.available_features.add("target-byteorder-big-endian") diff --git a/llvm/test/tools/dsymutil/ARM/swiftmodule-include-from-interface.test b/llvm/test/tools/dsymutil/ARM/swiftmodule-include-from-interface.test new file mode 100644 index 0000000..00141f12 --- /dev/null +++ b/llvm/test/tools/dsymutil/ARM/swiftmodule-include-from-interface.test @@ -0,0 +1,33 @@ +# RUN: dsymutil -include-swiftmodules-from-interface -verbose -oso-prepend-path=%p -y -o %t.dSYM  %s | FileCheck %s +# +# RUN: dsymutil -include-swiftmodules-from-interface --linker parallel -verbose -oso-prepend-path=%p -y %s -o %t-parallel.dSYM | FileCheck %s +# +# To regenerate: +# echo ''>I.swift +# echo ''>B.swift +# echo 'import I'>main.swift +# xcrun swiftc -emit-module-interface-path I.swiftinterface -enable-library-evolution I.swift +# xcrun swiftc -emit-module-path B.swiftmodule B.swift -Xfrontend -no-serialize-debugging-options +# xcrun swiftc -explicit-module-build main.swift -I. -module-cache-path cache -g -Xfrontend  -no-serialize-debugging-options +# output is "B.swiftmodule" and "cache/I*.swiftmodule" +# +# CHECK-NOT: Skipping compiled textual Swift interface: {{.*}}/Inputs/Binary.swiftmodule +# CHECK-NOT: Skipping compiled textual Swift interface: {{.*}}/Inputs/FromInterface.swiftmodule + +# +--- +triple:          'arm64-apple-darwin' +objects: +  - filename:        '../Inputs/Binary.swiftmodule' +    timestamp:       0 +    type:            50 +    symbols:         [] +  - filename:        '../Inputs/FromInterface.swiftmodule' +    timestamp:       0 +    type:            50 +    symbols:         [] +  - filename:        '../Inputs/FromInterface.swiftmodule' +    timestamp:       0 +    type:            50 +    symbols:         [] +... diff --git a/llvm/test/tools/dsymutil/cmdline.test b/llvm/test/tools/dsymutil/cmdline.test index 1574fe3..0b0bce1 100644 --- a/llvm/test/tools/dsymutil/cmdline.test +++ b/llvm/test/tools/dsymutil/cmdline.test @@ -14,6 +14,7 @@ CHECK: -fat64  CHECK: -flat  CHECK: -gen-reproducer  CHECK: -help +CHECK: -include-swiftmodules-from-interface  CHECK: -keep-function-for-static  CHECK: -no-object-timestamp  CHECK: -no-odr diff --git a/llvm/tools/bugpoint/ListReducer.h b/llvm/tools/bugpoint/ListReducer.h index 06f8ddb2..ceee853 100644 --- a/llvm/tools/bugpoint/ListReducer.h +++ b/llvm/tools/bugpoint/ListReducer.h @@ -32,7 +32,7 @@ template <typename ElTy> struct ListReducer {      KeepPrefix  // The prefix alone satisfies the predicate    }; -  virtual ~ListReducer() {} +  virtual ~ListReducer() = default;    /// This virtual function should be overriden by subclasses to implement the    /// test desired.  The testcase is only required to test to see if the Kept diff --git a/llvm/tools/bugpoint/ToolRunner.h b/llvm/tools/bugpoint/ToolRunner.h index c9da9af..9ff0663 100644 --- a/llvm/tools/bugpoint/ToolRunner.h +++ b/llvm/tools/bugpoint/ToolRunner.h @@ -105,7 +105,7 @@ public:    createCustomExecutor(const char *Argv0, std::string &Message,                         const std::string &ExecCommandLine); -  virtual ~AbstractInterpreter() {} +  virtual ~AbstractInterpreter() = default;    /// compileProgram - Compile the specified program from bitcode to executable    /// code.  This does not produce any output, it is only used when debugging diff --git a/llvm/tools/dsymutil/BinaryHolder.h b/llvm/tools/dsymutil/BinaryHolder.h index cb5bd95..27d7151 100644 --- a/llvm/tools/dsymutil/BinaryHolder.h +++ b/llvm/tools/dsymutil/BinaryHolder.h @@ -110,7 +110,7 @@ public:        std::string Filename;        TimestampTy Timestamp; -      KeyTy() {} +      KeyTy() = default;        KeyTy(StringRef Filename, TimestampTy Timestamp)            : Filename(Filename.str()), Timestamp(Timestamp) {}      }; diff --git a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp index b91c27e..ee1e906 100644 --- a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp +++ b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp @@ -794,9 +794,10 @@ bool DwarfLinkerForBinary::linkImpl(          reportWarning("Could not parse binary Swift module: " +                            toString(FromInterfaceOrErr.takeError()),                        Obj->getObjectFilename()); -        // Only skip swiftmodules that could be parsed and are -        // positively identified as textual. -      } else if (*FromInterfaceOrErr) { +        // Only skip swiftmodules that could be parsed and are positively +        // identified as textual. Do so only when the option allows. +      } else if (*FromInterfaceOrErr && +                 !Options.IncludeSwiftModulesFromInterface) {          if (Options.Verbose)            outs() << "Skipping compiled textual Swift interface: "                   << Obj->getObjectFilename() << "\n"; diff --git a/llvm/tools/dsymutil/LinkUtils.h b/llvm/tools/dsymutil/LinkUtils.h index ad5515a..c333a3d 100644 --- a/llvm/tools/dsymutil/LinkUtils.h +++ b/llvm/tools/dsymutil/LinkUtils.h @@ -114,6 +114,13 @@ struct LinkOptions {    /// Whether all remarks should be kept or only remarks with valid debug    /// locations.    bool RemarksKeepAll = true; + +  /// Whether or not to copy binary swiftmodules built from textual +  /// .swiftinterface files into the dSYM bundle. These typically come only +  /// from the SDK (since textual interfaces require library evolution) and +  /// thus are a waste of space to copy into the bundle. Turn this on if the +  /// swiftmodules are different from those in the SDK. +  bool IncludeSwiftModulesFromInterface = false;    /// @}    LinkOptions() = default; diff --git a/llvm/tools/dsymutil/Options.td b/llvm/tools/dsymutil/Options.td index ad35e55..e99bc12 100644 --- a/llvm/tools/dsymutil/Options.td +++ b/llvm/tools/dsymutil/Options.td @@ -202,6 +202,14 @@ def remarks_drop_without_debug: Flag<["--", "-"], "remarks-drop-without-debug">,             "all remarks are kept.">,    Group<grp_general>; +def include_swiftmodules_from_interface: Flag<["--", "-"], "include-swiftmodules-from-interface">, +  HelpText<"Whether or not to copy binary swiftmodules built from textual " +  ".swiftinterface files into the dSYM bundle. These typically come only " +  "from the SDK (since textual interfaces require library evolution) and " +  "thus are a waste of space to copy into the bundle. Turn this on if the " +  "swiftmodules are different from those in the SDK.">, +  Group<grp_general>; +  def linker: Separate<["--", "-"], "linker">,    MetaVarName<"<DWARF linker type>">,    HelpText<"Specify the desired type of DWARF linker. Defaults to 'classic'">, diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp index 913077e..688f6aa 100644 --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -391,6 +391,9 @@ static Expected<DsymutilOptions> getOptions(opt::InputArgList &Args) {    Options.LinkOpts.RemarksKeepAll =        !Args.hasArg(OPT_remarks_drop_without_debug); +  Options.LinkOpts.IncludeSwiftModulesFromInterface = +      Args.hasArg(OPT_include_swiftmodules_from_interface); +    if (opt::Arg *BuildVariantSuffix = Args.getLastArg(OPT_build_variant_suffix))      Options.LinkOpts.BuildVariantSuffix = BuildVariantSuffix->getValue(); diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index 7fee06b..017e210 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -305,7 +305,7 @@ public:          this->CacheDir[this->CacheDir.size() - 1] != '/')        this->CacheDir += '/';    } -  ~LLIObjectCache() override {} +  ~LLIObjectCache() override = default;    void notifyObjectCompiled(const Module *M, MemoryBufferRef Obj) override {      const std::string &ModuleID = M->getModuleIdentifier(); diff --git a/llvm/tools/llvm-cov/CoverageExporter.h b/llvm/tools/llvm-cov/CoverageExporter.h index 751e55d..ba946a1 100644 --- a/llvm/tools/llvm-cov/CoverageExporter.h +++ b/llvm/tools/llvm-cov/CoverageExporter.h @@ -37,7 +37,7 @@ protected:        : Coverage(CoverageMapping), Options(Options), OS(OS) {}  public: -  virtual ~CoverageExporter(){}; +  virtual ~CoverageExporter() = default;    /// Render the CoverageMapping object.    virtual void renderRoot(const CoverageFilters &IgnoreFilters) = 0; diff --git a/llvm/tools/llvm-cov/CoverageFilters.h b/llvm/tools/llvm-cov/CoverageFilters.h index 5345b0c..3cee23a 100644 --- a/llvm/tools/llvm-cov/CoverageFilters.h +++ b/llvm/tools/llvm-cov/CoverageFilters.h @@ -28,7 +28,7 @@ struct FunctionRecord;  /// Matches specific functions that pass the requirement of this filter.  class CoverageFilter {  public: -  virtual ~CoverageFilter() {} +  virtual ~CoverageFilter() = default;    /// Return true if the function passes the requirements of this filter.    virtual bool matches(const coverage::CoverageMapping &CM, diff --git a/llvm/tools/llvm-cov/SourceCoverageView.h b/llvm/tools/llvm-cov/SourceCoverageView.h index 43fb890a..bde187e 100644 --- a/llvm/tools/llvm-cov/SourceCoverageView.h +++ b/llvm/tools/llvm-cov/SourceCoverageView.h @@ -122,7 +122,7 @@ public:    static std::unique_ptr<CoveragePrinter>    create(const CoverageViewOptions &Opts); -  virtual ~CoveragePrinter() {} +  virtual ~CoveragePrinter() = default;    /// @name File Creation Interface    /// @{ @@ -288,7 +288,7 @@ public:    create(StringRef SourceName, const MemoryBuffer &File,           const CoverageViewOptions &Options, CoverageData &&CoverageInfo); -  virtual ~SourceCoverageView() {} +  virtual ~SourceCoverageView() = default;    /// Return the source name formatted for the host OS.    std::string getSourceName() const; diff --git a/llvm/tools/llvm-diff/lib/DiffConsumer.h b/llvm/tools/llvm-diff/lib/DiffConsumer.h index 08c3afc..d4f339b 100644 --- a/llvm/tools/llvm-diff/lib/DiffConsumer.h +++ b/llvm/tools/llvm-diff/lib/DiffConsumer.h @@ -49,7 +49,7 @@ class StringRef;      virtual void logd(const DiffLogBuilder &Log) = 0;    protected: -    virtual ~Consumer() {} +    virtual ~Consumer() = default;    };    class DiffConsumer : public Consumer { diff --git a/llvm/tools/llvm-diff/lib/DifferenceEngine.h b/llvm/tools/llvm-diff/lib/DifferenceEngine.h index 436a355..b829b2c 100644 --- a/llvm/tools/llvm-diff/lib/DifferenceEngine.h +++ b/llvm/tools/llvm-diff/lib/DifferenceEngine.h @@ -54,7 +54,7 @@ namespace llvm {        virtual bool operator()(const Value *L, const Value *R) = 0;      protected: -      virtual ~Oracle() {} +      virtual ~Oracle() = default;      };      DifferenceEngine(Consumer &consumer) diff --git a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp index 2c13dd5..0e73ada 100644 --- a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp @@ -112,7 +112,7 @@ namespace {  // Use X19 as the loop counter register since it's a callee-saved register  // that's available for temporary use. -constexpr const MCPhysReg kDefaultLoopCounterReg = AArch64::X19; +constexpr MCPhysReg kDefaultLoopCounterReg = AArch64::X19;  class ExegesisAArch64Target : public ExegesisTarget {  public: diff --git a/llvm/tools/llvm-exegesis/lib/Analysis.cpp b/llvm/tools/llvm-exegesis/lib/Analysis.cpp index fb84328..f3bf9690 100644 --- a/llvm/tools/llvm-exegesis/lib/Analysis.cpp +++ b/llvm/tools/llvm-exegesis/lib/Analysis.cpp @@ -446,7 +446,7 @@ void Analysis::printClusterRawHtml(const BenchmarkClustering::ClusterId &Id,  } // namespace exegesis -static constexpr const char kHtmlHead[] = R"( +static constexpr char kHtmlHead[] = R"(  <head>  <title>llvm-exegesis Analysis Results</title>  <style> diff --git a/llvm/tools/llvm-exegesis/lib/Assembler.cpp b/llvm/tools/llvm-exegesis/lib/Assembler.cpp index fd7924d..163f141 100644 --- a/llvm/tools/llvm-exegesis/lib/Assembler.cpp +++ b/llvm/tools/llvm-exegesis/lib/Assembler.cpp @@ -44,8 +44,8 @@  namespace llvm {  namespace exegesis { -static constexpr const char ModuleID[] = "ExegesisInfoTest"; -static constexpr const char FunctionID[] = "foo"; +static constexpr char ModuleID[] = "ExegesisInfoTest"; +static constexpr char FunctionID[] = "foo";  static const Align kFunctionAlignment(4096);  // Fills the given basic block with register setup code, and returns true if diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp index ba14d56..c6164b6 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -21,9 +21,9 @@  #include "llvm/Support/Format.h"  #include "llvm/Support/raw_ostream.h" -static constexpr const char kIntegerPrefix[] = "i_0x"; -static constexpr const char kDoublePrefix[] = "f_"; -static constexpr const char kInvalidOperand[] = "INVALID"; +static constexpr char kIntegerPrefix[] = "i_0x"; +static constexpr char kDoublePrefix[] = "f_"; +static constexpr char kInvalidOperand[] = "INVALID";  namespace llvm { @@ -245,8 +245,8 @@ template <> struct SequenceElementTraits<exegesis::RegisterValue> {  };  template <> struct ScalarTraits<exegesis::RegisterValue> { -  static constexpr const unsigned kRadix = 16; -  static constexpr const bool kSigned = false; +  static constexpr unsigned kRadix = 16; +  static constexpr bool kSigned = false;    static void output(const exegesis::RegisterValue &RV, void *Ctx,                       raw_ostream &Out) { diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp index 1fd0a15..12fad7d 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.cpp @@ -155,7 +155,7 @@ private:  #ifdef LLVM_ON_UNIX          // See "Exit Status for Commands":          // https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html -        constexpr const int kSigOffset = 128; +        constexpr int kSigOffset = 128;          return make_error<SnippetSignal>(CRC.RetCode - kSigOffset);  #else          // The exit code of the process on windows is not meaningful as a @@ -877,7 +877,7 @@ Error BenchmarkRunner::getValidationCountersToRun(    return Error::success();  } -BenchmarkRunner::FunctionExecutor::~FunctionExecutor() {} +BenchmarkRunner::FunctionExecutor::~FunctionExecutor() = default;  } // namespace exegesis  } // namespace llvm diff --git a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h index e688b81..16d3c9c 100644 --- a/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h +++ b/llvm/tools/llvm-exegesis/lib/BenchmarkRunner.h @@ -73,8 +73,8 @@ public:    // Scratch space to run instructions that touch memory.    struct ScratchSpace { -    static constexpr const size_t kAlignment = 1024; -    static constexpr const size_t kSize = 1 << 20; // 1MB. +    static constexpr size_t kAlignment = 1024; +    static constexpr size_t kSize = 1 << 20; // 1MB.      ScratchSpace()          : UnalignedPtr(std::make_unique<char[]>(kSize + kAlignment)),            AlignedPtr( diff --git a/llvm/tools/llvm-exegesis/lib/Clustering.h b/llvm/tools/llvm-exegesis/lib/Clustering.h index 9d6c110..2b0f5b4 100644 --- a/llvm/tools/llvm-exegesis/lib/Clustering.h +++ b/llvm/tools/llvm-exegesis/lib/Clustering.h @@ -67,11 +67,11 @@ public:      ClusterId(size_t Id, bool IsUnstable = false)          : Id_(Id), IsUnstable_(IsUnstable) {} -    static constexpr const size_t kMaxValid = +    static constexpr size_t kMaxValid =          (std::numeric_limits<size_t>::max() >> 1) - 4; -    static constexpr const size_t kNoise = kMaxValid + 1; -    static constexpr const size_t kError = kMaxValid + 2; -    static constexpr const size_t kUndef = kMaxValid + 3; +    static constexpr size_t kNoise = kMaxValid + 1; +    static constexpr size_t kError = kMaxValid + 2; +    static constexpr size_t kUndef = kMaxValid + 3;      size_t Id_ : (std::numeric_limits<size_t>::digits - 1);      size_t IsUnstable_ : 1; diff --git a/llvm/tools/llvm-exegesis/lib/Error.h b/llvm/tools/llvm-exegesis/lib/Error.h index 9b71fe8..c899023 100644 --- a/llvm/tools/llvm-exegesis/lib/Error.h +++ b/llvm/tools/llvm-exegesis/lib/Error.h @@ -81,7 +81,7 @@ private:  struct PerfCounterNotFullyEnabled      : public ErrorInfo<PerfCounterNotFullyEnabled> {    static char ID; -  PerfCounterNotFullyEnabled() {} +  PerfCounterNotFullyEnabled() = default;    void log(raw_ostream &OS) const override; diff --git a/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp b/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp index 80f5ce4..37dcc7c 100644 --- a/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp +++ b/llvm/tools/llvm-exegesis/lib/SnippetRepetitor.cpp @@ -131,7 +131,7 @@ private:  } // namespace -SnippetRepetitor::~SnippetRepetitor() {} +SnippetRepetitor::~SnippetRepetitor() = default;  std::unique_ptr<const SnippetRepetitor>  SnippetRepetitor::Create(Benchmark::RepetitionModeE Mode, diff --git a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h index 572d108..52ee980 100644 --- a/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h +++ b/llvm/tools/llvm-exegesis/lib/SubprocessMemory.h @@ -32,8 +32,8 @@ namespace exegesis {  class SubprocessMemory {  public: -  static constexpr const size_t AuxiliaryMemoryOffset = 1; -  static constexpr const size_t AuxiliaryMemorySize = 4096; +  static constexpr size_t AuxiliaryMemoryOffset = 1; +  static constexpr size_t AuxiliaryMemorySize = 4096;    // Gets the thread ID for the calling thread.    static long getCurrentTID(); diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp index fc5f82f..2ad6c5a 100644 --- a/llvm/tools/llvm-exegesis/lib/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/Target.cpp @@ -23,7 +23,7 @@ cl::OptionCategory Options("llvm-exegesis options");  cl::OptionCategory BenchmarkOptions("llvm-exegesis benchmark options");  cl::OptionCategory AnalysisOptions("llvm-exegesis analysis options"); -ExegesisTarget::~ExegesisTarget() {} // anchor. +ExegesisTarget::~ExegesisTarget() = default; // anchor.  static ExegesisTarget *FirstTarget = nullptr; @@ -215,7 +215,7 @@ const PfmCountersInfo &ExegesisTarget::getDummyPfmCounters() const {    return PfmCountersInfo::Dummy;  } -ExegesisTarget::SavedState::~SavedState() {} // anchor. +ExegesisTarget::SavedState::~SavedState() = default; // anchor.  namespace { diff --git a/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h b/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h index ef47b7f..74a18da 100644 --- a/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h +++ b/llvm/tools/llvm-exegesis/lib/UopsBenchmarkRunner.h @@ -30,7 +30,7 @@ public:                          ExecutionMode, ValCounters) {}    ~UopsBenchmarkRunner() override; -  static constexpr const size_t kMinNumDifferentAddresses = 6; +  static constexpr size_t kMinNumDifferentAddresses = 6;  private:    Expected<std::vector<BenchmarkMeasure>> diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp index b4437f7..6dc64765 100644 --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -278,9 +278,9 @@ static Expected<std::vector<CodeTemplate>> generateLEATemplatesCommon(    assert(X86II::getMemoryOperandNo(Instr.Description.TSFlags) == 1 &&           "invalid LEA"); -  constexpr const int kDestOp = 0; -  constexpr const int kBaseOp = 1; -  constexpr const int kIndexOp = 3; +  constexpr int kDestOp = 0; +  constexpr int kBaseOp = 1; +  constexpr int kIndexOp = 3;    auto PossibleDestRegs =        Instr.Operands[kDestOp].getRegisterAliasing().sourceBits();    remove(PossibleDestRegs, ForbiddenRegisters); @@ -548,7 +548,7 @@ private:    void initStack(unsigned Bytes); -  static constexpr const unsigned kF80Bytes = 10; // 80 bits. +  static constexpr unsigned kF80Bytes = 10; // 80 bits.    APInt Constant_;    std::vector<MCInst> Instructions; @@ -864,7 +864,7 @@ const MCPhysReg ExegesisX86Target::kUnavailableRegistersSSE[12] = {  // We're using one of R8-R15 because these registers are never hardcoded in  // instructions (e.g. MOVS writes to EDI, ESI, EDX), so they have less  // conflicts. -constexpr const MCPhysReg kDefaultLoopCounterReg = X86::R8; +constexpr MCPhysReg kDefaultLoopCounterReg = X86::R8;  } // namespace @@ -1110,9 +1110,9 @@ std::vector<MCInst> ExegesisX86Target::setRegTo(const MCSubtargetInfo &STI,  #ifdef __linux__  #ifdef __arm__ -static constexpr const uintptr_t VAddressSpaceCeiling = 0xC0000000; +static constexpr uintptr_t VAddressSpaceCeiling = 0xC0000000;  #else -static constexpr const uintptr_t VAddressSpaceCeiling = 0x0000800000000000; +static constexpr uintptr_t VAddressSpaceCeiling = 0x0000800000000000;  #endif  void generateRoundToNearestPage(unsigned int Register, diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp index 79216e8..88d6daf 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -776,6 +776,7 @@ createSharedMemoryManager(SimpleRemoteEPC &SREPC) {        SlabSize, SREPC, SAs);  } +#if LLVM_ON_UNIX && LLVM_ENABLE_THREADS  static void setupEPCRemoteMemoryManager(SimpleRemoteEPC::Setup &S) {    switch (UseMemMgr) {    case MemMgr::Default: @@ -789,6 +790,7 @@ static void setupEPCRemoteMemoryManager(SimpleRemoteEPC::Setup &S) {      break;    }  } +#endif  static Expected<MaterializationUnit::Interface>  getTestObjectFileInterface(Session &S, MemoryBufferRef O) { diff --git a/llvm/tools/llvm-libtool-darwin/DependencyInfo.h b/llvm/tools/llvm-libtool-darwin/DependencyInfo.h index 784ec3f..80bad8f 100644 --- a/llvm/tools/llvm-libtool-darwin/DependencyInfo.h +++ b/llvm/tools/llvm-libtool-darwin/DependencyInfo.h @@ -18,7 +18,7 @@ public:    explicit DependencyInfo(std::string DependencyInfoPath)        : DependencyInfoPath(DependencyInfoPath) {} -  virtual ~DependencyInfo(){}; +  virtual ~DependencyInfo() = default;    virtual void addMissingInput(llvm::StringRef Path) {      NotFounds.insert(Path.str()); diff --git a/llvm/tools/llvm-mca/CodeRegionGenerator.cpp b/llvm/tools/llvm-mca/CodeRegionGenerator.cpp index f7f929e..1469071 100644 --- a/llvm/tools/llvm-mca/CodeRegionGenerator.cpp +++ b/llvm/tools/llvm-mca/CodeRegionGenerator.cpp @@ -26,7 +26,7 @@ namespace llvm {  namespace mca {  // This virtual dtor serves as the anchor for the CodeRegionGenerator class. -CodeRegionGenerator::~CodeRegionGenerator() {} +CodeRegionGenerator::~CodeRegionGenerator() = default;  Expected<const CodeRegions &> AsmCodeRegionGenerator::parseCodeRegions(      const std::unique_ptr<MCInstPrinter> &IP, bool SkipFailures) { diff --git a/llvm/tools/llvm-mca/CodeRegionGenerator.h b/llvm/tools/llvm-mca/CodeRegionGenerator.h index a48c67a..c30f67a 100644 --- a/llvm/tools/llvm-mca/CodeRegionGenerator.h +++ b/llvm/tools/llvm-mca/CodeRegionGenerator.h @@ -151,7 +151,7 @@ protected:                     bool SkipFailures) = 0;  public: -  CodeRegionGenerator() {} +  CodeRegionGenerator() = default;    virtual ~CodeRegionGenerator();  }; diff --git a/llvm/tools/llvm-objdump/SourcePrinter.h b/llvm/tools/llvm-objdump/SourcePrinter.h index 5c131a0..19acc87 100644 --- a/llvm/tools/llvm-objdump/SourcePrinter.h +++ b/llvm/tools/llvm-objdump/SourcePrinter.h @@ -34,7 +34,7 @@ public:    LiveElement(const char *Name, DWARFUnit *Unit, const DWARFDie FuncDie)        : Name(Name), Unit(Unit), FuncDie(FuncDie) {} -  virtual ~LiveElement() {}; +  virtual ~LiveElement() = default;    const char *getName() const { return Name; }    virtual bool liveAtAddress(object::SectionedAddress Addr) const = 0; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 3525be9..bac8589 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -84,7 +84,7 @@ protected:  public:    Dumper(const object::ObjectFile &O); -  virtual ~Dumper() {} +  virtual ~Dumper() = default;    void reportUniqueWarning(Error Err);    void reportUniqueWarning(const Twine &Msg); diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp index b2362ec..d836d98 100644 --- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp @@ -68,7 +68,7 @@ DumpOutputStyle::DumpOutputStyle(InputFile &File)      RefTracker.reset(new TypeReferenceTracker(File));  } -DumpOutputStyle::~DumpOutputStyle() {} +DumpOutputStyle::~DumpOutputStyle() = default;  PDBFile &DumpOutputStyle::getPdb() { return File.pdb(); }  object::COFFObjectFile &DumpOutputStyle::getObj() { return File.obj(); } diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.h b/llvm/tools/llvm-pdbutil/DumpOutputStyle.h index 6714a6a..ea4a47f 100644 --- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.h +++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.h @@ -29,7 +29,7 @@ class TypeReferenceTracker;  struct StatCollection {    struct Stat { -    Stat() {} +    Stat() = default;      Stat(uint32_t Count, uint32_t Size) : Count(Count), Size(Size) {}      uint32_t Count = 0;      uint32_t Size = 0; diff --git a/llvm/tools/llvm-pdbutil/OutputStyle.h b/llvm/tools/llvm-pdbutil/OutputStyle.h index 8cc9016..a09fb82 100644 --- a/llvm/tools/llvm-pdbutil/OutputStyle.h +++ b/llvm/tools/llvm-pdbutil/OutputStyle.h @@ -17,7 +17,7 @@ namespace pdb {  class OutputStyle {  public: -  virtual ~OutputStyle() {} +  virtual ~OutputStyle() = default;    virtual Error dump() = 0;  }; diff --git a/llvm/tools/llvm-pdbutil/StreamUtil.h b/llvm/tools/llvm-pdbutil/StreamUtil.h index 9d6030c..6b8c13f 100644 --- a/llvm/tools/llvm-pdbutil/StreamUtil.h +++ b/llvm/tools/llvm-pdbutil/StreamUtil.h @@ -35,7 +35,7 @@ enum class StreamPurpose {  struct StreamInfo {  public: -  StreamInfo() {} +  StreamInfo() = default;    uint32_t getModuleIndex() const { return *ModuleIndex; }    StreamPurpose getPurpose() const { return Purpose; } diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp index 94728ce..96db6a7 100644 --- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp +++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp @@ -187,7 +187,7 @@ ProfiledBinary::ProfiledBinary(const StringRef ExeBinPath,    load();  } -ProfiledBinary::~ProfiledBinary() {} +ProfiledBinary::~ProfiledBinary() = default;  void ProfiledBinary::warnNoFuncEntry() {    uint64_t NoFuncEntryNum = 0; diff --git a/llvm/tools/llvm-rc/ResourceScriptStmt.h b/llvm/tools/llvm-rc/ResourceScriptStmt.h index a81e384f..84da9be 100644 --- a/llvm/tools/llvm-rc/ResourceScriptStmt.h +++ b/llvm/tools/llvm-rc/ResourceScriptStmt.h @@ -242,9 +242,9 @@ public:    virtual raw_ostream &log(raw_ostream &OS) const {      return OS << "Base statement\n";    }; -  RCResource() {} +  RCResource() = default;    RCResource(uint16_t Flags) : MemoryFlags(Flags) {} -  virtual ~RCResource() {} +  virtual ~RCResource() = default;    virtual Error visit(Visitor *) const {      llvm_unreachable("This is unable to call methods from Visitor base"); @@ -290,7 +290,7 @@ class OptionalStmtList : public OptionalStmt {    std::vector<std::unique_ptr<OptionalStmt>> Statements;  public: -  OptionalStmtList() {} +  OptionalStmtList() = default;    raw_ostream &log(raw_ostream &OS) const override;    void addStmt(std::unique_ptr<OptionalStmt> Stmt) { @@ -510,7 +510,7 @@ public:    virtual raw_ostream &log(raw_ostream &OS) const {      return OS << "Base menu definition\n";    } -  virtual ~MenuDefinition() {} +  virtual ~MenuDefinition() = default;    virtual uint16_t getResFlags() const { return 0; }    virtual MenuDefKind getKind() const { return MkBase; } @@ -818,7 +818,7 @@ public:    enum StmtKind { StBase = 0, StBlock = 1, StValue = 2 };    virtual raw_ostream &log(raw_ostream &OS) const { return OS << "VI stmt\n"; } -  virtual ~VersionInfoStmt() {} +  virtual ~VersionInfoStmt() = default;    virtual StmtKind getKind() const { return StBase; }    static bool classof(const VersionInfoStmt *S) { diff --git a/llvm/tools/llvm-rc/ResourceVisitor.h b/llvm/tools/llvm-rc/ResourceVisitor.h index a121a0a..1815c6b 100644 --- a/llvm/tools/llvm-rc/ResourceVisitor.h +++ b/llvm/tools/llvm-rc/ResourceVisitor.h @@ -55,7 +55,7 @@ public:    virtual Error visitVersionStmt(const VersionStmt *) = 0;    virtual Error visitMenuStmt(const MenuStmt *) = 0; -  virtual ~Visitor() {} +  virtual ~Visitor() = default;  };  } // namespace rc diff --git a/llvm/tools/llvm-readobj/ObjDumper.cpp b/llvm/tools/llvm-readobj/ObjDumper.cpp index 0b59dd4..20e027a 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.cpp +++ b/llvm/tools/llvm-readobj/ObjDumper.cpp @@ -41,7 +41,7 @@ ObjDumper::ObjDumper(ScopedPrinter &Writer, StringRef ObjName) : W(Writer) {    };  } -ObjDumper::~ObjDumper() {} +ObjDumper::~ObjDumper() = default;  void ObjDumper::reportUniqueWarning(Error Err) const {    reportUniqueWarning(toString(std::move(Err))); diff --git a/llvm/tools/llvm-readtapi/DiffEngine.h b/llvm/tools/llvm-readtapi/DiffEngine.h index 7ab57d4..b350ceef 100644 --- a/llvm/tools/llvm-readtapi/DiffEngine.h +++ b/llvm/tools/llvm-readtapi/DiffEngine.h @@ -39,7 +39,7 @@ enum DiffAttrKind {  class AttributeDiff {  public:    AttributeDiff(DiffAttrKind Kind) : Kind(Kind){}; -  virtual ~AttributeDiff(){}; +  virtual ~AttributeDiff() = default;    DiffAttrKind getKind() const { return Kind; }  private: diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp index fbe96bb..99cc38b 100644 --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -10118,7 +10118,7 @@ TEST(APFloatTest, Float4E2M1FNToFloat) {  }  TEST(APFloatTest, AddOrSubtractSignificand) { -  typedef detail::IEEEFloatUnitTestHelper Helper; +  using Helper = detail::IEEEFloatUnitTestHelper;    // Test cases are all combinations of:    // {equal exponents, LHS larger exponent, RHS larger exponent}    // {equal significands, LHS larger significand, RHS larger significand} diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp index 12ba004..e13523b 100644 --- a/llvm/unittests/ADT/BitVectorTest.cpp +++ b/llvm/unittests/ADT/BitVectorTest.cpp @@ -21,7 +21,7 @@ template <typename T>  class BitVectorTest : public ::testing::Test { };  // Test both BitVector and SmallBitVector with the same suite of tests. -typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes; +using BitVectorTestTypes = ::testing::Types<BitVector, SmallBitVector>;  TYPED_TEST_SUITE(BitVectorTest, BitVectorTestTypes, );  TYPED_TEST(BitVectorTest, TrivialOperation) { @@ -857,7 +857,7 @@ TYPED_TEST(BitVectorTest, BinOps) {    EXPECT_FALSE(B.anyCommon(A));  } -typedef std::vector<std::pair<int, int>> RangeList; +using RangeList = std::vector<std::pair<int, int>>;  template <typename VecType>  static inline VecType createBitVector(uint32_t Size, diff --git a/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp b/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp index a737390..571e4d2 100644 --- a/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp +++ b/llvm/unittests/ADT/BreadthFirstIteratorTest.cpp @@ -21,7 +21,7 @@ using namespace llvm;  namespace llvm {  TEST(BreadthFristIteratorTest, Basic) { -  typedef bf_iterator<Graph<4>> BFIter; +  using BFIter = bf_iterator<Graph<4>>;    Graph<4> G;    G.AddEdge(0, 1); @@ -46,7 +46,7 @@ TEST(BreadthFristIteratorTest, Basic) {  }  TEST(BreadthFristIteratorTest, Cycle) { -  typedef bf_iterator<Graph<4>> BFIter; +  using BFIter = bf_iterator<Graph<4>>;    Graph<4> G;    G.AddEdge(0, 1); diff --git a/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp b/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp index f5439478..918a2e6 100644 --- a/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp +++ b/llvm/unittests/ADT/DAGDeltaAlgorithmTest.cpp @@ -15,7 +15,7 @@ using namespace llvm;  namespace { -typedef DAGDeltaAlgorithm::edge_ty edge_ty; +using edge_ty = DAGDeltaAlgorithm::edge_ty;  class FixedDAGDeltaAlgorithm : public DAGDeltaAlgorithm {    changeset_ty FailingSet; diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp index aceb4f3..273ee09 100644 --- a/llvm/unittests/ADT/DenseMapTest.cpp +++ b/llvm/unittests/ADT/DenseMapTest.cpp @@ -129,18 +129,17 @@ typename T::mapped_type *const DenseMapTest<T>::dummy_value_ptr = nullptr;  // Register these types for testing.  // clang-format off -typedef ::testing::Types<DenseMap<uint32_t, uint32_t>, -                         DenseMap<uint32_t *, uint32_t *>, -                         DenseMap<CtorTester, CtorTester, CtorTesterMapInfo>, -                         DenseMap<EnumClass, uint32_t>, -                         DenseMap<std::optional<uint32_t>, uint32_t>, -                         SmallDenseMap<uint32_t, uint32_t>, -                         SmallDenseMap<uint32_t *, uint32_t *>, -                         SmallDenseMap<CtorTester, CtorTester, 4, -                                       CtorTesterMapInfo>, -                         SmallDenseMap<EnumClass, uint32_t>, -                         SmallDenseMap<std::optional<uint32_t>, uint32_t> -                         > DenseMapTestTypes; +using DenseMapTestTypes = ::testing::Types< +    DenseMap<uint32_t, uint32_t>, +    DenseMap<uint32_t *, uint32_t *>, +    DenseMap<CtorTester, CtorTester, CtorTesterMapInfo>, +    DenseMap<EnumClass, uint32_t>, +    DenseMap<std::optional<uint32_t>, uint32_t>, +    SmallDenseMap<uint32_t, uint32_t>, +    SmallDenseMap<uint32_t *, uint32_t *>, +    SmallDenseMap<CtorTester, CtorTester, 4, CtorTesterMapInfo>, +    SmallDenseMap<EnumClass, uint32_t>, +    SmallDenseMap<std::optional<uint32_t>, uint32_t>>;  // clang-format on  TYPED_TEST_SUITE(DenseMapTest, DenseMapTestTypes, ); diff --git a/llvm/unittests/ADT/DenseSetTest.cpp b/llvm/unittests/ADT/DenseSetTest.cpp index a24f99b..a2a062b 100644 --- a/llvm/unittests/ADT/DenseSetTest.cpp +++ b/llvm/unittests/ADT/DenseSetTest.cpp @@ -96,13 +96,13 @@ private:  };  // Register these types for testing. -typedef ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>, -                         const DenseSet<unsigned, TestDenseSetInfo>, -                         SmallDenseSet<unsigned, 1, TestDenseSetInfo>, -                         SmallDenseSet<unsigned, 4, TestDenseSetInfo>, -                         const SmallDenseSet<unsigned, 4, TestDenseSetInfo>, -                         SmallDenseSet<unsigned, 64, TestDenseSetInfo>> -    DenseSetTestTypes; +using DenseSetTestTypes = +    ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>, +                     const DenseSet<unsigned, TestDenseSetInfo>, +                     SmallDenseSet<unsigned, 1, TestDenseSetInfo>, +                     SmallDenseSet<unsigned, 4, TestDenseSetInfo>, +                     const SmallDenseSet<unsigned, 4, TestDenseSetInfo>, +                     SmallDenseSet<unsigned, 64, TestDenseSetInfo>>;  TYPED_TEST_SUITE(DenseSetTest, DenseSetTestTypes, );  TYPED_TEST(DenseSetTest, Constructor) { diff --git a/llvm/unittests/ADT/DepthFirstIteratorTest.cpp b/llvm/unittests/ADT/DepthFirstIteratorTest.cpp index f792878..00312ca 100644 --- a/llvm/unittests/ADT/DepthFirstIteratorTest.cpp +++ b/llvm/unittests/ADT/DepthFirstIteratorTest.cpp @@ -21,7 +21,7 @@ using namespace llvm;  namespace llvm {  template <typename T> struct CountedSet { -  typedef typename SmallPtrSet<T, 4>::iterator iterator; +  using iterator = typename SmallPtrSet<T, 4>::iterator;    SmallPtrSet<T, 4> S;    int InsertVisited = 0; @@ -44,8 +44,8 @@ public:  };  TEST(DepthFirstIteratorTest, ActuallyUpdateIterator) { -  typedef CountedSet<Graph<3>::NodeType *> StorageT; -  typedef df_iterator<Graph<3>, StorageT, true> DFIter; +  using StorageT = CountedSet<Graph<3>::NodeType *>; +  using DFIter = df_iterator<Graph<3>, StorageT, true>;    Graph<3> G;    G.AddEdge(0, 1); diff --git a/llvm/unittests/ADT/IListBaseTest.cpp b/llvm/unittests/ADT/IListBaseTest.cpp index bd91568..eeed488 100644 --- a/llvm/unittests/ADT/IListBaseTest.cpp +++ b/llvm/unittests/ADT/IListBaseTest.cpp @@ -19,13 +19,14 @@ template <typename T> class IListBaseTest : public ::testing::Test {};  class Parent;  // Test variants with the same test. -typedef ::testing::Types<ilist_base<false, void>, ilist_base<true, void>, ilist_base<false, Parent*>, ilist_base<true, Parent*>> -    IListBaseTestTypes; +using IListBaseTestTypes = +    ::testing::Types<ilist_base<false, void>, ilist_base<true, void>, +                     ilist_base<false, Parent *>, ilist_base<true, Parent *>>;  TYPED_TEST_SUITE(IListBaseTest, IListBaseTestTypes, );  TYPED_TEST(IListBaseTest, insertBeforeImpl) { -  typedef TypeParam list_base_type; -  typedef typename list_base_type::node_base_type node_base_type; +  using list_base_type = TypeParam; +  using node_base_type = typename list_base_type::node_base_type;    node_base_type S, A, B; @@ -51,8 +52,8 @@ TYPED_TEST(IListBaseTest, insertBeforeImpl) {  }  TYPED_TEST(IListBaseTest, removeImpl) { -  typedef TypeParam list_base_type; -  typedef typename list_base_type::node_base_type node_base_type; +  using list_base_type = TypeParam; +  using node_base_type = typename list_base_type::node_base_type;    node_base_type S, A, B; @@ -80,8 +81,8 @@ TYPED_TEST(IListBaseTest, removeImpl) {  }  TYPED_TEST(IListBaseTest, removeRangeImpl) { -  typedef TypeParam list_base_type; -  typedef typename list_base_type::node_base_type node_base_type; +  using list_base_type = TypeParam; +  using node_base_type = typename list_base_type::node_base_type;    node_base_type S, A, B, C, D; @@ -106,8 +107,8 @@ TYPED_TEST(IListBaseTest, removeRangeImpl) {  }  TYPED_TEST(IListBaseTest, removeRangeImplAllButSentinel) { -  typedef TypeParam list_base_type; -  typedef typename list_base_type::node_base_type node_base_type; +  using list_base_type = TypeParam; +  using node_base_type = typename list_base_type::node_base_type;    node_base_type S, A, B; @@ -126,8 +127,8 @@ TYPED_TEST(IListBaseTest, removeRangeImplAllButSentinel) {  }  TYPED_TEST(IListBaseTest, transferBeforeImpl) { -  typedef TypeParam list_base_type; -  typedef typename list_base_type::node_base_type node_base_type; +  using list_base_type = TypeParam; +  using node_base_type = typename list_base_type::node_base_type;    node_base_type S1, S2, A, B, C, D, E; diff --git a/llvm/unittests/ADT/IListIteratorTest.cpp b/llvm/unittests/ADT/IListIteratorTest.cpp index 4e5b847b..54a42582 100644 --- a/llvm/unittests/ADT/IListIteratorTest.cpp +++ b/llvm/unittests/ADT/IListIteratorTest.cpp @@ -141,10 +141,10 @@ TEST(IListIteratorTest, ReverseConstructor) {    L.insert(L.end(), B);    // Save typing. -  typedef simple_ilist<Node>::iterator iterator; -  typedef simple_ilist<Node>::reverse_iterator reverse_iterator; -  typedef simple_ilist<Node>::const_iterator const_iterator; -  typedef simple_ilist<Node>::const_reverse_iterator const_reverse_iterator; +  using iterator = simple_ilist<Node>::iterator; +  using reverse_iterator = simple_ilist<Node>::reverse_iterator; +  using const_iterator = simple_ilist<Node>::const_iterator; +  using const_reverse_iterator = simple_ilist<Node>::const_reverse_iterator;    // Check conversion values.    EXPECT_EQ(L.begin(), iterator(L.rend())); diff --git a/llvm/unittests/ADT/IListNodeBaseTest.cpp b/llvm/unittests/ADT/IListNodeBaseTest.cpp index ef90c71..393f83a 100644 --- a/llvm/unittests/ADT/IListNodeBaseTest.cpp +++ b/llvm/unittests/ADT/IListNodeBaseTest.cpp @@ -17,10 +17,10 @@ namespace {  class Parent {}; -typedef ilist_node_base<false, void> RawNode; -typedef ilist_node_base<true, void> TrackingNode; -typedef ilist_node_base<false, Parent> ParentNode; -typedef ilist_node_base<true, Parent> ParentTrackingNode; +using RawNode = ilist_node_base<false, void>; +using TrackingNode = ilist_node_base<true, void>; +using ParentNode = ilist_node_base<false, Parent>; +using ParentTrackingNode = ilist_node_base<true, Parent>;  TEST(IListNodeBaseTest, DefaultConstructor) {    RawNode A; diff --git a/llvm/unittests/ADT/IListSentinelTest.cpp b/llvm/unittests/ADT/IListSentinelTest.cpp index 1f4a831..709a1a4 100644 --- a/llvm/unittests/ADT/IListSentinelTest.cpp +++ b/llvm/unittests/ADT/IListSentinelTest.cpp @@ -14,18 +14,17 @@ using namespace llvm;  namespace {  template <class T, class... Options> struct PickSentinel { -  typedef ilist_sentinel< -      typename ilist_detail::compute_node_options<T, Options...>::type> -      type; +  using type = ilist_sentinel< +      typename ilist_detail::compute_node_options<T, Options...>::type>;  };  class Node : public ilist_node<Node> {};  class TrackingNode : public ilist_node<Node, ilist_sentinel_tracking<true>> {}; -typedef PickSentinel<Node>::type Sentinel; -typedef PickSentinel<Node, ilist_sentinel_tracking<true>>::type -    TrackingSentinel; -typedef PickSentinel<Node, ilist_sentinel_tracking<false>>::type -    NoTrackingSentinel; +using Sentinel = PickSentinel<Node>::type; +using TrackingSentinel = +    PickSentinel<Node, ilist_sentinel_tracking<true>>::type; +using NoTrackingSentinel = +    PickSentinel<Node, ilist_sentinel_tracking<false>>::type;  struct LocalAccess : ilist_detail::NodeAccess {    using NodeAccess::getPrev; diff --git a/llvm/unittests/ADT/IntervalMapTest.cpp b/llvm/unittests/ADT/IntervalMapTest.cpp index 99a93ab..38f397f 100644 --- a/llvm/unittests/ADT/IntervalMapTest.cpp +++ b/llvm/unittests/ADT/IntervalMapTest.cpp @@ -14,9 +14,9 @@ using namespace llvm;  namespace { -typedef IntervalMap<unsigned, unsigned, 4> UUMap; -typedef IntervalMap<unsigned, unsigned, 4, -                    IntervalMapHalfOpenInfo<unsigned>> UUHalfOpenMap; +using UUMap = IntervalMap<unsigned, unsigned, 4>; +using UUHalfOpenMap = +    IntervalMap<unsigned, unsigned, 4, IntervalMapHalfOpenInfo<unsigned>>;  // Empty map tests  TEST(IntervalMapTest, EmptyMap) { @@ -713,7 +713,7 @@ TEST(IntervalMapTest, OverlapsHalfOpen) {  }  TEST(IntervalMapOverlapsTest, SmallMaps) { -  typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps; +  using UUOverlaps = IntervalMapOverlaps<UUMap, UUMap>;    UUMap::Allocator allocator;    UUMap mapA(allocator);    UUMap mapB(allocator); @@ -757,7 +757,7 @@ TEST(IntervalMapOverlapsTest, SmallMaps) {  }  TEST(IntervalMapOverlapsTest, BigMaps) { -  typedef IntervalMapOverlaps<UUMap,UUMap> UUOverlaps; +  using UUOverlaps = IntervalMapOverlaps<UUMap, UUMap>;    UUMap::Allocator allocator;    UUMap mapA(allocator);    UUMap mapB(allocator); diff --git a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp index f4f2083..6da4227 100644 --- a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp +++ b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp @@ -25,9 +25,9 @@ struct SimpleRefCounted : Base<SimpleRefCounted<Base>> {  template <typename T> struct IntrusiveRefCntPtrTest : testing::Test {}; -typedef ::testing::Types<SimpleRefCounted<RefCountedBase>, -                         SimpleRefCounted<ThreadSafeRefCountedBase>> -    IntrusiveRefCntTypes; +using IntrusiveRefCntTypes = +    ::testing::Types<SimpleRefCounted<RefCountedBase>, +                     SimpleRefCounted<ThreadSafeRefCountedBase>>;  TYPED_TEST_SUITE(IntrusiveRefCntPtrTest, IntrusiveRefCntTypes, );  TYPED_TEST(IntrusiveRefCntPtrTest, RefCountedBaseCopyDoesNotLeak) { diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp index b5d63ef..9dd8c1a 100644 --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/unittests/ADT/IteratorTest.cpp @@ -177,8 +177,8 @@ TEST(PointeeIteratorTest, Basic) {    V.push_back(&arr[2]);    V.push_back(&arr[3]); -  typedef pointee_iterator<SmallVectorImpl<int *>::const_iterator> -      test_iterator; +  using test_iterator = +      pointee_iterator<SmallVectorImpl<int *>::const_iterator>;    test_iterator Begin, End;    Begin = V.begin(); @@ -218,9 +218,8 @@ TEST(PointeeIteratorTest, SmartPointer) {    V.push_back(std::make_unique<int>(3));    V.push_back(std::make_unique<int>(4)); -  typedef pointee_iterator< -      SmallVectorImpl<std::unique_ptr<int>>::const_iterator> -      test_iterator; +  using test_iterator = +      pointee_iterator<SmallVectorImpl<std::unique_ptr<int>>::const_iterator>;    test_iterator Begin, End;    Begin = V.begin(); diff --git a/llvm/unittests/ADT/PointerSumTypeTest.cpp b/llvm/unittests/ADT/PointerSumTypeTest.cpp index fbf59f3..11e657a 100644 --- a/llvm/unittests/ADT/PointerSumTypeTest.cpp +++ b/llvm/unittests/ADT/PointerSumTypeTest.cpp @@ -17,10 +17,9 @@ struct PointerSumTypeTest : public testing::Test {    float f;    int i1, i2; -  typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>, -                         PointerSumTypeMember<Int1, int *>, -                         PointerSumTypeMember<Int2, int *>> -      SumType; +  using SumType = PointerSumType<Kinds, PointerSumTypeMember<Float, float *>, +                                 PointerSumTypeMember<Int1, int *>, +                                 PointerSumTypeMember<Int2, int *>>;    SumType a, b, c, n;    PointerSumTypeTest() diff --git a/llvm/unittests/ADT/PointerUnionTest.cpp b/llvm/unittests/ADT/PointerUnionTest.cpp index acddb78..d8ac3ae 100644 --- a/llvm/unittests/ADT/PointerUnionTest.cpp +++ b/llvm/unittests/ADT/PointerUnionTest.cpp @@ -12,9 +12,9 @@ using namespace llvm;  namespace { -typedef PointerUnion<int *, float *> PU; -typedef PointerUnion<int *, float *, long long *> PU3; -typedef PointerUnion<int *, float *, long long *, double *> PU4; +using PU = PointerUnion<int *, float *>; +using PU3 = PointerUnion<int *, float *, long long *>; +using PU4 = PointerUnion<int *, float *, long long *, double *>;  struct PointerUnionTest : public testing::Test {    float f; @@ -116,9 +116,9 @@ TEST_F(PointerUnionTest, Get) {  template<int I> struct alignas(8) Aligned {}; -typedef PointerUnion<Aligned<0> *, Aligned<1> *, Aligned<2> *, Aligned<3> *, -                     Aligned<4> *, Aligned<5> *, Aligned<6> *, Aligned<7> *> -    PU8; +using PU8 = +    PointerUnion<Aligned<0> *, Aligned<1> *, Aligned<2> *, Aligned<3> *, +                 Aligned<4> *, Aligned<5> *, Aligned<6> *, Aligned<7> *>;  TEST_F(PointerUnionTest, ManyElements) {    Aligned<0> a0; diff --git a/llvm/unittests/ADT/PostOrderIteratorTest.cpp b/llvm/unittests/ADT/PostOrderIteratorTest.cpp index 838481f..e875dd6 100644 --- a/llvm/unittests/ADT/PostOrderIteratorTest.cpp +++ b/llvm/unittests/ADT/PostOrderIteratorTest.cpp @@ -23,7 +23,7 @@ namespace {  // Whether we're able to compile  TEST(PostOrderIteratorTest, Compiles) { -  typedef SmallPtrSet<void *, 4> ExtSetTy; +  using ExtSetTy = SmallPtrSet<void *, 4>;    // Tests that template specializations are kept up to date    void *Null = nullptr; diff --git a/llvm/unittests/ADT/PriorityWorklistTest.cpp b/llvm/unittests/ADT/PriorityWorklistTest.cpp index f12d32a..08a4773 100644 --- a/llvm/unittests/ADT/PriorityWorklistTest.cpp +++ b/llvm/unittests/ADT/PriorityWorklistTest.cpp @@ -20,8 +20,8 @@ namespace {  using namespace llvm;  template <typename T> class PriorityWorklistTest : public ::testing::Test {}; -typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>> -    TestTypes; +using TestTypes = +    ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>>;  TYPED_TEST_SUITE(PriorityWorklistTest, TestTypes, );  TYPED_TEST(PriorityWorklistTest, Basic) { diff --git a/llvm/unittests/ADT/RangeAdapterTest.cpp b/llvm/unittests/ADT/RangeAdapterTest.cpp index c1a8a98..6849ccbc 100644 --- a/llvm/unittests/ADT/RangeAdapterTest.cpp +++ b/llvm/unittests/ADT/RangeAdapterTest.cpp @@ -24,8 +24,8 @@ class ReverseOnlyVector {  public:    ReverseOnlyVector(std::initializer_list<int> list) : Vec(list) {} -  typedef std::vector<int>::reverse_iterator reverse_iterator; -  typedef std::vector<int>::const_reverse_iterator const_reverse_iterator; +  using reverse_iterator = std::vector<int>::reverse_iterator; +  using const_reverse_iterator = std::vector<int>::const_reverse_iterator;    reverse_iterator rbegin() { return Vec.rbegin(); }    reverse_iterator rend() { return Vec.rend(); }    const_reverse_iterator rbegin() const { return Vec.rbegin(); } @@ -41,11 +41,11 @@ class BidirectionalVector {  public:    BidirectionalVector(std::initializer_list<int> list) : Vec(list) {} -  typedef std::vector<int>::iterator iterator; +  using iterator = std::vector<int>::iterator;    iterator begin() const;    iterator end() const; -  typedef std::vector<int>::reverse_iterator reverse_iterator; +  using reverse_iterator = std::vector<int>::reverse_iterator;    reverse_iterator rbegin() const { return Vec.rbegin(); }    reverse_iterator rend() const { return Vec.rend(); }  }; @@ -58,15 +58,15 @@ class BidirectionalVectorConsts {  public:    BidirectionalVectorConsts(std::initializer_list<int> list) : Vec(list) {} -  typedef std::vector<int>::iterator iterator; -  typedef std::vector<int>::const_iterator const_iterator; +  using iterator = std::vector<int>::iterator; +  using const_iterator = std::vector<int>::const_iterator;    iterator begin();    iterator end();    const_iterator begin() const;    const_iterator end() const; -  typedef std::vector<int>::reverse_iterator reverse_iterator; -  typedef std::vector<int>::const_reverse_iterator const_reverse_iterator; +  using reverse_iterator = std::vector<int>::reverse_iterator; +  using const_reverse_iterator = std::vector<int>::const_reverse_iterator;    reverse_iterator rbegin() { return Vec.rbegin(); }    reverse_iterator rend() { return Vec.rend(); }    const_reverse_iterator rbegin() const { return Vec.rbegin(); } @@ -80,7 +80,7 @@ class CustomIteratorVector {  public:    CustomIteratorVector(std::initializer_list<int> list) : V(list) {} -  typedef std::vector<int>::iterator iterator; +  using iterator = std::vector<int>::iterator;    class reverse_iterator {      std::vector<int>::iterator I; @@ -126,8 +126,8 @@ template <typename R> void TestRev(const R &r) {  // Test fixture  template <typename T> class RangeAdapterLValueTest : public ::testing::Test {}; -typedef ::testing::Types<std::vector<int>, std::list<int>, int[4]> -    RangeAdapterLValueTestTypes; +using RangeAdapterLValueTestTypes = +    ::testing::Types<std::vector<int>, std::list<int>, int[4]>;  TYPED_TEST_SUITE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes, );  TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) { @@ -140,10 +140,10 @@ TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) {  template <typename T> struct RangeAdapterRValueTest : testing::Test {}; -typedef ::testing::Types<std::vector<int>, std::list<int>, CustomIteratorVector, -                         ReverseOnlyVector, BidirectionalVector, -                         BidirectionalVectorConsts> -    RangeAdapterRValueTestTypes; +using RangeAdapterRValueTestTypes = +    ::testing::Types<std::vector<int>, std::list<int>, CustomIteratorVector, +                     ReverseOnlyVector, BidirectionalVector, +                     BidirectionalVectorConsts>;  TYPED_TEST_SUITE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes, );  TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) { diff --git a/llvm/unittests/ADT/SCCIteratorTest.cpp b/llvm/unittests/ADT/SCCIteratorTest.cpp index 4835095..5f08829 100644 --- a/llvm/unittests/ADT/SCCIteratorTest.cpp +++ b/llvm/unittests/ADT/SCCIteratorTest.cpp @@ -21,7 +21,7 @@ TEST(SCCIteratorTest, AllSmallGraphs) {    // create graphs for which every node has a self-edge.  #define NUM_NODES 4  #define NUM_GRAPHS (NUM_NODES * (NUM_NODES - 1)) -  typedef Graph<NUM_NODES> GT; +  using GT = Graph<NUM_NODES>;    /// Enumerate all graphs using NUM_GRAPHS bits.    static_assert(NUM_GRAPHS < sizeof(unsigned) * CHAR_BIT, "Too many graphs!"); diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp index 966b1f0..8556777 100644 --- a/llvm/unittests/ADT/STLExtrasTest.cpp +++ b/llvm/unittests/ADT/STLExtrasTest.cpp @@ -60,7 +60,7 @@ TEST(STLExtrasTest, EnumerateLValue) {    // Test that a simple LValue can be enumerated and gives correct results with    // multiple types, including the empty container.    std::vector<char> foo = {'a', 'b', 'c'}; -  typedef std::pair<std::size_t, char> CharPairType; +  using CharPairType = std::pair<std::size_t, char>;    std::vector<CharPairType> CharResults;    for (auto [index, value] : llvm::enumerate(foo)) { @@ -72,7 +72,7 @@ TEST(STLExtrasTest, EnumerateLValue) {                            CharPairType(2u, 'c')));    // Test a const range of a different type. -  typedef std::pair<std::size_t, int> IntPairType; +  using IntPairType = std::pair<std::size_t, int>;    std::vector<IntPairType> IntResults;    const std::vector<int> bar = {1, 2, 3};    for (auto [index, value] : llvm::enumerate(bar)) { @@ -111,7 +111,7 @@ TEST(STLExtrasTest, EnumerateModifyLValue) {  TEST(STLExtrasTest, EnumerateRValueRef) {    // Test that an rvalue can be enumerated. -  typedef std::pair<std::size_t, int> PairType; +  using PairType = std::pair<std::size_t, int>;    std::vector<PairType> Results;    auto Enumerator = llvm::enumerate(std::vector<int>{1, 2, 3}); @@ -138,7 +138,7 @@ TEST(STLExtrasTest, EnumerateModifyRValue) {    // Test that when enumerating an rvalue, modification still works (even if    // this isn't terribly useful, it at least shows that we haven't snuck an    // extra const in there somewhere. -  typedef std::pair<std::size_t, char> PairType; +  using PairType = std::pair<std::size_t, char>;    std::vector<PairType> Results;    for (auto X : llvm::enumerate(std::vector<char>{'1', '2', '3'})) { diff --git a/llvm/unittests/ADT/SimpleIListTest.cpp b/llvm/unittests/ADT/SimpleIListTest.cpp index c2992ba..cf3df8c 100644 --- a/llvm/unittests/ADT/SimpleIListTest.cpp +++ b/llvm/unittests/ADT/SimpleIListTest.cpp @@ -605,8 +605,8 @@ struct Tag2 {};  struct DoubleNode : ilist_node<DoubleNode, ilist_tag<Tag1>>,                      ilist_node<DoubleNode, ilist_tag<Tag2>> { -  typedef ilist_node<DoubleNode, ilist_tag<Tag1>> Node1Type; -  typedef ilist_node<DoubleNode, ilist_tag<Tag2>> Node2Type; +  using Node1Type = ilist_node<DoubleNode, ilist_tag<Tag1>>; +  using Node2Type = ilist_node<DoubleNode, ilist_tag<Tag2>>;    Node1Type::self_iterator getIterator1() { return Node1Type::getIterator(); }    Node2Type::self_iterator getIterator2() { return Node2Type::getIterator(); } @@ -617,8 +617,8 @@ struct DoubleNode : ilist_node<DoubleNode, ilist_tag<Tag1>>,      return Node2Type::getIterator();    }  }; -typedef simple_ilist<DoubleNode, ilist_tag<Tag1>> TaggedList1Type; -typedef simple_ilist<DoubleNode, ilist_tag<Tag2>> TaggedList2Type; +using TaggedList1Type = simple_ilist<DoubleNode, ilist_tag<Tag1>>; +using TaggedList2Type = simple_ilist<DoubleNode, ilist_tag<Tag2>>;  TEST(SimpleIListTest, TaggedLists) {    TaggedList1Type L1; diff --git a/llvm/unittests/ADT/SmallPtrSetTest.cpp b/llvm/unittests/ADT/SmallPtrSetTest.cpp index a627091..fe7a827 100644 --- a/llvm/unittests/ADT/SmallPtrSetTest.cpp +++ b/llvm/unittests/ADT/SmallPtrSetTest.cpp @@ -57,7 +57,7 @@ TEST(SmallPtrSetTest, GrowthTest) {    SmallPtrSet<int *, 4> s; -  typedef SmallPtrSet<int *, 4>::iterator iter; +  using iter = SmallPtrSet<int *, 4>::iterator;    s.insert(&buf[0]);    s.insert(&buf[1]); diff --git a/llvm/unittests/ADT/SmallStringTest.cpp b/llvm/unittests/ADT/SmallStringTest.cpp index 2f4df8a..db85824 100644 --- a/llvm/unittests/ADT/SmallStringTest.cpp +++ b/llvm/unittests/ADT/SmallStringTest.cpp @@ -23,7 +23,7 @@ namespace {  // Test fixture class  class SmallStringTest : public testing::Test {  protected: -  typedef SmallString<40> StringType; +  using StringType = SmallString<40>;    StringType theString; diff --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp index 74fc737..dbc626d 100644 --- a/llvm/unittests/ADT/SmallVectorTest.cpp +++ b/llvm/unittests/ADT/SmallVectorTest.cpp @@ -226,13 +226,10 @@ protected:    VectorT otherVector;  }; - -typedef ::testing::Types<SmallVector<Constructable, 0>, -                         SmallVector<Constructable, 1>, -                         SmallVector<Constructable, 2>, -                         SmallVector<Constructable, 4>, -                         SmallVector<Constructable, 5> -                         > SmallVectorTestTypes; +using SmallVectorTestTypes = ::testing::Types< +    SmallVector<Constructable, 0>, SmallVector<Constructable, 1>, +    SmallVector<Constructable, 2>, SmallVector<Constructable, 4>, +    SmallVector<Constructable, 5>>;  TYPED_TEST_SUITE(SmallVectorTest, SmallVectorTestTypes, );  // Constructor test. @@ -537,11 +534,11 @@ TYPED_TEST(SmallVectorTest, AppendNonIterTest) {  }  struct output_iterator { -  typedef std::output_iterator_tag iterator_category; -  typedef int value_type; -  typedef int difference_type; -  typedef value_type *pointer; -  typedef value_type &reference; +  using iterator_category = std::output_iterator_tag; +  using value_type = int; +  using difference_type = int; +  using pointer = value_type *; +  using reference = value_type &;    operator int() { return 2; }    operator Constructable() { return 7; }  }; @@ -896,7 +893,7 @@ protected:    VectorT2 otherVector;  }; -typedef ::testing::Types< +using DualSmallVectorTestTypes = ::testing::Types<      // Small mode -> Small mode.      std::pair<SmallVector<Constructable, 4>, SmallVector<Constructable, 4>>,      // Small mode -> Big mode. @@ -904,8 +901,7 @@ typedef ::testing::Types<      // Big mode -> Small mode.      std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 4>>,      // Big mode -> Big mode. -    std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 2>> -  > DualSmallVectorTestTypes; +    std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 2>>>;  TYPED_TEST_SUITE(DualSmallVectorsTest, DualSmallVectorTestTypes, ); diff --git a/llvm/unittests/ADT/SparseMultiSetTest.cpp b/llvm/unittests/ADT/SparseMultiSetTest.cpp index 54f7bc99..91d37f4 100644 --- a/llvm/unittests/ADT/SparseMultiSetTest.cpp +++ b/llvm/unittests/ADT/SparseMultiSetTest.cpp @@ -13,7 +13,7 @@ using namespace llvm;  namespace { -typedef SparseMultiSet<unsigned> USet; +using USet = SparseMultiSet<unsigned>;  // Empty set tests.  TEST(SparseMultiSetTest, EmptySet) { @@ -211,7 +211,7 @@ struct Alt {  };  TEST(SparseMultiSetTest, AltStructSet) { -  typedef SparseMultiSet<Alt> ASet; +  using ASet = SparseMultiSet<Alt>;    ASet Set;    Set.setUniverse(10);    Set.insert(Alt(1005)); diff --git a/llvm/unittests/ADT/SparseSetTest.cpp b/llvm/unittests/ADT/SparseSetTest.cpp index 4fbf1ca..f2b9329 100644 --- a/llvm/unittests/ADT/SparseSetTest.cpp +++ b/llvm/unittests/ADT/SparseSetTest.cpp @@ -13,7 +13,7 @@ using namespace llvm;  namespace { -typedef SparseSet<unsigned> USet; +using USet = SparseSet<unsigned>;  // Empty set tests.  TEST(SparseSetTest, EmptySet) { @@ -166,7 +166,7 @@ struct Alt {  };  TEST(SparseSetTest, AltStructSet) { -  typedef SparseSet<Alt> ASet; +  using ASet = SparseSet<Alt>;    ASet Set;    Set.setUniverse(10);    Set.insert(Alt(1005)); diff --git a/llvm/unittests/ADT/StringSwitchTest.cpp b/llvm/unittests/ADT/StringSwitchTest.cpp index c94feb5..75d50f4 100644 --- a/llvm/unittests/ADT/StringSwitchTest.cpp +++ b/llvm/unittests/ADT/StringSwitchTest.cpp @@ -240,6 +240,23 @@ TEST(StringSwitchTest, CasesCopies) {    EXPECT_EQ(NumCopies, 1u);  } +TEST(StringSwitchTest, StringSwitchMultipleMatches) { +  auto Translate = [](StringRef S) { +    return llvm::StringSwitch<int>(S) +        .CaseLower("A", 0) +        .Case("b", 1) +        .Case("a", 2) +        .CasesLower({"a", "b"}, 3) +        .DefaultUnreachable(); +  }; + +  // Check that the value of the first match is returned. +  EXPECT_EQ(0, Translate("A")); +  EXPECT_EQ(0, Translate("a")); +  EXPECT_EQ(3, Translate("B")); +  EXPECT_EQ(1, Translate("b")); +} +  TEST(StringSwitchTest, DefaultUnreachable) {    auto Translate = [](StringRef S) {      return llvm::StringSwitch<int>(S) diff --git a/llvm/unittests/ADT/TestGraph.h b/llvm/unittests/ADT/TestGraph.h index a59ab50..bb2ec47 100644 --- a/llvm/unittests/ADT/TestGraph.h +++ b/llvm/unittests/ADT/TestGraph.h @@ -34,7 +34,7 @@ public:    /// NodeSubset - A subset of the graph's nodes.    class NodeSubset { -    typedef unsigned char BitVector; // Where the limitation N <= 8 comes from. +    using BitVector = unsigned char; // Where the limitation N <= 8 comes from.      BitVector Elements;      NodeSubset(BitVector e) : Elements(e) {}    public: @@ -96,7 +96,7 @@ public:    };    /// NodeType - Node index and set of children of the node. -  typedef std::pair<unsigned, NodeSubset> NodeType; +  using NodeType = std::pair<unsigned, NodeSubset>;  private:    /// Nodes - The list of nodes for this graph. @@ -233,8 +233,8 @@ public:  template <unsigned N>  struct GraphTraits<Graph<N> > { -  typedef typename Graph<N>::NodeType *NodeRef; -  typedef typename Graph<N>::ChildIterator ChildIteratorType; +  using NodeRef = typename Graph<N>::NodeType *; +  using ChildIteratorType = typename Graph<N>::ChildIterator;    static NodeRef getEntryNode(const Graph<N> &G) { return G.AccessNode(0); }    static ChildIteratorType child_begin(NodeRef Node) { diff --git a/llvm/unittests/ADT/TinyPtrVectorTest.cpp b/llvm/unittests/ADT/TinyPtrVectorTest.cpp index af4ae4f..c77721d 100644 --- a/llvm/unittests/ADT/TinyPtrVectorTest.cpp +++ b/llvm/unittests/ADT/TinyPtrVectorTest.cpp @@ -28,14 +28,14 @@ template <typename PointerTy, unsigned IntBits, typename IntType,            typename PtrTraits, typename Info>  struct RemovePointer<      PointerIntPair<PointerTy, IntBits, IntType, PtrTraits, Info>> { -  typedef typename RemovePointer<PointerTy>::type type; +  using type = typename RemovePointer<PointerTy>::type;  };  template <typename VectorT>  class TinyPtrVectorTest : public testing::Test {  protected: -  typedef typename VectorT::value_type PtrT; -  typedef typename RemovePointer<PtrT>::type ValueT; +  using PtrT = typename VectorT::value_type; +  using ValueT = typename RemovePointer<PtrT>::type;    using PtrTraits = PointerLikeTypeTraits<PtrT>;    VectorT V; @@ -78,9 +78,9 @@ protected:    }  }; -typedef ::testing::Types<TinyPtrVector<int *>, TinyPtrVector<double *>, -                         TinyPtrVector<PointerIntPair<int *, 1>>> -    TinyPtrVectorTestTypes; +using TinyPtrVectorTestTypes = +    ::testing::Types<TinyPtrVector<int *>, TinyPtrVector<double *>, +                     TinyPtrVector<PointerIntPair<int *, 1>>>;  TYPED_TEST_SUITE(TinyPtrVectorTest, TinyPtrVectorTestTypes, );  TYPED_TEST(TinyPtrVectorTest, EmptyTest) { diff --git a/llvm/unittests/CAS/ActionCacheTest.cpp b/llvm/unittests/CAS/ActionCacheTest.cpp index db67e30..692da23 100644 --- a/llvm/unittests/CAS/ActionCacheTest.cpp +++ b/llvm/unittests/CAS/ActionCacheTest.cpp @@ -21,7 +21,7 @@ using namespace llvm;  using namespace llvm::cas;  TEST_P(CASTest, ActionCacheHit) { -  std::shared_ptr<ObjectStore> CAS = createObjectStore(); +  std::unique_ptr<ObjectStore> CAS = createObjectStore();    std::unique_ptr<ActionCache> Cache = createActionCache();    std::optional<ObjectProxy> ID; @@ -36,7 +36,7 @@ TEST_P(CASTest, ActionCacheHit) {  }  TEST_P(CASTest, ActionCacheMiss) { -  std::shared_ptr<ObjectStore> CAS = createObjectStore(); +  std::unique_ptr<ObjectStore> CAS = createObjectStore();    std::unique_ptr<ActionCache> Cache = createActionCache();    std::optional<ObjectProxy> ID1, ID2; @@ -59,7 +59,7 @@ TEST_P(CASTest, ActionCacheMiss) {  }  TEST_P(CASTest, ActionCacheRewrite) { -  std::shared_ptr<ObjectStore> CAS = createObjectStore(); +  std::unique_ptr<ObjectStore> CAS = createObjectStore();    std::unique_ptr<ActionCache> Cache = createActionCache();    std::optional<ObjectProxy> ID1, ID2; diff --git a/llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp b/llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp new file mode 100644 index 0000000..19522e9 --- /dev/null +++ b/llvm/unittests/CAS/BuiltinUnifiedCASDatabasesTest.cpp @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/CAS/BuiltinUnifiedCASDatabases.h" +#include "CASTestConfig.h" +#include "llvm/CAS/ActionCache.h" +#include "llvm/CAS/ObjectStore.h" +#include "llvm/Testing/Support/Error.h" +#include "llvm/Testing/Support/SupportHelpers.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace llvm::cas; + +TEST_F(OnDiskCASTest, UnifiedCASMaterializationCheckPreventsGarbageCollection) { +  unittest::TempDir Temp("on-disk-unified-cas", /*Unique=*/true); + +  auto WithCAS = [&](llvm::function_ref<void(ObjectStore &)> Action) { +    std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>> DBs; +    ASSERT_THAT_ERROR( +        createOnDiskUnifiedCASDatabases(Temp.path()).moveInto(DBs), +        Succeeded()); +    ObjectStore &CAS = *DBs.first; +    ASSERT_THAT_ERROR(CAS.setSizeLimit(1), Succeeded()); +    Action(CAS); +  }; + +  std::optional<CASID> ID; + +  // Create an object in the CAS. +  WithCAS([&ID](ObjectStore &CAS) { +    std::optional<ObjectRef> Ref; +    ASSERT_THAT_ERROR(CAS.store({}, "blah").moveInto(Ref), Succeeded()); +    ASSERT_TRUE(Ref.has_value()); + +    ID = CAS.getID(*Ref); +  }); + +  // Check materialization and prune the storage. +  WithCAS([&ID](ObjectStore &CAS) { +    std::optional<ObjectRef> Ref = CAS.getReference(*ID); +    ASSERT_TRUE(Ref.has_value()); + +    std::optional<bool> IsMaterialized; +    ASSERT_THAT_ERROR(CAS.isMaterialized(*Ref).moveInto(IsMaterialized), +                      Succeeded()); +    ASSERT_TRUE(IsMaterialized); + +    ASSERT_THAT_ERROR(CAS.pruneStorageData(), Succeeded()); +  }); + +  // Verify that the previous materialization check kept the object in the CAS. +  WithCAS([&ID](ObjectStore &CAS) { +    std::optional<ObjectRef> Ref = CAS.getReference(*ID); +    ASSERT_TRUE(Ref.has_value()); + +    std::optional<bool> IsMaterialized; +    ASSERT_THAT_ERROR(CAS.isMaterialized(*Ref).moveInto(IsMaterialized), +                      Succeeded()); +    ASSERT_TRUE(IsMaterialized); +  }); +} diff --git a/llvm/unittests/CAS/CASTestConfig.cpp b/llvm/unittests/CAS/CASTestConfig.cpp index 10e4b68..08cbf1d 100644 --- a/llvm/unittests/CAS/CASTestConfig.cpp +++ b/llvm/unittests/CAS/CASTestConfig.cpp @@ -8,6 +8,7 @@  #include "CASTestConfig.h"  #include "llvm/CAS/ObjectStore.h" +#include "llvm/Testing/Support/Error.h"  #include "gtest/gtest.h"  #include <mutex> @@ -15,7 +16,8 @@ using namespace llvm;  using namespace llvm::cas;  static CASTestingEnv createInMemory(int I) { -  return CASTestingEnv{createInMemoryCAS(), createInMemoryActionCache()}; +  return CASTestingEnv{createInMemoryCAS(), createInMemoryActionCache(), +                       std::nullopt};  }  INSTANTIATE_TEST_SUITE_P(InMemoryCAS, CASTest, @@ -23,7 +25,7 @@ INSTANTIATE_TEST_SUITE_P(InMemoryCAS, CASTest,  #if LLVM_ENABLE_ONDISK_CAS  namespace llvm::cas::ondisk { -extern void setMaxMappingSize(uint64_t Size); +void setMaxMappingSize(uint64_t Size);  } // namespace llvm::cas::ondisk  void setMaxOnDiskCASMappingSize() { @@ -31,6 +33,17 @@ void setMaxOnDiskCASMappingSize() {    std::call_once(        Flag, [] { llvm::cas::ondisk::setMaxMappingSize(100 * 1024 * 1024); });  } + +static CASTestingEnv createOnDisk(int I) { +  unittest::TempDir Temp("on-disk-cas", /*Unique=*/true); +  std::unique_ptr<ObjectStore> CAS; +  EXPECT_THAT_ERROR(createOnDiskCAS(Temp.path()).moveInto(CAS), Succeeded()); +  std::unique_ptr<ActionCache> Cache; +  EXPECT_THAT_ERROR(createOnDiskActionCache(Temp.path()).moveInto(Cache), +                    Succeeded()); +  return CASTestingEnv{std::move(CAS), std::move(Cache), std::move(Temp)}; +} +INSTANTIATE_TEST_SUITE_P(OnDiskCAS, CASTest, ::testing::Values(createOnDisk));  #else  void setMaxOnDiskCASMappingSize() {}  #endif /* LLVM_ENABLE_ONDISK_CAS */ diff --git a/llvm/unittests/CAS/CASTestConfig.h b/llvm/unittests/CAS/CASTestConfig.h index 8d3c553..b1c0e59 100644 --- a/llvm/unittests/CAS/CASTestConfig.h +++ b/llvm/unittests/CAS/CASTestConfig.h @@ -6,16 +6,28 @@  //  //===----------------------------------------------------------------------===// +#ifndef LLVM_UNITTESTS_CASTESTCONFIG_H +#define LLVM_UNITTESTS_CASTESTCONFIG_H +  #include "llvm/CAS/ActionCache.h"  #include "llvm/CAS/ObjectStore.h" +#include "llvm/Testing/Support/SupportHelpers.h"  #include "gtest/gtest.h" +#include <memory> -#ifndef LLVM_UNITTESTS_CASTESTCONFIG_H -#define LLVM_UNITTESTS_CASTESTCONFIG_H +namespace llvm::unittest::cas { +class MockEnv { +  void anchor(); + +public: +  virtual ~MockEnv(); +}; +} // namespace llvm::unittest::cas  struct CASTestingEnv {    std::unique_ptr<llvm::cas::ObjectStore> CAS;    std::unique_ptr<llvm::cas::ActionCache> Cache; +  std::optional<llvm::unittest::TempDir> Temp;  };  void setMaxOnDiskCASMappingSize(); @@ -24,26 +36,47 @@ void setMaxOnDiskCASMappingSize();  class OnDiskCASTest : public ::testing::Test {  protected:    void SetUp() override { +#if !LLVM_ENABLE_ONDISK_CAS +    GTEST_SKIP() << "OnDiskCAS is not enabled"; +#endif      // Use a smaller database size for testing to conserve disk space.      setMaxOnDiskCASMappingSize();    }  }; +// Parametered test fixture for ObjectStore and ActionCache tests.  class CASTest      : public testing::TestWithParam<std::function<CASTestingEnv(int)>> {  protected:    std::optional<int> NextCASIndex; +  llvm::SmallVector<llvm::unittest::TempDir> Dirs; + +  llvm::SmallVector<std::unique_ptr<llvm::unittest::cas::MockEnv>> Envs; +    std::unique_ptr<llvm::cas::ObjectStore> createObjectStore() {      auto TD = GetParam()(++(*NextCASIndex)); +    if (TD.Temp) +      Dirs.push_back(std::move(*TD.Temp));      return std::move(TD.CAS);    }    std::unique_ptr<llvm::cas::ActionCache> createActionCache() {      auto TD = GetParam()(++(*NextCASIndex)); +    if (TD.Temp) +      Dirs.push_back(std::move(*TD.Temp));      return std::move(TD.Cache);    } -  void SetUp() override { NextCASIndex = 0; } -  void TearDown() override { NextCASIndex = std::nullopt; } + +  void SetUp() override { +    NextCASIndex = 0; +    setMaxOnDiskCASMappingSize(); +  } + +  void TearDown() override { +    NextCASIndex = std::nullopt; +    Dirs.clear(); +    Envs.clear(); +  }  };  #endif diff --git a/llvm/unittests/CAS/CMakeLists.txt b/llvm/unittests/CAS/CMakeLists.txt index da469f7..91e49be 100644 --- a/llvm/unittests/CAS/CMakeLists.txt +++ b/llvm/unittests/CAS/CMakeLists.txt @@ -1,9 +1,11 @@  set(ONDISK_CAS_TEST_SOURCES +  BuiltinUnifiedCASDatabasesTest.cpp    OnDiskGraphDBTest.cpp    OnDiskDataAllocatorTest.cpp    OnDiskKeyValueDBTest.cpp    OnDiskTrieRawHashMapTest.cpp    ProgramTest.cpp +  UnifiedOnDiskCacheTest.cpp    )  set(LLVM_OPTIONAL_SOURCES diff --git a/llvm/unittests/CAS/ObjectStoreTest.cpp b/llvm/unittests/CAS/ObjectStoreTest.cpp index 54083fd..b43ae33 100644 --- a/llvm/unittests/CAS/ObjectStoreTest.cpp +++ b/llvm/unittests/CAS/ObjectStoreTest.cpp @@ -1,4 +1,4 @@ -//===- ObjectStoreTest.cpp ------------------------------------------------===// +//===----------------------------------------------------------------------===//  //  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.  // See https://llvm.org/LICENSE.txt for license information. @@ -76,7 +76,7 @@ multiline text multiline text multiline text multiline text multiline text)",    // Run validation on all CASIDs.    for (int I = 0, E = IDs.size(); I != E; ++I) -    ASSERT_THAT_ERROR(CAS1->validate(IDs[I]), Succeeded()); +    ASSERT_THAT_ERROR(CAS1->validateObject(IDs[I]), Succeeded());    // Check that the blobs can be retrieved multiple times.    for (int I = 0, E = IDs.size(); I != E; ++I) { @@ -120,15 +120,15 @@ TEST_P(CASTest, BlobsBig) {      std::optional<CASID> ID2;      ASSERT_THAT_ERROR(CAS->createProxy({}, String1).moveInto(ID1), Succeeded());      ASSERT_THAT_ERROR(CAS->createProxy({}, String1).moveInto(ID2), Succeeded()); -    ASSERT_THAT_ERROR(CAS->validate(*ID1), Succeeded()); -    ASSERT_THAT_ERROR(CAS->validate(*ID2), Succeeded()); +    ASSERT_THAT_ERROR(CAS->validateObject(*ID1), Succeeded()); +    ASSERT_THAT_ERROR(CAS->validateObject(*ID2), Succeeded());      ASSERT_EQ(ID1, ID2);      String1.append(String2);      ASSERT_THAT_ERROR(CAS->createProxy({}, String2).moveInto(ID1), Succeeded());      ASSERT_THAT_ERROR(CAS->createProxy({}, String2).moveInto(ID2), Succeeded()); -    ASSERT_THAT_ERROR(CAS->validate(*ID1), Succeeded()); -    ASSERT_THAT_ERROR(CAS->validate(*ID2), Succeeded()); +    ASSERT_THAT_ERROR(CAS->validateObject(*ID1), Succeeded()); +    ASSERT_THAT_ERROR(CAS->validateObject(*ID2), Succeeded());      ASSERT_EQ(ID1, ID2);      String2.append(String1);    } @@ -176,10 +176,11 @@ multiline text multiline text multiline text multiline text multiline text)",      // Check basic printing of IDs.      IDs.push_back(CAS1->getID(*Node)); -    auto ID = CAS1->getID(Nodes.back()); -    EXPECT_EQ(ID.toString(), IDs.back().toString()); -    EXPECT_EQ(*Node, Nodes.back()); -    EXPECT_EQ(ID, IDs.back()); +    EXPECT_EQ(IDs.back().toString(), IDs.back().toString()); +    EXPECT_EQ(Nodes.front(), Nodes.front()); +    EXPECT_EQ(Nodes.back(), Nodes.back()); +    EXPECT_EQ(IDs.front(), IDs.front()); +    EXPECT_EQ(IDs.back(), IDs.back());      if (Nodes.size() <= 1)        continue;      EXPECT_NE(Nodes.front(), Nodes.back()); @@ -266,7 +267,7 @@ TEST_P(CASTest, NodesBig) {    }    for (auto ID : CreatedNodes) -    ASSERT_THAT_ERROR(CAS->validate(CAS->getID(ID)), Succeeded()); +    ASSERT_THAT_ERROR(CAS->validateObject(CAS->getID(ID)), Succeeded());  }  #if LLVM_ENABLE_THREADS @@ -332,17 +333,124 @@ static void testBlobsParallel1(ObjectStore &CAS, uint64_t BlobSize) {  }  TEST_P(CASTest, BlobsParallel) { -  std::shared_ptr<ObjectStore> CAS = createObjectStore(); +  std::unique_ptr<ObjectStore> CAS = createObjectStore();    uint64_t Size = 1ULL * 1024;    ASSERT_NO_FATAL_FAILURE(testBlobsParallel1(*CAS, Size));  }  #ifdef EXPENSIVE_CHECKS  TEST_P(CASTest, BlobsBigParallel) { -  std::shared_ptr<ObjectStore> CAS = createObjectStore(); +  std::unique_ptr<ObjectStore> CAS = createObjectStore();    // 100k is large enough to be standalone files in our on-disk cas.    uint64_t Size = 100ULL * 1024;    ASSERT_NO_FATAL_FAILURE(testBlobsParallel1(*CAS, Size));  }  #endif // EXPENSIVE_CHECKS + +#ifndef _WIN32 // create_link won't work for directories on Windows +TEST_F(OnDiskCASTest, OnDiskCASBlobsParallelMultiCAS) { +  // This test intentionally uses symlinked paths to the same CAS to subvert the +  // shared memory mappings that would normally be created within a single +  // process. This breaks the lock file guarantees, so we must be careful not +  // to create or destroy the CAS objects concurrently, which is when the locks +  // are normally important. +  unittest::TempDir Temp("on-disk-cas", /*Unique=*/true); +  ASSERT_EQ(sys::fs::create_directory(Temp.path("real_cas")), +            std::error_code()); +  ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas1")), +            std::error_code()); +  ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas2")), +            std::error_code()); +  ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas3")), +            std::error_code()); + +  std::unique_ptr<ObjectStore> CAS1, CAS2, CAS3, CAS4; +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("real_cas")).moveInto(CAS1), +                    Succeeded()); +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas1")).moveInto(CAS2), +                    Succeeded()); +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas2")).moveInto(CAS3), +                    Succeeded()); +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas3")).moveInto(CAS4), +                    Succeeded()); + +  uint64_t Size = 1ULL * 1024; +  ASSERT_NO_FATAL_FAILURE(testBlobsParallel(*CAS1, *CAS2, *CAS3, *CAS4, Size)); +} + +TEST_F(OnDiskCASTest, OnDiskCASBlobsBigParallelMultiCAS) { +  // See comment in BlobsParallelMultiCAS. +  unittest::TempDir Temp("on-disk-cas", /*Unique=*/true); +  ASSERT_EQ(sys::fs::create_directory(Temp.path("real_cas")), +            std::error_code()); +  ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas1")), +            std::error_code()); +  ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas2")), +            std::error_code()); +  ASSERT_EQ(sys::fs::create_link("real_cas", Temp.path("sym_cas3")), +            std::error_code()); + +  std::unique_ptr<ObjectStore> CAS1, CAS2, CAS3, CAS4; +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("real_cas")).moveInto(CAS1), +                    Succeeded()); +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas1")).moveInto(CAS2), +                    Succeeded()); +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas2")).moveInto(CAS3), +                    Succeeded()); +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path("sym_cas3")).moveInto(CAS4), +                    Succeeded()); + +  // 100k is large enough to be standalone files in our on-disk cas. +  uint64_t Size = 100ULL * 1024; +  ASSERT_NO_FATAL_FAILURE(testBlobsParallel(*CAS1, *CAS2, *CAS3, *CAS4, Size)); +} +#endif // _WIN32  #endif // LLVM_ENABLE_THREADS + +TEST_F(OnDiskCASTest, OnDiskCASDiskSize) { +  unittest::TempDir Temp("on-disk-cas", /*Unique=*/true); +  std::unique_ptr<ObjectStore> CAS; +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path()).moveInto(CAS), Succeeded()); + +  uint64_t MaxSize = 100 * 1024 * 1024; + +  // Check that we map the files to the correct size. +  auto CheckFileSizes = [&](bool Mapped) { +    bool FoundIndex = false, FoundData = false; +    std::error_code EC; +    for (sys::fs::directory_iterator I(Temp.path(), EC), E; I != E && !EC; +         I.increment(EC)) { +      StringRef Filename = sys::path::filename(I->path()); +      if (Filename.starts_with("index.") && !Filename.ends_with(".shared")) { +        FoundIndex = true; +        ASSERT_TRUE(I->status()); +        if (Mapped) +          EXPECT_EQ(I->status()->getSize(), MaxSize); +        else +          EXPECT_LT(I->status()->getSize(), MaxSize); +      } +      if (Filename.starts_with("data.") && !Filename.ends_with(".shared")) { +        FoundData = true; +        ASSERT_TRUE(I->status()); +        if (Mapped) +          EXPECT_EQ(I->status()->getSize(), MaxSize); +        else +          EXPECT_LT(I->status()->getSize(), MaxSize); +      } +    } +    ASSERT_TRUE(FoundIndex); +    ASSERT_TRUE(FoundData); +  }; + +  // Check that we have the full mapping size when the CAS is open. +  CheckFileSizes(/*Mapped=*/true); +  CAS.reset(); +  // Check that the CAS is shrunk to a smaller size. +  CheckFileSizes(/*Mapped=*/false); + +  // Repeat the checks when starting from an existing CAS. +  ASSERT_THAT_ERROR(createOnDiskCAS(Temp.path()).moveInto(CAS), Succeeded()); +  CheckFileSizes(/*Mapped=*/true); +  CAS.reset(); +  CheckFileSizes(/*Mapped=*/false); +} diff --git a/llvm/unittests/CAS/OnDiskCommonUtils.h b/llvm/unittests/CAS/OnDiskCommonUtils.h index 89f93e0..48a1830 100644 --- a/llvm/unittests/CAS/OnDiskCommonUtils.h +++ b/llvm/unittests/CAS/OnDiskCommonUtils.h @@ -12,6 +12,8 @@  #include "llvm/CAS/BuiltinObjectHasher.h"  #include "llvm/CAS/OnDiskGraphDB.h" +#include "llvm/CAS/OnDiskKeyValueDB.h" +#include "llvm/CAS/UnifiedOnDiskCache.h"  #include "llvm/Support/BLAKE3.h"  #include "llvm/Testing/Support/Error.h" @@ -58,6 +60,25 @@ inline Expected<ObjectID> store(OnDiskGraphDB &DB, StringRef Data,    return ID;  } +inline Expected<ObjectID> cachePut(OnDiskKeyValueDB &DB, ArrayRef<uint8_t> Key, +                                   ObjectID ID) { +  auto Value = UnifiedOnDiskCache::getValueFromObjectID(ID); +  auto Result = DB.put(Key, Value); +  if (!Result) +    return Result.takeError(); +  return UnifiedOnDiskCache::getObjectIDFromValue(*Result); +} + +inline Expected<std::optional<ObjectID>> cacheGet(OnDiskKeyValueDB &DB, +                                                  ArrayRef<uint8_t> Key) { +  auto Result = DB.get(Key); +  if (!Result) +    return Result.takeError(); +  if (!*Result) +    return std::nullopt; +  return UnifiedOnDiskCache::getObjectIDFromValue(**Result); +} +  inline Error printTree(OnDiskGraphDB &DB, ObjectID ID, raw_ostream &OS,                         unsigned Indent = 0) {    std::optional<ondisk::ObjectHandle> Obj; diff --git a/llvm/unittests/CAS/OnDiskGraphDBTest.cpp b/llvm/unittests/CAS/OnDiskGraphDBTest.cpp index 3c2e963..e9c73bf 100644 --- a/llvm/unittests/CAS/OnDiskGraphDBTest.cpp +++ b/llvm/unittests/CAS/OnDiskGraphDBTest.cpp @@ -102,7 +102,7 @@ TEST_F(OnDiskCASTest, OnDiskGraphDBFaultInSingleNode) {    std::unique_ptr<OnDiskGraphDB> DB;    ASSERT_THAT_ERROR(        OnDiskGraphDB::open(Temp.path(), "blake3", sizeof(HashType), -                          std::move(UpstreamDB), +                          UpstreamDB.get(),                            OnDiskGraphDB::FaultInPolicy::SingleNode)            .moveInto(DB),        Succeeded()); @@ -208,7 +208,7 @@ TEST_F(OnDiskCASTest, OnDiskGraphDBFaultInFullTree) {    unittest::TempDir Temp("ondiskcas", /*Unique=*/true);    std::unique_ptr<OnDiskGraphDB> DB;    ASSERT_THAT_ERROR(OnDiskGraphDB::open(Temp.path(), "blake3", sizeof(HashType), -                                        std::move(UpstreamDB), +                                        UpstreamDB.get(),                                          OnDiskGraphDB::FaultInPolicy::FullTree)                          .moveInto(DB),                      Succeeded()); @@ -264,14 +264,14 @@ TEST_F(OnDiskCASTest, OnDiskGraphDBFaultInPolicyConflict) {      unittest::TempDir Temp("ondiskcas", /*Unique=*/true);      std::unique_ptr<OnDiskGraphDB> DB;      ASSERT_THAT_ERROR(OnDiskGraphDB::open(Temp.path(), "blake3", -                                          sizeof(HashType), -                                          std::move(UpstreamDB), Policy1) +                                          sizeof(HashType), UpstreamDB.get(), +                                          Policy1)                            .moveInto(DB),                        Succeeded());      DB.reset();      ASSERT_THAT_ERROR(OnDiskGraphDB::open(Temp.path(), "blake3", -                                          sizeof(HashType), -                                          std::move(UpstreamDB), Policy2) +                                          sizeof(HashType), UpstreamDB.get(), +                                          Policy2)                            .moveInto(DB),                        Failed());    }; diff --git a/llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp b/llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp new file mode 100644 index 0000000..09aebc2 --- /dev/null +++ b/llvm/unittests/CAS/UnifiedOnDiskCacheTest.cpp @@ -0,0 +1,198 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/CAS/UnifiedOnDiskCache.h" +#include "CASTestConfig.h" +#include "OnDiskCommonUtils.h" +#include "llvm/Testing/Support/Error.h" +#include "llvm/Testing/Support/SupportHelpers.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace llvm::cas; +using namespace llvm::cas::ondisk; +using namespace llvm::unittest::cas; + +/// Visits all the files of a directory recursively and returns the sum of their +/// sizes. +static Expected<size_t> countFileSizes(StringRef Path) { +  size_t TotalSize = 0; +  std::error_code EC; +  for (sys::fs::directory_iterator DirI(Path, EC), DirE; !EC && DirI != DirE; +       DirI.increment(EC)) { +    if (DirI->type() == sys::fs::file_type::directory_file) { +      Expected<size_t> Subsize = countFileSizes(DirI->path()); +      if (!Subsize) +        return Subsize.takeError(); +      TotalSize += *Subsize; +      continue; +    } +    ErrorOr<sys::fs::basic_file_status> Stat = DirI->status(); +    if (!Stat) +      return createFileError(DirI->path(), Stat.getError()); +    TotalSize += Stat->getSize(); +  } +  if (EC) +    return createFileError(Path, EC); +  return TotalSize; +} + +TEST_F(OnDiskCASTest, UnifiedOnDiskCacheTest) { +  unittest::TempDir Temp("ondisk-unified", /*Unique=*/true); +  std::unique_ptr<UnifiedOnDiskCache> UniDB; + +  const uint64_t SizeLimit = 1024ull * 64; +  auto reopenDB = [&]() { +    UniDB.reset(); +    ASSERT_THAT_ERROR(UnifiedOnDiskCache::open(Temp.path(), SizeLimit, "blake3", +                                               sizeof(HashType)) +                          .moveInto(UniDB), +                      Succeeded()); +  }; + +  reopenDB(); + +  HashType RootHash; +  HashType OtherHash; +  HashType Key1Hash; +  HashType Key2Hash; +  { +    OnDiskGraphDB &DB = UniDB->getGraphDB(); +    std::optional<ObjectID> ID1; +    ASSERT_THAT_ERROR(store(DB, "1", {}).moveInto(ID1), Succeeded()); +    std::optional<ObjectID> ID2; +    ASSERT_THAT_ERROR(store(DB, "2", {}).moveInto(ID2), Succeeded()); +    std::optional<ObjectID> IDRoot; +    ASSERT_THAT_ERROR(store(DB, "root", {*ID1, *ID2}).moveInto(IDRoot), +                      Succeeded()); +    ArrayRef<uint8_t> Digest = DB.getDigest(*IDRoot); +    ASSERT_EQ(Digest.size(), RootHash.size()); +    llvm::copy(Digest, RootHash.data()); + +    std::optional<ObjectID> IDOther; +    ASSERT_THAT_ERROR(store(DB, "other", {}).moveInto(IDOther), Succeeded()); +    Digest = DB.getDigest(*IDOther); +    ASSERT_EQ(Digest.size(), OtherHash.size()); +    llvm::copy(Digest, OtherHash.data()); + +    Key1Hash = digest("key1"); +    std::optional<ObjectID> Val; +    ASSERT_THAT_ERROR( +        cachePut(UniDB->getKeyValueDB(), Key1Hash, *IDRoot).moveInto(Val), +        Succeeded()); +    EXPECT_EQ(IDRoot, Val); + +    Key2Hash = digest("key2"); +    std::optional<ObjectID> KeyID; +    ASSERT_THAT_ERROR(DB.getReference(Key2Hash).moveInto(KeyID), Succeeded()); +    ASSERT_THAT_ERROR(cachePut(UniDB->getKeyValueDB(), +                               UniDB->getGraphDB().getDigest(*KeyID), *ID1) +                          .moveInto(Val), +                      Succeeded()); +  } + +  auto checkTree = [&](const HashType &Digest, StringRef ExpectedTree) { +    OnDiskGraphDB &DB = UniDB->getGraphDB(); +    std::optional<ObjectID> ID; +    ASSERT_THAT_ERROR(DB.getReference(Digest).moveInto(ID), Succeeded()); +    std::string PrintedTree; +    raw_string_ostream OS(PrintedTree); +    ASSERT_THAT_ERROR(printTree(DB, *ID, OS), Succeeded()); +    EXPECT_EQ(PrintedTree, ExpectedTree); +  }; +  auto checkRootTree = [&]() { +    return checkTree(RootHash, "root\n  1\n  2\n"); +  }; + +  auto checkKey = [&](const HashType &Key, StringRef ExpectedData) { +    OnDiskGraphDB &DB = UniDB->getGraphDB(); +    std::optional<ObjectID> Val; +    ASSERT_THAT_ERROR(cacheGet(UniDB->getKeyValueDB(), Key).moveInto(Val), +                      Succeeded()); + +    ASSERT_TRUE(Val.has_value()); +    std::optional<ondisk::ObjectHandle> Obj; +    ASSERT_THAT_ERROR(DB.load(*Val).moveInto(Obj), Succeeded()); +    EXPECT_EQ(toStringRef(DB.getObjectData(*Obj)), ExpectedData); +  }; + +  checkRootTree(); +  checkTree(OtherHash, "other\n"); +  checkKey(Key1Hash, "root"); +  checkKey(Key2Hash, "1"); + +  auto storeBigObject = [&](unsigned Index) { +    SmallString<1000> Buf; +    Buf.append(970, 'a'); +    raw_svector_ostream(Buf) << Index; +    std::optional<ObjectID> ID; +    ASSERT_THAT_ERROR(store(UniDB->getGraphDB(), Buf, {}).moveInto(ID), +                      Succeeded()); +  }; + +  uint64_t PrevStoreSize = UniDB->getStorageSize(); +  unsigned Index = 0; +  while (!UniDB->hasExceededSizeLimit()) { +    storeBigObject(Index++); +  } +  EXPECT_GT(UniDB->getStorageSize(), PrevStoreSize); +  UniDB->setSizeLimit(SizeLimit * 2); +  EXPECT_FALSE(UniDB->hasExceededSizeLimit()); +  UniDB->setSizeLimit(SizeLimit); +  EXPECT_TRUE(UniDB->hasExceededSizeLimit()); + +  reopenDB(); + +  EXPECT_FALSE(UniDB->hasExceededSizeLimit()); +  EXPECT_FALSE(UniDB->needsGarbageCollection()); + +  checkRootTree(); +  checkKey(Key1Hash, "root"); + +  while (!UniDB->hasExceededSizeLimit()) { +    storeBigObject(Index++); +  } +  PrevStoreSize = UniDB->getStorageSize(); +  ASSERT_THAT_ERROR(UniDB->close(), Succeeded()); +  EXPECT_TRUE(UniDB->needsGarbageCollection()); + +  reopenDB(); +  EXPECT_TRUE(UniDB->needsGarbageCollection()); + +  std::optional<size_t> DirSizeBefore; +  ASSERT_THAT_ERROR(countFileSizes(Temp.path()).moveInto(DirSizeBefore), +                    Succeeded()); + +  ASSERT_THAT_ERROR(UnifiedOnDiskCache::collectGarbage(Temp.path()), +                    Succeeded()); + +  std::optional<size_t> DirSizeAfter; +  ASSERT_THAT_ERROR(countFileSizes(Temp.path()).moveInto(DirSizeAfter), +                    Succeeded()); +  EXPECT_LT(*DirSizeAfter, *DirSizeBefore); + +  reopenDB(); +  EXPECT_FALSE(UniDB->needsGarbageCollection()); + +  checkRootTree(); +  checkKey(Key1Hash, "root"); + +  EXPECT_LT(UniDB->getStorageSize(), PrevStoreSize); + +  // 'Other' tree and 'Key2' got garbage-collected. +  { +    OnDiskGraphDB &DB = UniDB->getGraphDB(); +    std::optional<ObjectID> ID; +    ASSERT_THAT_ERROR(DB.getReference(OtherHash).moveInto(ID), Succeeded()); +    EXPECT_FALSE(DB.containsObject(*ID)); +    std::optional<ObjectID> Val; +    ASSERT_THAT_ERROR(cacheGet(UniDB->getKeyValueDB(), Key2Hash).moveInto(Val), +                      Succeeded()); +    EXPECT_FALSE(Val.has_value()); +  } +} diff --git a/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp b/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp index 5c96199..fab40b9 100644 --- a/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp +++ b/llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp @@ -84,7 +84,7 @@ public:  class RandomAccessVisitorTest : public testing::Test {  public: -  RandomAccessVisitorTest() {} +  RandomAccessVisitorTest() = default;    static void SetUpTestCase() {      GlobalState = std::make_unique<GlobalTestState>(); diff --git a/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp b/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp index b1f19e9..62b7591 100644 --- a/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp +++ b/llvm/unittests/DebugInfo/CodeView/TypeIndexDiscoveryTest.cpp @@ -21,7 +21,7 @@ using namespace llvm::codeview;  class TypeIndexIteratorTest : public testing::Test {  public: -  TypeIndexIteratorTest() {} +  TypeIndexIteratorTest() = default;    void SetUp() override {      Refs.clear(); diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp index 2fe5260..aa5b292 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp @@ -864,7 +864,7 @@ TEST_F(DebugLineBasicFixture, CallbackUsedForUnterminatedSequence) {  }  struct AdjustAddressFixtureBase : public CommonFixture { -  virtual ~AdjustAddressFixtureBase() {} +  virtual ~AdjustAddressFixtureBase() = default;    // Create and update the prologue as specified by the subclass, then return    // the length of the table. diff --git a/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h b/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h index f03c82f..a2732e3 100644 --- a/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h +++ b/llvm/unittests/ExecutionEngine/JITLink/JITLinkTestUtils.h @@ -19,7 +19,7 @@ class MockJITLinkMemoryManager : public llvm::jitlink::JITLinkMemoryManager {  public:    class Alloc {    public: -    virtual ~Alloc() {} +    virtual ~Alloc() = default;    };    class SimpleAlloc : public Alloc { diff --git a/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp b/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp index 87fad37..25c22d1 100644 --- a/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp +++ b/llvm/unittests/MC/SystemZ/SystemZMCDisassemblerTest.cpp @@ -61,7 +61,7 @@ Context &getContext() {  class SystemZMCSymbolizerTest : public MCSymbolizer {  public:    SystemZMCSymbolizerTest(MCContext &MC) : MCSymbolizer(MC, nullptr) {} -  ~SystemZMCSymbolizerTest() override {} +  ~SystemZMCSymbolizerTest() override = default;    bool tryAddingSymbolicOperand([[maybe_unused]] MCInst &Inst,                                  [[maybe_unused]] raw_ostream &CStream, diff --git a/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp b/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp index 286528f..6d44151 100644 --- a/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp +++ b/llvm/unittests/MC/X86/X86MCDisassemblerTest.cpp @@ -62,7 +62,7 @@ Context &getContext() {  class X86MCSymbolizerTest : public MCSymbolizer {  public:    X86MCSymbolizerTest(MCContext &MC) : MCSymbolizer(MC, nullptr) {} -  ~X86MCSymbolizerTest() override {} +  ~X86MCSymbolizerTest() override = default;    struct OpInfo {      int64_t Value = 0; diff --git a/llvm/unittests/MIR/MachineMetadata.cpp b/llvm/unittests/MIR/MachineMetadata.cpp index 0f038d9..5875512 100644 --- a/llvm/unittests/MIR/MachineMetadata.cpp +++ b/llvm/unittests/MIR/MachineMetadata.cpp @@ -33,7 +33,7 @@ using namespace llvm;  class MachineMetadataTest : public testing::Test {  public: -  MachineMetadataTest() {} +  MachineMetadataTest() = default;  protected:    LLVMContext Context; diff --git a/llvm/unittests/MIR/MachineStableHashTest.cpp b/llvm/unittests/MIR/MachineStableHashTest.cpp index ea0de1a..bedecb1 100644 --- a/llvm/unittests/MIR/MachineStableHashTest.cpp +++ b/llvm/unittests/MIR/MachineStableHashTest.cpp @@ -22,7 +22,7 @@ using namespace llvm;  class MachineStableHashTest : public testing::Test {  public: -  MachineStableHashTest() {} +  MachineStableHashTest() = default;  protected:    LLVMContext Context; diff --git a/llvm/unittests/Support/raw_ostream_proxy_test.cpp b/llvm/unittests/Support/raw_ostream_proxy_test.cpp index 864dda7..446e64a 100644 --- a/llvm/unittests/Support/raw_ostream_proxy_test.cpp +++ b/llvm/unittests/Support/raw_ostream_proxy_test.cpp @@ -40,8 +40,6 @@ public:    bool IsDisplayed = false;  }; -constexpr size_t BufferedNoPwriteSmallVectorStream::PreferredBufferSize; -  TEST(raw_ostream_proxyTest, write) {    // Besides confirming that "write" works, this test confirms that the proxy    // takes on the buffer from the stream it's proxying, such that writes to the diff --git a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp index 4dfc0bc..a835a34 100644 --- a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp +++ b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp @@ -36,10 +36,8 @@ static std::string AArch64InstPrinterTestPrintAlignedLabel(uint64_t value) {    MCAsmInfo MAI;    MCInstrInfo MII;    MCRegisterInfo MRI; -  MCSubtargetInfo STI(Triple(""), "", "", "", {}, -                      ArrayRef((SubtargetFeatureKV *)NULL, (size_t)0), -                      ArrayRef((SubtargetSubTypeKV *)NULL, (size_t)0), NULL, -                      NULL, NULL, NULL, NULL, NULL); +  MCSubtargetInfo STI(Triple(""), "", "", "", {}, {}, {}, nullptr, nullptr, +                      nullptr, nullptr, nullptr, nullptr);    MCContext Ctx(Triple(""), &MAI, &MRI, &STI);    MCInst MI; diff --git a/llvm/unittests/Transforms/Utils/LocalTest.cpp b/llvm/unittests/Transforms/Utils/LocalTest.cpp index 4b53cc3..4908eda 100644 --- a/llvm/unittests/Transforms/Utils/LocalTest.cpp +++ b/llvm/unittests/Transforms/Utils/LocalTest.cpp @@ -1153,7 +1153,7 @@ TEST(Local, ExpressionForConstant) {    IntegerType *Int1Ty = Type::getInt1Ty(Context);    Expr = createExpression(ConstantInt::getTrue(Context), Int1Ty);    EXPECT_NE(Expr, nullptr); -  EXPECT_EQ(Expr->getElement(1), 18446744073709551615U); +  EXPECT_EQ(Expr->getElement(1), 1U);    Expr = createExpression(ConstantInt::getFalse(Context), Int1Ty);    EXPECT_NE(Expr, nullptr); diff --git a/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp index 7a66117b..5bc489b 100644 --- a/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp @@ -28,7 +28,7 @@ using testing::IsEmpty;  using testing::Not;  using testing::NotNull; -constexpr const char kTriple[] = "aarch64-unknown-linux"; +constexpr char kTriple[] = "aarch64-unknown-linux";  class AArch64TargetTest : public ::testing::Test {  protected: diff --git a/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp index 39c4260..0e90654 100644 --- a/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/PowerPC/TargetTest.cpp @@ -26,7 +26,7 @@ using testing::NotNull;  using testing::IsEmpty;  using testing::Not; -constexpr const char kTriple[] = "powerpc64le-unknown-linux"; +constexpr char kTriple[] = "powerpc64le-unknown-linux";  class PowerPCTargetTest : public PPCTestBase {  protected: diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp index c6f3448..7a40901de 100644 --- a/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/X86/SnippetRepetitorTest.cpp @@ -49,8 +49,8 @@ protected:      Fill(Sink);    } -  static constexpr const unsigned kMinInstructions = 3; -  static constexpr const unsigned kLoopBodySize = 5; +  static constexpr unsigned kMinInstructions = 3; +  static constexpr unsigned kLoopBodySize = 5;    std::unique_ptr<TargetMachine> TM;    std::unique_ptr<LLVMContext> Context; diff --git a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp index a0cad28..08c18e4 100644 --- a/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/X86/SubprocessMemoryTest.cpp @@ -29,7 +29,7 @@ namespace exegesis {  // This needs to be updated anytime a test is added or removed from the test  // suite. -static constexpr const size_t TestCount = 4; +static constexpr size_t TestCount = 4;  class SubprocessMemoryTest : public X86TestBase {  protected: diff --git a/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp b/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp index 9ebdb12..5a21a69 100644 --- a/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp +++ b/llvm/unittests/tools/llvm-exegesis/X86/TargetTest.cpp @@ -582,7 +582,7 @@ TEST_F(X86Core2TargetTest, SetRegToDf0) {  TEST_F(X86Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {    const Instruction &I = getInstr(X86::ADD64rm);    InstructionTemplate IT(&I); -  constexpr const int kOffset = 42; +  constexpr int kOffset = 42;    State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);    // Memory is operands 2-6.    EXPECT_THAT(IT.getValueFor(I.Operands[2]), IsReg(X86::RDI)); @@ -595,7 +595,7 @@ TEST_F(X86Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {  TEST_F(X86Core2Avx512TargetTest, FillMemoryOperands_VGATHERDPSZ128rm) {    const Instruction &I = getInstr(X86::VGATHERDPSZ128rm);    InstructionTemplate IT(&I); -  constexpr const int kOffset = 42; +  constexpr int kOffset = 42;    State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);    // Memory is operands 4-8.    EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(X86::RDI)); @@ -625,9 +625,9 @@ TEST_F(X86Core2TargetTest, GenerateLowerMunmapTest) {  }  #ifdef __arm__ -static constexpr const uintptr_t VAddressSpaceCeiling = 0xC0000000; +static constexpr uintptr_t VAddressSpaceCeiling = 0xC0000000;  #else -static constexpr const uintptr_t VAddressSpaceCeiling = 0x0000800000000000; +static constexpr uintptr_t VAddressSpaceCeiling = 0x0000800000000000;  #endif  TEST_F(X86Core2TargetTest, GenerateUpperMunmapTest) { diff --git a/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h b/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h index 4122726..b4c84d1 100644 --- a/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h +++ b/llvm/unittests/tools/llvm-exegesis/X86/TestBase.h @@ -22,7 +22,7 @@ namespace exegesis {  void InitializeX86ExegesisTarget(); -constexpr const char kTriple[] = "x86_64-unknown-linux"; +constexpr char kTriple[] = "x86_64-unknown-linux";  class X86TestBase : public ::testing::Test {  protected: diff --git a/llvm/utils/FileCheck/FileCheck.cpp b/llvm/utils/FileCheck/FileCheck.cpp index 305c28b..a5473f9 100644 --- a/llvm/utils/FileCheck/FileCheck.cpp +++ b/llvm/utils/FileCheck/FileCheck.cpp @@ -193,7 +193,7 @@ struct MarkerStyle {    std::string Note;    /// Does this marker indicate inclusion by -dump-input-filter=error?    bool FiltersAsError; -  MarkerStyle() {} +  MarkerStyle() = default;    MarkerStyle(char Lead, raw_ostream::Colors Color,                const std::string &Note = "", bool FiltersAsError = false)        : Lead(Lead), Color(Color), Note(Note), FiltersAsError(FiltersAsError) { diff --git a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp index 3f284ee..b63ce36 100644 --- a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp +++ b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp @@ -220,7 +220,7 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {                            ProfileLower + "'");      // Name of the object in C++ -    const std::string CppSpelling = ArchInfoName(Major, Minor, ProfileUpper); +    std::string CppSpelling = ArchInfoName(Major, Minor, ProfileUpper);      OS << "inline constexpr ArchInfo " << CppSpelling << " = {\n";      CppSpellings.push_back(std::move(CppSpelling)); diff --git a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn index f280f69..2f84999 100644 --- a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn +++ b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/bugprone/BUILD.gn @@ -32,6 +32,7 @@ static_library("bugprone") {      "CopyConstructorInitCheck.cpp",      "CrtpConstructorAccessibilityCheck.cpp",      "DanglingHandleCheck.cpp", +    "DefaultOperatorNewOnOveralignedTypeCheck.cpp",      "DerivedMethodShadowingBaseMethodCheck.cpp",      "DynamicStaticInitializersCheck.cpp",      "EasilySwappableParametersCheck.cpp", diff --git a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn index 3ad0a83..ec642b6 100644 --- a/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn +++ b/llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn @@ -16,7 +16,6 @@ static_library("cert") {    ]    sources = [      "CERTTidyModule.cpp", -    "DefaultOperatorNewAlignmentCheck.cpp",      "DontModifyStdNamespaceCheck.cpp",      "FloatLoopCounter.cpp",      "LimitedRandomnessCheck.cpp", diff --git a/llvm/utils/gn/secondary/lldb/tools/lldb-dap/BUILD.gn b/llvm/utils/gn/secondary/lldb/tools/lldb-dap/BUILD.gn index a42f781..b6c2f46 100644 --- a/llvm/utils/gn/secondary/lldb/tools/lldb-dap/BUILD.gn +++ b/llvm/utils/gn/secondary/lldb/tools/lldb-dap/BUILD.gn @@ -21,6 +21,7 @@ static_library("lib") {    sources = [      "Breakpoint.cpp",      "BreakpointBase.cpp", +    "ClientLauncher.cpp",      "CommandPlugins.cpp",      "DAP.cpp",      "DAPError.cpp", diff --git a/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn index 5590b27..1e0e918 100644 --- a/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/lib/CAS/BUILD.gn @@ -4,14 +4,17 @@ static_library("CAS") {      "ActionCache.cpp",      "ActionCaches.cpp",      "BuiltinCAS.cpp", +    "BuiltinUnifiedCASDatabases.cpp",      "DatabaseFile.cpp",      "InMemoryCAS.cpp",      "MappedFileRegionArena.cpp",      "ObjectStore.cpp", +    "OnDiskCAS.cpp",      "OnDiskCommon.cpp",      "OnDiskDataAllocator.cpp",      "OnDiskGraphDB.cpp",      "OnDiskKeyValueDB.cpp",      "OnDiskTrieRawHashMap.cpp", +    "UnifiedOnDiskCache.cpp",    ]  } diff --git a/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn b/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn index 2d9eb68..b10e0e6 100644 --- a/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/unittests/CAS/BUILD.gn @@ -9,8 +9,10 @@ unittest("CASTests") {    ]    sources = [      "ActionCacheTest.cpp", +    "BuiltinUnifiedCASDatabasesTest.cpp",      "CASTestConfig.cpp",      "ObjectStoreTest.cpp", +    "UnifiedOnDiskCacheTest.cpp",    ]    if (llvm_enable_ondisk_cas) { diff --git a/llvm/utils/profcheck-xfail.txt b/llvm/utils/profcheck-xfail.txt index 380b162..d7af3a7 100644 --- a/llvm/utils/profcheck-xfail.txt +++ b/llvm/utils/profcheck-xfail.txt @@ -530,32 +530,6 @@ Instrumentation/TypeSanitizer/swifterror.ll  LTO/X86/diagnostic-handler-remarks-with-hotness.ll  Other/optimization-remarks-auto.ll  Other/X86/debugcounter-partiallyinlinelibcalls.ll -tools/llvm-objcopy/ELF/auto-remove-add-symtab-shndx.test -tools/UpdateTestChecks/update_analyze_test_checks/loop-access-analysis.test -tools/UpdateTestChecks/update_analyze_test_checks/loop-distribute.test -tools/UpdateTestChecks/update_test_checks/argument_name_reuse.test -tools/UpdateTestChecks/update_test_checks/basic.test -tools/UpdateTestChecks/update_test_checks/check_attrs.test -tools/UpdateTestChecks/update_test_checks/difile_absolute_filenames.test -tools/UpdateTestChecks/update_test_checks/filter_out_after.test -tools/UpdateTestChecks/update_test_checks/generated_funcs_prefix_reuse.test -tools/UpdateTestChecks/update_test_checks/generated_funcs.test -tools/UpdateTestChecks/update_test_checks/global_preserve_name.test -tools/UpdateTestChecks/update_test_checks/if_target.test -tools/UpdateTestChecks/update_test_checks/named_function_arguments_split.test -tools/UpdateTestChecks/update_test_checks/on_the_fly_arg_change.test -tools/UpdateTestChecks/update_test_checks/phi-labels.test -tools/UpdateTestChecks/update_test_checks/pre-process.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values2.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values3.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values4.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values5.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values6.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values_funcs.test -tools/UpdateTestChecks/update_test_checks/stable_ir_values.test -tools/UpdateTestChecks/update_test_checks/switch_case.test -tools/UpdateTestChecks/update_test_checks/tbaa-semantics-checks.test -tools/UpdateTestChecks/update_test_checks/various_ir_values_dbgrecords.test  Transforms/AtomicExpand/AArch64/atomicrmw-fp.ll  Transforms/AtomicExpand/AArch64/expand-atomicrmw-xchg-fp.ll  Transforms/AtomicExpand/AArch64/pcsections.ll @@ -917,7 +891,6 @@ Transforms/InstCombine/select_frexp.ll  Transforms/InstCombine/select.ll  Transforms/InstCombine/select-min-max.ll  Transforms/InstCombine/select-of-symmetric-selects.ll -Transforms/InstCombine/select-safe-transforms.ll  Transforms/InstCombine/select-select.ll  Transforms/InstCombine/select-with-extreme-eq-cond.ll  Transforms/InstCombine/shift.ll @@ -1324,6 +1297,7 @@ Transforms/SimpleLoopUnswitch/trivial-unswitch.ll  Transforms/SimpleLoopUnswitch/trivial-unswitch-logical-and-or.ll  Transforms/StackProtector/cross-dso-cfi-stack-chk-fail.ll  Transforms/StructurizeCFG/AMDGPU/uniform-regions.ll +Transforms/StructurizeCFG/callbr.ll  Transforms/StructurizeCFG/hoist-zerocost.ll  Transforms/StructurizeCFG/loop-break-phi.ll  Transforms/StructurizeCFG/nested-loop-order.ll diff --git a/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h b/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h index 7b53594..a9886d1 100644 --- a/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h +++ b/mlir/include/mlir/Dialect/GPU/IR/GPUDialect.h @@ -178,8 +178,8 @@ enum class SparseHandleKind { SpMat, DnTensor, SpGEMMOp };  class SparseDnTensorHandleType      : public Type::TypeBase<SparseDnTensorHandleType, Type, TypeStorage> {  public: -  using Base = typename Type::TypeBase<SparseDnTensorHandleType, Type, -                                       TypeStorage>::Base; +  using Base = +      Type::TypeBase<SparseDnTensorHandleType, Type, TypeStorage>::Base;    using Base::Base;    static constexpr StringLiteral name = "gpu.sparse.dntensor_handle"; @@ -188,8 +188,7 @@ public:  class SparseSpMatHandleType      : public Type::TypeBase<SparseSpMatHandleType, Type, TypeStorage> {  public: -  using Base = -      typename Type::TypeBase<SparseSpMatHandleType, Type, TypeStorage>::Base; +  using Base = Type::TypeBase<SparseSpMatHandleType, Type, TypeStorage>::Base;    using Base::Base;    static constexpr StringLiteral name = "gpu.sparse.spmat_handle"; @@ -198,8 +197,8 @@ public:  class SparseSpGEMMOpHandleType      : public Type::TypeBase<SparseSpGEMMOpHandleType, Type, TypeStorage> {  public: -  using Base = typename Type::TypeBase<SparseSpGEMMOpHandleType, Type, -                                       TypeStorage>::Base; +  using Base = +      Type::TypeBase<SparseSpGEMMOpHandleType, Type, TypeStorage>::Base;    using Base::Base;    static constexpr StringLiteral name = "gpu.sparse.spgemmop_handle"; diff --git a/mlir/include/mlir/Dialect/XeGPU/IR/XeGPU.h b/mlir/include/mlir/Dialect/XeGPU/IR/XeGPU.h index 1481859..0c05996 100644 --- a/mlir/include/mlir/Dialect/XeGPU/IR/XeGPU.h +++ b/mlir/include/mlir/Dialect/XeGPU/IR/XeGPU.h @@ -30,9 +30,11 @@ class SliceAttr;  } // namespace xegpu  } // namespace mlir +// clang-format off +#include <mlir/Dialect/XeGPU/IR/XeGPUEnums.h.inc>  #include <mlir/Dialect/XeGPU/IR/XeGPUAttrInterface.h.inc>  #include <mlir/Dialect/XeGPU/IR/XeGPUDialect.h.inc> -#include <mlir/Dialect/XeGPU/IR/XeGPUEnums.h.inc> +// clang-format on  #define GET_ATTRDEF_CLASSES  #include <mlir/Dialect/XeGPU/IR/XeGPUAttrs.h.inc> diff --git a/mlir/include/mlir/Dialect/XeGPU/IR/XeGPUAttrs.td b/mlir/include/mlir/Dialect/XeGPU/IR/XeGPUAttrs.td index 40352b4..9c35c07 100644 --- a/mlir/include/mlir/Dialect/XeGPU/IR/XeGPUAttrs.td +++ b/mlir/include/mlir/Dialect/XeGPU/IR/XeGPUAttrs.td @@ -223,17 +223,17 @@ def DistributeLayoutAttr: AttrInterface<"DistributeLayoutAttr"> {      InterfaceMethod<"Derive a new layout by dropping InstData",                      "xegpu::DistributeLayoutAttr",                      "dropInstData">, -    InterfaceMethod<[{Delinearizes a linear subgroup ID into its multidimensional -                      indices based on the effective subgroup layout.}], +    InterfaceMethod<[{Delinearizes a linear ID into its multidimensional +                      indices based on the effective layout level.}],                      "FailureOr<SmallVector<Value>>", -                    "delinearizeSubgroupId", +                    "delinearizeId",                      (ins "OpBuilder &": $builder, "Location":$loc, "Value":$linearId)>, -    InterfaceMethod<[{Generates instructions to compute multidimensional offsets for blocks -                      assigned to a subgroup identified by linearId. The shape parameter -                      represents the workgroup-level problem size. Each subgroup may access +    InterfaceMethod<[{Generates instructions to compute multidimensional coordinates for dist units +                      assigned to a level identified by linearId. The shape parameter +                      represents the higher-level problem size. Each level may access                        multiple blocks according to round-robin distribution rules.}],                      "FailureOr<SmallVector<SmallVector<Value>>>", -                    "getOffsets", +                    "computeDistributedCoords",                      (ins "OpBuilder &": $builder, "Location":$loc, "Value":$linearId, "ArrayRef<int64_t>":$shape)>,      InterfaceMethod</*desc=*/[{Check if this layout can be achieved by applying a transpose                       to some other layout according to given permutation of (0...n-1).}], @@ -476,17 +476,17 @@ def XeGPU_LayoutAttr : XeGPUAttr<"Layout", "layout", [DistributeLayoutAttr]> {        return {};      } -    /// Delinearizes a linear subgroup ID into its multidimensional indices -    /// based on the effective subgroup layout. +    /// Delinearizes a linear ID into its multidimensional indices +    /// based on the effective level of the layout.      FailureOr<SmallVector<Value>> -    delinearizeSubgroupId(OpBuilder &builder, Location loc, Value linearId); +    delinearizeId(OpBuilder &builder, Location loc, Value linearId); -    /// Generates instructions to compute multidimensional offsets for blocks -    /// assigned to a subgroup identified by linearId. The shape parameter -    /// represents the workgroup-level problem size. Each subgroup may access +    /// Generates instructions to compute multidimensional coordinates for dist units +    /// assigned to a level identified by linearId. The shape parameter +    /// represents the higher-level problem size. Each `level` may access      /// multiple blocks according to round-robin distribution rules.      FailureOr<SmallVector<SmallVector<Value>>> -    getOffsets(OpBuilder &builder, Location loc, Value linearId, ArrayRef<int64_t> shape); +    computeDistributedCoords(OpBuilder &builder, Location loc, Value linearId, ArrayRef<int64_t> shape);      /// Check if this is slice of some other layout.      bool isSliceOf(const xegpu::DistributeLayoutAttr &other) { return false; } @@ -643,14 +643,15 @@ def XeGPU_SliceAttr : XeGPUAttr<"Slice", "slice", [DistributeLayoutAttr]> {      /// Delinearizes a linear subgroup ID into its multidimensional indices      /// based on the effective subgroup layout.      FailureOr<SmallVector<Value>> -    delinearizeSubgroupId(OpBuilder &builder, Location loc, Value linearId); +    delinearizeId(OpBuilder &builder, Location loc, Value linearId); -    /// Generates instructions to compute multidimensional offsets for blocks +    /// Generates instructions to compute multidimensional coordinates for blocks      /// assigned to a subgroup identified by linearId. The shape parameter      /// represents the workgroup-level problem size. Each subgroup may access      /// multiple blocks according to round-robin distribution rules. +      FailureOr<SmallVector<SmallVector<Value>>> -    getOffsets(OpBuilder &builder, Location loc, Value linearId, ArrayRef<int64_t> shape); +    computeDistributedCoords(OpBuilder &builder, Location loc, Value linearId, ArrayRef<int64_t> shape);      /// Check if this is slice of some other layout.      bool isSliceOf(const xegpu::DistributeLayoutAttr &other); diff --git a/mlir/include/mlir/Dialect/XeGPU/Transforms/Passes.td b/mlir/include/mlir/Dialect/XeGPU/Transforms/Passes.td index b7af541..eb05628 100644 --- a/mlir/include/mlir/Dialect/XeGPU/Transforms/Passes.td +++ b/mlir/include/mlir/Dialect/XeGPU/Transforms/Passes.td @@ -26,7 +26,7 @@ def XeGPUSubgroupDistribute : Pass<"xegpu-subgroup-distribute"> {      The pass distributes subgroup level (SIMD) XeGPU ops to work items.    }];    let dependentDialects = ["memref::MemRefDialect", "xegpu::XeGPUDialect", -                           "vector::VectorDialect"]; +                           "vector::VectorDialect", "index::IndexDialect"];  }  def XeGPUPropagateLayout : Pass<"xegpu-propagate-layout"> { diff --git a/mlir/include/mlir/IR/BlockSupport.h b/mlir/include/mlir/IR/BlockSupport.h index f9fbef2..a2e080e 100644 --- a/mlir/include/mlir/IR/BlockSupport.h +++ b/mlir/include/mlir/IR/BlockSupport.h @@ -206,12 +206,12 @@ namespace ilist_detail {  // operations to have trailing Regions without a circular include  // dependence.  template <> -struct SpecificNodeAccess< -    typename compute_node_options<::mlir::Operation>::type> : NodeAccess { +struct SpecificNodeAccess<compute_node_options<::mlir::Operation>::type> +    : NodeAccess {  protected: -  using OptionsT = typename compute_node_options<mlir::Operation>::type; -  using pointer = typename OptionsT::pointer; -  using const_pointer = typename OptionsT::const_pointer; +  using OptionsT = compute_node_options<mlir::Operation>::type; +  using pointer = OptionsT::pointer; +  using const_pointer = OptionsT::const_pointer;    using node_type = ilist_node_impl<OptionsT>;    static node_type *getNodePtr(pointer N); diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp index 82bdb84..74936e3 100644 --- a/mlir/lib/AsmParser/Parser.cpp +++ b/mlir/lib/AsmParser/Parser.cpp @@ -407,8 +407,8 @@ Parser::parseFloatFromIntegerLiteral(std::optional<APFloat> &result,                       "hexadecimal float constant out of range for type");    } -  APInt truncatedValue(typeSizeInBits, intValue.getNumWords(), -                       intValue.getRawData()); +  APInt truncatedValue(typeSizeInBits, +                       ArrayRef(intValue.getRawData(), intValue.getNumWords()));    result.emplace(semantics, truncatedValue);    return success();  } diff --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp index ba57155..03ed4d5 100644 --- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp +++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp @@ -240,8 +240,7 @@ struct CmpFOpLowering : public ConvertOpToLLVMPattern<arith::CmpFOp> {  struct SelectOpOneToNLowering : public ConvertOpToLLVMPattern<arith::SelectOp> {    using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern; -  using Adaptor = -      typename ConvertOpToLLVMPattern<arith::SelectOp>::OneToNOpAdaptor; +  using Adaptor = ConvertOpToLLVMPattern<arith::SelectOp>::OneToNOpAdaptor;    LogicalResult    matchAndRewrite(arith::SelectOp op, Adaptor adaptor, diff --git a/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp b/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp index 798d8b0..b75968e 100644 --- a/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp +++ b/mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp @@ -137,8 +137,7 @@ static SmallVector<Value> flattenValues(ArrayRef<ValueRange> values) {  /// op to llvm.br.  struct BranchOpLowering : public ConvertOpToLLVMPattern<cf::BranchOp> {    using ConvertOpToLLVMPattern<cf::BranchOp>::ConvertOpToLLVMPattern; -  using Adaptor = -      typename ConvertOpToLLVMPattern<cf::BranchOp>::OneToNOpAdaptor; +  using Adaptor = ConvertOpToLLVMPattern<cf::BranchOp>::OneToNOpAdaptor;    LogicalResult    matchAndRewrite(cf::BranchOp op, Adaptor adaptor, @@ -163,8 +162,7 @@ struct BranchOpLowering : public ConvertOpToLLVMPattern<cf::BranchOp> {  /// branch op to llvm.cond_br.  struct CondBranchOpLowering : public ConvertOpToLLVMPattern<cf::CondBranchOp> {    using ConvertOpToLLVMPattern<cf::CondBranchOp>::ConvertOpToLLVMPattern; -  using Adaptor = -      typename ConvertOpToLLVMPattern<cf::CondBranchOp>::OneToNOpAdaptor; +  using Adaptor = ConvertOpToLLVMPattern<cf::CondBranchOp>::OneToNOpAdaptor;    LogicalResult    matchAndRewrite(cf::CondBranchOp op, Adaptor adaptor, @@ -204,7 +202,7 @@ struct SwitchOpLowering : public ConvertOpToLLVMPattern<cf::SwitchOp> {    using ConvertOpToLLVMPattern<cf::SwitchOp>::ConvertOpToLLVMPattern;    LogicalResult -  matchAndRewrite(cf::SwitchOp op, typename cf::SwitchOp::Adaptor adaptor, +  matchAndRewrite(cf::SwitchOp op, cf::SwitchOp::Adaptor adaptor,                    ConversionPatternRewriter &rewriter) const override {      // Get or convert default block.      FailureOr<Block *> convertedDefaultBlock = getConvertedBlock( diff --git a/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp b/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp index a2dfc12..a922338 100644 --- a/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp +++ b/mlir/lib/Conversion/MathToROCDL/MathToROCDL.cpp @@ -68,7 +68,7 @@ struct ClampFOpConversion final        return LLVM::detail::handleMultidimensionalVectors(            op.getOperation(), adaptor.getOperands(), *getTypeConverter(),            [&](Type llvm1DVectorTy, ValueRange operands) -> Value { -            typename math::ClampFOp::Adaptor adaptor(operands); +            math::ClampFOp::Adaptor adaptor(operands);              return ROCDL::FMed3Op::create(rewriter, op.getLoc(), llvm1DVectorTy,                                            adaptor.getValue(), adaptor.getMin(),                                            adaptor.getMax()); diff --git a/mlir/lib/Conversion/XeGPUToXeVM/XeGPUToXeVM.cpp b/mlir/lib/Conversion/XeGPUToXeVM/XeGPUToXeVM.cpp index 33e8f2e..de552ce 100644 --- a/mlir/lib/Conversion/XeGPUToXeVM/XeGPUToXeVM.cpp +++ b/mlir/lib/Conversion/XeGPUToXeVM/XeGPUToXeVM.cpp @@ -562,6 +562,8 @@ class LoadStoreMatrixToXeVMPattern : public OpConversionPattern<OpType> {      VectorType valOrResVecTy = dyn_cast<VectorType>(data.getType());      if (!valOrResVecTy)        valOrResVecTy = VectorType::get(1, data.getType()); +    if (valOrResVecTy.getShape().size() != 1) +      return rewriter.notifyMatchFailure(op, "Expected 1D data vector.");      int64_t elemBitWidth =          valOrResVecTy.getElementType().getIntOrFloatBitWidth(); diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp index 0992ce14..d478220 100644 --- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp +++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp @@ -584,6 +584,10 @@ void ForOp::print(OpAsmPrinter &p) {  LogicalResult ForOp::verifyRegions() {    // Check that the body defines as single block argument for the induction    // variable. +  if (getBody()->getNumArguments() != 1) +    return emitOpError("expected body to have a single block argument for the " +                       "induction variable"); +    if (getInductionVar().getType() != getLowerBound().getType())      return emitOpError(          "expected induction variable to be same type as bounds and step"); diff --git a/mlir/lib/Dialect/SCF/IR/SCF.cpp b/mlir/lib/Dialect/SCF/IR/SCF.cpp index 2946b53..881e256 100644 --- a/mlir/lib/Dialect/SCF/IR/SCF.cpp +++ b/mlir/lib/Dialect/SCF/IR/SCF.cpp @@ -2565,6 +2565,39 @@ struct ConvertTrivialIfToSelect : public OpRewritePattern<IfOp> {  struct ConditionPropagation : public OpRewritePattern<IfOp> {    using OpRewritePattern<IfOp>::OpRewritePattern; +  /// Kind of parent region in the ancestor cache. +  enum class Parent { Then, Else, None }; + +  /// Returns the kind of region ("then", "else", or "none") of the +  /// IfOp that the given region is transitively nested in. Updates +  /// the cache accordingly. +  static Parent getParentType(Region *toCheck, IfOp op, +                              DenseMap<Region *, Parent> &cache, +                              Region *endRegion) { +    SmallVector<Region *> seen; +    while (toCheck != endRegion) { +      auto found = cache.find(toCheck); +      if (found != cache.end()) +        return found->second; +      seen.push_back(toCheck); +      if (&op.getThenRegion() == toCheck) { +        for (Region *region : seen) +          cache[region] = Parent::Then; +        return Parent::Then; +      } +      if (&op.getElseRegion() == toCheck) { +        for (Region *region : seen) +          cache[region] = Parent::Else; +        return Parent::Else; +      } +      toCheck = toCheck->getParentRegion(); +    } + +    for (Region *region : seen) +      cache[region] = Parent::None; +    return Parent::None; +  } +    LogicalResult matchAndRewrite(IfOp op,                                  PatternRewriter &rewriter) const override {      // Early exit if the condition is constant since replacing a constant @@ -2580,9 +2613,12 @@ struct ConditionPropagation : public OpRewritePattern<IfOp> {      Value constantTrue = nullptr;      Value constantFalse = nullptr; +    DenseMap<Region *, Parent> cache;      for (OpOperand &use :           llvm::make_early_inc_range(op.getCondition().getUses())) { -      if (op.getThenRegion().isAncestor(use.getOwner()->getParentRegion())) { +      switch (getParentType(use.getOwner()->getParentRegion(), op, cache, +                            op.getCondition().getParentRegion())) { +      case Parent::Then: {          changed = true;          if (!constantTrue) @@ -2591,8 +2627,9 @@ struct ConditionPropagation : public OpRewritePattern<IfOp> {          rewriter.modifyOpInPlace(use.getOwner(),                                   [&]() { use.set(constantTrue); }); -      } else if (op.getElseRegion().isAncestor( -                     use.getOwner()->getParentRegion())) { +        break; +      } +      case Parent::Else: {          changed = true;          if (!constantFalse) @@ -2601,6 +2638,10 @@ struct ConditionPropagation : public OpRewritePattern<IfOp> {          rewriter.modifyOpInPlace(use.getOwner(),                                   [&]() { use.set(constantFalse); }); +        break; +      } +      case Parent::None: +        break;        }      } diff --git a/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp b/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp index 7a26cd3..1fbcf5f 100644 --- a/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp +++ b/mlir/lib/Dialect/SparseTensor/Transforms/SparseTensorCodegen.cpp @@ -1050,7 +1050,7 @@ public:  /// Sparse codegen rule for position accesses.  class SparseToPositionsConverter : public OpConversionPattern<ToPositionsOp> {  public: -  using OpAdaptor = typename ToPositionsOp::Adaptor; +  using OpAdaptor = ToPositionsOp::Adaptor;    using OpConversionPattern<ToPositionsOp>::OpConversionPattern;    LogicalResult    matchAndRewrite(ToPositionsOp op, OneToNOpAdaptor adaptor, @@ -1073,7 +1073,7 @@ public:  class SparseToCoordinatesConverter      : public OpConversionPattern<ToCoordinatesOp> {  public: -  using OpAdaptor = typename ToCoordinatesOp::Adaptor; +  using OpAdaptor = ToCoordinatesOp::Adaptor;    using OpConversionPattern<ToCoordinatesOp>::OpConversionPattern;    LogicalResult    matchAndRewrite(ToCoordinatesOp op, OneToNOpAdaptor adaptor, @@ -1099,7 +1099,7 @@ public:  class SparseToCoordinatesBufferConverter      : public OpConversionPattern<ToCoordinatesBufferOp> {  public: -  using OpAdaptor = typename ToCoordinatesBufferOp::Adaptor; +  using OpAdaptor = ToCoordinatesBufferOp::Adaptor;    using OpConversionPattern<ToCoordinatesBufferOp>::OpConversionPattern;    LogicalResult    matchAndRewrite(ToCoordinatesBufferOp op, OneToNOpAdaptor adaptor, @@ -1121,7 +1121,7 @@ public:  /// Sparse codegen rule for value accesses.  class SparseToValuesConverter : public OpConversionPattern<ToValuesOp> {  public: -  using OpAdaptor = typename ToValuesOp::Adaptor; +  using OpAdaptor = ToValuesOp::Adaptor;    using OpConversionPattern<ToValuesOp>::OpConversionPattern;    LogicalResult    matchAndRewrite(ToValuesOp op, OneToNOpAdaptor adaptor, diff --git a/mlir/lib/Dialect/XeGPU/IR/XeGPUDialect.cpp b/mlir/lib/Dialect/XeGPU/IR/XeGPUDialect.cpp index 83406c8..397107b 100644 --- a/mlir/lib/Dialect/XeGPU/IR/XeGPUDialect.cpp +++ b/mlir/lib/Dialect/XeGPU/IR/XeGPUDialect.cpp @@ -37,55 +37,61 @@ void XeGPUDialect::initialize() {        >();  } -/// Generates instructions to compute offsets for a subgroup identified by -/// its multidimensional indices (sgId), using the specified subgroup layout -/// (sgLayout), subgroup data dimensions (sizePerSg), and the overall data -/// dimensions (sizePerWg). +// A `srcShape` consists of N distribution units, each being `subShapesLayout` x +// `subShape`. A `delinearizedId` is used to identify a particular `subShape` +// within each distribution unit. +// Example: +// WG data is 128x256. SG data is 16x32, in 4x2 layout, this gives a +// distribution unit of shape 64x64, we have 2x4 such distribution units. +// `delinearizedId` is used to identify a 16x32 of a subgroup in each +// distribution unit.  static SmallVector<SmallVector<Value>> -genOffsetsComputingInsts(OpBuilder &builder, Location loc, -                         SmallVector<Value> sgId, ArrayRef<int64_t> sgLayout, -                         ArrayRef<int64_t> sizePerSg, -                         ArrayRef<int64_t> sizePerWg) { - -  SmallVector<SmallVector<Value>> offsets; +genCoordinates(OpBuilder &builder, Location loc, +               SmallVector<Value> delinearizedId, +               ArrayRef<int64_t> subShapesLayout, ArrayRef<int64_t> subShape, +               ArrayRef<int64_t> srcShape) { +  SmallVector<SmallVector<Value>> coordinates; + +  // A distribution unit must be less than or equal to `srcShape` +  SmallVector<int64_t> distUnitShape = llvm::map_to_vector( +      llvm::zip_equal(srcShape, +                      computeElementwiseMul(subShapesLayout, subShape)), +      [](const auto &t) { return std::min(std::get<0>(t), std::get<1>(t)); }); -  // nd local offset, localOffset[i] = sgId[i] * sizePerSg[i] -  SmallVector<Value> localOffsets = llvm::map_to_vector( -      llvm::zip(sgId, sizePerSg), [&](const auto &t) -> Value { +  // Get the offset of `subShape` within a distribution unit. +  SmallVector<Value> distUnitLocalOffset = llvm::map_to_vector( +      llvm::zip(delinearizedId, subShape), [&](const auto &t) -> Value {          return builder.createOrFold<index::MulOp>(              loc, std::get<0>(t),              builder.createOrFold<arith::ConstantIndexOp>(loc, std::get<1>(t)));        }); -  // distUnit[i] is the minimum value between sizePerWg[i] and -  // sgLayout[i] * sizePerSg[i] -  SmallVector<int64_t> distUnit = llvm::map_to_vector( -      llvm::zip_equal(sizePerWg, computeElementwiseMul(sgLayout, sizePerSg)), -      [](const auto &t) { return std::min(std::get<0>(t), std::get<1>(t)); }); - +  // For each dist unit    for (SmallVector<int64_t> unitOffs : -       StaticTileOffsetRange(sizePerWg, distUnit)) { +       StaticTileOffsetRange(srcShape, distUnitShape)) { +    // Get dist unit offset within `srcShape`.      SmallVector<Value> base =          llvm::map_to_vector(unitOffs, [&](int64_t d) -> Value {            return arith::ConstantIndexOp::create(builder, loc, d);          }); - -    SmallVector<Value> adds = llvm::map_to_vector( -        llvm::zip_equal(base, localOffsets), [&](const auto &t) -> Value { -          return builder.createOrFold<arith::AddIOp>(loc, std::get<0>(t), -                                                     std::get<1>(t)); -        }); - +    // Calculate `subShape` offset within `srcShape`. +    SmallVector<Value> adds = +        llvm::map_to_vector(llvm::zip_equal(base, distUnitLocalOffset), +                            [&](const auto &t) -> Value { +                              return builder.createOrFold<arith::AddIOp>( +                                  loc, std::get<0>(t), std::get<1>(t)); +                            }); +    // Do not go beyond `srcShape` bounds.      SmallVector<Value> mods = llvm::map_to_vector( -        llvm::zip_equal(adds, sizePerWg), [&](const auto &t) -> Value { +        llvm::zip_equal(adds, srcShape), [&](const auto &t) -> Value {            return builder.createOrFold<index::RemUOp>(                loc, std::get<0>(t),                arith::ConstantIndexOp::create(builder, loc, std::get<1>(t)));          }); -    offsets.push_back(mods); +    coordinates.push_back(mods);    } -  return offsets; +  return coordinates;  }  // Checks if the given shape can be evenly distributed based on the layout @@ -272,12 +278,7 @@ LayoutAttr::verify(llvm::function_ref<mlir::InFlightDiagnostic()> emitError,  }  FailureOr<SmallVector<Value>> -LayoutAttr::delinearizeSubgroupId(OpBuilder &builder, Location loc, -                                  Value linearId) { -  // delinearizeSubgroupId is only available for -  // workgroup-level layout attribute -  if (!isForWorkgroup()) -    return failure(); +LayoutAttr::delinearizeId(OpBuilder &builder, Location loc, Value linearId) {    // TODO: handle order attribute    auto hasDefaultOrder = [&]() { @@ -287,41 +288,52 @@ LayoutAttr::delinearizeSubgroupId(OpBuilder &builder, Location loc,    };    if (!hasDefaultOrder())      return mlir::emitError(loc, "order attribute is currently not supported."); - -  auto dims = -      llvm::map_to_vector(getEffectiveSgLayoutAsInt(), [&](int64_t d) -> Value { -        return builder.createOrFold<arith::ConstantIndexOp>(loc, d); -      }); +  SmallVector<int64_t> layout; +  if (isForWorkgroup()) { +    layout = getEffectiveSgLayoutAsInt(); +  } else if (isForSubgroup()) { +    layout = getEffectiveLaneLayoutAsInt(); +  } else { +    return failure(); +  } +  auto dims = llvm::map_to_vector(layout, [&](int64_t d) -> Value { +    return builder.createOrFold<arith::ConstantIndexOp>(loc, d); +  });    return affine::delinearizeIndex(builder, loc, linearId, dims);  } -/// Implements DistributeLayoutAttr::getOffsets to generate +/// Implements DistributeLayoutAttr::computeDistributedCoords to generate  /// instructions for computing multi-dimensional offsets when distributed by  /// LayoutAttr.  FailureOr<SmallVector<SmallVector<Value>>> -LayoutAttr::getOffsets(OpBuilder &builder, Location loc, Value linearId, -                       ArrayRef<int64_t> shape) { -  if (!isForWorkgroup()) +LayoutAttr::computeDistributedCoords(OpBuilder &builder, Location loc, +                                     Value linearId, ArrayRef<int64_t> shape) { +  SmallVector<int64_t> layout; +  SmallVector<int64_t> subShape; +  if (isForWorkgroup()) { +    layout = getEffectiveSgLayoutAsInt(); +    subShape = getEffectiveSgDataAsInt(); +  } else if (isForSubgroup()) { +    layout = getEffectiveLaneLayoutAsInt(); +    subShape = getEffectiveLaneDataAsInt(); +  } else {      return failure(); - -  SmallVector<int64_t> sgLayout = getEffectiveSgLayoutAsInt(); -  SmallVector<int64_t> sgShape = getEffectiveSgDataAsInt(); -  if (sgShape.empty()) { -    if (auto derivedShape = computeShapeRatio(shape, sgLayout)) -      sgShape = derivedShape.value(); +  } +  if (subShape.empty()) { +    if (auto derivedShape = computeShapeRatio(shape, layout)) +      subShape = derivedShape.value();      else        return failure();    }    // delinearize Ids -  auto maybeIds = delinearizeSubgroupId(builder, loc, linearId); +  auto maybeIds = delinearizeId(builder, loc, linearId);    if (failed(maybeIds))      return failure(); -  SmallVector<Value> sgIds = *maybeIds; +  SmallVector<Value> ids = *maybeIds; -  return genOffsetsComputingInsts(builder, loc, sgIds, sgLayout, sgShape, -                                  shape); +  return genCoordinates(builder, loc, ids, layout, subShape, shape);  }  //===----------------------------------------------------------------------===// @@ -375,34 +387,43 @@ SliceAttr SliceAttr::flatten() const {  }  FailureOr<SmallVector<Value>> -SliceAttr::delinearizeSubgroupId(OpBuilder &builder, Location loc, -                                 Value linearId) { +SliceAttr::delinearizeId(OpBuilder &builder, Location loc, Value linearId) {    SliceAttr attr = flatten();    auto parent = dyn_cast<LayoutAttr>(attr.getParent()); -  return parent.delinearizeSubgroupId(builder, loc, linearId); +  return parent.delinearizeId(builder, loc, linearId);  } -/// Implements DistributeLayoutAttr::getOffsets to generate -/// instructions for computing multi-dimensional offsets when distributed by -/// SliceAttr. +// Implements DistributeLayoutAttr::computeDistributedCoords to generate +// instructions for computing multi-dimensional offsets when distributed by +// LayoutAttr.  FailureOr<SmallVector<SmallVector<Value>>> -SliceAttr::getOffsets(OpBuilder &builder, Location loc, Value linearId, -                      ArrayRef<int64_t> shape) { +SliceAttr::computeDistributedCoords(OpBuilder &builder, Location loc, +                                    Value linearId, ArrayRef<int64_t> shape) {    assert(getRank() == static_cast<int64_t>(shape.size()) && "invalid shape.");    if (!isForWorkgroup())      return failure(); -  SmallVector<int64_t> sgLayout = getEffectiveSgLayoutAsInt(); -  SmallVector<int64_t> sgShape = getEffectiveSgDataAsInt(); -  if (sgShape.empty()) { -    if (auto derivedShape = computeShapeRatio(shape, sgLayout)) -      sgShape = derivedShape.value(); +  SmallVector<int64_t> layout; +  SmallVector<int64_t> subShape; +  if (isForWorkgroup()) { +    layout = getEffectiveSgLayoutAsInt(); +    subShape = getEffectiveSgDataAsInt(); +  } else if (isForSubgroup()) { +    layout = getEffectiveLaneLayoutAsInt(); +    subShape = getEffectiveLaneDataAsInt(); +  } else { +    return failure(); +  } + +  if (subShape.empty()) { +    if (auto derivedShape = computeShapeRatio(shape, layout)) +      subShape = derivedShape.value();      else        return failure();    }    // delinearize Ids -  auto maybeIds = delinearizeSubgroupId(builder, loc, linearId); +  auto maybeIds = delinearizeId(builder, loc, linearId);    if (failed(maybeIds))      return failure(); @@ -412,8 +433,7 @@ SliceAttr::getOffsets(OpBuilder &builder, Location loc, Value linearId,    SmallVector<Value> sgIds =        XeGPUDialect::slice(ArrayRef<Value>(*maybeIds), dims); -  return genOffsetsComputingInsts(builder, loc, sgIds, sgLayout, sgShape, -                                  shape); +  return genCoordinates(builder, loc, sgIds, layout, subShape, shape);  }  bool SliceAttr::isSliceOf(const xegpu::DistributeLayoutAttr &other) { diff --git a/mlir/lib/Dialect/XeGPU/IR/XeGPUOps.cpp b/mlir/lib/Dialect/XeGPU/IR/XeGPUOps.cpp index abd12e2..7b6c4b6 100644 --- a/mlir/lib/Dialect/XeGPU/IR/XeGPUOps.cpp +++ b/mlir/lib/Dialect/XeGPU/IR/XeGPUOps.cpp @@ -175,13 +175,13 @@ isValidGatherScatterBufferParams(Type offsetsTy, Type maskTy,  LogicalResult  IsValidMatrixOpParams(VectorType dataTy, MemDescType mdescTy, -                      UnitAttr subgroup_block_io, +                      UnitAttr subgroup_block_io, DistributeLayoutAttr layout,                        function_ref<InFlightDiagnostic()> emitError) {    if (!dataTy) {      if (subgroup_block_io)        return emitError() << "subgroup_block_io " -                            "are only allowed when result is a 1D VectorType."; +                            "are only allowed when result is a VectorType.";      else        return success();    } @@ -192,15 +192,37 @@ IsValidMatrixOpParams(VectorType dataTy, MemDescType mdescTy,    ArrayRef<int64_t> dataShape = dataTy.getShape();    ArrayRef<int64_t> mdescShape = mdescTy.getShape(); +  SmallVector<int64_t> blockShape = mdescTy.getBlockShape(); +  ArrayAttr strideAttr = mdescTy.getStrideAttr(); +  SmallVector<int64_t> strides; +  for (Attribute attr : strideAttr.getValue()) { +    strides.push_back(cast<IntegerAttr>(attr).getInt()); +  } +  if (subgroup_block_io && layout) { +    auto laneData = layout.getEffectiveLaneDataAsInt(); +    auto laneLayout = layout.getEffectiveLaneLayoutAsInt(); +    if (!laneData.empty()) { +      bool isLaneDataContiguous = +          std::all_of(laneData.begin(), std::prev(laneData.end()), +                      [](int x) { return x == 1; }); +      if (!isLaneDataContiguous) +        return emitError() << "With subgroup_block_io, accessed data must be " +                              "contiguous and coalesced."; +      for (size_t i = 0; i < laneData.size(); ++i) { +        if (laneLayout[i] != blockShape[i]) +          return emitError() << "With subgroup_block_io, the block shape must " +                                "match the lane layout."; +        if (laneLayout[i] != 1 && strides[i] != 1) +          return emitError() << "With subgroup_block_io, the distributed " +                                "dimensions must be contiguous."; +      } +    } +  }    if (dataShape.size() == 2) { -    if (subgroup_block_io) -      return emitError() << "subgroup_block_io " -                            "are only allowed when result is a 1D VectorType.";      if (llvm::any_of(llvm::zip_equal(dataShape, mdescShape),                       [](auto p) { return std::get<0>(p) > std::get<1>(p); }))        return emitError() << "data shape must not exceed mem_desc shape.";    } else { -    SmallVector<int64_t> blockShape = mdescTy.getBlockShape();      // if the subgroup_block_io attribute is set,  mdescTy must have block      // attribute      if (subgroup_block_io && !blockShape.size()) @@ -1105,7 +1127,7 @@ LogicalResult LoadMatrixOp::verify() {    MemDescType mdescTy = getMemDesc().getType();    return IsValidMatrixOpParams(resTy, mdescTy, subgroup_block_io, -                               [&]() { return emitError(); }); +                               getLayoutAttr(), [&]() { return emitError(); });  }  //===----------------------------------------------------------------------===// @@ -1129,7 +1151,7 @@ LogicalResult StoreMatrixOp::verify() {    UnitAttr subgroup_block_io = getSubgroupBlockIoAttr();    MemDescType mdescTy = getMemDesc().getType();    return IsValidMatrixOpParams(dataTy, mdescTy, subgroup_block_io, -                               [&]() { return emitError(); }); +                               getLayoutAttr(), [&]() { return emitError(); });  }  namespace mlir { diff --git a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSubgroupDistribute.cpp b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSubgroupDistribute.cpp index 5a3b27e..bbd7733 100644 --- a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSubgroupDistribute.cpp +++ b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUSubgroupDistribute.cpp @@ -7,6 +7,7 @@  //===----------------------------------------------------------------------===//  #include "mlir/Dialect/GPU/IR/GPUDialect.h"  #include "mlir/Dialect/GPU/Utils/DistributionUtils.h" +#include "mlir/Dialect/Index/IR/IndexDialect.h"  #include "mlir/Dialect/MemRef/IR/MemRef.h"  #include "mlir/Dialect/Vector/IR/VectorOps.h"  #include "mlir/Dialect/Vector/Transforms/VectorDistribution.h" @@ -912,6 +913,186 @@ struct StoreDistribution final : public gpu::WarpDistributionPattern {    }  }; +static SmallVector<Value> computeDistributedCoordinatesForMatrixOp( +    PatternRewriter &rewriter, Location loc, xegpu::DistributeLayoutAttr layout, +    Value laneId, ArrayRef<int64_t> payloadShape, ValueRange origOffsets) { +  SmallVector<Value> newCoods; +  auto maybeCoords = +      layout.computeDistributedCoords(rewriter, loc, laneId, payloadShape); +  if (failed(maybeCoords)) +    return {}; +  assert(maybeCoords.value().size() == 1 && +         "Expected one set of distributed offsets"); +  SmallVector<OpFoldResult> ofrVec = xegpu::addWithRightAligned( +      rewriter, loc, getAsOpFoldResult(maybeCoords.value()[0]), +      getAsOpFoldResult(origOffsets)); +  newCoods = llvm::to_vector(llvm::map_range( +      ofrVec, [&](OpFoldResult ofr) -> Value { return cast<Value>(ofr); })); +  return newCoods; +} + +/// Pattern for distributing xegpu::LoadMatrixOp. +struct LoadMatrixDistribution final : public gpu::WarpDistributionPattern { +  using gpu::WarpDistributionPattern::WarpDistributionPattern; +  LogicalResult matchAndRewrite(gpu::WarpExecuteOnLane0Op warpOp, +                                PatternRewriter &rewriter) const override { +    gpu::YieldOp yield = warpOp.getTerminator(); +    Operation *lastNode = yield->getPrevNode(); +    auto matrixOp = dyn_cast_or_null<xegpu::LoadMatrixOp>(lastNode); +    if (!matrixOp) +      return failure(); + +    OpOperand *producedByLastLoad = getWarpResult(warpOp, [&](Operation *op) { +      return isa<xegpu::LoadMatrixOp>(op) && matrixOp == op; +    }); +    if (!producedByLastLoad) +      return rewriter.notifyMatchFailure( +          warpOp, "The last op is not xegpu::LoadMatrixOp"); +    const int operandIdx = producedByLastLoad->getOperandNumber(); + +    VectorType sgPayloadTy = +        dyn_cast<VectorType>(matrixOp.getResult().getType()); +    VectorType warpResultTy = +        cast<VectorType>(warpOp.getResult(operandIdx).getType()); +    if (!sgPayloadTy) +      return rewriter.notifyMatchFailure( +          matrixOp, "the matrix op payload must be a vector type"); + +    auto loc = matrixOp.getLoc(); +    auto offsets = matrixOp.getMixedOffsets(); +    if (offsets.empty()) +      return rewriter.notifyMatchFailure(matrixOp, +                                         "the load op must have offsets"); +    SmallVector<Value> offsetsAsValues = +        vector::getAsValues(rewriter, matrixOp.getLoc(), offsets); + +    auto layout = matrixOp.getLayoutAttr(); +    if (!layout) +      return rewriter.notifyMatchFailure( +          matrixOp, "the matrix operation lacks layout attribute"); + +    FailureOr<VectorType> distPayloadByWarpOpOrFailure = +        getDistVecTypeBasedOnLaneLayout(layout, sgPayloadTy); +    if (failed(distPayloadByWarpOpOrFailure)) +      return rewriter.notifyMatchFailure( +          matrixOp, "Failed to distribute matrix op payload based on layout."); + +    SmallVector<Value> operands = {matrixOp.getMemDesc()}; +    const unsigned offsetsStartIdx = operands.size(); +    operands.append(offsetsAsValues); + +    SmallVector<Type> operandTypes = llvm::to_vector( +        llvm::map_range(operands, [](Value v) { return v.getType(); })); + +    SmallVector<size_t> newRetIndices; +    gpu::WarpExecuteOnLane0Op newWarpOp = moveRegionToNewWarpOpAndAppendReturns( +        rewriter, warpOp, operands, operandTypes, newRetIndices); +    SmallVector<Value> newOperands = llvm::map_to_vector( +        newRetIndices, [&](size_t idx) { return newWarpOp.getResult(idx); }); + +    SmallVector<int64_t> newConstOffsets{matrixOp.getConstOffsets()}; +    std::fill(newConstOffsets.begin(), newConstOffsets.end(), +              ShapedType::kDynamic); +    DenseI64ArrayAttr newConstOffsetsAttr = +        rewriter.getDenseI64ArrayAttr(newConstOffsets); +    ValueRange currentOffsets = +        ValueRange(newOperands).drop_front(offsetsStartIdx); + +    SmallVector<Value> newCoords = currentOffsets; +    rewriter.setInsertionPointAfter(newWarpOp); + +    if (!matrixOp.getSubgroupBlockIoAttr()) { +      newCoords = computeDistributedCoordinatesForMatrixOp( +          rewriter, loc, layout, newWarpOp.getLaneid(), sgPayloadTy.getShape(), +          currentOffsets); +    } +    xegpu::LoadMatrixOp newOp = xegpu::LoadMatrixOp::create( +        rewriter, newWarpOp.getLoc(), *distPayloadByWarpOpOrFailure, +        newOperands[0], ValueRange(newCoords), newConstOffsetsAttr, +        matrixOp.getSubgroupBlockIoAttr(), xegpu::DistributeLayoutAttr{}); +    // Resolve the output type and replace all uses. +    rewriter.replaceAllUsesWith( +        newWarpOp.getResult(operandIdx), +        resolveDistributedTy(newOp.getResult(), warpResultTy, rewriter)); +    return success(); +  } +}; + +/// Pattern for distributing xegpu::StoreMatrixOp. +struct StoreMatrixDistribution final : public gpu::WarpDistributionPattern { +  using gpu::WarpDistributionPattern::WarpDistributionPattern; +  LogicalResult matchAndRewrite(gpu::WarpExecuteOnLane0Op warpOp, +                                PatternRewriter &rewriter) const override { +    gpu::YieldOp yield = warpOp.getTerminator(); +    Operation *lastNode = yield->getPrevNode(); +    auto matrixOp = dyn_cast_or_null<xegpu::StoreMatrixOp>(lastNode); +    if (!matrixOp) +      return failure(); + +    VectorType sgPayloadTy = dyn_cast<VectorType>(matrixOp.getData().getType()); +    if (!sgPayloadTy) +      return rewriter.notifyMatchFailure( +          matrixOp, "the matrix op payload must be a vector type"); + +    auto loc = matrixOp.getLoc(); +    auto offsets = matrixOp.getMixedOffsets(); +    if (offsets.empty()) +      return rewriter.notifyMatchFailure(matrixOp, +                                         "the store op must have offsets"); +    SmallVector<Value> offsetsAsValues = +        vector::getAsValues(rewriter, matrixOp.getLoc(), offsets); + +    auto layout = matrixOp.getLayoutAttr(); +    if (!layout) +      return rewriter.notifyMatchFailure( +          matrixOp, "the matrix operation lacks layout attribute"); + +    FailureOr<VectorType> distPayloadByWarpOpOrFailure = +        getDistVecTypeBasedOnLaneLayout(layout, sgPayloadTy); +    if (failed(distPayloadByWarpOpOrFailure)) +      return rewriter.notifyMatchFailure( +          matrixOp, "Failed to distribute matrix op payload based on layout."); + +    SmallVector<Value> operands = {matrixOp.getData(), matrixOp.getMemDesc()}; +    const unsigned offsetsStartIdx = operands.size(); +    operands.append(offsetsAsValues); + +    SmallVector<Type> operandTypes = llvm::to_vector( +        llvm::map_range(operands, [](Value v) { return v.getType(); })); +    operandTypes[0] = *distPayloadByWarpOpOrFailure; + +    SmallVector<size_t> newRetIndices; +    gpu::WarpExecuteOnLane0Op newWarpOp = moveRegionToNewWarpOpAndAppendReturns( +        rewriter, warpOp, operands, operandTypes, newRetIndices); +    SmallVector<Value> newOperands = llvm::map_to_vector( +        newRetIndices, [&](size_t idx) { return newWarpOp.getResult(idx); }); + +    SmallVector<int64_t> newConstOffsets{matrixOp.getConstOffsets()}; +    std::fill(newConstOffsets.begin(), newConstOffsets.end(), +              ShapedType::kDynamic); +    DenseI64ArrayAttr newConstOffsetsAttr = +        rewriter.getDenseI64ArrayAttr(newConstOffsets); +    ValueRange currentOffsets = +        ValueRange(newOperands).drop_front(offsetsStartIdx); + +    SmallVector<Value> newCoords = currentOffsets; +    rewriter.setInsertionPointAfter(newWarpOp); + +    if (!matrixOp.getSubgroupBlockIoAttr()) { +      newCoords = computeDistributedCoordinatesForMatrixOp( +          rewriter, loc, layout, newWarpOp.getLaneid(), sgPayloadTy.getShape(), +          currentOffsets); +    } + +    xegpu::StoreMatrixOp::create( +        rewriter, loc, TypeRange{}, newOperands[0], newOperands[1], +        ValueRange(newCoords), newConstOffsetsAttr, +        matrixOp.getSubgroupBlockIoAttr(), xegpu::DistributeLayoutAttr{}); +    rewriter.eraseOp(matrixOp); +    return success(); +  } +}; +  /// Distribute a scattered load op. The logic and requirements are the same as  /// for the scattered store distribution. The warpOp's payload vector is  /// expected to be distributed by the load's result consumer. @@ -1443,7 +1624,8 @@ void xegpu::populateXeGPUSubgroupDistributePatterns(                 LoadNdDistribution, DpasDistribution, PrefetchNdDistribution,                 GpuBarrierDistribution, VectorMultiReductionDistribution,                 LoadDistribution, StoreDistribution, VectorTransposeDistribution, -               VectorBitcastDistribution, +               VectorBitcastDistribution, LoadMatrixDistribution, +               StoreMatrixDistribution,                 MemrefExtractAlignedPointerAsIndexDistribution>(        patterns.getContext(),        /*pattern benefit=*/regularPatternBenefit); @@ -1468,6 +1650,8 @@ void XeGPUSubgroupDistributePass::runOnOperation() {        // Layouts are needed for vector type only.        if (!isa<VectorType>(operand.get().getType()))          continue; +      if (isa<xegpu::LoadMatrixOp, xegpu::StoreMatrixOp>(op)) +        continue;        auto layout = xegpu::getDistributeLayoutAttr(operand.get());        if (!layout) { diff --git a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp index 9fc5ad9..79eea55 100644 --- a/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp +++ b/mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp @@ -114,7 +114,8 @@ genOffsetsList(ConversionPatternRewriter &rewriter, OpType op,    // Compute the list of subgroup-relative offsets for sub-tensors or sub-memory    // descriptors to be accessed, based on the layout information.    ArrayRef<int64_t> wgShape = op.getDataShape(); -  auto maybeDescOffsets = layout.getOffsets(rewriter, loc, sgId, wgShape); +  auto maybeDescOffsets = +      layout.computeDistributedCoords(rewriter, loc, sgId, wgShape);    if (failed(maybeDescOffsets))      return failure(); @@ -830,8 +831,8 @@ struct WgToSgArithConstantOp : public OpConversionPattern<arith::ConstantOp> {        // Get subgroup id        Value sgId =            gpu::SubgroupIdOp::create(rewriter, loc, /*upper_bound=*/nullptr); - -      auto sgOffsets = layout.getOffsets(rewriter, loc, sgId, wgShape); +      auto sgOffsets = +          layout.computeDistributedCoords(rewriter, loc, sgId, wgShape);        if (failed(sgOffsets))          return failure(); @@ -1052,7 +1053,8 @@ struct WgToSgVectorStepOp : public OpConversionPattern<vector::StepOp> {      Value sgId =          gpu::SubgroupIdOp::create(rewriter, loc, /*upper_bound=*/nullptr); -    auto sgOffsets = layout.getOffsets(rewriter, loc, sgId, wgShape); +    auto sgOffsets = +        layout.computeDistributedCoords(rewriter, loc, sgId, wgShape);      if (failed(sgOffsets))        return failure(); diff --git a/mlir/lib/IR/Operation.cpp b/mlir/lib/IR/Operation.cpp index ce421f4..8212d6d 100644 --- a/mlir/lib/IR/Operation.cpp +++ b/mlir/lib/IR/Operation.cpp @@ -463,28 +463,26 @@ void Operation::updateOrderIfNecessary() {  //===----------------------------------------------------------------------===//  auto llvm::ilist_detail::SpecificNodeAccess< -    typename llvm::ilist_detail::compute_node_options< -        ::mlir::Operation>::type>::getNodePtr(pointer n) -> node_type * { +    llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>:: +    getNodePtr(pointer n) -> node_type * {    return NodeAccess::getNodePtr<OptionsT>(n);  }  auto llvm::ilist_detail::SpecificNodeAccess< -    typename llvm::ilist_detail::compute_node_options< -        ::mlir::Operation>::type>::getNodePtr(const_pointer n) -    -> const node_type * { +    llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>:: +    getNodePtr(const_pointer n) -> const node_type * {    return NodeAccess::getNodePtr<OptionsT>(n);  }  auto llvm::ilist_detail::SpecificNodeAccess< -    typename llvm::ilist_detail::compute_node_options< -        ::mlir::Operation>::type>::getValuePtr(node_type *n) -> pointer { +    llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>:: +    getValuePtr(node_type *n) -> pointer {    return NodeAccess::getValuePtr<OptionsT>(n);  }  auto llvm::ilist_detail::SpecificNodeAccess< -    typename llvm::ilist_detail::compute_node_options< -        ::mlir::Operation>::type>::getValuePtr(const node_type *n) -    -> const_pointer { +    llvm::ilist_detail::compute_node_options<::mlir::Operation>::type>:: +    getValuePtr(const node_type *n) -> const_pointer {    return NodeAccess::getValuePtr<OptionsT>(n);  } diff --git a/mlir/test/Dialect/EmitC/invalid_ops.mlir b/mlir/test/Dialect/EmitC/invalid_ops.mlir index 5f594fb..f285196 100644 --- a/mlir/test/Dialect/EmitC/invalid_ops.mlir +++ b/mlir/test/Dialect/EmitC/invalid_ops.mlir @@ -876,3 +876,41 @@ func.func @test_do(%arg0 : !emitc.ptr<i32>) {    return  } + +// ----- + +func.func @test_for_none_block_argument(%arg0: index) { +  // expected-error@+1 {{expected body to have a single block argument for the induction variable}} +  "emitc.for"(%arg0, %arg0, %arg0) ( +    { +      emitc.yield +    } +  ) : (index, index, index) -> () +  return +} + +// ----- + +func.func @test_for_more_than_one_block_argument(%arg0: index) { +  // expected-error@+1 {{expected body to have a single block argument for the induction variable}} +  "emitc.for"(%arg0, %arg0, %arg0) ( +    { +    ^bb0(%i0 : index, %i1 : index): +      emitc.yield +    } +  ) : (index, index, index) -> () +  return +} + +// ----- + +func.func @test_for_unmatch_type(%arg0: index) { +  // expected-error@+1 {{expected induction variable to be same type as bounds}} +  "emitc.for"(%arg0, %arg0, %arg0) ( +    { +    ^bb0(%i0 : f32): +      emitc.yield +    } +  ) : (index, index, index) -> () +  return +} diff --git a/mlir/test/Dialect/XeGPU/invalid.mlir b/mlir/test/Dialect/XeGPU/invalid.mlir index ebbe3ce..92f3537 100644 --- a/mlir/test/Dialect/XeGPU/invalid.mlir +++ b/mlir/test/Dialect/XeGPU/invalid.mlir @@ -451,7 +451,7 @@ func.func @store_scatter_offset_wi_1(%src: memref<?xf16>) {    %offsets = arith.constant dense<[0]> : vector<1xindex>    %mask = arith.constant dense<1>: vector<1xi1>    // expected-error@+1 {{Mask should match value except the chunk size dim}} -  xegpu.store %val, %src[%offsets], %mask  +  xegpu.store %val, %src[%offsets], %mask          : vector<4xf16>, memref<?xf16>, vector<1xindex>, vector<1xi1>    return  } @@ -871,14 +871,6 @@ func.func @load_mem_desc_invalid_rank(%arg0: !xegpu.mem_desc<64xf16>) {  }  // ----- -func.func @load_mem_desc_invalid_attr2(%arg0: !xegpu.mem_desc<16x64xf16>) { -  // expected-error@+1 {{subgroup_block_io are only allowed when result is a 1D VectorType.}} -  %data2 = xegpu.load_matrix %arg0[8, 8] <{subgroup_block_io}>: !xegpu.mem_desc<16x64xf16> -> vector<16x16xf16> -  return -} - - -// -----  func.func @store_mem_desc_mismatch_element_type(%arg0: !xegpu.mem_desc<16x64xf16>, %arg1: vector<16x16xf32>) {    // expected-error@+1 {{failed to verify that all of {mem_desc, data} have same element type}}    xegpu.store_matrix %arg1, %arg0[8, 8] : vector<16x16xf32>, !xegpu.mem_desc<16x64xf16> @@ -900,16 +892,25 @@ func.func @store_mem_desc_invalid_rank(%arg0: !xegpu.mem_desc<64xf16>, %arg1: ve  }  // ----- -func.func @store_mem_desc_invalid_attr2(%arg0: !xegpu.mem_desc<16x64xf16>, %data: vector<16x16xf16>) { -  // expected-error@+1 {{subgroup_block_io are only allowed when result is a 1D VectorType.}} -  xegpu.store_matrix %data,  %arg0[8, 8] <{subgroup_block_io}>: vector<16x16xf16>, !xegpu.mem_desc<16x64xf16> +func.func @simt_store_matrix_vector_nonlinear(%arg0: !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [32, 1]>>, %arg1: vector<2x16xf32>) { +  // expected-error@+1 {{With subgroup_block_io, accessed data must be contiguous and coalesced}} +  xegpu.store_matrix %arg1, %arg0[0, 0] {subgroup_block_io, layout = #xegpu.layout<lane_layout = [1, 16], lane_data = [2, 1]>} : +        vector<2x16xf32>, !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [32, 1]>>    return  }  // ----- -func.func @store_mem_desc_invalid_attr2(%arg0: !xegpu.mem_desc<16x64xf16>, %data: vector<16x16xf16>) { -  // expected-error@+1 {{subgroup_block_io are only allowed when result is a 1D VectorType.}} -  xegpu.store_matrix %data,  %arg0[8, 8] <{subgroup_block_io}>: vector<16x16xf16>, !xegpu.mem_desc<16x64xf16> +func.func @simt_store_matrix_vector_noncoalesced(%arg0: !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [1, 32], block = [1, 16]>>, %arg1: vector<16x2xf32>) { +  // expected-error@+1 {{With subgroup_block_io, the distributed dimensions must be contiguous}} +  xegpu.store_matrix %arg1, %arg0[0, 0] {subgroup_block_io, layout = #xegpu.layout<lane_layout = [1, 16], lane_data = [1, 2]>} : +        vector<16x2xf32>, !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [1, 32], block = [1, 16]>>    return  } +// ----- +func.func @simt_store_matrix_vector_noncoalesced(%arg0: !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [32, 1], block = [1, 17]>>, %arg1: vector<16x2xf32>) { +  // expected-error@+1 {{With subgroup_block_io, the block shape must match the lane layout}} +  xegpu.store_matrix %arg1, %arg0[0, 0] {subgroup_block_io, layout = #xegpu.layout<lane_layout = [1, 16], lane_data = [1, 1]>} : +        vector<16x2xf32>, !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [32, 1], block = [1, 17]>> +  return +} diff --git a/mlir/test/Dialect/XeGPU/subgroup-distribute.mlir b/mlir/test/Dialect/XeGPU/subgroup-distribute.mlir index 27a3dc3..8946d14 100644 --- a/mlir/test/Dialect/XeGPU/subgroup-distribute.mlir +++ b/mlir/test/Dialect/XeGPU/subgroup-distribute.mlir @@ -265,3 +265,66 @@ gpu.module @xevm_module{      gpu.return    }  } + +// ----- +// CHECK-LABEL: gpu.func @load_store_matrix_1({{.*}}) { +// CHECK: %[[LAYOUT_X:.*]] = arith.constant 8 : index +// CHECK: %[[LAYOUT_Y:.*]] = arith.constant 2 : index +// CHECK: %[[LANE_ID:.*]] = gpu.lane_id +// CHECK: %[[DELINEARIZED_LANE_Y:.*]] = affine.apply #{{.*}}()[%[[LANE_ID]]] +// CHECK: %[[DELINEARIZED_LANE_X:.*]] = affine.apply #{{.*}}()[%[[LANE_ID]]] +// CHECK: %[[LANE_Y_OFFSET:.*]] = index.remu %[[DELINEARIZED_LANE_Y]], %[[LAYOUT_Y]] +// CHECK: %[[LANE_X_OFFSET:.*]] = index.remu %[[DELINEARIZED_LANE_X]], %[[LAYOUT_X]] +// CHECK: %[[MAT:.*]] = xegpu.load_matrix %arg0[%[[LANE_Y_OFFSET]], %[[LANE_X_OFFSET]]] : !xegpu.mem_desc<32x32xf32>, index, index -> vector<1x1xf32> +// CHECK: xegpu.store_matrix %[[MAT]], %arg0[%[[LANE_Y_OFFSET]], %[[LANE_X_OFFSET]]] : vector<1x1xf32>, !xegpu.mem_desc<32x32xf32>, index, index +gpu.module @xevm_module{ +  gpu.func @load_store_matrix_1(%arg0: !xegpu.mem_desc<32x32xf32>) { +    %c0 = arith.constant 0 : index +    %1 = xegpu.load_matrix %arg0[%c0, %c0] <{layout = #xegpu.layout<lane_layout = [2, 8], lane_data = [1, 1]>}> : !xegpu.mem_desc<32x32xf32>, index, index -> vector<2x8xf32> +    xegpu.store_matrix %1, %arg0[%c0, %c0] <{layout = #xegpu.layout<lane_layout = [2, 8], lane_data = [1, 1]>}> : vector<2x8xf32>, !xegpu.mem_desc<32x32xf32>, index, index +    gpu.return +  } +} + +// ----- +// CHECK-LABEL: gpu.func @load_store_matrix_2({{.*}}) { +// CHECK: %[[DIST_UNIT_HEIGHT_X:.*]] = arith.constant 4 : index +// CHECK: %[[DIST_UNIT_HEIGHT_Y:.*]] = arith.constant 8 : index +// CHECK: %[[LANE_DATA_Y:.*]] = arith.constant 2 : index +// CHECK: %[[USER_OFFSET_X:.*]] = arith.constant 1 : index +// CHECK: %[[LANE_ID:.*]] = gpu.lane_id +// CHECK: %[[DELINEARIZED_LANE_Y:.*]] = affine.apply #{{.*}}()[%[[LANE_ID]]] +// CHECK: %[[DELINEARIZED_LANE_X:.*]] = affine.apply #{{.*}}()[%[[LANE_ID]]] +// CHECK: %[[LANE_Y_OFFSET_1:.*]] = index.mul %[[DELINEARIZED_LANE_Y]], %[[LANE_DATA_Y]] +// CHECK: %[[LANE_Y_OFFSET:.*]] = index.remu %[[LANE_Y_OFFSET_1]], %[[DIST_UNIT_HEIGHT_Y]] +// CHECK: %[[LANE_X_OFFSET_1:.*]] = index.remu %[[DELINEARIZED_LANE_X]], %[[DIST_UNIT_HEIGHT_X]] +// CHECK: %[[LANE_X_OFFSET:.*]] = index.add %[[LANE_X_OFFSET_1]], %[[USER_OFFSET_X]] +// CHECK: %[[MAT:.*]] = xegpu.load_matrix %arg0[%[[LANE_Y_OFFSET]], %[[LANE_X_OFFSET]]] : !xegpu.mem_desc<32x32xf32>, index, index -> vector<2x1xf32> +// CHECK: xegpu.store_matrix %[[MAT]], %arg0[%[[LANE_Y_OFFSET]], %[[LANE_X_OFFSET]]] : vector<2x1xf32>, !xegpu.mem_desc<32x32xf32>, index, index +gpu.module @xevm_module{ +  gpu.func @load_store_matrix_2(%arg0: !xegpu.mem_desc<32x32xf32>) { +    %c0 = arith.constant 0 : index +    %c1 = arith.constant 1 : index +    %1 = xegpu.load_matrix %arg0[%c0, %c1] <{layout = #xegpu.layout<lane_layout = [4, 4], lane_data = [2, 1]>}> : !xegpu.mem_desc<32x32xf32>, index, index -> vector<8x4xf32> +    xegpu.store_matrix %1, %arg0[%c0, %c1] <{layout = #xegpu.layout<lane_layout = [4, 4], lane_data = [2, 1]>}> : vector<8x4xf32>, !xegpu.mem_desc<32x32xf32>, index, index +    gpu.return +  } +} + +// ----- +// CHECK-LABEL: gpu.func @load_store_matrix_3({{.*}}) { +// CHECK: %[[MAT:.*]] = xegpu.load_matrix %arg0[%{{.*}}, %{{.*}}] <{subgroup_block_io}>: +// CHECK-SAME: !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<block = [16, 1], stride = [1, 32]>>, index, index -> vector<1x2xf32> +// CHECK: xegpu.store_matrix %[[MAT]], %arg0[%{{.*}}, %{{.*}}] <{subgroup_block_io}>: +// CHECK-SAME: vector<1x2xf32>, !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<block = [16, 1], stride = [1, 32]>>, index, index +gpu.module @xevm_module{ +  gpu.func @load_store_matrix_3(%arg0: !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [1, 32], block = [16, 1]>>) { +    %c0 = arith.constant 0 : index +    %c1 = arith.constant 1 : index +    %1 = xegpu.load_matrix %arg0[%c0, %c1] {subgroup_block_io, layout = #xegpu.layout<lane_layout = [16, 1], lane_data = [1, 1]>} : +      !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [1, 32], block = [16, 1]>>, index, index -> vector<16x2xf32> +    xegpu.store_matrix %1, %arg0[%c0, %c1] {subgroup_block_io, layout = #xegpu.layout<lane_layout = [16, 1], lane_data = [1, 1]>} : +      vector<16x2xf32>, !xegpu.mem_desc<32x32xf32, #xegpu.mem_layout<stride = [1, 32], block = [16, 1]>>, index, index +    gpu.return +  } +} diff --git a/mlir/test/Target/SPIRV/group-ops.mlir b/mlir/test/Target/SPIRV/group-ops.mlir index cf519cb..6f19b35 100644 --- a/mlir/test/Target/SPIRV/group-ops.mlir +++ b/mlir/test/Target/SPIRV/group-ops.mlir @@ -1,11 +1,13 @@ -// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip -split-input-file %s | FileCheck %s +// RUN: mlir-translate --no-implicit-module --test-spirv-roundtrip --split-input-file %s | FileCheck %s  // RUN: %if spirv-tools %{ rm -rf %t %}  // RUN: %if spirv-tools %{ mkdir %t %}  // RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %}  // RUN: %if spirv-tools %{ spirv-val %t %} -spirv.module Logical GLSL450 requires #spirv.vce<v1.3, [Shader, Linkage, SubgroupBallotKHR, Groups, SubgroupBufferBlockIOINTEL, GroupNonUniformArithmetic, GroupUniformArithmeticKHR], [SPV_KHR_storage_buffer_storage_class, SPV_KHR_shader_ballot, SPV_INTEL_subgroups, SPV_KHR_uniform_group_instructions]> { +spirv.module Logical GLSL450 requires #spirv.vce<v1.3, +  [Shader, Linkage, SubgroupBallotKHR, Groups, GroupNonUniformArithmetic, GroupUniformArithmeticKHR], +  [SPV_KHR_storage_buffer_storage_class, SPV_KHR_shader_ballot, SPV_KHR_uniform_group_instructions]> {    // CHECK-LABEL: @subgroup_ballot    spirv.func @subgroup_ballot(%predicate: i1) -> vector<4xi32> "None" {      // CHECK: %{{.*}} = spirv.KHR.SubgroupBallot %{{.*}}: vector<4xi32> @@ -24,30 +26,6 @@ spirv.module Logical GLSL450 requires #spirv.vce<v1.3, [Shader, Linkage, Subgrou      %0 = spirv.GroupBroadcast <Workgroup> %value, %localid : f32, vector<3xi32>      spirv.ReturnValue %0: f32    } -  // CHECK-LABEL: @subgroup_block_read_intel -  spirv.func @subgroup_block_read_intel(%ptr : !spirv.ptr<i32, StorageBuffer>) -> i32 "None" { -    // CHECK: spirv.INTEL.SubgroupBlockRead %{{.*}} : !spirv.ptr<i32, StorageBuffer> -> i32 -    %0 = spirv.INTEL.SubgroupBlockRead %ptr : !spirv.ptr<i32, StorageBuffer> -> i32 -    spirv.ReturnValue %0: i32 -  } -  // CHECK-LABEL: @subgroup_block_read_intel_vector -  spirv.func @subgroup_block_read_intel_vector(%ptr : !spirv.ptr<i32, StorageBuffer>) -> vector<3xi32> "None" { -    // CHECK: spirv.INTEL.SubgroupBlockRead %{{.*}} : !spirv.ptr<i32, StorageBuffer> -> vector<3xi32> -    %0 = spirv.INTEL.SubgroupBlockRead %ptr : !spirv.ptr<i32, StorageBuffer> -> vector<3xi32> -    spirv.ReturnValue %0: vector<3xi32> -  } -  // CHECK-LABEL: @subgroup_block_write_intel -  spirv.func @subgroup_block_write_intel(%ptr : !spirv.ptr<i32, StorageBuffer>, %value: i32) -> () "None" { -    // CHECK: spirv.INTEL.SubgroupBlockWrite %{{.*}}, %{{.*}} : i32 -    spirv.INTEL.SubgroupBlockWrite "StorageBuffer" %ptr, %value : i32 -    spirv.Return -  } -  // CHECK-LABEL: @subgroup_block_write_intel_vector -  spirv.func @subgroup_block_write_intel_vector(%ptr : !spirv.ptr<i32, StorageBuffer>, %value: vector<3xi32>) -> () "None" { -    // CHECK: spirv.INTEL.SubgroupBlockWrite %{{.*}}, %{{.*}} : vector<3xi32> -    spirv.INTEL.SubgroupBlockWrite "StorageBuffer" %ptr, %value : vector<3xi32> -    spirv.Return -  }    // CHECK-LABEL: @group_iadd    spirv.func @group_iadd(%value: i32) -> i32 "None" {      // CHECK: spirv.GroupIAdd <Workgroup> <Reduce> %{{.*}} : i32 diff --git a/mlir/test/Target/SPIRV/subgroup-block-intel.mlir b/mlir/test/Target/SPIRV/subgroup-block-intel.mlir new file mode 100644 index 0000000..14060e6 --- /dev/null +++ b/mlir/test/Target/SPIRV/subgroup-block-intel.mlir @@ -0,0 +1,34 @@ +// RUN: mlir-translate --no-implicit-module --test-spirv-roundtrip %s | FileCheck %s + +// RUN: %if spirv-tools %{ rm -rf %t %} +// RUN: %if spirv-tools %{ mkdir %t %} +// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --spirv-save-validation-files-with-prefix=%t/module %s %} +// RUN: %if spirv-tools %{ spirv-val %t %} + +spirv.module Physical64 GLSL450 requires #spirv.vce<v1.3, [Addresses, Shader, Linkage, SubgroupBufferBlockIOINTEL], +                                                          [SPV_KHR_storage_buffer_storage_class, SPV_INTEL_subgroups]> { +  // CHECK-LABEL: @subgroup_block_read_intel +  spirv.func @subgroup_block_read_intel(%ptr : !spirv.ptr<i32, StorageBuffer>) -> i32 "None" { +    // CHECK: spirv.INTEL.SubgroupBlockRead %{{.*}} : !spirv.ptr<i32, StorageBuffer> -> i32 +    %0 = spirv.INTEL.SubgroupBlockRead %ptr : !spirv.ptr<i32, StorageBuffer> -> i32 +    spirv.ReturnValue %0: i32 +  } +  // CHECK-LABEL: @subgroup_block_read_intel_vector +  spirv.func @subgroup_block_read_intel_vector(%ptr : !spirv.ptr<i32, StorageBuffer>) -> vector<3xi32> "None" { +    // CHECK: spirv.INTEL.SubgroupBlockRead %{{.*}} : !spirv.ptr<i32, StorageBuffer> -> vector<3xi32> +    %0 = spirv.INTEL.SubgroupBlockRead %ptr : !spirv.ptr<i32, StorageBuffer> -> vector<3xi32> +    spirv.ReturnValue %0: vector<3xi32> +  } +  // CHECK-LABEL: @subgroup_block_write_intel +  spirv.func @subgroup_block_write_intel(%ptr : !spirv.ptr<i32, StorageBuffer>, %value: i32) -> () "None" { +    // CHECK: spirv.INTEL.SubgroupBlockWrite %{{.*}}, %{{.*}} : i32 +    spirv.INTEL.SubgroupBlockWrite "StorageBuffer" %ptr, %value : i32 +    spirv.Return +  } +  // CHECK-LABEL: @subgroup_block_write_intel_vector +  spirv.func @subgroup_block_write_intel_vector(%ptr : !spirv.ptr<i32, StorageBuffer>, %value: vector<3xi32>) -> () "None" { +    // CHECK: spirv.INTEL.SubgroupBlockWrite %{{.*}}, %{{.*}} : vector<3xi32> +    spirv.INTEL.SubgroupBlockWrite "StorageBuffer" %ptr, %value : vector<3xi32> +    spirv.Return +  } +} diff --git a/mlir/test/lib/Dialect/XeGPU/TestXeGPUTransforms.cpp b/mlir/test/lib/Dialect/XeGPU/TestXeGPUTransforms.cpp index 76d4611..93d5144 100644 --- a/mlir/test/lib/Dialect/XeGPU/TestXeGPUTransforms.cpp +++ b/mlir/test/lib/Dialect/XeGPU/TestXeGPUTransforms.cpp @@ -200,7 +200,8 @@ class TestStepOpPattern : public OpConversionPattern<vector::StepOp> {      Value sgId =          gpu::SubgroupIdOp::create(rewriter, loc, /*upper_bound=*/nullptr); -    auto maybeOffsets = sliceAttr.getOffsets(rewriter, loc, sgId, wgShape); +    auto maybeOffsets = +        sliceAttr.computeDistributedCoords(rewriter, loc, sgId, wgShape);      if (failed(maybeOffsets))        return failure(); diff --git a/mlir/test/python/CMakeLists.txt b/mlir/test/python/CMakeLists.txt index 2c12381..c81f75f 100644 --- a/mlir/test/python/CMakeLists.txt +++ b/mlir/test/python/CMakeLists.txt @@ -11,7 +11,7 @@ add_public_tablegen_target(MLIRPythonTestIncGen)  add_subdirectory(lib) -set(MLIR_PYTHON_TEST_DEPENDS MLIRPythonModules mlir-runner) +set(MLIR_PYTHON_TEST_DEPENDS MLIRPythonModules mlir-runner mlir_c_runner_utils mlir_runner_utils)  if(NOT MLIR_STANDALONE_BUILD)    list(APPEND MLIR_PYTHON_TEST_DEPENDS FileCheck count not)  endif() diff --git a/openmp/runtime/src/z_Linux_asm.S b/openmp/runtime/src/z_Linux_asm.S index 684c7e2..12fea67 100644 --- a/openmp/runtime/src/z_Linux_asm.S +++ b/openmp/runtime/src/z_Linux_asm.S @@ -1358,10 +1358,10 @@ __tid = 8  	PROC __kmp_invoke_microtask  	PACBTI_C -	stp	x29, x30, [sp, #-16]!  # if OMPT_SUPPORT  	stp	x19, x20, [sp, #-16]!  # endif +	stp	x29, x30, [sp, #-16]!  	mov	x29, sp  	orr	w9, wzr, #1 @@ -1415,11 +1415,11 @@ KMP_LABEL(kmp_1):  	blr	x8  	orr	w0, wzr, #1  	mov	sp, x29 +	ldp	x29, x30, [sp], #16  # if OMPT_SUPPORT  	str	xzr, [x19]  	ldp	x19, x20, [sp], #16  # endif -	ldp	x29, x30, [sp], #16  	PACBTI_RET  	ret diff --git a/polly/docs/ReleaseNotes.rst b/polly/docs/ReleaseNotes.rst index f5ea47b..215a802 100644 --- a/polly/docs/ReleaseNotes.rst +++ b/polly/docs/ReleaseNotes.rst @@ -13,3 +13,7 @@ In Polly |version| the following important changes have been incorporated.   * ScopInliner has been updated for the New Pass Manager. + * Polly now is a monolithic pass split into phases. + + * Polly's support for the legacy pass manager has been removed. + diff --git a/polly/include/polly/Canonicalization.h b/polly/include/polly/Canonicalization.h index 03f277e..972b660 100644 --- a/polly/include/polly/Canonicalization.h +++ b/polly/include/polly/Canonicalization.h @@ -11,12 +11,6 @@  #include "llvm/Passes/PassBuilder.h" -namespace llvm { -namespace legacy { -class PassManagerBase; -} -} // namespace llvm -  namespace polly {  /// Schedule a set of canonicalization passes to prepare for Polly. @@ -26,8 +20,6 @@ namespace polly {  /// into a canonical form that simplifies the analysis and optimization passes  /// of Polly. The set of optimization passes scheduled here is probably not yet  /// optimal. TODO: Optimize the set of canonicalization passes. -void registerCanonicalicationPasses(llvm::legacy::PassManagerBase &PM); -  llvm::FunctionPassManager  buildCanonicalicationPassesForNPM(llvm::ModulePassManager &MPM,                                    llvm::OptimizationLevel Level); diff --git a/polly/include/polly/CodeGen/CodeGeneration.h b/polly/include/polly/CodeGen/CodeGeneration.h index 57aec1d..2340fbe 100644 --- a/polly/include/polly/CodeGen/CodeGeneration.h +++ b/polly/include/polly/CodeGen/CodeGeneration.h @@ -14,6 +14,7 @@  #include "llvm/IR/PassManager.h"  namespace polly { +class IslAstInfo;  enum VectorizerChoice {    VECTORIZER_NONE, @@ -33,6 +34,8 @@ struct CodeGenerationPass final : PassInfoMixin<CodeGenerationPass> {  };  extern bool PerfMonitoring; + +bool runCodeGeneration(Scop &S, llvm::RegionInfo &RI, IslAstInfo &AI);  } // namespace polly  #endif // POLLY_CODEGENERATION_H diff --git a/polly/include/polly/CodeGen/IslAst.h b/polly/include/polly/CodeGen/IslAst.h index c99a495..3e1ff2c 100644 --- a/polly/include/polly/CodeGen/IslAst.h +++ b/polly/include/polly/CodeGen/IslAst.h @@ -21,6 +21,7 @@  #ifndef POLLY_ISLAST_H  #define POLLY_ISLAST_H +#include "polly/DependenceInfo.h"  #include "polly/ScopPass.h"  #include "llvm/ADT/SmallPtrSet.h"  #include "llvm/IR/PassManager.h" @@ -172,33 +173,6 @@ struct IslAstAnalysis : AnalysisInfoMixin<IslAstAnalysis> {                   ScopStandardAnalysisResults &SAR);  }; -class IslAstInfoWrapperPass final : public ScopPass { -  std::unique_ptr<IslAstInfo> Ast; - -public: -  static char ID; - -  IslAstInfoWrapperPass() : ScopPass(ID) {} - -  IslAstInfo &getAI() { return *Ast; } -  const IslAstInfo &getAI() const { return *Ast; } - -  /// Build the AST for the given SCoP @p S. -  bool runOnScop(Scop &S) override; - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; - -  /// Release the internal memory. -  void releaseMemory() override; - -  /// Print a source code representation of the program. -  void printScop(raw_ostream &OS, Scop &S) const override; -}; - -llvm::Pass *createIslAstInfoWrapperPassPass(); -llvm::Pass *createIslAstInfoPrinterLegacyPass(llvm::raw_ostream &OS); -  struct IslAstPrinterPass final : PassInfoMixin<IslAstPrinterPass> {    IslAstPrinterPass(raw_ostream &OS) : OS(OS) {} @@ -207,11 +181,9 @@ struct IslAstPrinterPass final : PassInfoMixin<IslAstPrinterPass> {    raw_ostream &OS;  }; -} // namespace polly -namespace llvm { -void initializeIslAstInfoWrapperPassPass(llvm::PassRegistry &); -void initializeIslAstInfoPrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm +std::unique_ptr<IslAstInfo> runIslAstGen(Scop &S, +                                         DependenceAnalysis::Result &DA); +} // namespace polly  #endif // POLLY_ISLAST_H diff --git a/polly/include/polly/CodePreparation.h b/polly/include/polly/CodePreparation.h index c6bc526..1a15e3d 100644 --- a/polly/include/polly/CodePreparation.h +++ b/polly/include/polly/CodePreparation.h @@ -15,6 +15,12 @@  #include "llvm/IR/PassManager.h" +namespace llvm { +class DominatorTree; +class LoopInfo; +class RegionInfo; +} // namespace llvm +  namespace polly {  struct CodePreparationPass final : llvm::PassInfoMixin<CodePreparationPass> {    llvm::PreservedAnalyses run(llvm::Function &F, diff --git a/polly/include/polly/DeLICM.h b/polly/include/polly/DeLICM.h index 0e03c04..63fc509 100644 --- a/polly/include/polly/DeLICM.h +++ b/polly/include/polly/DeLICM.h @@ -21,15 +21,10 @@  #include "isl/isl-noexceptions.h"  namespace llvm { -class PassRegistry; -class Pass;  class raw_ostream;  } // namespace llvm  namespace polly { -/// Create a new DeLICM pass instance. -llvm::Pass *createDeLICMWrapperPass(); -llvm::Pass *createDeLICMPrinterLegacyPass(llvm::raw_ostream &OS);  struct DeLICMPass final : llvm::PassInfoMixin<DeLICMPass> {    DeLICMPass() {} @@ -59,11 +54,7 @@ bool isConflicting(isl::union_set ExistingOccupied,                     isl::union_map ProposedWrites,                     llvm::raw_ostream *OS = nullptr, unsigned Indent = 0); +bool runDeLICM(Scop &S);  } // namespace polly -namespace llvm { -void initializeDeLICMWrapperPassPass(llvm::PassRegistry &); -void initializeDeLICMPrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm -  #endif /* POLLY_DELICM_H */ diff --git a/polly/include/polly/DeadCodeElimination.h b/polly/include/polly/DeadCodeElimination.h index d416afa..4d8da56 100644 --- a/polly/include/polly/DeadCodeElimination.h +++ b/polly/include/polly/DeadCodeElimination.h @@ -13,16 +13,10 @@  #ifndef POLLY_DEADCODEELIMINATION_H  #define POLLY_DEADCODEELIMINATION_H +#include "polly/DependenceInfo.h"  #include "polly/ScopPass.h" -namespace llvm { -class PassRegistry; -class Pass; -class raw_ostream; -} // namespace llvm -  namespace polly { -llvm::Pass *createDeadCodeElimWrapperPass();  struct DeadCodeElimPass final : llvm::PassInfoMixin<DeadCodeElimPass> {    DeadCodeElimPass() {} @@ -31,10 +25,7 @@ struct DeadCodeElimPass final : llvm::PassInfoMixin<DeadCodeElimPass> {                                ScopStandardAnalysisResults &SAR, SPMUpdater &U);  }; +bool runDeadCodeElim(Scop &S, DependenceAnalysis::Result &DA);  } // namespace polly -namespace llvm { -void initializeDeadCodeElimWrapperPassPass(llvm::PassRegistry &); -} // namespace llvm -  #endif /* POLLY_DEADCODEELIMINATION_H */ diff --git a/polly/include/polly/DependenceInfo.h b/polly/include/polly/DependenceInfo.h index d562ad8..88ea468 100644 --- a/polly/include/polly/DependenceInfo.h +++ b/polly/include/polly/DependenceInfo.h @@ -145,7 +145,6 @@ public:    friend struct DependenceAnalysis;    friend struct DependenceInfoPrinterPass;    friend class DependenceInfo; -  friend class DependenceInfoWrapperPass;    /// Destructor that will free internal objects.    ~Dependences() { releaseMemory(); } @@ -192,6 +191,8 @@ private:    const AnalysisLevel Level;  }; +extern Dependences::AnalysisLevel OptAnalysisLevel; +  struct DependenceAnalysis final : public AnalysisInfoMixin<DependenceAnalysis> {    static AnalysisKey Key;    struct Result { @@ -232,108 +233,7 @@ struct DependenceInfoPrinterPass final    raw_ostream &OS;  }; -class DependenceInfo final : public ScopPass { -public: -  static char ID; - -  /// Construct a new DependenceInfo pass. -  DependenceInfo() : ScopPass(ID) {} - -  /// Return the dependence information for the current SCoP. -  /// -  /// @param Level The granularity of dependence analysis result. -  /// -  /// @return The dependence analysis result -  /// -  const Dependences &getDependences(Dependences::AnalysisLevel Level); - -  /// Recompute dependences from schedule and memory accesses. -  const Dependences &recomputeDependences(Dependences::AnalysisLevel Level); - -  /// Invalidate the dependence information and recompute it when needed again. -  /// May be required when the underlying Scop was changed in a way that would -  /// add new dependencies (e.g. between new statement instances insierted into -  /// the SCoP) or intentionally breaks existing ones. It is not required when -  /// updating the schedule that conforms the existing dependencies. -  void abandonDependences(); - -  /// Compute the dependence information for the SCoP @p S. -  bool runOnScop(Scop &S) override; - -  /// Print the dependences for the given SCoP to @p OS. -  void printScop(raw_ostream &OS, Scop &) const override; - -  /// Release the internal memory. -  void releaseMemory() override { -    for (auto &d : D) -      d.reset(); -  } - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; - -private: -  Scop *S; - -  /// Dependences struct for the current SCoP. -  std::unique_ptr<Dependences> D[Dependences::NumAnalysisLevels]; -}; - -llvm::Pass *createDependenceInfoPass(); -llvm::Pass *createDependenceInfoPrinterLegacyPass(llvm::raw_ostream &OS); - -/// Construct a new DependenceInfoWrapper pass. -class DependenceInfoWrapperPass final : public FunctionPass { -public: -  static char ID; - -  /// Construct a new DependenceInfoWrapper pass. -  DependenceInfoWrapperPass() : FunctionPass(ID) {} - -  /// Return the dependence information for the given SCoP. -  /// -  /// @param S     SCoP object. -  /// @param Level The granularity of dependence analysis result. -  /// -  /// @return The dependence analysis result -  /// -  const Dependences &getDependences(Scop *S, Dependences::AnalysisLevel Level); - -  /// Recompute dependences from schedule and memory accesses. -  const Dependences &recomputeDependences(Scop *S, -                                          Dependences::AnalysisLevel Level); - -  /// Compute the dependence information on-the-fly for the function. -  bool runOnFunction(Function &F) override; - -  /// Print the dependences for the current function to @p OS. -  void print(raw_ostream &OS, const Module *M = nullptr) const override; - -  /// Release the internal memory. -  void releaseMemory() override { ScopToDepsMap.clear(); } - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; - -private: -  using ScopToDepsMapTy = DenseMap<Scop *, std::unique_ptr<Dependences>>; - -  /// Scop to Dependence map for the current function. -  ScopToDepsMapTy ScopToDepsMap; -}; - -llvm::Pass *createDependenceInfoWrapperPassPass(); -llvm::Pass * -createDependenceInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS); - +DependenceAnalysis::Result runDependenceAnalysis(Scop &S);  } // namespace polly -namespace llvm { -void initializeDependenceInfoPass(llvm::PassRegistry &); -void initializeDependenceInfoPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeDependenceInfoWrapperPassPass(llvm::PassRegistry &); -void initializeDependenceInfoPrinterLegacyFunctionPassPass( -    llvm::PassRegistry &); -} // namespace llvm -  #endif diff --git a/polly/include/polly/FlattenSchedule.h b/polly/include/polly/FlattenSchedule.h index 3ef3c30..154344d 100644 --- a/polly/include/polly/FlattenSchedule.h +++ b/polly/include/polly/FlattenSchedule.h @@ -15,20 +15,10 @@  #ifndef POLLY_FLATTENSCHEDULE_H  #define POLLY_FLATTENSCHEDULE_H -namespace llvm { -class PassRegistry; -class Pass; -class raw_ostream; -} // namespace llvm -  namespace polly { -llvm::Pass *createFlattenSchedulePass(); -llvm::Pass *createFlattenSchedulePrinterLegacyPass(llvm::raw_ostream &OS); -} // namespace polly +class Scop; -namespace llvm { -void initializeFlattenSchedulePass(llvm::PassRegistry &); -void initializeFlattenSchedulePrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm +void runFlattenSchedulePass(Scop &S); +} // namespace polly  #endif /* POLLY_FLATTENSCHEDULE_H */ diff --git a/polly/include/polly/ForwardOpTree.h b/polly/include/polly/ForwardOpTree.h index b5da0f5..8b2ece1 100644 --- a/polly/include/polly/ForwardOpTree.h +++ b/polly/include/polly/ForwardOpTree.h @@ -15,13 +15,7 @@  #include "polly/ScopPass.h" -namespace llvm { -class PassRegistry; -} // namespace llvm -  namespace polly { -llvm::Pass *createForwardOpTreeWrapperPass(); -llvm::Pass *createForwardOpTreePrinterLegacyPass(llvm::raw_ostream &OS);  struct ForwardOpTreePass final : llvm::PassInfoMixin<ForwardOpTreePass> {    ForwardOpTreePass() {} @@ -41,11 +35,15 @@ private:    llvm::raw_ostream &OS;  }; +/// Pass that redirects scalar reads to array elements that are known to contain +/// the same value. +/// +/// This reduces the number of scalar accesses and therefore potentially +/// increases the freedom of the scheduler. In the ideal case, all reads of a +/// scalar definition are redirected (We currently do not care about removing +/// the write in this case).  This is also useful for the main DeLICM pass as +/// there are less scalars to be mapped. +bool runForwardOpTree(Scop &S);  } // namespace polly -namespace llvm { -void initializeForwardOpTreeWrapperPassPass(PassRegistry &); -void initializeForwardOpTreePrinterLegacyPassPass(PassRegistry &); -} // namespace llvm -  #endif // POLLY_FORWARDOPTREE_H diff --git a/polly/include/polly/JSONExporter.h b/polly/include/polly/JSONExporter.h index 958f95e..82a881c 100644 --- a/polly/include/polly/JSONExporter.h +++ b/polly/include/polly/JSONExporter.h @@ -9,13 +9,11 @@  #ifndef POLLY_JSONEXPORTER_H  #define POLLY_JSONEXPORTER_H +#include "polly/DependenceInfo.h"  #include "polly/ScopPass.h"  #include "llvm/IR/PassManager.h"  namespace polly { -llvm::Pass *createJSONExporterPass(); -llvm::Pass *createJSONImporterPass(); -llvm::Pass *createJSONImporterPrinterLegacyPass(llvm::raw_ostream &OS);  /// This pass exports a scop to a jscop file. The filename is generated from the  /// concatenation of the function and scop name. @@ -30,12 +28,9 @@ struct JSONImportPass final : llvm::PassInfoMixin<JSONExportPass> {    llvm::PreservedAnalyses run(Scop &, ScopAnalysisManager &,                                ScopStandardAnalysisResults &, SPMUpdater &);  }; -} // namespace polly -namespace llvm { -void initializeJSONExporterPass(llvm::PassRegistry &); -void initializeJSONImporterPass(llvm::PassRegistry &); -void initializeJSONImporterPrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm +void runImportJSON(Scop &S, DependenceAnalysis::Result &DA); +void runExportJSON(Scop &S); +} // namespace polly  #endif /* POLLY_JSONEXPORTER_H */ diff --git a/polly/include/polly/LinkAllPasses.h b/polly/include/polly/LinkAllPasses.h deleted file mode 100644 index 9978344c..0000000 --- a/polly/include/polly/LinkAllPasses.h +++ /dev/null @@ -1,156 +0,0 @@ -//===- polly/LinkAllPasses.h ----------- Reference All Passes ---*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This header file pulls in all transformation and analysis passes for tools -// like opt and bugpoint that need this functionality. -// -//===----------------------------------------------------------------------===// - -#ifndef POLLY_LINKALLPASSES_H -#define POLLY_LINKALLPASSES_H - -#include "polly/Config/config.h" -#include "polly/Support/DumpFunctionPass.h" -#include "polly/Support/DumpModulePass.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/AlwaysTrue.h" - -namespace llvm { -class Pass; -class PassRegistry; -} // namespace llvm - -namespace polly { -llvm::Pass *createCodePreparationPass(); -llvm::Pass *createScopInlinerPass(); -llvm::Pass *createDeadCodeElimWrapperPass(); -llvm::Pass *createDependenceInfoPass(); -llvm::Pass *createDependenceInfoPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createDependenceInfoWrapperPassPass(); -llvm::Pass * -createDependenceInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS); -llvm::Pass *createDOTOnlyPrinterWrapperPass(); -llvm::Pass *createDOTOnlyViewerWrapperPass(); -llvm::Pass *createDOTPrinterWrapperPass(); -llvm::Pass *createDOTViewerWrapperPass(); -llvm::Pass *createJSONExporterPass(); -llvm::Pass *createJSONImporterPass(); -llvm::Pass *createJSONImporterPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createPollyCanonicalizePass(); -llvm::Pass *createScopDetectionWrapperPassPass(); -llvm::Pass *createScopDetectionPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createScopInfoRegionPassPass(); -llvm::Pass *createScopInfoPrinterLegacyRegionPass(llvm::raw_ostream &OS); -llvm::Pass *createScopInfoWrapperPassPass(); -llvm::Pass *createScopInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS); -llvm::Pass *createIslAstInfoWrapperPassPass(); -llvm::Pass *createIslAstInfoPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createCodeGenerationPass(); -llvm::Pass *createIslScheduleOptimizerWrapperPass(); -llvm::Pass *createIslScheduleOptimizerPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createFlattenSchedulePass(); -llvm::Pass *createFlattenSchedulePrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createForwardOpTreeWrapperPass(); -llvm::Pass *createForwardOpTreePrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createDeLICMWrapperPass(); -llvm::Pass *createDeLICMPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createMaximalStaticExpansionPass(); -llvm::Pass *createSimplifyWrapperPass(int); -llvm::Pass *createSimplifyPrinterLegacyPass(llvm::raw_ostream &OS); -llvm::Pass *createPruneUnprofitableWrapperPass(); - -extern char &CodePreparationID; -} // namespace polly - -namespace { -struct PollyForcePassLinking { -  PollyForcePassLinking() { -    // We must reference the passes in such a way that compilers will not delete -    // it all as dead code, even with whole program optimization, yet is -    // effectively a NO-OP. -    if (llvm::getNonFoldableAlwaysTrue()) -      return; - -    polly::createCodePreparationPass(); -    polly::createDeadCodeElimWrapperPass(); -    polly::createDependenceInfoPass(); -    polly::createDependenceInfoPrinterLegacyPass(llvm::outs()); -    polly::createDependenceInfoWrapperPassPass(); -    polly::createDependenceInfoPrinterLegacyFunctionPass(llvm::outs()); -    polly::createDOTOnlyPrinterWrapperPass(); -    polly::createDOTOnlyViewerWrapperPass(); -    polly::createDOTPrinterWrapperPass(); -    polly::createDOTViewerWrapperPass(); -    polly::createJSONExporterPass(); -    polly::createJSONImporterPass(); -    polly::createJSONImporterPrinterLegacyPass(llvm::outs()); -    polly::createScopDetectionWrapperPassPass(); -    polly::createScopDetectionPrinterLegacyPass(llvm::outs()); -    polly::createScopInfoRegionPassPass(); -    polly::createScopInfoPrinterLegacyRegionPass(llvm::outs()); -    polly::createScopInfoWrapperPassPass(); -    polly::createScopInfoPrinterLegacyFunctionPass(llvm::outs()); -    polly::createPollyCanonicalizePass(); -    polly::createIslAstInfoWrapperPassPass(); -    polly::createIslAstInfoPrinterLegacyPass(llvm::outs()); -    polly::createCodeGenerationPass(); -    polly::createIslScheduleOptimizerWrapperPass(); -    polly::createIslScheduleOptimizerPrinterLegacyPass(llvm::outs()); -    polly::createMaximalStaticExpansionPass(); -    polly::createFlattenSchedulePass(); -    polly::createFlattenSchedulePrinterLegacyPass(llvm::errs()); -    polly::createForwardOpTreeWrapperPass(); -    polly::createForwardOpTreePrinterLegacyPass(llvm::errs()); -    polly::createDeLICMWrapperPass(); -    polly::createDeLICMPrinterLegacyPass(llvm::outs()); -    polly::createDumpModuleWrapperPass("", true); -    polly::createDumpFunctionWrapperPass(""); -    polly::createSimplifyWrapperPass(0); -    polly::createSimplifyPrinterLegacyPass(llvm::outs()); -    polly::createPruneUnprofitableWrapperPass(); -  } -} PollyForcePassLinking; // Force link by creating a global definition. -} // namespace - -namespace llvm { -void initializeCodePreparationPass(llvm::PassRegistry &); -void initializeScopInlinerWrapperPassPass(llvm::PassRegistry &); -void initializeScopDetectionWrapperPassPass(llvm::PassRegistry &); -void initializeScopDetectionPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeScopInfoRegionPassPass(PassRegistry &); -void initializeScopInfoPrinterLegacyRegionPassPass(llvm::PassRegistry &); -void initializeScopInfoWrapperPassPass(PassRegistry &); -void initializeScopInfoPrinterLegacyFunctionPassPass(PassRegistry &); -void initializeDeadCodeElimWrapperPassPass(llvm::PassRegistry &); -void initializeJSONExporterPass(llvm::PassRegistry &); -void initializeJSONImporterPass(llvm::PassRegistry &); -void initializeJSONImporterPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeDependenceInfoPass(llvm::PassRegistry &); -void initializeDependenceInfoPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeDependenceInfoWrapperPassPass(llvm::PassRegistry &); -void initializeDependenceInfoPrinterLegacyFunctionPassPass( -    llvm::PassRegistry &); -void initializeIslAstInfoWrapperPassPass(llvm::PassRegistry &); -void initializeIslAstInfoPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeCodeGenerationPass(llvm::PassRegistry &); -void initializeIslScheduleOptimizerWrapperPassPass(llvm::PassRegistry &); -void initializeIslScheduleOptimizerPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeMaximalStaticExpanderWrapperPassPass(llvm::PassRegistry &); -void initializePollyCanonicalizePass(llvm::PassRegistry &); -void initializeFlattenSchedulePass(llvm::PassRegistry &); -void initializeFlattenSchedulePrinterLegacyPassPass(llvm::PassRegistry &); -void initializeForwardOpTreeWrapperPassPass(llvm::PassRegistry &); -void initializeForwardOpTreePrinterLegacyPassPass(PassRegistry &); -void initializeDeLICMWrapperPassPass(llvm::PassRegistry &); -void initializeDeLICMPrinterLegacyPassPass(llvm::PassRegistry &); -void initializeSimplifyWrapperPassPass(llvm::PassRegistry &); -void initializeSimplifyPrinterLegacyPassPass(llvm::PassRegistry &); -void initializePruneUnprofitableWrapperPassPass(llvm::PassRegistry &); -} // namespace llvm - -#endif diff --git a/polly/include/polly/MaximalStaticExpansion.h b/polly/include/polly/MaximalStaticExpansion.h index 88827b2..1f9fbcb 100644 --- a/polly/include/polly/MaximalStaticExpansion.h +++ b/polly/include/polly/MaximalStaticExpansion.h @@ -14,6 +14,7 @@  #ifndef POLLY_MAXIMALSTATICEXPANSION_H  #define POLLY_MAXIMALSTATICEXPANSION_H +#include "polly/DependenceInfo.h"  #include "polly/ScopPass.h"  #include "llvm/IR/PassManager.h" @@ -37,6 +38,7 @@ private:    llvm::raw_ostream &OS;  }; +void runMaximalStaticExpansion(Scop &S, DependenceAnalysis::Result &DI);  } // namespace polly  #endif /* POLLY_MAXIMALSTATICEXPANSION_H */ diff --git a/polly/include/polly/Pass/PhaseManager.h b/polly/include/polly/Pass/PhaseManager.h new file mode 100644 index 0000000..9ff9bbf --- /dev/null +++ b/polly/include/polly/Pass/PhaseManager.h @@ -0,0 +1,127 @@ +//===------ PhaseManager.h --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implements the sequence of operations on SCoPs, called phases. It is itelf +// not a pass in either pass manager, but used from PollyFunctionPass or +// PollyModulePass. +// +//===----------------------------------------------------------------------===// + +#ifndef POLLY_PASS_PHASEMANAGER_H_ +#define POLLY_PASS_PHASEMANAGER_H_ + +#include "polly/DependenceInfo.h" +#include "llvm/ADT/Bitset.h" +#include <stddef.h> + +namespace llvm { +class Function; +class Error; +} // namespace llvm + +namespace polly { + +/// Phases (in execution order) within the Polly pass. +enum class PassPhase { +  None, + +  Prepare, + +  Detection, +  PrintDetect, +  DotScops, +  DotScopsOnly, +  ViewScops, +  ViewScopsOnly, + +  ScopInfo, +  PrintScopInfo, + +  Flatten, + +  Dependences, +  PrintDependences, + +  ImportJScop, +  Simplify0, +  Optree, +  DeLICM, +  Simplify1, +  DeadCodeElimination, +  MaximumStaticExtension, +  PruneUnprofitable, +  Optimization, +  ExportJScop, +  AstGen, +  CodeGen, + +  PassPhaseFirst = Prepare, +  PassPhaseLast = CodeGen +}; + +StringRef getPhaseName(PassPhase Phase); +PassPhase parsePhase(StringRef Name); +bool dependsOnDependenceInfo(PassPhase Phase); + +/// Options for the Polly pass. +class PollyPassOptions { +  /// For each Polly phase, whether it should be executed. +  /// Since PassPhase::None is unused, bit positions are shifted by one. +  llvm::Bitset<static_cast<size_t>(PassPhase::PassPhaseLast) - +               static_cast<size_t>(PassPhase::PassPhaseFirst) + 1> +      PhaseEnabled; + +public: +  bool ViewAll = false; +  std::string ViewFilter; +  Dependences::AnalysisLevel PrintDepsAnalysisLevel = Dependences::AL_Statement; + +  bool isPhaseEnabled(PassPhase Phase) const { +    assert(Phase != PassPhase::None); +    unsigned BitPos = static_cast<size_t>(Phase) - +                      static_cast<size_t>(PassPhase::PassPhaseFirst); +    return PhaseEnabled[BitPos]; +  } + +  void setPhaseEnabled(PassPhase Phase, bool Enabled = true) { +    assert(Phase != PassPhase::None); +    unsigned BitPos = static_cast<size_t>(Phase) - +                      static_cast<size_t>(PassPhase::PassPhaseFirst); +    if (Enabled) +      PhaseEnabled.set(BitPos); +    else +      PhaseEnabled.reset(BitPos); +  } + +  /// Enable all phases that are necessary for a roundtrip from LLVM-IR back to +  /// LLVM-IR. +  void enableEnd2End(); + +  /// Enabled the default optimization phases. +  void enableDefaultOpts(); + +  /// Disable all phases following \p Phase. +  /// Useful when regression testing that particular phase and everything after +  /// it is not of interest. +  void disableAfter(PassPhase Phase); + +  /// Check whether the options are coherent relative to each other. +  llvm::Error checkConsistency() const; +}; + +/// Run Polly and its phases on \p F. +bool runPollyPass(Function &F, llvm::FunctionAnalysisManager &FAM, +                  PollyPassOptions Opts); +} // namespace polly + +/// Make llvm::enum_seq<PassPhase> work. +template <> struct llvm::enum_iteration_traits<polly::PassPhase> { +  static constexpr bool is_iterable = true; +}; + +#endif /* POLLY_PASS_PHASEMANAGER_H_ */ diff --git a/polly/include/polly/Pass/PollyFunctionPass.h b/polly/include/polly/Pass/PollyFunctionPass.h new file mode 100644 index 0000000..dd0d4e7 --- /dev/null +++ b/polly/include/polly/Pass/PollyFunctionPass.h @@ -0,0 +1,32 @@ +//===------ PollyFunctionPass.h - Polly function pass ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef POLLY_PASS_POLLYFUNCTIONPASS_H_ +#define POLLY_PASS_POLLYFUNCTIONPASS_H_ + +#include "polly/Pass/PhaseManager.h" +#include "llvm/IR/Analysis.h" +#include "llvm/IR/PassManager.h" +#include <utility> + +namespace polly { + +class PollyFunctionPass : public llvm::PassInfoMixin<PollyFunctionPass> { +public: +  PollyFunctionPass() {} +  PollyFunctionPass(PollyPassOptions Opts) : Opts(std::move(Opts)) {} + +  llvm::PreservedAnalyses run(llvm::Function &F, +                              llvm::FunctionAnalysisManager &); + +private: +  PollyPassOptions Opts; +}; +} // namespace polly + +#endif /* POLLY_PASS_POLLYFUNCTIONPASS_H_ */ diff --git a/polly/include/polly/Pass/PollyModulePass.h b/polly/include/polly/Pass/PollyModulePass.h new file mode 100644 index 0000000..2214bbf --- /dev/null +++ b/polly/include/polly/Pass/PollyModulePass.h @@ -0,0 +1,30 @@ +//===------ PollyModulePass.h - Polly module pass -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef POLLY_PASS_POLLYMODULEPASS_H_ +#define POLLY_PASS_POLLYMODULEPASS_H_ + +#include "polly/Pass/PhaseManager.h" +#include "llvm/IR/PassManager.h" + +namespace polly { + +class PollyModulePass : public llvm::PassInfoMixin<PollyModulePass> { +public: +  PollyModulePass() {} +  PollyModulePass(PollyPassOptions Opts) : Opts(std::move(Opts)) {} + +  llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &); + +private: +  PollyPassOptions Opts; +}; + +} // namespace polly + +#endif /* POLLY_PASS_POLLYMODULEPASS_H_ */ diff --git a/polly/include/polly/PruneUnprofitable.h b/polly/include/polly/PruneUnprofitable.h index 2d285cc..16b76cc 100644 --- a/polly/include/polly/PruneUnprofitable.h +++ b/polly/include/polly/PruneUnprofitable.h @@ -15,13 +15,7 @@  #include "polly/ScopPass.h" -namespace llvm { -class Pass; -class PassRegistry; -} // namespace llvm -  namespace polly { -llvm::Pass *createPruneUnprofitableWrapperPass();  struct PruneUnprofitablePass final      : llvm::PassInfoMixin<PruneUnprofitablePass> { @@ -30,10 +24,8 @@ struct PruneUnprofitablePass final    llvm::PreservedAnalyses run(Scop &S, ScopAnalysisManager &SAM,                                ScopStandardAnalysisResults &SAR, SPMUpdater &U);  }; -} // namespace polly -namespace llvm { -void initializePruneUnprofitableWrapperPassPass(PassRegistry &); -} +bool runPruneUnprofitable(Scop &S); +} // namespace polly  #endif // POLLY_PRUNEUNPROFITABLE_H diff --git a/polly/include/polly/RegisterPasses.h b/polly/include/polly/RegisterPasses.h index 3a81e1b..7819462 100644 --- a/polly/include/polly/RegisterPasses.h +++ b/polly/include/polly/RegisterPasses.h @@ -14,7 +14,6 @@  #define POLLY_REGISTER_PASSES_H  namespace llvm { -class PassRegistry;  class PassBuilder;  struct PassPluginLibraryInfo;  namespace legacy { @@ -23,7 +22,6 @@ class PassManagerBase;  } // namespace llvm  namespace polly { -void initializePollyPasses(llvm::PassRegistry &Registry);  void registerPollyPasses(llvm::PassBuilder &PB);  } // namespace polly diff --git a/polly/include/polly/ScheduleOptimizer.h b/polly/include/polly/ScheduleOptimizer.h index 3e17eef..ac45572 100644 --- a/polly/include/polly/ScheduleOptimizer.h +++ b/polly/include/polly/ScheduleOptimizer.h @@ -9,16 +9,10 @@  #ifndef POLLY_SCHEDULEOPTIMIZER_H  #define POLLY_SCHEDULEOPTIMIZER_H +#include "polly/DependenceInfo.h"  #include "polly/ScopPass.h" -namespace llvm { -class Pass; -class PassRegistry; -} // namespace llvm -  namespace polly { -llvm::Pass *createIslScheduleOptimizerWrapperPass(); -llvm::Pass *createIslScheduleOptimizerPrinterLegacyPass(llvm::raw_ostream &OS);  struct IslScheduleOptimizerPass final      : llvm::PassInfoMixin<IslScheduleOptimizerPass> { @@ -38,11 +32,9 @@ struct IslScheduleOptimizerPrinterPass final  private:    llvm::raw_ostream &OS;  }; -} // namespace polly -namespace llvm { -void initializeIslScheduleOptimizerWrapperPassPass(llvm::PassRegistry &); -void initializeIslScheduleOptimizerPrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm +void runIslScheduleOptimizer(Scop &S, llvm::TargetTransformInfo *TTI, +                             DependenceAnalysis::Result &Deps); +} // namespace polly  #endif // POLLY_SCHEDULEOPTIMIZER_H diff --git a/polly/include/polly/ScopDetection.h b/polly/include/polly/ScopDetection.h index 5759f75..ded1c882 100644 --- a/polly/include/polly/ScopDetection.h +++ b/polly/include/polly/ScopDetection.h @@ -52,7 +52,6 @@  #include "llvm/Analysis/AliasSetTracker.h"  #include "llvm/Analysis/RegionInfo.h"  #include "llvm/Analysis/ScalarEvolutionExpressions.h" -#include "llvm/Pass.h"  #include <set>  namespace polly { @@ -68,7 +67,6 @@ using llvm::DenseMap;  using llvm::DominatorTree;  using llvm::Function;  using llvm::FunctionAnalysisManager; -using llvm::FunctionPass;  using llvm::IntrinsicInst;  using llvm::LoopInfo;  using llvm::Module; @@ -631,31 +629,6 @@ struct ScopAnalysisPrinterPass final : PassInfoMixin<ScopAnalysisPrinterPass> {    raw_ostream &OS;  }; - -class ScopDetectionWrapperPass final : public FunctionPass { -  std::unique_ptr<ScopDetection> Result; - -public: -  ScopDetectionWrapperPass(); - -  /// @name FunctionPass interface -  ///@{ -  static char ID; -  void getAnalysisUsage(AnalysisUsage &AU) const override; -  void releaseMemory() override; -  bool runOnFunction(Function &F) override; -  void print(raw_ostream &OS, const Module *M = nullptr) const override; -  ///@} - -  ScopDetection &getSD() const { return *Result; } -}; - -llvm::Pass *createScopDetectionPrinterLegacyPass(llvm::raw_ostream &OS);  } // namespace polly -namespace llvm { -void initializeScopDetectionWrapperPassPass(llvm::PassRegistry &); -void initializeScopDetectionPrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm -  #endif // POLLY_SCOPDETECTION_H diff --git a/polly/include/polly/ScopGraphPrinter.h b/polly/include/polly/ScopGraphPrinter.h index b57732a..c4e669f 100644 --- a/polly/include/polly/ScopGraphPrinter.h +++ b/polly/include/polly/ScopGraphPrinter.h @@ -70,6 +70,9 @@ struct DOTGraphTraits<polly::ScopDetection *> : DOTGraphTraits<RegionNode *> {  namespace polly { +extern std::string ViewFilter; +extern bool ViewAll; +  struct ScopViewer final : llvm::DOTGraphTraitsViewer<ScopAnalysis, false> {    ScopViewer() : llvm::DOTGraphTraitsViewer<ScopAnalysis, false>("scops") {} diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index f700144..7541ddc 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -23,13 +23,11 @@  #include "llvm/ADT/ArrayRef.h"  #include "llvm/ADT/MapVector.h"  #include "llvm/ADT/SetVector.h" -#include "llvm/Analysis/RegionPass.h"  #include "llvm/IR/DebugLoc.h"  #include "llvm/IR/Instruction.h"  #include "llvm/IR/Instructions.h"  #include "llvm/IR/PassManager.h"  #include "llvm/IR/ValueHandle.h" -#include "llvm/Pass.h"  #include "isl/isl-noexceptions.h"  #include <cassert>  #include <cstddef> @@ -55,8 +53,6 @@ using llvm::MemIntrinsic;  using llvm::PassInfoMixin;  using llvm::PHINode;  using llvm::RegionNode; -using llvm::RegionPass; -using llvm::RGPassManager;  using llvm::SetVector;  using llvm::SmallPtrSetImpl;  using llvm::SmallVector; @@ -2674,39 +2670,6 @@ public:  /// Print Scop scop to raw_ostream OS.  raw_ostream &operator<<(raw_ostream &OS, const Scop &scop); -/// The legacy pass manager's analysis pass to compute scop information -///        for a region. -class ScopInfoRegionPass final : public RegionPass { -  /// The Scop pointer which is used to construct a Scop. -  std::unique_ptr<Scop> S; - -public: -  static char ID; // Pass identification, replacement for typeid - -  ScopInfoRegionPass() : RegionPass(ID) {} -  ~ScopInfoRegionPass() override = default; - -  /// Build Scop object, the Polly IR of static control -  ///        part for the current SESE-Region. -  /// -  /// @return If the current region is a valid for a static control part, -  ///         return the Polly IR representing this static control part, -  ///         return null otherwise. -  Scop *getScop() { return S.get(); } -  const Scop *getScop() const { return S.get(); } - -  /// Calculate the polyhedral scop information for a given Region. -  bool runOnRegion(Region *R, RGPassManager &RGM) override; - -  void releaseMemory() override { S.reset(); } - -  void print(raw_ostream &O, const Module *M = nullptr) const override; - -  void getAnalysisUsage(AnalysisUsage &AU) const override; -}; - -llvm::Pass *createScopInfoPrinterLegacyRegionPass(raw_ostream &OS); -  class ScopInfo {  public:    using RegionToScopMapTy = MapVector<Region *, std::unique_ptr<Scop>>; @@ -2781,45 +2744,6 @@ struct ScopInfoPrinterPass final : PassInfoMixin<ScopInfoPrinterPass> {    raw_ostream &Stream;  }; - -//===----------------------------------------------------------------------===// -/// The legacy pass manager's analysis pass to compute scop information -///        for the whole function. -/// -/// This pass will maintain a map of the maximal region within a scop to its -/// scop object for all the feasible scops present in a function. -/// This pass is an alternative to the ScopInfoRegionPass in order to avoid a -/// region pass manager. -class ScopInfoWrapperPass final : public FunctionPass { -  std::unique_ptr<ScopInfo> Result; - -public: -  ScopInfoWrapperPass() : FunctionPass(ID) {} -  ~ScopInfoWrapperPass() override = default; - -  static char ID; // Pass identification, replacement for typeid - -  ScopInfo *getSI() { return Result.get(); } -  const ScopInfo *getSI() const { return Result.get(); } - -  /// Calculate all the polyhedral scops for a given function. -  bool runOnFunction(Function &F) override; - -  void releaseMemory() override { Result.reset(); } - -  void print(raw_ostream &O, const Module *M = nullptr) const override; - -  void getAnalysisUsage(AnalysisUsage &AU) const override; -}; - -llvm::Pass *createScopInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS);  } // end namespace polly -namespace llvm { -void initializeScopInfoRegionPassPass(PassRegistry &); -void initializeScopInfoPrinterLegacyRegionPassPass(PassRegistry &); -void initializeScopInfoWrapperPassPass(PassRegistry &); -void initializeScopInfoPrinterLegacyFunctionPassPass(PassRegistry &); -} // end namespace llvm -  #endif // POLLY_SCOPINFO_H diff --git a/polly/include/polly/ScopInliner.h b/polly/include/polly/ScopInliner.h index 0146678..ae1938f 100644 --- a/polly/include/polly/ScopInliner.h +++ b/polly/include/polly/ScopInliner.h @@ -23,12 +23,6 @@ public:                                llvm::LazyCallGraph &CG,                                llvm::CGSCCUpdateResult &UR);  }; - -llvm::Pass *createScopInlinerWrapperPass();  } // namespace polly -namespace llvm { -void initializeScopInlinerWrapperPassPass(llvm::PassRegistry &); -} -  #endif /* POLLY_POLLYINLINER_H */ diff --git a/polly/include/polly/ScopPass.h b/polly/include/polly/ScopPass.h index 144cfd1..80ccd571 100644 --- a/polly/include/polly/ScopPass.h +++ b/polly/include/polly/ScopPass.h @@ -19,7 +19,6 @@  #include "polly/ScopInfo.h"  #include "llvm/ADT/PriorityWorklist.h" -#include "llvm/Analysis/RegionPass.h"  #include "llvm/Analysis/TargetTransformInfo.h"  #include "llvm/IR/PassManager.h"  #include "llvm/IR/PassManagerImpl.h" @@ -155,33 +154,6 @@ using ScopPassManager =      PassManager<Scop, ScopAnalysisManager, ScopStandardAnalysisResults &,                  SPMUpdater &>; -/// ScopPass - This class adapts the RegionPass interface to allow convenient -/// creation of passes that operate on the Polly IR. Instead of overriding -/// runOnRegion, subclasses override runOnScop. -class ScopPass : public RegionPass { -  Scop *S; - -protected: -  explicit ScopPass(char &ID) : RegionPass(ID), S(nullptr) {} - -  /// runOnScop - This method must be overloaded to perform the -  /// desired Polyhedral transformation or analysis. -  /// -  virtual bool runOnScop(Scop &S) = 0; - -  /// Print method for SCoPs. -  virtual void printScop(raw_ostream &OS, Scop &S) const {} - -  /// getAnalysisUsage - Subclasses that override getAnalysisUsage -  /// must call this. -  /// -  void getAnalysisUsage(AnalysisUsage &AU) const override; - -private: -  bool runOnRegion(Region *R, RGPassManager &RGM) override; -  void print(raw_ostream &OS, const Module *) const override; -}; -  struct ScopStandardAnalysisResults {    DominatorTree &DT;    ScopInfo &SI; diff --git a/polly/include/polly/Simplify.h b/polly/include/polly/Simplify.h index b2aa58d..4565eb2 100644 --- a/polly/include/polly/Simplify.h +++ b/polly/include/polly/Simplify.h @@ -16,11 +16,6 @@  #include "polly/ScopPass.h"  #include "llvm/ADT/SmallVector.h" -namespace llvm { -class PassRegistry; -class Pass; -} // namespace llvm -  namespace polly {  class MemoryAccess;  class ScopStmt; @@ -41,17 +36,6 @@ class ScopStmt;  ///   undefined.  llvm::SmallVector<MemoryAccess *, 32> getAccessesInOrder(ScopStmt &Stmt); -/// Create a Simplify pass -/// -/// @param CallNo Disambiguates this instance for when there are multiple -///               instances of this pass in the pass manager. It is used only to -///               keep the statistics apart and has no influence on the -///               simplification itself. -/// -/// @return The Simplify pass. -llvm::Pass *createSimplifyWrapperPass(int CallNo = 0); -llvm::Pass *createSimplifyPrinterLegacyPass(llvm::raw_ostream &OS); -  struct SimplifyPass final : PassInfoMixin<SimplifyPass> {    SimplifyPass(int CallNo = 0) : CallNo(CallNo) {} @@ -73,11 +57,8 @@ private:    raw_ostream &OS;    int CallNo;  }; -} // namespace polly -namespace llvm { -void initializeSimplifyWrapperPassPass(llvm::PassRegistry &); -void initializeSimplifyPrinterLegacyPassPass(llvm::PassRegistry &); -} // namespace llvm +bool runSimplify(Scop &S, int CallNo); +} // namespace polly  #endif /* POLLY_TRANSFORM_SIMPLIFY_H */ diff --git a/polly/include/polly/Support/DumpFunctionPass.h b/polly/include/polly/Support/DumpFunctionPass.h index e5c1620..af04912 100644 --- a/polly/include/polly/Support/DumpFunctionPass.h +++ b/polly/include/polly/Support/DumpFunctionPass.h @@ -16,13 +16,7 @@  #include "llvm/IR/PassManager.h"  #include <string> -namespace llvm { -class FunctionPass; -class ModulePass; -} // namespace llvm -  namespace polly { -llvm::FunctionPass *createDumpFunctionWrapperPass(std::string Suffix);  /// A pass that isolates a function into a new Module and writes it into a file.  struct DumpFunctionPass final : llvm::PassInfoMixin<DumpFunctionPass> { @@ -33,12 +27,6 @@ struct DumpFunctionPass final : llvm::PassInfoMixin<DumpFunctionPass> {    llvm::PreservedAnalyses run(llvm::Function &F,                                llvm::FunctionAnalysisManager &AM);  }; -  } // namespace polly -namespace llvm { -class PassRegistry; -void initializeDumpFunctionWrapperPassPass(llvm::PassRegistry &); -} // namespace llvm -  #endif /* POLLY_SUPPORT_DUMPFUNCTIONPASS_H */ diff --git a/polly/include/polly/Support/DumpModulePass.h b/polly/include/polly/Support/DumpModulePass.h index c90bbc2..6d393a1 100644 --- a/polly/include/polly/Support/DumpModulePass.h +++ b/polly/include/polly/Support/DumpModulePass.h @@ -16,12 +16,8 @@  #include "llvm/IR/PassManager.h"  #include <string> -namespace llvm { -class ModulePass; -} // namespace llvm -  namespace polly { -/// Create a pass that prints the module into a file. +/// A pass that prints the module into a file.  ///  /// The meaning of @p Filename depends on @p IsSuffix. If IsSuffix==false, then  /// the module is written to the @p Filename. If it is true, the filename is @@ -30,10 +26,6 @@ namespace polly {  /// The intent of IsSuffix is to avoid the file being overwritten when  /// processing multiple modules and/or with multiple dump passes in the  /// pipeline. -llvm::ModulePass *createDumpModuleWrapperPass(std::string Filename, -                                              bool IsSuffix); - -/// A pass that prints the module into a file.  struct DumpModulePass final : llvm::PassInfoMixin<DumpModulePass> {    std::string Filename;    bool IsSuffix; @@ -46,9 +38,4 @@ struct DumpModulePass final : llvm::PassInfoMixin<DumpModulePass> {  } // namespace polly -namespace llvm { -class PassRegistry; -void initializeDumpModuleWrapperPassPass(llvm::PassRegistry &); -} // namespace llvm -  #endif /* POLLY_SUPPORT_DUMPMODULEPASS_H */ diff --git a/polly/include/polly/Support/ScopHelper.h b/polly/include/polly/Support/ScopHelper.h index 7589152..38b731a 100644 --- a/polly/include/polly/Support/ScopHelper.h +++ b/polly/include/polly/Support/ScopHelper.h @@ -361,14 +361,6 @@ void simplifyRegion(llvm::Region *R, llvm::DominatorTree *DT,  /// Split the entry block of a function to store the newly inserted  ///        allocations outside of all Scops.  /// -/// @param EntryBlock The entry block of the current function. -/// @param P          The pass that currently running. -/// -void splitEntryBlockForAlloca(llvm::BasicBlock *EntryBlock, llvm::Pass *P); - -/// Split the entry block of a function to store the newly inserted -///        allocations outside of all Scops. -///  /// @param DT DominatorTree to be updated.  /// @param LI LoopInfo to be updated.  /// @param RI RegionInfo to be updated. diff --git a/polly/lib/Analysis/DependenceInfo.cpp b/polly/lib/Analysis/DependenceInfo.cpp index c620f40..5183fc5 100644 --- a/polly/lib/Analysis/DependenceInfo.cpp +++ b/polly/lib/Analysis/DependenceInfo.cpp @@ -20,7 +20,6 @@  //===----------------------------------------------------------------------===//  //  #include "polly/DependenceInfo.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/Support/GICHelper.h" @@ -42,6 +41,10 @@ using namespace llvm;  #include "polly/Support/PollyDebug.h"  #define DEBUG_TYPE "polly-dependence" +namespace polly { +Dependences::AnalysisLevel OptAnalysisLevel; +} +  static cl::opt<int> OptComputeOut(      "polly-dependences-computeout",      cl::desc("Bound the dependence analysis by a maximal amount of " @@ -69,9 +72,10 @@ static cl::opt<enum AnalysisType> OptAnalysisType(                            "Overapproximation of dependences")),      cl::Hidden, cl::init(VALUE_BASED_ANALYSIS), cl::cat(PollyCategory)); -static cl::opt<Dependences::AnalysisLevel> OptAnalysisLevel( +static cl::opt<Dependences::AnalysisLevel, true> XOptAnalysisLevel(      "polly-dependences-analysis-level",      cl::desc("The level of dependence analysis"), +    cl::location(OptAnalysisLevel),      cl::values(clEnumValN(Dependences::AL_Statement, "statement-wise",                            "Statement-level analysis"),                 clEnumValN(Dependences::AL_Reference, "reference-wise", @@ -881,213 +885,7 @@ DependenceInfoPrinterPass::run(Scop &S, ScopAnalysisManager &SAM,    return PreservedAnalyses::all();  } -const Dependences & -DependenceInfo::getDependences(Dependences::AnalysisLevel Level) { -  if (Dependences *d = D[Level].get()) -    return *d; - -  return recomputeDependences(Level); -} - -const Dependences & -DependenceInfo::recomputeDependences(Dependences::AnalysisLevel Level) { -  D[Level].reset(new Dependences(S->getSharedIslCtx(), Level)); -  D[Level]->calculateDependences(*S); -  return *D[Level]; -} - -void DependenceInfo::abandonDependences() { -  for (std::unique_ptr<Dependences> &Deps : D) -    Deps.release(); -} - -bool DependenceInfo::runOnScop(Scop &ScopVar) { -  S = &ScopVar; -  return false; -} - -/// Print the dependences for the given SCoP to @p OS. - -void polly::DependenceInfo::printScop(raw_ostream &OS, Scop &S) const { -  if (auto d = D[OptAnalysisLevel].get()) { -    d->print(OS); -    return; -  } - -  // Otherwise create the dependences on-the-fly and print it -  Dependences D(S.getSharedIslCtx(), OptAnalysisLevel); -  D.calculateDependences(S); -  D.print(OS); -} - -void DependenceInfo::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequiredTransitive<ScopInfoRegionPass>(); -  AU.setPreservesAll(); -} - -char DependenceInfo::ID = 0; - -Pass *polly::createDependenceInfoPass() { return new DependenceInfo(); } - -INITIALIZE_PASS_BEGIN(DependenceInfo, "polly-dependences", -                      "Polly - Calculate dependences", false, false); -INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass); -INITIALIZE_PASS_END(DependenceInfo, "polly-dependences", -                    "Polly - Calculate dependences", false, false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from DependenceAnalysis. -class DependenceInfoPrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  DependenceInfoPrinterLegacyPass() : DependenceInfoPrinterLegacyPass(outs()) {} - -  explicit DependenceInfoPrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    DependenceInfo &P = getAnalysis<DependenceInfo>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for " -       << "region: '" << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<DependenceInfo>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char DependenceInfoPrinterLegacyPass::ID = 0; -} // namespace - -Pass *polly::createDependenceInfoPrinterLegacyPass(raw_ostream &OS) { -  return new DependenceInfoPrinterLegacyPass(OS); -} - -INITIALIZE_PASS_BEGIN(DependenceInfoPrinterLegacyPass, -                      "polly-print-dependences", "Polly - Print dependences", -                      false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo); -INITIALIZE_PASS_END(DependenceInfoPrinterLegacyPass, "polly-print-dependences", -                    "Polly - Print dependences", false, false) - -//===----------------------------------------------------------------------===// - -const Dependences & -DependenceInfoWrapperPass::getDependences(Scop *S, -                                          Dependences::AnalysisLevel Level) { -  auto It = ScopToDepsMap.find(S); -  if (It != ScopToDepsMap.end()) -    if (It->second) { -      if (It->second->getDependenceLevel() == Level) -        return *It->second; -    } -  return recomputeDependences(S, Level); -} - -const Dependences &DependenceInfoWrapperPass::recomputeDependences( -    Scop *S, Dependences::AnalysisLevel Level) { -  std::unique_ptr<Dependences> D(new Dependences(S->getSharedIslCtx(), Level)); -  D->calculateDependences(*S); -  auto Inserted = ScopToDepsMap.insert(std::make_pair(S, std::move(D))); -  return *Inserted.first->second; +DependenceAnalysis::Result polly::runDependenceAnalysis(Scop &S) { +  DependenceAnalysis::Result Result{S, {}}; +  return Result;  } - -bool DependenceInfoWrapperPass::runOnFunction(Function &F) { -  auto &SI = *getAnalysis<ScopInfoWrapperPass>().getSI(); -  for (auto &It : SI) { -    assert(It.second && "Invalid SCoP object!"); -    recomputeDependences(It.second.get(), Dependences::AL_Access); -  } -  return false; -} - -void DependenceInfoWrapperPass::print(raw_ostream &OS, const Module *M) const { -  for (auto &It : ScopToDepsMap) { -    assert((It.first && It.second) && "Invalid Scop or Dependence object!\n"); -    It.second->print(OS); -  } -} - -void DependenceInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequiredTransitive<ScopInfoWrapperPass>(); -  AU.setPreservesAll(); -} - -char DependenceInfoWrapperPass::ID = 0; - -Pass *polly::createDependenceInfoWrapperPassPass() { -  return new DependenceInfoWrapperPass(); -} - -INITIALIZE_PASS_BEGIN( -    DependenceInfoWrapperPass, "polly-function-dependences", -    "Polly - Calculate dependences for all the SCoPs of a function", false, -    false) -INITIALIZE_PASS_DEPENDENCY(ScopInfoWrapperPass); -INITIALIZE_PASS_END( -    DependenceInfoWrapperPass, "polly-function-dependences", -    "Polly - Calculate dependences for all the SCoPs of a function", false, -    false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from DependenceInfoWrapperPass. -class DependenceInfoPrinterLegacyFunctionPass final : public FunctionPass { -public: -  static char ID; - -  DependenceInfoPrinterLegacyFunctionPass() -      : DependenceInfoPrinterLegacyFunctionPass(outs()) {} - -  explicit DependenceInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS) -      : FunctionPass(ID), OS(OS) {} - -  bool runOnFunction(Function &F) override { -    DependenceInfoWrapperPass &P = getAnalysis<DependenceInfoWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for function '" -       << F.getName() << "':\n"; -    P.print(OS); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    FunctionPass::getAnalysisUsage(AU); -    AU.addRequired<DependenceInfoWrapperPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char DependenceInfoPrinterLegacyFunctionPass::ID = 0; -} // namespace - -Pass *polly::createDependenceInfoPrinterLegacyFunctionPass(raw_ostream &OS) { -  return new DependenceInfoPrinterLegacyFunctionPass(OS); -} - -INITIALIZE_PASS_BEGIN( -    DependenceInfoPrinterLegacyFunctionPass, "polly-print-function-dependences", -    "Polly - Print dependences for all the SCoPs of a function", false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfoWrapperPass); -INITIALIZE_PASS_END(DependenceInfoPrinterLegacyFunctionPass, -                    "polly-print-function-dependences", -                    "Polly - Print dependences for all the SCoPs of a function", -                    false, false) diff --git a/polly/lib/Analysis/PruneUnprofitable.cpp b/polly/lib/Analysis/PruneUnprofitable.cpp index f8469c0..40cc917 100644 --- a/polly/lib/Analysis/PruneUnprofitable.cpp +++ b/polly/lib/Analysis/PruneUnprofitable.cpp @@ -55,8 +55,9 @@ static void updateStatistics(Scop &S, bool Pruned) {      NumAffineLoops += ScopStats.NumAffineLoops;    }  } +} // namespace -static bool runPruneUnprofitable(Scop &S) { +bool polly::runPruneUnprofitable(Scop &S) {    if (PollyProcessUnprofitable) {      POLLY_DEBUG(          dbgs() << "NOTE: -polly-process-unprofitable active, won't prune " @@ -79,35 +80,6 @@ static bool runPruneUnprofitable(Scop &S) {    return false;  } -class PruneUnprofitableWrapperPass final : public ScopPass { -public: -  static char ID; - -  explicit PruneUnprofitableWrapperPass() : ScopPass(ID) {} -  PruneUnprofitableWrapperPass(const PruneUnprofitableWrapperPass &) = delete; -  PruneUnprofitableWrapperPass & -  operator=(const PruneUnprofitableWrapperPass &) = delete; - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.addRequired<ScopInfoRegionPass>(); -    AU.setPreservesAll(); -  } - -  bool runOnScop(Scop &S) override { return runPruneUnprofitable(S); } -}; -} // namespace - -char PruneUnprofitableWrapperPass::ID; - -Pass *polly::createPruneUnprofitableWrapperPass() { -  return new PruneUnprofitableWrapperPass(); -} - -INITIALIZE_PASS_BEGIN(PruneUnprofitableWrapperPass, "polly-prune-unprofitable", -                      "Polly - Prune unprofitable SCoPs", false, false) -INITIALIZE_PASS_END(PruneUnprofitableWrapperPass, "polly-prune-unprofitable", -                    "Polly - Prune unprofitable SCoPs", false, false) -  llvm::PreservedAnalyses  PruneUnprofitablePass::run(Scop &S, ScopAnalysisManager &SAM,                             ScopStandardAnalysisResults &SAR, SPMUpdater &U) { diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp index 67a4c43..60a1e00 100644 --- a/polly/lib/Analysis/ScopBuilder.cpp +++ b/polly/lib/Analysis/ScopBuilder.cpp @@ -56,6 +56,7 @@  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/raw_ostream.h"  #include <cassert> +#include <deque>  using namespace llvm;  using namespace polly; diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 43ed863..29e8934 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -44,7 +44,6 @@  //===----------------------------------------------------------------------===//  #include "polly/ScopDetection.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopDetectionDiagnostic.h"  #include "polly/Support/SCEVValidator.h" @@ -75,8 +74,6 @@  #include "llvm/IR/Module.h"  #include "llvm/IR/PassManager.h"  #include "llvm/IR/Value.h" -#include "llvm/InitializePasses.h" -#include "llvm/Pass.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/Regex.h"  #include "llvm/Support/raw_ostream.h" @@ -1983,53 +1980,12 @@ void ScopDetection::verifyAnalysis() {      verifyRegion(*R);  } -bool ScopDetectionWrapperPass::runOnFunction(Function &F) { -  auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); -  auto &RI = getAnalysis<RegionInfoPass>().getRegionInfo(); -  auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); -  auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE(); -  auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); -  auto &ORE = getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(); - -  Result = std::make_unique<ScopDetection>(DT, SE, LI, RI, AA, ORE); -  Result->detect(F); -  return false; -} - -void ScopDetectionWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequired<LoopInfoWrapperPass>(); -  AU.addRequiredTransitive<ScalarEvolutionWrapperPass>(); -  AU.addRequired<DominatorTreeWrapperPass>(); -  AU.addRequired<OptimizationRemarkEmitterWrapperPass>(); -  // We also need AA and RegionInfo when we are verifying analysis. -  AU.addRequiredTransitive<AAResultsWrapperPass>(); -  AU.addRequiredTransitive<RegionInfoPass>(); -  AU.setPreservesAll(); -} - -void ScopDetectionWrapperPass::print(raw_ostream &OS, const Module *) const { -  for (const Region *R : Result->ValidRegions) -    OS << "Valid Region for Scop: " << R->getNameStr() << '\n'; - -  OS << "\n"; -} - -ScopDetectionWrapperPass::ScopDetectionWrapperPass() : FunctionPass(ID) { -  // Disable runtime alias checks if we ignore aliasing all together. -  if (IgnoreAliasing) -    PollyUseRuntimeAliasChecks = false; -} -  ScopAnalysis::ScopAnalysis() {    // Disable runtime alias checks if we ignore aliasing all together.    if (IgnoreAliasing)      PollyUseRuntimeAliasChecks = false;  } -void ScopDetectionWrapperPass::releaseMemory() { Result.reset(); } - -char ScopDetectionWrapperPass::ID; -  AnalysisKey ScopAnalysis::Key;  ScopDetection ScopAnalysis::run(Function &F, FunctionAnalysisManager &FAM) { @@ -2055,66 +2011,3 @@ PreservedAnalyses ScopAnalysisPrinterPass::run(Function &F,    OS << "\n";    return PreservedAnalyses::all();  } - -Pass *polly::createScopDetectionWrapperPassPass() { -  return new ScopDetectionWrapperPass(); -} - -INITIALIZE_PASS_BEGIN(ScopDetectionWrapperPass, "polly-detect", -                      "Polly - Detect static control parts (SCoPs)", false, -                      false); -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass); -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); -INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass); -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); -INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass); -INITIALIZE_PASS_END(ScopDetectionWrapperPass, "polly-detect", -                    "Polly - Detect static control parts (SCoPs)", false, false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from ScopDetectionWrapperPass. -class ScopDetectionPrinterLegacyPass final : public FunctionPass { -public: -  static char ID; - -  ScopDetectionPrinterLegacyPass() : ScopDetectionPrinterLegacyPass(outs()) {} - -  explicit ScopDetectionPrinterLegacyPass(llvm::raw_ostream &OS) -      : FunctionPass(ID), OS(OS) {} - -  bool runOnFunction(Function &F) override { -    ScopDetectionWrapperPass &P = getAnalysis<ScopDetectionWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for function '" -       << F.getName() << "':\n"; -    P.print(OS); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    FunctionPass::getAnalysisUsage(AU); -    AU.addRequired<ScopDetectionWrapperPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char ScopDetectionPrinterLegacyPass::ID = 0; -} // namespace - -Pass *polly::createScopDetectionPrinterLegacyPass(raw_ostream &OS) { -  return new ScopDetectionPrinterLegacyPass(OS); -} - -INITIALIZE_PASS_BEGIN(ScopDetectionPrinterLegacyPass, "polly-print-detect", -                      "Polly - Print static control parts (SCoPs)", false, -                      false); -INITIALIZE_PASS_DEPENDENCY(ScopDetectionWrapperPass); -INITIALIZE_PASS_END(ScopDetectionPrinterLegacyPass, "polly-print-detect", -                    "Polly - Print static control parts (SCoPs)", false, false) diff --git a/polly/lib/Analysis/ScopGraphPrinter.cpp b/polly/lib/Analysis/ScopGraphPrinter.cpp index eb6c995..29e2128 100644 --- a/polly/lib/Analysis/ScopGraphPrinter.cpp +++ b/polly/lib/Analysis/ScopGraphPrinter.cpp @@ -14,20 +14,26 @@  //===----------------------------------------------------------------------===//  #include "polly/ScopGraphPrinter.h" -#include "polly/LinkAllPasses.h"  #include "polly/ScopDetection.h"  #include "llvm/Support/CommandLine.h"  using namespace polly;  using namespace llvm; -static cl::opt<std::string> -    ViewFilter("polly-view-only", -               cl::desc("Only view functions that match this pattern"), -               cl::Hidden, cl::init("")); -static cl::opt<bool> ViewAll("polly-view-all", -                             cl::desc("Also show functions without any scops"), -                             cl::Hidden, cl::init(false)); +namespace polly { +std::string ViewFilter; +bool ViewAll; +} // namespace polly + +static cl::opt<std::string, true> +    XViewFilter("polly-view-only", +                cl::desc("Only view functions that match this pattern"), +                cl::location(ViewFilter), cl::Hidden, cl::init("")); + +static cl::opt<bool, true> +    XViewAll("polly-view-all", +             cl::desc("Also show functions without any scops"), +             cl::location(ViewAll), cl::Hidden, cl::init(false));  namespace llvm { @@ -134,104 +140,6 @@ void DOTGraphTraits<ScopDetection *>::addCustomGraphFeatures(  } // namespace llvm -struct ScopDetectionAnalysisGraphTraits { -  static ScopDetection *getGraph(ScopDetectionWrapperPass *Analysis) { -    return &Analysis->getSD(); -  } -}; - -struct ScopViewerWrapperPass -    : DOTGraphTraitsViewerWrapperPass<ScopDetectionWrapperPass, false, -                                      ScopDetection *, -                                      ScopDetectionAnalysisGraphTraits> { -  static char ID; -  ScopViewerWrapperPass() -      : DOTGraphTraitsViewerWrapperPass<ScopDetectionWrapperPass, false, -                                        ScopDetection *, -                                        ScopDetectionAnalysisGraphTraits>( -            "scops", ID) {} -  bool processFunction(Function &F, ScopDetectionWrapperPass &SD) override { -    if (ViewFilter != "" && !F.getName().count(ViewFilter)) -      return false; - -    if (ViewAll) -      return true; - -    // Check that at least one scop was detected. -    return std::distance(SD.getSD().begin(), SD.getSD().end()) > 0; -  } -}; -char ScopViewerWrapperPass::ID = 0; - -struct ScopOnlyViewerWrapperPass -    : DOTGraphTraitsViewerWrapperPass<ScopDetectionWrapperPass, false, -                                      ScopDetection *, -                                      ScopDetectionAnalysisGraphTraits> { -  static char ID; -  ScopOnlyViewerWrapperPass() -      : DOTGraphTraitsViewerWrapperPass<ScopDetectionWrapperPass, false, -                                        ScopDetection *, -                                        ScopDetectionAnalysisGraphTraits>( -            "scopsonly", ID) {} -}; -char ScopOnlyViewerWrapperPass::ID = 0; - -struct ScopPrinterWrapperPass -    : DOTGraphTraitsPrinterWrapperPass<ScopDetectionWrapperPass, false, -                                       ScopDetection *, -                                       ScopDetectionAnalysisGraphTraits> { -  static char ID; -  ScopPrinterWrapperPass() -      : DOTGraphTraitsPrinterWrapperPass<ScopDetectionWrapperPass, false, -                                         ScopDetection *, -                                         ScopDetectionAnalysisGraphTraits>( -            "scops", ID) {} -}; -char ScopPrinterWrapperPass::ID = 0; - -struct ScopOnlyPrinterWrapperPass -    : DOTGraphTraitsPrinterWrapperPass<ScopDetectionWrapperPass, true, -                                       ScopDetection *, -                                       ScopDetectionAnalysisGraphTraits> { -  static char ID; -  ScopOnlyPrinterWrapperPass() -      : DOTGraphTraitsPrinterWrapperPass<ScopDetectionWrapperPass, true, -                                         ScopDetection *, -                                         ScopDetectionAnalysisGraphTraits>( -            "scopsonly", ID) {} -}; -char ScopOnlyPrinterWrapperPass::ID = 0; - -static RegisterPass<ScopViewerWrapperPass> X("view-scops", -                                             "Polly - View Scops of function"); - -static RegisterPass<ScopOnlyViewerWrapperPass> -    Y("view-scops-only", -      "Polly - View Scops of function (with no function bodies)"); - -static RegisterPass<ScopPrinterWrapperPass> -    M("dot-scops", "Polly - Print Scops of function"); - -static RegisterPass<ScopOnlyPrinterWrapperPass> -    N("dot-scops-only", -      "Polly - Print Scops of function (with no function bodies)"); - -Pass *polly::createDOTViewerWrapperPass() { -  return new ScopViewerWrapperPass(); -} - -Pass *polly::createDOTOnlyViewerWrapperPass() { -  return new ScopOnlyViewerWrapperPass(); -} - -Pass *polly::createDOTPrinterWrapperPass() { -  return new ScopPrinterWrapperPass(); -} - -Pass *polly::createDOTOnlyPrinterWrapperPass() { -  return new ScopOnlyPrinterWrapperPass(); -} -  bool ScopViewer::processFunction(Function &F, const ScopDetection &SD) {    if (ViewFilter != "" && !F.getName().count(ViewFilter))      return false; diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 8c6a236..70e184d 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -17,7 +17,6 @@  //===----------------------------------------------------------------------===//  #include "polly/ScopInfo.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopBuilder.h"  #include "polly/ScopDetection.h" @@ -57,7 +56,6 @@  #include "llvm/IR/PassManager.h"  #include "llvm/IR/Type.h"  #include "llvm/IR/Value.h" -#include "llvm/InitializePasses.h"  #include "llvm/Support/Compiler.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/ErrorHandling.h" @@ -2544,19 +2542,6 @@ raw_ostream &polly::operator<<(raw_ostream &OS, const Scop &scop) {    return OS;  } -//===----------------------------------------------------------------------===// -void ScopInfoRegionPass::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequired<LoopInfoWrapperPass>(); -  AU.addRequired<RegionInfoPass>(); -  AU.addRequired<DominatorTreeWrapperPass>(); -  AU.addRequiredTransitive<ScalarEvolutionWrapperPass>(); -  AU.addRequiredTransitive<ScopDetectionWrapperPass>(); -  AU.addRequired<AAResultsWrapperPass>(); -  AU.addRequired<AssumptionCacheTracker>(); -  AU.addRequired<OptimizationRemarkEmitterWrapperPass>(); -  AU.setPreservesAll(); -} -  void updateLoopCountStatistic(ScopDetection::LoopStats Stats,                                Scop::ScopStatistics ScopStats) {    assert(Stats.NumLoops == ScopStats.NumAffineLoops + ScopStats.NumBoxedLoops); @@ -2592,112 +2577,6 @@ void updateLoopCountStatistic(ScopDetection::LoopStats Stats,    NumSingletonWritesInLoops += ScopStats.NumSingletonWritesInLoops;  } -bool ScopInfoRegionPass::runOnRegion(Region *R, RGPassManager &RGM) { -  auto &SD = getAnalysis<ScopDetectionWrapperPass>().getSD(); - -  if (!SD.isMaxRegionInScop(*R)) -    return false; - -  Function *F = R->getEntry()->getParent(); -  auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE(); -  auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); -  auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); -  auto const &DL = F->getParent()->getDataLayout(); -  auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); -  auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(*F); -  auto &ORE = getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(); - -  ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE, ORE); -  S = SB.getScop(); // take ownership of scop object - -#if !defined(NDEBUG) || defined(LLVM_ENABLE_STATS) -  if (S) { -    ScopDetection::LoopStats Stats = -        ScopDetection::countBeneficialLoops(&S->getRegion(), SE, LI, 0); -    updateLoopCountStatistic(Stats, S->getStatistics()); -  } -#endif - -  return false; -} - -void ScopInfoRegionPass::print(raw_ostream &OS, const Module *) const { -  if (S) -    S->print(OS, PollyPrintInstructions); -  else -    OS << "Invalid Scop!\n"; -} - -char ScopInfoRegionPass::ID = 0; - -Pass *polly::createScopInfoRegionPassPass() { return new ScopInfoRegionPass(); } - -INITIALIZE_PASS_BEGIN(ScopInfoRegionPass, "polly-scops", -                      "Polly - Create polyhedral description of Scops", false, -                      false); -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass); -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker); -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); -INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); -INITIALIZE_PASS_DEPENDENCY(ScopDetectionWrapperPass); -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass); -INITIALIZE_PASS_END(ScopInfoRegionPass, "polly-scops", -                    "Polly - Create polyhedral description of Scops", false, -                    false) - -//===----------------------------------------------------------------------===// - -namespace { - -/// Print result from ScopInfoRegionPass. -class ScopInfoPrinterLegacyRegionPass final : public RegionPass { -public: -  static char ID; - -  ScopInfoPrinterLegacyRegionPass() : ScopInfoPrinterLegacyRegionPass(outs()) {} - -  explicit ScopInfoPrinterLegacyRegionPass(llvm::raw_ostream &OS) -      : RegionPass(ID), OS(OS) {} - -  bool runOnRegion(Region *R, RGPassManager &RGM) override { -    ScopInfoRegionPass &P = getAnalysis<ScopInfoRegionPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << R->getNameStr() << "' in function '" -       << R->getEntry()->getParent()->getName() << "':\n"; -    P.print(OS); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    RegionPass::getAnalysisUsage(AU); -    AU.addRequired<ScopInfoRegionPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char ScopInfoPrinterLegacyRegionPass::ID = 0; -} // namespace - -Pass *polly::createScopInfoPrinterLegacyRegionPass(raw_ostream &OS) { -  return new ScopInfoPrinterLegacyRegionPass(OS); -} - -INITIALIZE_PASS_BEGIN(ScopInfoPrinterLegacyRegionPass, "polly-print-scops", -                      "Polly - Print polyhedral description of Scops", false, -                      false); -INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass); -INITIALIZE_PASS_END(ScopInfoPrinterLegacyRegionPass, "polly-print-scops", -                    "Polly - Print polyhedral description of Scops", false, -                    false) - -//===----------------------------------------------------------------------===// -  ScopInfo::ScopInfo(const DataLayout &DL, ScopDetection &SD, ScalarEvolution &SE,                     LoopInfo &LI, AliasAnalysis &AA, DominatorTree &DT,                     AssumptionCache &AC, OptimizationRemarkEmitter &ORE) @@ -2771,110 +2650,3 @@ PreservedAnalyses ScopInfoPrinterPass::run(Function &F,    }    return PreservedAnalyses::all();  } - -void ScopInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequired<LoopInfoWrapperPass>(); -  AU.addRequired<RegionInfoPass>(); -  AU.addRequired<DominatorTreeWrapperPass>(); -  AU.addRequiredTransitive<ScalarEvolutionWrapperPass>(); -  AU.addRequiredTransitive<ScopDetectionWrapperPass>(); -  AU.addRequired<AAResultsWrapperPass>(); -  AU.addRequired<AssumptionCacheTracker>(); -  AU.addRequired<OptimizationRemarkEmitterWrapperPass>(); -  AU.setPreservesAll(); -} - -bool ScopInfoWrapperPass::runOnFunction(Function &F) { -  auto &SD = getAnalysis<ScopDetectionWrapperPass>().getSD(); -  auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE(); -  auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); -  auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); -  auto const &DL = F.getParent()->getDataLayout(); -  auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); -  auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); -  auto &ORE = getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(); - -  Result.reset(new ScopInfo{DL, SD, SE, LI, AA, DT, AC, ORE}); -  return false; -} - -void ScopInfoWrapperPass::print(raw_ostream &OS, const Module *) const { -  for (auto &It : *Result) { -    if (It.second) -      It.second->print(OS, PollyPrintInstructions); -    else -      OS << "Invalid Scop!\n"; -  } -} - -char ScopInfoWrapperPass::ID = 0; - -Pass *polly::createScopInfoWrapperPassPass() { -  return new ScopInfoWrapperPass(); -} - -INITIALIZE_PASS_BEGIN( -    ScopInfoWrapperPass, "polly-function-scops", -    "Polly - Create polyhedral description of all Scops of a function", false, -    false); -INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass); -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker); -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); -INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); -INITIALIZE_PASS_DEPENDENCY(ScopDetectionWrapperPass); -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass); -INITIALIZE_PASS_END( -    ScopInfoWrapperPass, "polly-function-scops", -    "Polly - Create polyhedral description of all Scops of a function", false, -    false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from ScopInfoWrapperPass. -class ScopInfoPrinterLegacyFunctionPass final : public FunctionPass { -public: -  static char ID; - -  ScopInfoPrinterLegacyFunctionPass() -      : ScopInfoPrinterLegacyFunctionPass(outs()) {} -  explicit ScopInfoPrinterLegacyFunctionPass(llvm::raw_ostream &OS) -      : FunctionPass(ID), OS(OS) {} - -  bool runOnFunction(Function &F) override { -    ScopInfoWrapperPass &P = getAnalysis<ScopInfoWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for function '" -       << F.getName() << "':\n"; -    P.print(OS); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    FunctionPass::getAnalysisUsage(AU); -    AU.addRequired<ScopInfoWrapperPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char ScopInfoPrinterLegacyFunctionPass::ID = 0; -} // namespace - -Pass *polly::createScopInfoPrinterLegacyFunctionPass(raw_ostream &OS) { -  return new ScopInfoPrinterLegacyFunctionPass(OS); -} - -INITIALIZE_PASS_BEGIN( -    ScopInfoPrinterLegacyFunctionPass, "polly-print-function-scops", -    "Polly - Print polyhedral description of all Scops of a function", false, -    false); -INITIALIZE_PASS_DEPENDENCY(ScopInfoWrapperPass); -INITIALIZE_PASS_END( -    ScopInfoPrinterLegacyFunctionPass, "polly-print-function-scops", -    "Polly - Print polyhedral description of all Scops of a function", false, -    false) diff --git a/polly/lib/Analysis/ScopPass.cpp b/polly/lib/Analysis/ScopPass.cpp index 719cd0f..61417e7 100644 --- a/polly/lib/Analysis/ScopPass.cpp +++ b/polly/lib/Analysis/ScopPass.cpp @@ -24,42 +24,6 @@  using namespace llvm;  using namespace polly; -bool ScopPass::runOnRegion(Region *R, RGPassManager &RGM) { -  S = nullptr; - -  if (skipRegion(*R)) -    return false; - -  if ((S = getAnalysis<ScopInfoRegionPass>().getScop())) -    return runOnScop(*S); - -  return false; -} - -void ScopPass::print(raw_ostream &OS, const Module *M) const { -  if (S) -    printScop(OS, *S); -} - -void ScopPass::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequired<ScopInfoRegionPass>(); - -  AU.addPreserved<AAResultsWrapperPass>(); -  AU.addPreserved<BasicAAWrapperPass>(); -  AU.addPreserved<LoopInfoWrapperPass>(); -  AU.addPreserved<DominatorTreeWrapperPass>(); -  AU.addPreserved<GlobalsAAWrapperPass>(); -  AU.addPreserved<ScopDetectionWrapperPass>(); -  AU.addPreserved<ScalarEvolutionWrapperPass>(); -  AU.addPreserved<SCEVAAWrapperPass>(); -  AU.addPreserved<OptimizationRemarkEmitterWrapperPass>(); -  AU.addPreserved<LazyBlockFrequencyInfoPass>(); -  AU.addPreserved<LazyBranchProbabilityInfoPass>(); -  AU.addPreserved<RegionInfoPass>(); -  AU.addPreserved<ScopInfoRegionPass>(); -  AU.addPreserved<TargetTransformInfoWrapperPass>(); -} -  namespace polly {  template class OwningInnerAnalysisManagerProxy<ScopAnalysisManager, Function>;  } diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt index 0ed6738..e4f196f 100644 --- a/polly/lib/CMakeLists.txt +++ b/polly/lib/CMakeLists.txt @@ -60,6 +60,9 @@ add_llvm_pass_plugin(Polly    CodeGen/RuntimeDebugBuilder.cpp    CodeGen/PerfMonitor.cpp    Exchange/JSONExporter.cpp +  Pass/PhaseManager.cpp +  Pass/PollyFunctionPass.cpp +  Pass/PollyModulePass.cpp    Support/GICHelper.cpp    Support/PollyDebug.cpp    Support/SCEVAffinator.cpp diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp index 2d8b393..f2d5a34 100644 --- a/polly/lib/CodeGen/CodeGeneration.cpp +++ b/polly/lib/CodeGen/CodeGeneration.cpp @@ -25,7 +25,6 @@  #include "polly/CodeGen/PerfMonitor.h"  #include "polly/CodeGen/Utils.h"  #include "polly/DependenceInfo.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/Support/ScopHelper.h" @@ -37,7 +36,6 @@  #include "llvm/IR/Function.h"  #include "llvm/IR/PassManager.h"  #include "llvm/IR/Verifier.h" -#include "llvm/InitializePasses.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/raw_ostream.h" @@ -314,59 +312,6 @@ static bool generateCode(Scop &S, IslAstInfo &AI, LoopInfo &LI,    return true;  } -namespace { - -class CodeGeneration final : public ScopPass { -public: -  static char ID; - -  /// The data layout used. -  const DataLayout *DL; - -  /// @name The analysis passes we need to generate code. -  /// -  ///{ -  LoopInfo *LI; -  IslAstInfo *AI; -  DominatorTree *DT; -  ScalarEvolution *SE; -  RegionInfo *RI; -  ///} - -  CodeGeneration() : ScopPass(ID) {} - -  /// Generate LLVM-IR for the SCoP @p S. -  bool runOnScop(Scop &S) override { -    AI = &getAnalysis<IslAstInfoWrapperPass>().getAI(); -    LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); -    DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); -    SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); -    DL = &S.getFunction().getDataLayout(); -    RI = &getAnalysis<RegionInfoPass>().getRegionInfo(); -    return generateCode(S, *AI, *LI, *DT, *SE, *RI); -  } - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); - -    AU.addRequired<DominatorTreeWrapperPass>(); -    AU.addRequired<IslAstInfoWrapperPass>(); -    AU.addRequired<RegionInfoPass>(); -    AU.addRequired<ScalarEvolutionWrapperPass>(); -    AU.addRequired<ScopDetectionWrapperPass>(); -    AU.addRequired<ScopInfoRegionPass>(); -    AU.addRequired<LoopInfoWrapperPass>(); - -    AU.addPreserved<DependenceInfo>(); -    AU.addPreserved<IslAstInfoWrapperPass>(); - -    // FIXME: We do not yet add regions for the newly generated code to the -    //        region tree. -  } -}; -} // namespace -  PreservedAnalyses CodeGenerationPass::run(Scop &S, ScopAnalysisManager &SAM,                                            ScopStandardAnalysisResults &AR,                                            SPMUpdater &U) { @@ -379,17 +324,6 @@ PreservedAnalyses CodeGenerationPass::run(Scop &S, ScopAnalysisManager &SAM,    return PreservedAnalyses::all();  } -char CodeGeneration::ID = 1; - -Pass *polly::createCodeGenerationPass() { return new CodeGeneration(); } - -INITIALIZE_PASS_BEGIN(CodeGeneration, "polly-codegen", -                      "Polly - Create LLVM-IR from SCoPs", false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo); -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass); -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); -INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); -INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); -INITIALIZE_PASS_DEPENDENCY(ScopDetectionWrapperPass); -INITIALIZE_PASS_END(CodeGeneration, "polly-codegen", -                    "Polly - Create LLVM-IR from SCoPs", false, false) +bool polly::runCodeGeneration(Scop &S, RegionInfo &RI, IslAstInfo &AI) { +  return generateCode(S, AI, *S.getLI(), *S.getDT(), *S.getSE(), RI); +} diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp index 09bacda..3177cda 100644 --- a/polly/lib/CodeGen/IslAst.cpp +++ b/polly/lib/CodeGen/IslAst.cpp @@ -29,7 +29,6 @@  #include "polly/CodeGen/IslAst.h"  #include "polly/CodeGen/CodeGeneration.h"  #include "polly/DependenceInfo.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopDetection.h"  #include "polly/ScopInfo.h" @@ -83,6 +82,11 @@ static cl::opt<bool> DetectParallel("polly-ast-detect-parallel",                                      cl::desc("Detect parallelism"), cl::Hidden,                                      cl::cat(PollyCategory)); +static cl::opt<bool> +    PollyPrintAst("polly-print-ast", +                  cl::desc("Print the ISL abstract syntax tree"), +                  cl::cat(PollyCategory)); +  STATISTIC(ScopsProcessed, "Number of SCoPs processed");  STATISTIC(ScopsBeneficial, "Number of beneficial SCoPs");  STATISTIC(BeneficialAffineLoops, "Number of beneficial affine loops"); @@ -776,90 +780,19 @@ PreservedAnalyses IslAstPrinterPass::run(Scop &S, ScopAnalysisManager &SAM,    return PreservedAnalyses::all();  } -void IslAstInfoWrapperPass::releaseMemory() { Ast.reset(); } - -bool IslAstInfoWrapperPass::runOnScop(Scop &Scop) { -  auto GetDeps = [this](Dependences::AnalysisLevel Lvl) -> const Dependences & { -    return getAnalysis<DependenceInfo>().getDependences(Lvl); +std::unique_ptr<IslAstInfo> +polly::runIslAstGen(Scop &S, DependenceAnalysis::Result &DA) { +  auto GetDeps = [&](Dependences::AnalysisLevel Lvl) -> const Dependences & { +    return DA.getDependences(Lvl);    }; -  Ast = runIslAst(Scop, GetDeps); - -  return false; -} - -void IslAstInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { -  // Get the Common analysis usage of ScopPasses. -  ScopPass::getAnalysisUsage(AU); -  AU.addRequiredTransitive<ScopInfoRegionPass>(); -  AU.addRequired<DependenceInfo>(); - -  AU.addPreserved<DependenceInfo>(); -} - -void IslAstInfoWrapperPass::printScop(raw_ostream &OS, Scop &S) const { -  OS << "Printing analysis 'Polly - Generate an AST of the SCoP (isl)'" -     << S.getName() << "' in function '" << S.getFunction().getName() << "':\n"; -  if (Ast) -    Ast->print(OS); -} - -char IslAstInfoWrapperPass::ID = 0; - -Pass *polly::createIslAstInfoWrapperPassPass() { -  return new IslAstInfoWrapperPass(); -} - -INITIALIZE_PASS_BEGIN(IslAstInfoWrapperPass, "polly-ast", -                      "Polly - Generate an AST of the SCoP (isl)", false, -                      false); -INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo); -INITIALIZE_PASS_END(IslAstInfoWrapperPass, "polly-ast", -                    "Polly - Generate an AST from the SCoP (isl)", false, false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from IslAstInfoWrapperPass. -class IslAstInfoPrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  IslAstInfoPrinterLegacyPass() : IslAstInfoPrinterLegacyPass(outs()) {} -  explicit IslAstInfoPrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    IslAstInfoWrapperPass &P = getAnalysis<IslAstInfoWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; +  std::unique_ptr<IslAstInfo> Result = runIslAst(S, GetDeps); +  if (PollyPrintAst) { +    outs() << "Printing analysis 'Polly - Generate an AST of the SCoP (isl)'" +           << S.getName() << "' in function '" << S.getFunction().getName() +           << "':\n"; +    if (Result) +      Result->print(llvm::outs());    } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<IslAstInfoWrapperPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char IslAstInfoPrinterLegacyPass::ID = 0; -} // namespace - -Pass *polly::createIslAstInfoPrinterLegacyPass(raw_ostream &OS) { -  return new IslAstInfoPrinterLegacyPass(OS); +  return Result;  } - -INITIALIZE_PASS_BEGIN(IslAstInfoPrinterLegacyPass, "polly-print-ast", -                      "Polly - Print the AST from a SCoP (isl)", false, false); -INITIALIZE_PASS_DEPENDENCY(IslAstInfoWrapperPass); -INITIALIZE_PASS_END(IslAstInfoPrinterLegacyPass, "polly-print-ast", -                    "Polly - Print the AST from a SCoP (isl)", false, false) diff --git a/polly/lib/Exchange/JSONExporter.cpp b/polly/lib/Exchange/JSONExporter.cpp index dfd6314..7d30c03 100644 --- a/polly/lib/Exchange/JSONExporter.cpp +++ b/polly/lib/Exchange/JSONExporter.cpp @@ -12,7 +12,6 @@  #include "polly/JSONExporter.h"  #include "polly/DependenceInfo.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/ScopPass.h" @@ -36,6 +35,11 @@ using namespace polly;  #define DEBUG_TYPE "polly-import-jscop" +static cl::opt<bool> +    PollyPrintImportJscop("polly-print-import-jscop", +                          cl::desc("Polly - Print Scop import result"), +                          cl::cat(PollyCategory)); +  STATISTIC(NewAccessMapFound, "Number of updated access functions");  namespace { @@ -50,36 +54,6 @@ static cl::opt<std::string>                    cl::desc("Postfix to append to the import .jsop files."),                    cl::Hidden, cl::value_desc("File postfix"), cl::ValueRequired,                    cl::init(""), cl::cat(PollyCategory)); - -class JSONExporter : public ScopPass { -public: -  static char ID; -  explicit JSONExporter() : ScopPass(ID) {} - -  /// Export the SCoP @p S to a JSON file. -  bool runOnScop(Scop &S) override; - -  /// Print the SCoP @p S as it is exported. -  void printScop(raw_ostream &OS, Scop &S) const override; - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; -}; - -class JSONImporter : public ScopPass { -public: -  static char ID; -  std::vector<std::string> NewAccessStrings; -  explicit JSONImporter() : ScopPass(ID) {} -  /// Import new access functions for SCoP @p S from a JSON file. -  bool runOnScop(Scop &S) override; - -  /// Print the SCoP @p S and the imported access functions. -  void printScop(raw_ostream &OS, Scop &S) const override; - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; -};  } // namespace  static std::string getFileName(Scop &S, StringRef Suffix = "") { @@ -742,21 +716,6 @@ static bool importScop(Scop &S, const Dependences &D, const DataLayout &DL,    return true;  } -char JSONExporter::ID = 0; -void JSONExporter::printScop(raw_ostream &OS, Scop &S) const { OS << S; } - -bool JSONExporter::runOnScop(Scop &S) { -  exportScop(S); -  return false; -} - -void JSONExporter::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.setPreservesAll(); -  AU.addRequired<ScopInfoRegionPass>(); -} - -Pass *polly::createJSONExporterPass() { return new JSONExporter(); } -  PreservedAnalyses JSONExportPass::run(Scop &S, ScopAnalysisManager &SAM,                                        ScopStandardAnalysisResults &SAR,                                        SPMUpdater &) { @@ -764,37 +723,6 @@ PreservedAnalyses JSONExportPass::run(Scop &S, ScopAnalysisManager &SAM,    return PreservedAnalyses::all();  } -char JSONImporter::ID = 0; - -void JSONImporter::printScop(raw_ostream &OS, Scop &S) const { -  OS << S; -  for (std::vector<std::string>::const_iterator I = NewAccessStrings.begin(), -                                                E = NewAccessStrings.end(); -       I != E; I++) -    OS << "New access function '" << *I << "' detected in JSCOP file\n"; -} - -bool JSONImporter::runOnScop(Scop &S) { -  const Dependences &D = -      getAnalysis<DependenceInfo>().getDependences(Dependences::AL_Statement); -  const DataLayout &DL = S.getFunction().getParent()->getDataLayout(); - -  if (!importScop(S, D, DL, &NewAccessStrings)) -    report_fatal_error("Tried to import a malformed jscop file."); - -  return false; -} - -void JSONImporter::getAnalysisUsage(AnalysisUsage &AU) const { -  ScopPass::getAnalysisUsage(AU); -  AU.addRequired<DependenceInfo>(); - -  // TODO: JSONImporter should throw away DependenceInfo. -  AU.addPreserved<DependenceInfo>(); -} - -Pass *polly::createJSONImporterPass() { return new JSONImporter(); } -  PreservedAnalyses JSONImportPass::run(Scop &S, ScopAnalysisManager &SAM,                                        ScopStandardAnalysisResults &SAR,                                        SPMUpdater &) { @@ -814,68 +742,24 @@ PreservedAnalyses JSONImportPass::run(Scop &S, ScopAnalysisManager &SAM,    return PA;  } -INITIALIZE_PASS_BEGIN(JSONExporter, "polly-export-jscop", -                      "Polly - Export Scops as JSON" -                      " (Writes a .jscop file for each Scop)", -                      false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo) -INITIALIZE_PASS_END(JSONExporter, "polly-export-jscop", -                    "Polly - Export Scops as JSON" -                    " (Writes a .jscop file for each Scop)", -                    false, false) - -INITIALIZE_PASS_BEGIN(JSONImporter, "polly-import-jscop", -                      "Polly - Import Scops from JSON" -                      " (Reads a .jscop file for each Scop)", -                      false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo) -INITIALIZE_PASS_END(JSONImporter, "polly-import-jscop", -                    "Polly - Import Scops from JSON" -                    " (Reads a .jscop file for each Scop)", -                    false, false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from JSONImporter. -class JSONImporterPrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  JSONImporterPrinterLegacyPass() : JSONImporterPrinterLegacyPass(outs()) {} -  explicit JSONImporterPrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    JSONImporter &P = getAnalysis<JSONImporter>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } +void polly::runImportJSON(Scop &S, DependenceAnalysis::Result &DA) { +  const Dependences &D = DA.getDependences(Dependences::AL_Statement); +  const DataLayout &DL = S.getFunction().getParent()->getDataLayout(); +  std::vector<std::string> NewAccessStrings; +  if (!importScop(S, D, DL, &NewAccessStrings)) +    report_fatal_error("Tried to import a malformed jscop file."); -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<JSONImporter>(); -    AU.setPreservesAll(); +  if (PollyPrintImportJscop) { +    outs() +        << "Printing analysis 'Polly - Print Scop import result' for region: '" +        << S.getRegion().getNameStr() << "' in function '" +        << S.getFunction().getName() << "':\n"; +    outs() << S; +    for (std::vector<std::string>::const_iterator I = NewAccessStrings.begin(), +                                                  E = NewAccessStrings.end(); +         I != E; I++) +      outs() << "New access function '" << *I << "' detected in JSCOP file\n";    } - -private: -  llvm::raw_ostream &OS; -}; - -char JSONImporterPrinterLegacyPass::ID = 0; -} // namespace - -Pass *polly::createJSONImporterPrinterLegacyPass(llvm::raw_ostream &OS) { -  return new JSONImporterPrinterLegacyPass(OS);  } -INITIALIZE_PASS_BEGIN(JSONImporterPrinterLegacyPass, "polly-print-import-jscop", -                      "Polly - Print Scop import result", false, false) -INITIALIZE_PASS_DEPENDENCY(JSONImporter) -INITIALIZE_PASS_END(JSONImporterPrinterLegacyPass, "polly-print-import-jscop", -                    "Polly - Print Scop import result", false, false) +void polly::runExportJSON(Scop &S) { exportScop(S); } diff --git a/polly/lib/Pass/PhaseManager.cpp b/polly/lib/Pass/PhaseManager.cpp new file mode 100644 index 0000000..fb76c81 --- /dev/null +++ b/polly/lib/Pass/PhaseManager.cpp @@ -0,0 +1,424 @@ +//===------ PhaseManager.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "polly/Pass/PhaseManager.h" +#include "polly/CodeGen/CodeGeneration.h" +#include "polly/CodeGen/IslAst.h" +#include "polly/CodePreparation.h" +#include "polly/DeLICM.h" +#include "polly/DeadCodeElimination.h" +#include "polly/DependenceInfo.h" +#include "polly/FlattenSchedule.h" +#include "polly/ForwardOpTree.h" +#include "polly/JSONExporter.h" +#include "polly/MaximalStaticExpansion.h" +#include "polly/PruneUnprofitable.h" +#include "polly/ScheduleOptimizer.h" +#include "polly/ScopDetection.h" +#include "polly/ScopDetectionDiagnostic.h" +#include "polly/ScopGraphPrinter.h" +#include "polly/ScopInfo.h" +#include "polly/Simplify.h" +#include "llvm/Analysis/AssumptionCache.h" +#include "llvm/Analysis/OptimizationRemarkEmitter.h" +#include "llvm/IR/Module.h" + +#define DEBUG_TYPE "polly-pass" + +using namespace polly; +using namespace llvm; + +namespace { + +/// Recurse through all subregions and all regions and add them to RQ. +static void addRegionIntoQueue(Region &R, SmallVector<Region *> &RQ) { +  RQ.push_back(&R); +  for (const auto &E : R) +    addRegionIntoQueue(*E, RQ); +} + +/// The phase pipeline of Polly to be embedded into another pass manager than +/// runs passes on functions. +/// +/// Polly holds state besides LLVM-IR (RegionInfo and ScopInfo) between phases +/// that LLVM pass managers do not consider when scheduling analyses and passes. +/// That is, the ScopInfo must persist between phases that a pass manager must +/// not invalidate to recompute later. +class PhaseManager { +private: +  Function &F; +  FunctionAnalysisManager &FAM; +  PollyPassOptions Opts; + +public: +  PhaseManager(Function &F, FunctionAnalysisManager &FAM, PollyPassOptions Opts) +      : F(F), FAM(FAM), Opts(std::move(Opts)) {} + +  /// Execute Polly's phases as indicated by the options. +  bool run() { +    // Get analyses from the function pass manager. +    // These must be preserved during all phases so that if processing one SCoP +    // has finished, the next SCoP can still use them. Recomputing is not an +    // option because ScopDetection stores references to the old results. +    // TODO: CodePreparation doesn't actually need these analysis, it just keeps +    // them up-to-date. If they are not computed yet, can also compute after the +    // prepare phase. +    LoopInfo &LI = FAM.getResult<LoopAnalysis>(F); +    DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F); +    bool ModifiedIR = false; + +    // Phase: prepare +    // TODO: Setting ModifiedIR will invalidate any analysis, even if DT, LI are +    // preserved. +    if (Opts.isPhaseEnabled(PassPhase::Prepare)) { +      PreservedAnalyses PA = CodePreparationPass().run(F, FAM); +      FAM.invalidate(F, PA); +      if (!PA.areAllPreserved()) +        ModifiedIR = true; +    } + +    // Can't do anything without detection +    if (!Opts.isPhaseEnabled(PassPhase::Detection)) +      return false; + +    AAResults &AA = FAM.getResult<AAManager>(F); +    ScalarEvolution &SE = FAM.getResult<ScalarEvolutionAnalysis>(F); +    OptimizationRemarkEmitter &ORE = +        FAM.getResult<OptimizationRemarkEmitterAnalysis>(F); + +    // ScopDetection is modifying RegionInfo, do not cache it, nor use a cached +    // version. +    RegionInfo RI = RegionInfoAnalysis().run(F, FAM); + +    // Phase: detection +    ScopDetection SD(DT, SE, LI, RI, AA, ORE); +    SD.detect(F); +    if (Opts.isPhaseEnabled(PassPhase::PrintDetect)) { +      outs() << "Detected Scops in Function " << F.getName() << "\n"; +      for (const Region *R : SD.ValidRegions) +        outs() << "Valid Region for Scop: " << R->getNameStr() << '\n'; +      outs() << "\n"; +    } + +    if (Opts.isPhaseEnabled(PassPhase::DotScops)) +      printGraphForFunction(F, &SD, "scops", false); +    if (Opts.isPhaseEnabled(PassPhase::DotScopsOnly)) +      printGraphForFunction(F, &SD, "scopsonly", true); + +    auto ViewScops = [&](const char *Name, bool IsSimply) { +      if (Opts.ViewFilter.empty() && !F.getName().count(Opts.ViewFilter)) +        return; + +      if (Opts.ViewAll || std::distance(SD.begin(), SD.end()) > 0) +        viewGraphForFunction(F, &SD, Name, IsSimply); +    }; +    if (Opts.isPhaseEnabled(PassPhase::ViewScops)) +      ViewScops("scops", false); +    if (Opts.isPhaseEnabled(PassPhase::ViewScopsOnly)) +      ViewScops("scopsonly", true); + +    // Phase: scops +    AssumptionCache &AC = FAM.getResult<AssumptionAnalysis>(F); +    const DataLayout &DL = F.getParent()->getDataLayout(); +    ScopInfo Info(DL, SD, SE, LI, AA, DT, AC, ORE); +    if (Opts.isPhaseEnabled(PassPhase::PrintScopInfo)) { +      if (Region *TLR = RI.getTopLevelRegion()) { +        SmallVector<Region *> Regions; +        addRegionIntoQueue(*TLR, Regions); + +        // reverse iteration because the regression tests expect it. +        for (Region *R : reverse(Regions)) { +          Scop *S = Info.getScop(R); +          outs() << "Printing analysis 'Polly - Create polyhedral " +                    "description of Scops' for region: '" +                 << R->getNameStr() << "' in function '" << F.getName() +                 << "':\n"; +          if (S) +            outs() << *S; +          else +            outs() << "Invalid Scop!\n"; +        } +      } +    } + +    SmallPriorityWorklist<Region *, 4> Worklist; +    for (auto &[R, S] : Info) +      if (S) +        Worklist.insert(R); + +    TargetTransformInfo &TTI = FAM.getResult<TargetIRAnalysis>(F); +    while (!Worklist.empty()) { +      Region *R = Worklist.pop_back_val(); +      if (!SD.isMaxRegionInScop(*R, /*Verify=*/false)) +        continue; +      Scop *S = Info.getScop(R); + +      // Phase: flatten +      if (Opts.isPhaseEnabled(PassPhase::Flatten)) +        runFlattenSchedulePass(*S); + +      // Phase: deps +      // Actual analysis runs on-demand, so it does not matter whether the phase +      // is actually enabled, but use this location to print dependencies. +      DependenceAnalysis::Result DA = runDependenceAnalysis(*S); +      if (Opts.isPhaseEnabled(PassPhase::PrintDependences)) { +        assert(Opts.isPhaseEnabled(PassPhase::Dependences)); +        const Dependences &D = DA.getDependences(Opts.PrintDepsAnalysisLevel); +        D.print(outs()); +      } + +      // Phase: import-jscop +      if (Opts.isPhaseEnabled(PassPhase::ImportJScop)) +        runImportJSON(*S, DA); + +      // Phase: simplify-0 +      bool ModifiedSinceSimplify = true; +      if (Opts.isPhaseEnabled(PassPhase::Simplify0)) { +        runSimplify(*S, 0); +        ModifiedSinceSimplify = false; +      } + +      // Phase: optree +      if (Opts.isPhaseEnabled(PassPhase::Optree)) { +        bool ModifiedByOptree = runForwardOpTree(*S); +        ModifiedSinceSimplify |= ModifiedByOptree; +      } + +      // Phase: delicm +      if (Opts.isPhaseEnabled(PassPhase::DeLICM)) { +        bool ModifiedByDelicm = runDeLICM(*S); +        ModifiedSinceSimplify |= ModifiedByDelicm; +      } + +      // Phase: simplify-1 +      // If we have already run simplify-0, do not re-run it if the SCoP has not +      // changed since then. +      if (ModifiedSinceSimplify && Opts.isPhaseEnabled(PassPhase::Simplify1)) { +        runSimplify(*S, 1); +        ModifiedSinceSimplify = false; +      } + +      // Phase: dce +      if (Opts.isPhaseEnabled(PassPhase::DeadCodeElimination)) +        runDeadCodeElim(*S, DA); + +      // Phase: mse +      if (Opts.isPhaseEnabled(PassPhase::MaximumStaticExtension)) +        runMaximalStaticExpansion(*S, DA); + +      // Phase: prune +      if (Opts.isPhaseEnabled(PassPhase::PruneUnprofitable)) +        runPruneUnprofitable(*S); + +      // Phase: opt-isl +      if (Opts.isPhaseEnabled(PassPhase::Optimization)) +        runIslScheduleOptimizer(*S, &TTI, DA); + +      // Phase: import-jscop +      if (Opts.isPhaseEnabled(PassPhase::ExportJScop)) +        runExportJSON(*S); + +      // Phase: ast +      // Cannot run codegen unless ast is enabled +      if (!Opts.isPhaseEnabled(PassPhase::AstGen)) +        continue; +      std::unique_ptr<IslAstInfo> IslAst = runIslAstGen(*S, DA); + +      // Phase: codegen +      if (!Opts.isPhaseEnabled(PassPhase::CodeGen)) +        continue; +      bool ModifiedByCodeGen = runCodeGeneration(*S, RI, *IslAst); +      if (ModifiedByCodeGen) { +        ModifiedIR = true; + +        // For all regions, create new polly::Scop objects because the old ones +        // refere to invalidated LLVM-IR. +        // FIXME: Adds all SCoPs again to statistics +        Info.recompute(); +      } +    } + +    return ModifiedIR; +  } +}; +} // namespace + +StringRef polly::getPhaseName(PassPhase Phase) { +  switch (Phase) { +  case PassPhase::Prepare: +    return "prepare"; +  case PassPhase::Detection: +    return "detect"; +  case PassPhase::PrintDetect: +    return "print-detect"; +  case PassPhase::DotScops: +    return "dot-scops"; +  case PassPhase::DotScopsOnly: +    return "dot-scops-only"; +  case PassPhase::ViewScops: +    return "view-scops"; +  case PassPhase::ViewScopsOnly: +    return "view-scops-only"; +  case PassPhase::ScopInfo: +    return "scops"; +  case PassPhase::PrintScopInfo: +    return "print-scops"; +  case PassPhase::Flatten: +    return "flatten"; +  case PassPhase::Dependences: +    return "deps"; +  case PassPhase::PrintDependences: +    return "print-deps"; +  case PassPhase::ImportJScop: +    return "import-jscop"; +  case PassPhase::Simplify0: +    return "simplify-0"; +  case PassPhase::Optree: +    return "optree"; +  case PassPhase::DeLICM: +    return "delicm"; +  case PassPhase::Simplify1: +    return "simplify-1"; +  case PassPhase::DeadCodeElimination: +    return "dce"; +  case PassPhase::MaximumStaticExtension: +    return "mse"; +  case PassPhase::PruneUnprofitable: +    return "prune"; +  case PassPhase::Optimization: +    return "opt-isl"; // "opt" would conflict with the llvm executable +  case PassPhase::ExportJScop: +    return "export-jscop"; +  case PassPhase::AstGen: +    return "ast"; +  case PassPhase::CodeGen: +    return "codegen"; +  default: +    llvm_unreachable("Unexpected phase"); +  } +} + +PassPhase polly::parsePhase(StringRef Name) { +  return StringSwitch<PassPhase>(Name) +      .Case("prepare", PassPhase::Prepare) +      .Case("detect", PassPhase::Detection) +      .Case("print-detect", PassPhase::PrintDetect) +      .Case("dot-scops", PassPhase::DotScops) +      .Case("dot-scops-only", PassPhase::DotScopsOnly) +      .Case("view-scops", PassPhase::ViewScops) +      .Case("view-scops-only", PassPhase::ViewScopsOnly) +      .Case("scops", PassPhase::ScopInfo) +      .Case("print-scops", PassPhase::PrintScopInfo) +      .Case("flatten", PassPhase::Flatten) +      .Case("deps", PassPhase::Dependences) +      .Case("print-deps", PassPhase::PrintDependences) +      .Case("import-jscop", PassPhase::ImportJScop) +      .Case("simplify-0", PassPhase::Simplify0) +      .Case("optree", PassPhase::Optree) +      .Case("delicm", PassPhase::DeLICM) +      .Case("simplify-1", PassPhase::Simplify1) +      .Case("dce", PassPhase::DeadCodeElimination) +      .Case("mse", PassPhase::MaximumStaticExtension) +      .Case("prune", PassPhase::PruneUnprofitable) +      .Case("opt-isl", PassPhase::Optimization) +      .Case("export-jscop", PassPhase::ExportJScop) +      .Case("ast", PassPhase::AstGen) +      .Case("codegen", PassPhase::CodeGen) +      .Default(PassPhase::None); +} + +bool polly::dependsOnDependenceInfo(PassPhase Phase) { +  // Nothing before dep phase can depend on it +  if (static_cast<size_t>(Phase) <= static_cast<size_t>(PassPhase::Dependences)) +    return false; + +  switch (Phase) { +  case PassPhase::Simplify0: +  case PassPhase::Optree: +  case PassPhase::DeLICM: +  case PassPhase::Simplify1: +  case PassPhase::PruneUnprofitable: +  case PassPhase::ImportJScop: +  case PassPhase::ExportJScop: +  case PassPhase::AstGen: // transitively through codegen +  case PassPhase::CodeGen: +    return false; +  default: +    return true; +  } +} + +void PollyPassOptions::enableEnd2End() { +  setPhaseEnabled(PassPhase::Detection); +  setPhaseEnabled(PassPhase::ScopInfo); +  setPhaseEnabled(PassPhase::Dependences); +  setPhaseEnabled(PassPhase::AstGen); +  setPhaseEnabled(PassPhase::CodeGen); +} + +void PollyPassOptions::enableDefaultOpts() { +  setPhaseEnabled(PassPhase::Prepare); +  setPhaseEnabled(PassPhase::Simplify0); +  setPhaseEnabled(PassPhase::Optree); +  setPhaseEnabled(PassPhase::DeLICM); +  setPhaseEnabled(PassPhase::Simplify1); +  setPhaseEnabled(PassPhase::PruneUnprofitable); +  setPhaseEnabled(PassPhase::Optimization); +} + +void PollyPassOptions::disableAfter(PassPhase Phase) { +  assert(Phase != PassPhase::None); +  for (PassPhase P : enum_seq_inclusive(Phase, PassPhase::PassPhaseLast)) { +    if (P == Phase) +      continue; +    setPhaseEnabled(P, false); +  } +} + +Error PollyPassOptions::checkConsistency() const { +  for (PassPhase P : enum_seq_inclusive(PassPhase::PassPhaseFirst, +                                        PassPhase::PassPhaseLast)) { +    if (!isPhaseEnabled(P)) +      continue; + +    // Prepare and Detection have no requirements +    if (P == PassPhase::Prepare || P == PassPhase::Detection) +      continue; + +    if (!isPhaseEnabled(PassPhase::Detection)) +      return make_error<StringError>( +          formatv("'{0}' requires 'detect' to be enabled", getPhaseName(P)) +              .str(), +          inconvertibleErrorCode()); + +    if (static_cast<size_t>(P) < static_cast<size_t>(PassPhase::ScopInfo)) +      continue; + +    if (!isPhaseEnabled(PassPhase::ScopInfo)) +      return make_error<StringError>( +          formatv("'{0}' requires 'scops' to be enabled", getPhaseName(P)) +              .str(), +          inconvertibleErrorCode()); + +    if (dependsOnDependenceInfo(P) && !isPhaseEnabled(PassPhase::Dependences)) +      return make_error<StringError>( +          formatv("'{0}' requires 'deps' to be enabled", getPhaseName(P)).str(), +          inconvertibleErrorCode()); +  } + +  if (isPhaseEnabled(PassPhase::CodeGen) && !isPhaseEnabled(PassPhase::AstGen)) +    return make_error<StringError>("'codegen' requires 'ast' to be enabled", +                                   inconvertibleErrorCode()); + +  return Error::success(); +} + +bool polly::runPollyPass(Function &F, FunctionAnalysisManager &FAM, +                         PollyPassOptions Opts) { +  return PhaseManager(F, FAM, std::move(Opts)).run(); +} diff --git a/polly/lib/Pass/PollyFunctionPass.cpp b/polly/lib/Pass/PollyFunctionPass.cpp new file mode 100644 index 0000000..a478e4d --- /dev/null +++ b/polly/lib/Pass/PollyFunctionPass.cpp @@ -0,0 +1,22 @@ +//===------ PollyFunctionPass.cpp - Polly function pass  ------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "polly/Pass/PollyFunctionPass.h" + +using namespace llvm; +using namespace polly; + +PreservedAnalyses PollyFunctionPass::run(llvm::Function &F, +                                         llvm::FunctionAnalysisManager &FAM) { +  bool ModifiedIR = runPollyPass(F, FAM, Opts); + +  // Be conservative about preserved analyses. +  // FIXME: May also need to invalidate/update Module/CGSCC passes, but cannot +  // reach them within a FunctionPassManager. +  return ModifiedIR ? PreservedAnalyses::none() : PreservedAnalyses::all(); +} diff --git a/polly/lib/Pass/PollyModulePass.cpp b/polly/lib/Pass/PollyModulePass.cpp new file mode 100644 index 0000000..f56ee67 --- /dev/null +++ b/polly/lib/Pass/PollyModulePass.cpp @@ -0,0 +1,29 @@ +//===------ PollyModulePass.cpp - Polly module pass  ----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "polly/Pass/PollyModulePass.h" +#include "llvm/IR/Module.h" + +using namespace llvm; +using namespace polly; + +PreservedAnalyses PollyModulePass::run(llvm::Module &M, +                                       llvm::ModuleAnalysisManager &MAM) { +  FunctionAnalysisManager &FAM = +      MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); + +  bool ModifiedAnyIR = false; +  for (Function &F : M) { +    bool LocalModifiedIR = runPollyPass(F, FAM, Opts); +    ModifiedAnyIR |= LocalModifiedIR; +  } + +  // Be conservative about preserved analyses, especially if parallel functions +  // have been outlined. +  return ModifiedAnyIR ? PreservedAnalyses::none() : PreservedAnalyses::all(); +} diff --git a/polly/lib/Support/DumpFunctionPass.cpp b/polly/lib/Support/DumpFunctionPass.cpp index e47b7fe..9565e21 100644 --- a/polly/lib/Support/DumpFunctionPass.cpp +++ b/polly/lib/Support/DumpFunctionPass.cpp @@ -13,7 +13,6 @@  #include "polly/Support/DumpFunctionPass.h"  #include "llvm/IR/Module.h"  #include "llvm/IR/PassInstrumentation.h" -#include "llvm/Pass.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/FileSystem.h"  #include "llvm/Support/Path.h" @@ -82,50 +81,10 @@ static void runDumpFunction(llvm::Function &F, StringRef Suffix) {    Out->keep();    LLVM_DEBUG(dbgs() << "Dump file " << Dumpfile << " written successfully\n");  } - -class DumpFunctionWrapperPass final : public FunctionPass { -private: -  DumpFunctionWrapperPass(const DumpFunctionWrapperPass &) = delete; -  const DumpFunctionWrapperPass & -  operator=(const DumpFunctionWrapperPass &) = delete; - -  std::string Suffix; - -public: -  static char ID; - -  explicit DumpFunctionWrapperPass() : FunctionPass(ID), Suffix("-dump") {} - -  explicit DumpFunctionWrapperPass(std::string Suffix) -      : FunctionPass(ID), Suffix(std::move(Suffix)) {} - -  /// @name FunctionPass interface -  //@{ -  void getAnalysisUsage(llvm::AnalysisUsage &AU) const override { -    AU.setPreservesAll(); -  } - -  bool runOnFunction(llvm::Function &F) override { -    runDumpFunction(F, Suffix); -    return false; -  } -  //@} -}; - -char DumpFunctionWrapperPass::ID;  } // namespace -FunctionPass *polly::createDumpFunctionWrapperPass(std::string Suffix) { -  return new DumpFunctionWrapperPass(std::move(Suffix)); -} -  llvm::PreservedAnalyses DumpFunctionPass::run(Function &F,                                                FunctionAnalysisManager &AM) {    runDumpFunction(F, Suffix);    return PreservedAnalyses::all();  } - -INITIALIZE_PASS_BEGIN(DumpFunctionWrapperPass, "polly-dump-function", -                      "Polly - Dump Function", false, false) -INITIALIZE_PASS_END(DumpFunctionWrapperPass, "polly-dump-function", -                    "Polly - Dump Function", false, false) diff --git a/polly/lib/Support/DumpModulePass.cpp b/polly/lib/Support/DumpModulePass.cpp index c1c27ef..2eaa070 100644 --- a/polly/lib/Support/DumpModulePass.cpp +++ b/polly/lib/Support/DumpModulePass.cpp @@ -12,7 +12,6 @@  #include "polly/Support/DumpModulePass.h"  #include "llvm/IR/Module.h" -#include "llvm/Pass.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/FileSystem.h"  #include "llvm/Support/Path.h" @@ -47,56 +46,10 @@ static void runDumpModule(llvm::Module &M, StringRef Filename, bool IsSuffix) {    M.print(Out->os(), nullptr);    Out->keep();  } - -class DumpModuleWrapperPass final : public ModulePass { -private: -  DumpModuleWrapperPass(const DumpModuleWrapperPass &) = delete; -  const DumpModuleWrapperPass & -  operator=(const DumpModuleWrapperPass &) = delete; - -  std::string Filename; -  bool IsSuffix; - -public: -  static char ID; - -  /// This constructor is used e.g. if using opt -polly-dump-module. -  /// -  /// Provide a default suffix to not overwrite the original file. -  explicit DumpModuleWrapperPass() -      : ModulePass(ID), Filename("-dump"), IsSuffix(true) {} - -  explicit DumpModuleWrapperPass(std::string Filename, bool IsSuffix) -      : ModulePass(ID), Filename(std::move(Filename)), IsSuffix(IsSuffix) {} - -  /// @name ModulePass interface -  //@{ -  void getAnalysisUsage(llvm::AnalysisUsage &AU) const override { -    AU.setPreservesAll(); -  } - -  bool runOnModule(llvm::Module &M) override { -    runDumpModule(M, Filename, IsSuffix); -    return false; -  } -  //@} -}; - -char DumpModuleWrapperPass::ID;  } // namespace -ModulePass *polly::createDumpModuleWrapperPass(std::string Filename, -                                               bool IsSuffix) { -  return new DumpModuleWrapperPass(std::move(Filename), IsSuffix); -} -  llvm::PreservedAnalyses DumpModulePass::run(llvm::Module &M,                                              llvm::ModuleAnalysisManager &AM) {    runDumpModule(M, Filename, IsSuffix);    return PreservedAnalyses::all();  } - -INITIALIZE_PASS_BEGIN(DumpModuleWrapperPass, "polly-dump-module", -                      "Polly - Dump Module", false, false) -INITIALIZE_PASS_END(DumpModuleWrapperPass, "polly-dump-module", -                    "Polly - Dump Module", false, false) diff --git a/polly/lib/Support/PollyPasses.def b/polly/lib/Support/PollyPasses.def index 2c792a5..4968397 100644 --- a/polly/lib/Support/PollyPasses.def +++ b/polly/lib/Support/PollyPasses.def @@ -1,3 +1,10 @@ +#ifndef MODULE_PASS +#define MODULE_PASS(NAME, CREATE_PASS, PARSER) +#endif +MODULE_PASS("polly", createModuleToFunctionPassAdaptor(PollyFunctionPass(Opts)), parsePollyDefaultOptions) +MODULE_PASS("polly-custom", createModuleToFunctionPassAdaptor(PollyFunctionPass(Opts)), parsePollyCustomOptions) +#undef MODULE_PASS +  #ifndef CGSCC_PASS  #define CGSCC_PASS(NAME, CREATE_PASS, PARSER)  #endif @@ -12,15 +19,17 @@ FUNCTION_ANALYSIS("polly-function-scops", ScopInfoAnalysis())  #undef FUNCTION_ANALYSIS  #ifndef FUNCTION_PASS -#define FUNCTION_PASS(NAME, CREATE_PASS) +#define FUNCTION_PASS(NAME, CREATE_PASS, PARSER)  #endif -FUNCTION_PASS("polly-prepare", CodePreparationPass()) -FUNCTION_PASS("print<polly-detect>", ScopAnalysisPrinterPass(llvm::errs())) -FUNCTION_PASS("print<polly-function-scops>", ScopInfoPrinterPass(llvm::errs())) -FUNCTION_PASS("polly-scop-viewer", ScopViewer()) -FUNCTION_PASS("polly-scop-only-viewer", ScopOnlyViewer()) -FUNCTION_PASS("polly-scop-printer", ScopPrinter()) -FUNCTION_PASS("polly-scop-only-printer", ScopOnlyPrinter()) +FUNCTION_PASS("polly-prepare", CodePreparationPass(), parseNoOptions) +FUNCTION_PASS("print<polly-detect>", ScopAnalysisPrinterPass(llvm::errs()), parseNoOptions) +FUNCTION_PASS("print<polly-function-scops>", ScopInfoPrinterPass(llvm::errs()), parseNoOptions) +FUNCTION_PASS("polly-scop-viewer", ScopViewer(), parseNoOptions) +FUNCTION_PASS("polly-scop-only-viewer", ScopOnlyViewer(), parseNoOptions) +FUNCTION_PASS("polly-scop-printer", ScopPrinter(), parseNoOptions) +FUNCTION_PASS("polly-scop-only-printer", ScopOnlyPrinter(), parseNoOptions) +FUNCTION_PASS("polly", PollyFunctionPass(Opts), parsePollyDefaultOptions) +FUNCTION_PASS("polly-custom", PollyFunctionPass(Opts), parsePollyCustomOptions)  #undef FUNCTION_PASS  #ifndef SCOP_ANALYSIS diff --git a/polly/lib/Support/RegisterPasses.cpp b/polly/lib/Support/RegisterPasses.cpp index 04f8715..2f1d7a8 100644 --- a/polly/lib/Support/RegisterPasses.cpp +++ b/polly/lib/Support/RegisterPasses.cpp @@ -28,8 +28,9 @@  #include "polly/DependenceInfo.h"  #include "polly/ForwardOpTree.h"  #include "polly/JSONExporter.h" -#include "polly/LinkAllPasses.h"  #include "polly/MaximalStaticExpansion.h" +#include "polly/Options.h" +#include "polly/Pass/PollyFunctionPass.h"  #include "polly/PruneUnprofitable.h"  #include "polly/ScheduleOptimizer.h"  #include "polly/ScopDetection.h" @@ -52,6 +53,8 @@  #include "llvm/Transforms/IPO.h"  using namespace llvm; +using namespace polly; +  namespace cl = llvm::cl;  using namespace polly; @@ -201,58 +204,19 @@ static cl::opt<bool> EnablePruneUnprofitable(      cl::desc("Bail out on unprofitable SCoPs before rescheduling"), cl::Hidden,      cl::init(true), cl::cat(PollyCategory)); -namespace { +static cl::opt<bool> +    PollyPrintDetect("polly-print-detect", +                     cl::desc("Polly - Print static control parts (SCoPs)"), +                     cl::cat(PollyCategory)); -/// Initialize Polly passes when library is loaded. -/// -/// We use the constructor of a statically declared object to initialize the -/// different Polly passes right after the Polly library is loaded. This ensures -/// that the Polly passes are available e.g. in the 'opt' tool. -struct StaticInitializer { -  StaticInitializer() { -    llvm::PassRegistry &Registry = *llvm::PassRegistry::getPassRegistry(); -    polly::initializePollyPasses(Registry); -  } -}; -static StaticInitializer InitializeEverything; -} // end of anonymous namespace. - -void initializePollyPasses(llvm::PassRegistry &Registry) { -  initializeCodeGenerationPass(Registry); - -  initializeCodePreparationPass(Registry); -  initializeDeadCodeElimWrapperPassPass(Registry); -  initializeDependenceInfoPass(Registry); -  initializeDependenceInfoPrinterLegacyPassPass(Registry); -  initializeDependenceInfoWrapperPassPass(Registry); -  initializeDependenceInfoPrinterLegacyFunctionPassPass(Registry); -  initializeJSONExporterPass(Registry); -  initializeJSONImporterPass(Registry); -  initializeJSONImporterPrinterLegacyPassPass(Registry); -  initializeMaximalStaticExpanderWrapperPassPass(Registry); -  initializeIslAstInfoWrapperPassPass(Registry); -  initializeIslAstInfoPrinterLegacyPassPass(Registry); -  initializeIslScheduleOptimizerWrapperPassPass(Registry); -  initializeIslScheduleOptimizerPrinterLegacyPassPass(Registry); -  initializePollyCanonicalizePass(Registry); -  initializeScopDetectionWrapperPassPass(Registry); -  initializeScopDetectionPrinterLegacyPassPass(Registry); -  initializeScopInlinerWrapperPassPass(Registry); -  initializeScopInfoRegionPassPass(Registry); -  initializeScopInfoPrinterLegacyRegionPassPass(Registry); -  initializeScopInfoWrapperPassPass(Registry); -  initializeScopInfoPrinterLegacyFunctionPassPass(Registry); -  initializeFlattenSchedulePass(Registry); -  initializeFlattenSchedulePrinterLegacyPassPass(Registry); -  initializeForwardOpTreeWrapperPassPass(Registry); -  initializeForwardOpTreePrinterLegacyPassPass(Registry); -  initializeDeLICMWrapperPassPass(Registry); -  initializeDeLICMPrinterLegacyPassPass(Registry); -  initializeSimplifyWrapperPassPass(Registry); -  initializeSimplifyPrinterLegacyPassPass(Registry); -  initializeDumpModuleWrapperPassPass(Registry); -  initializePruneUnprofitableWrapperPassPass(Registry); -} +static cl::opt<bool> +    PollyPrintScops("polly-print-scops", +                    cl::desc("Print polyhedral description of all regions"), +                    cl::cat(PollyCategory)); + +static cl::opt<bool> PollyPrintDeps("polly-print-deps", +                                    cl::desc("Polly - Print dependences"), +                                    cl::cat(PollyCategory));  static bool shouldEnablePollyForOptimization() { return PollyEnabled; } @@ -266,6 +230,198 @@ static bool shouldEnablePollyForDiagnostic() {           ExportJScop;  } +/// Parser of parameters for LoopVectorize pass. +static llvm::Expected<PollyPassOptions> parsePollyOptions(StringRef Params, +                                                          bool IsCustom) { +  PassPhase PrevPhase = PassPhase::None; + +  bool EnableDefaultOpts = !IsCustom; +  bool EnableEnd2End = !IsCustom; +  std::optional<bool> +      PassEnabled[static_cast<size_t>(PassPhase::PassPhaseLast) + 1]; +  PassPhase StopAfter = PassPhase::None; + +  // Passes enabled using command-line flags (can be overridden using +  // 'polly<no-pass>') +  if (PollyPrintDetect) +    PassEnabled[static_cast<size_t>(PassPhase::PrintDetect)] = true; +  if (PollyPrintScops) +    PassEnabled[static_cast<size_t>(PassPhase::PrintScopInfo)] = true; +  if (PollyPrintDeps) +    PassEnabled[static_cast<size_t>(PassPhase::PrintDependences)] = true; + +  if (PollyViewer) +    PassEnabled[static_cast<size_t>(PassPhase::ViewScops)] = true; +  if (PollyOnlyViewer) +    PassEnabled[static_cast<size_t>(PassPhase::ViewScopsOnly)] = true; +  if (PollyPrinter) +    PassEnabled[static_cast<size_t>(PassPhase::DotScops)] = true; +  if (PollyOnlyPrinter) +    PassEnabled[static_cast<size_t>(PassPhase::DotScopsOnly)] = true; +  if (!EnableSimplify) +    PassEnabled[static_cast<size_t>(PassPhase::Simplify0)] = false; +  if (!EnableForwardOpTree) +    PassEnabled[static_cast<size_t>(PassPhase::Optree)] = false; +  if (!EnableDeLICM) +    PassEnabled[static_cast<size_t>(PassPhase::DeLICM)] = false; +  if (!EnableSimplify) +    PassEnabled[static_cast<size_t>(PassPhase::Simplify1)] = false; +  if (ImportJScop) +    PassEnabled[static_cast<size_t>(PassPhase::ImportJScop)] = true; +  if (DeadCodeElim) +    PassEnabled[static_cast<size_t>(PassPhase::DeadCodeElimination)] = true; +  if (FullyIndexedStaticExpansion) +    PassEnabled[static_cast<size_t>(PassPhase::MaximumStaticExtension)] = true; +  if (!EnablePruneUnprofitable) +    PassEnabled[static_cast<size_t>(PassPhase::PruneUnprofitable)] = false; +  switch (Optimizer) { +  case OPTIMIZER_NONE: +    // explicitly switched off +    PassEnabled[static_cast<size_t>(PassPhase::Optimization)] = false; +    break; +  case OPTIMIZER_ISL: +    // default: enabled +    break; +  } +  if (ExportJScop) +    PassEnabled[static_cast<size_t>(PassPhase::ExportJScop)] = true; +  switch (CodeGeneration) { +  case CODEGEN_AST: +    PassEnabled[static_cast<size_t>(PassPhase::AstGen)] = true; +    PassEnabled[static_cast<size_t>(PassPhase::CodeGen)] = false; +    break; +  case CODEGEN_FULL: +    // default: ast and codegen enabled +    break; +  case CODEGEN_NONE: +    PassEnabled[static_cast<size_t>(PassPhase::AstGen)] = false; +    PassEnabled[static_cast<size_t>(PassPhase::CodeGen)] = false; +    break; +  } + +  while (!Params.empty()) { +    StringRef Param; +    std::tie(Param, Params) = Params.split(';'); +    auto [ParamName, ParamVal] = Param.split('='); + +    if (ParamName == "stopafter") { +      StopAfter = parsePhase(ParamVal); +      if (StopAfter == PassPhase::None) +        return make_error<StringError>( +            formatv("invalid stopafter parameter value '{0}'", ParamVal).str(), +            inconvertibleErrorCode()); +      continue; +    } + +    if (!ParamVal.empty()) +      return make_error<StringError>( +          formatv("parameter '{0}' does not take value", ParamName).str(), +          inconvertibleErrorCode()); + +    bool Enabled = true; +    if (ParamName.starts_with("no-")) { +      Enabled = false; +      ParamName = ParamName.drop_front(3); +    } + +    if (ParamName == "default-opts") { +      EnableDefaultOpts = Enabled; +      continue; +    } + +    if (ParamName == "end2end") { +      EnableEnd2End = Enabled; +      continue; +    } + +    PassPhase Phase; + +    // Shortcut for both simplifys at the same time +    if (ParamName == "simplify") { +      PassEnabled[static_cast<size_t>(PassPhase::Simplify0)] = Enabled; +      PassEnabled[static_cast<size_t>(PassPhase::Simplify1)] = Enabled; +      Phase = PassPhase::Simplify0; +    } else { +      Phase = parsePhase(ParamName); +      if (Phase == PassPhase::None) +        return make_error<StringError>( +            formatv("invalid Polly parameter/phase name '{0}'", ParamName) +                .str(), +            inconvertibleErrorCode()); + +      if (PrevPhase >= Phase) +        return make_error<StringError>( +            formatv("phases must not be repeated and enumerated in-order: " +                    "'{0}' listed before '{1}'", +                    getPhaseName(PrevPhase), getPhaseName(Phase)) +                .str(), +            inconvertibleErrorCode()); + +      PassEnabled[static_cast<size_t>(Phase)] = Enabled; +    } +    PrevPhase = Phase; +  } + +  PollyPassOptions Opts; +  Opts.ViewAll = ViewAll; +  Opts.ViewFilter = ViewFilter; +  Opts.PrintDepsAnalysisLevel = OptAnalysisLevel; + +  // Implicitly enable dependent phases first. May be overriden explicitly +  // on/off later. +  for (PassPhase P : llvm::enum_seq_inclusive(PassPhase::PassPhaseFirst, +                                              PassPhase::PassPhaseLast)) { +    bool Enabled = PassEnabled[static_cast<size_t>(P)].value_or(false); +    if (!Enabled) +      continue; + +    if (static_cast<size_t>(PassPhase::Detection) < static_cast<size_t>(P)) +      Opts.setPhaseEnabled(PassPhase::Detection); + +    if (static_cast<size_t>(PassPhase::ScopInfo) < static_cast<size_t>(P)) +      Opts.setPhaseEnabled(PassPhase::ScopInfo); + +    if (dependsOnDependenceInfo(P)) +      Opts.setPhaseEnabled(PassPhase::Dependences); + +    if (static_cast<size_t>(PassPhase::AstGen) < static_cast<size_t>(P)) +      Opts.setPhaseEnabled(PassPhase::AstGen); +  } + +  if (EnableEnd2End) +    Opts.enableEnd2End(); + +  if (EnableDefaultOpts) +    Opts.enableDefaultOpts(); + +  for (PassPhase P : llvm::enum_seq_inclusive(PassPhase::PassPhaseFirst, +                                              PassPhase::PassPhaseLast)) { +    std::optional<bool> Enabled = PassEnabled[static_cast<size_t>(P)]; + +    // Apply only if set explicitly. +    if (Enabled.has_value()) +      Opts.setPhaseEnabled(P, *Enabled); +  } + +  if (StopAfter != PassPhase::None) +    Opts.disableAfter(StopAfter); + +  if (Error CheckResult = Opts.checkConsistency()) +    return CheckResult; + +  return Opts; +} + +static llvm::Expected<PollyPassOptions> +parsePollyDefaultOptions(StringRef Params) { +  return parsePollyOptions(Params, false); +} + +static llvm::Expected<PollyPassOptions> +parsePollyCustomOptions(StringRef Params) { +  return parsePollyOptions(Params, true); +} +  /// Register Polly passes such that they form a polyhedral optimizer.  ///  /// The individual Polly passes are registered in the pass manager such that @@ -305,77 +461,12 @@ static void buildCommonPollyPipeline(FunctionPassManager &PM,                                       OptimizationLevel Level,                                       bool EnableForOpt) {    PassBuilder PB; -  ScopPassManager SPM; - -  PM.addPass(CodePreparationPass()); - -  // TODO add utility passes for the various command line options, once they're -  // ported - -  if (PollyDetectOnly) { -    // Don't add more passes other than the ScopPassManager's detection passes. -    PM.addPass(createFunctionToScopPassAdaptor(std::move(SPM))); -    return; -  } -  if (PollyViewer) -    PM.addPass(ScopViewer()); -  if (PollyOnlyViewer) -    PM.addPass(ScopOnlyViewer()); -  if (PollyPrinter) -    PM.addPass(ScopPrinter()); -  if (PollyOnlyPrinter) -    PM.addPass(ScopOnlyPrinter()); -  if (EnableSimplify) -    SPM.addPass(SimplifyPass(0)); -  if (EnableForwardOpTree) -    SPM.addPass(ForwardOpTreePass()); -  if (EnableDeLICM) -    SPM.addPass(DeLICMPass()); -  if (EnableSimplify) -    SPM.addPass(SimplifyPass(1)); - -  if (ImportJScop) -    SPM.addPass(JSONImportPass()); - -  if (DeadCodeElim) -    SPM.addPass(DeadCodeElimPass()); - -  if (FullyIndexedStaticExpansion) -    SPM.addPass(MaximalStaticExpansionPass()); - -  if (EnablePruneUnprofitable) -    SPM.addPass(PruneUnprofitablePass()); - -  switch (Optimizer) { -  case OPTIMIZER_NONE: -    break; /* Do nothing */ -  case OPTIMIZER_ISL: -    SPM.addPass(IslScheduleOptimizerPass()); -    break; -  } - -  if (ExportJScop) -    SPM.addPass(JSONExportPass()); - -  if (!EnableForOpt) -    return; - -  switch (CodeGeneration) { -  case CODEGEN_AST: -    SPM.addPass( -        llvm::RequireAnalysisPass<IslAstAnalysis, Scop, ScopAnalysisManager, -                                  ScopStandardAnalysisResults &, -                                  SPMUpdater &>()); -    break; -  case CODEGEN_FULL: -    SPM.addPass(CodeGenerationPass()); -    break; -  case CODEGEN_NONE: -    break; -  } +  ExitOnError Err("Inconsistent Polly configuration: "); +  PollyPassOptions &&Opts = +      Err(parsePollyOptions(StringRef(), /*IsCustom=*/false)); +  PM.addPass(PollyFunctionPass(Opts)); -  PM.addPass(createFunctionToScopPassAdaptor(std::move(SPM)));    PM.addPass(PB.buildFunctionSimplificationPipeline(        Level, llvm::ThinOrFullLTOPhase::None)); // Cleanup @@ -492,8 +583,9 @@ parseCGPipeline(StringRef Name, llvm::CGSCCPassManager &CGPM,    return false;  } -static bool +static llvm::Expected<bool>  parseFunctionPipeline(StringRef Name, FunctionPassManager &FPM, +                      PassInstrumentationCallbacks *PIC,                        ArrayRef<PassBuilder::PipelineElement> Pipeline) {    if (llvm::parseAnalysisUtilityPasses<OwningScopAnalysisManagerFunctionProxy>(            "polly-scop-analyses", Name, FPM)) @@ -505,8 +597,13 @@ parseFunctionPipeline(StringRef Name, FunctionPassManager &FPM,                                                                FPM))            \      return true; -#define FUNCTION_PASS(NAME, CREATE_PASS)                                       \ -  if (Name == NAME) {                                                          \ +#define FUNCTION_PASS(NAME, CREATE_PASS, PARSER)                               \ +  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \ +    auto ExpectedOpts = PassBuilder::parsePassParameters(PARSER, Name, NAME);  \ +    if (!ExpectedOpts)                                                         \ +      return ExpectedOpts.takeError();                                         \ +    auto &&Opts = *ExpectedOpts;                                               \ +    (void)Opts;                                                                \      FPM.addPass(CREATE_PASS);                                                  \      return true;                                                               \    } @@ -592,6 +689,28 @@ parseTopLevelPipeline(llvm::ModulePassManager &MPM,    return true;  } +static llvm::Expected<bool> +parseModulePipeline(StringRef Name, llvm::ModulePassManager &MPM, +                    PassInstrumentationCallbacks *PIC, +                    ArrayRef<PassBuilder::PipelineElement> Pipeline) { +  assert(Pipeline.empty()); + +#define MODULE_PASS(NAME, CREATE_PASS, PARSER)                                 \ +  if (PassBuilder::checkParametrizedPassName(Name, NAME)) {                    \ +    auto ExpectedOpts = PassBuilder::parsePassParameters(PARSER, Name, NAME);  \ +    if (!ExpectedOpts)                                                         \ +      return ExpectedOpts.takeError();                                         \ +    auto &&Opts = *ExpectedOpts;                                               \ +    (void)Opts;                                                                \ +    MPM.addPass(CREATE_PASS);                                                  \ +    return true;                                                               \ +  } + +#include "PollyPasses.def" + +  return false; +} +  /// Register Polly to be available as an optimizer  ///  /// @@ -620,10 +739,36 @@ parseTopLevelPipeline(llvm::ModulePassManager &MPM,  /// handle LICMed code to make it useful.  void registerPollyPasses(PassBuilder &PB) {    PassInstrumentationCallbacks *PIC = PB.getPassInstrumentationCallbacks(); + +#define MODULE_PASS(NAME, CREATE_PASS, PARSER)                                 \ +  {                                                                            \ +    std::remove_reference_t<decltype(*PARSER(StringRef()))> Opts;              \ +    (void)Opts;                                                                \ +    PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);              \ +  } +#define CGSCC_PASS(NAME, CREATE_PASS, PARSER)                                  \ +  {                                                                            \ +    std::remove_reference_t<decltype(*PARSER(StringRef()))> Opts;              \ +    (void)Opts;                                                                \ +    PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);              \ +  } +#define FUNCTION_PASS(NAME, CREATE_PASS, PARSER)                               \ +  {                                                                            \ +    std::remove_reference_t<decltype(*PARSER(StringRef()))> Opts;              \ +    (void)Opts;                                                                \ +    PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);              \ +  } +#include "PollyPasses.def" +    PB.registerAnalysisRegistrationCallback([PIC](FunctionAnalysisManager &FAM) {      registerFunctionAnalyses(FAM, PIC);    }); -  PB.registerPipelineParsingCallback(parseFunctionPipeline); +  PB.registerPipelineParsingCallback( +      [PIC](StringRef Name, FunctionPassManager &FPM, +            ArrayRef<PassBuilder::PipelineElement> Pipeline) -> bool { +        ExitOnError Err("Unable to parse Polly module pass: "); +        return Err(parseFunctionPipeline(Name, FPM, PIC, Pipeline)); +      });    PB.registerPipelineParsingCallback(        [PIC](StringRef Name, FunctionPassManager &FPM,              ArrayRef<PassBuilder::PipelineElement> Pipeline) -> bool { @@ -635,6 +780,12 @@ void registerPollyPasses(PassBuilder &PB) {          ExitOnError Err("Unable to parse Polly call graph pass: ");          return Err(parseCGPipeline(Name, CGPM, PIC, Pipeline));        }); +  PB.registerPipelineParsingCallback( +      [PIC](StringRef Name, ModulePassManager &MPM, +            ArrayRef<PassBuilder::PipelineElement> Pipeline) -> bool { +        ExitOnError Err("Unable to parse Polly module pass: "); +        return Err(parseModulePipeline(Name, MPM, PIC, Pipeline)); +      });    PB.registerParseTopLevelPipelineCallback(        [PIC](llvm::ModulePassManager &MPM,              ArrayRef<PassBuilder::PipelineElement> Pipeline) -> bool { diff --git a/polly/lib/Support/ScopHelper.cpp b/polly/lib/Support/ScopHelper.cpp index a2328d1..cf0ec44 100644 --- a/polly/lib/Support/ScopHelper.cpp +++ b/polly/lib/Support/ScopHelper.cpp @@ -206,18 +206,6 @@ void polly::splitEntryBlockForAlloca(BasicBlock *EntryBlock, DominatorTree *DT,    splitBlock(EntryBlock, I, DT, LI, RI);  } -void polly::splitEntryBlockForAlloca(BasicBlock *EntryBlock, Pass *P) { -  auto *DTWP = P->getAnalysisIfAvailable<DominatorTreeWrapperPass>(); -  auto *DT = DTWP ? &DTWP->getDomTree() : nullptr; -  auto *LIWP = P->getAnalysisIfAvailable<LoopInfoWrapperPass>(); -  auto *LI = LIWP ? &LIWP->getLoopInfo() : nullptr; -  RegionInfoPass *RIP = P->getAnalysisIfAvailable<RegionInfoPass>(); -  RegionInfo *RI = RIP ? &RIP->getRegionInfo() : nullptr; - -  // splitBlock updates DT, LI and RI. -  polly::splitEntryBlockForAlloca(EntryBlock, DT, LI, RI); -} -  void polly::recordAssumption(polly::RecordedAssumptionsTy *RecordedAssumptions,                               polly::AssumptionKind Kind, isl::set Set,                               DebugLoc Loc, polly::AssumptionSign Sign, diff --git a/polly/lib/Transform/Canonicalization.cpp b/polly/lib/Transform/Canonicalization.cpp index 1be560e..cd7195f 100644 --- a/polly/lib/Transform/Canonicalization.cpp +++ b/polly/lib/Transform/Canonicalization.cpp @@ -13,7 +13,6 @@  //===----------------------------------------------------------------------===//  #include "polly/Canonicalization.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "llvm/Analysis/GlobalsModRef.h"  #include "llvm/Analysis/ProfileSummaryInfo.h" @@ -39,24 +38,6 @@ static cl::opt<bool>                   cl::desc("Run an early inliner pass before Polly"), cl::Hidden,                   cl::cat(PollyCategory)); -void polly::registerCanonicalicationPasses(llvm::legacy::PassManagerBase &PM) { -  bool UseMemSSA = true; -  PM.add(llvm::createPromoteMemoryToRegisterPass()); -  PM.add(llvm::createEarlyCSEPass(UseMemSSA)); -  PM.add(llvm::createInstructionCombiningPass()); -  PM.add(llvm::createCFGSimplificationPass()); -  PM.add(llvm::createTailCallEliminationPass()); -  PM.add(llvm::createCFGSimplificationPass()); -  PM.add(llvm::createReassociatePass()); -  if (PollyInliner) { -    PM.add(llvm::createPromoteMemoryToRegisterPass()); -    PM.add(llvm::createCFGSimplificationPass()); -    PM.add(llvm::createInstructionCombiningPass()); -    PM.add(createBarrierNoopPass()); -  } -  PM.add(llvm::createInstructionCombiningPass()); -} -  /// Adapted from llvm::PassBuilder::buildInlinerPipeline  static ModuleInlinerWrapperPass  buildInlinePasses(llvm::OptimizationLevel Level) { @@ -125,49 +106,3 @@ polly::buildCanonicalicationPassesForNPM(llvm::ModulePassManager &MPM,    return FPM;  } - -namespace { -class PollyCanonicalize final : public ModulePass { -  PollyCanonicalize(const PollyCanonicalize &) = delete; -  const PollyCanonicalize &operator=(const PollyCanonicalize &) = delete; - -public: -  static char ID; - -  explicit PollyCanonicalize() : ModulePass(ID) {} -  ~PollyCanonicalize(); - -  /// @name FunctionPass interface. -  //@{ -  void getAnalysisUsage(AnalysisUsage &AU) const override; -  void releaseMemory() override; -  bool runOnModule(Module &M) override; -  void print(raw_ostream &OS, const Module *) const override; -  //@} -}; -} // namespace - -PollyCanonicalize::~PollyCanonicalize() {} - -void PollyCanonicalize::getAnalysisUsage(AnalysisUsage &AU) const {} - -void PollyCanonicalize::releaseMemory() {} - -bool PollyCanonicalize::runOnModule(Module &M) { -  legacy::PassManager PM; -  registerCanonicalicationPasses(PM); -  PM.run(M); - -  return true; -} - -void PollyCanonicalize::print(raw_ostream &OS, const Module *) const {} - -char PollyCanonicalize::ID = 0; - -Pass *polly::createPollyCanonicalizePass() { return new PollyCanonicalize(); } - -INITIALIZE_PASS_BEGIN(PollyCanonicalize, "polly-canonicalize", -                      "Polly - Run canonicalization passes", false, false) -INITIALIZE_PASS_END(PollyCanonicalize, "polly-canonicalize", -                    "Polly - Run canonicalization passes", false, false) diff --git a/polly/lib/Transform/CodePreparation.cpp b/polly/lib/Transform/CodePreparation.cpp index d045fb6..5b96c86 100644 --- a/polly/lib/Transform/CodePreparation.cpp +++ b/polly/lib/Transform/CodePreparation.cpp @@ -16,13 +16,11 @@  //===----------------------------------------------------------------------===//  #include "polly/CodePreparation.h" -#include "polly/LinkAllPasses.h"  #include "polly/Support/ScopHelper.h"  #include "llvm/Analysis/DominanceFrontier.h"  #include "llvm/Analysis/LoopInfo.h"  #include "llvm/Analysis/RegionInfo.h"  #include "llvm/Analysis/ScalarEvolution.h" -#include "llvm/InitializePasses.h"  using namespace llvm;  using namespace polly; @@ -47,32 +45,6 @@ static bool runCodePreprationImpl(Function &F, DominatorTree *DT, LoopInfo *LI,    return true;  } -namespace { - -/// Prepare the IR for the scop detection. -/// -class CodePreparation final : public FunctionPass { -  CodePreparation(const CodePreparation &) = delete; -  const CodePreparation &operator=(const CodePreparation &) = delete; - -  void clear(); - -public: -  static char ID; - -  explicit CodePreparation() : FunctionPass(ID) {} -  ~CodePreparation(); - -  /// @name FunctionPass interface. -  //@{ -  void getAnalysisUsage(AnalysisUsage &AU) const override; -  void releaseMemory() override; -  bool runOnFunction(Function &F) override; -  void print(raw_ostream &OS, const Module *) const override; -  //@} -}; -} // namespace -  PreservedAnalyses CodePreparationPass::run(Function &F,                                             FunctionAnalysisManager &FAM) {    auto &DT = FAM.getResult<DominatorTreeAnalysis>(F); @@ -86,44 +58,3 @@ PreservedAnalyses CodePreparationPass::run(Function &F,    PA.preserve<LoopAnalysis>();    return PA;  } - -void CodePreparation::clear() {} - -CodePreparation::~CodePreparation() { clear(); } - -void CodePreparation::getAnalysisUsage(AnalysisUsage &AU) const { -  AU.addRequired<LoopInfoWrapperPass>(); - -  AU.addPreserved<LoopInfoWrapperPass>(); -  AU.addPreserved<RegionInfoPass>(); -  AU.addPreserved<DominatorTreeWrapperPass>(); -  AU.addPreserved<DominanceFrontierWrapperPass>(); -} - -bool CodePreparation::runOnFunction(Function &F) { -  if (skipFunction(F)) -    return false; - -  DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); -  LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); -  RegionInfo *RI = &getAnalysis<RegionInfoPass>().getRegionInfo(); - -  runCodePreprationImpl(F, DT, LI, RI); - -  return true; -} - -void CodePreparation::releaseMemory() { clear(); } - -void CodePreparation::print(raw_ostream &OS, const Module *) const {} - -char CodePreparation::ID = 0; -char &polly::CodePreparationID = CodePreparation::ID; - -Pass *polly::createCodePreparationPass() { return new CodePreparation(); } - -INITIALIZE_PASS_BEGIN(CodePreparation, "polly-prepare", -                      "Polly - Prepare code for polly", false, false) -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) -INITIALIZE_PASS_END(CodePreparation, "polly-prepare", -                    "Polly - Prepare code for polly", false, false) diff --git a/polly/lib/Transform/DeLICM.cpp b/polly/lib/Transform/DeLICM.cpp index 9a9768a..e8f2d95 100644 --- a/polly/lib/Transform/DeLICM.cpp +++ b/polly/lib/Transform/DeLICM.cpp @@ -15,7 +15,6 @@  //===----------------------------------------------------------------------===//  #include "polly/DeLICM.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/ScopPass.h" @@ -25,7 +24,6 @@  #include "polly/ZoneAlgo.h"  #include "llvm/ADT/Statistic.h"  #include "llvm/IR/Module.h" -#include "llvm/InitializePasses.h"  #include "polly/Support/PollyDebug.h"  #define DEBUG_TYPE "polly-delicm" @@ -35,6 +33,10 @@ using namespace llvm;  namespace { +static cl::opt<bool> PollyPrintDeLICM("polly-print-delicm", +                                      cl::desc("Polly - Print DeLICM/DePRE"), +                                      cl::cat(PollyCategory)); +  cl::opt<int>      DelicmMaxOps("polly-delicm-max-ops",                   cl::desc("Maximum number of isl operations to invest for " @@ -1356,7 +1358,10 @@ public:    }    /// Return whether at least one transformation been applied. -  bool isModified() const { return NumberOfTargetsMapped > 0; } +  bool isModified() const { +    return NumberOfTargetsMapped > 0 || NumberOfMappedValueScalars > 0 || +           NumberOfMappedPHIScalars > 0; +  }  };  static std::unique_ptr<DeLICMImpl> collapseToUnused(Scop &S, LoopInfo &LI) { @@ -1376,7 +1381,7 @@ static std::unique_ptr<DeLICMImpl> collapseToUnused(Scop &S, LoopInfo &LI) {    return Impl;  } -static std::unique_ptr<DeLICMImpl> runDeLICM(Scop &S, LoopInfo &LI) { +static std::unique_ptr<DeLICMImpl> runDeLICMImpl(Scop &S, LoopInfo &LI) {    std::unique_ptr<DeLICMImpl> Impl = collapseToUnused(S, LI);    Scop::ScopStatistics ScopStats = S.getStatistics(); @@ -1394,7 +1399,7 @@ static PreservedAnalyses runDeLICMUsingNPM(Scop &S, ScopAnalysisManager &SAM,                                             ScopStandardAnalysisResults &SAR,                                             SPMUpdater &U, raw_ostream *OS) {    LoopInfo &LI = SAR.LI; -  std::unique_ptr<DeLICMImpl> Impl = runDeLICM(S, LI); +  std::unique_ptr<DeLICMImpl> Impl = runDeLICMImpl(S, LI);    if (OS) {      *OS << "Printing analysis 'Polly - DeLICM/DePRE' for region: '" @@ -1417,88 +1422,8 @@ static PreservedAnalyses runDeLICMUsingNPM(Scop &S, ScopAnalysisManager &SAM,    PA.preserveSet<AllAnalysesOn<Loop>>();    return PA;  } - -class DeLICMWrapperPass final : public ScopPass { -private: -  DeLICMWrapperPass(const DeLICMWrapperPass &) = delete; -  const DeLICMWrapperPass &operator=(const DeLICMWrapperPass &) = delete; - -  /// The pass implementation, also holding per-scop data. -  std::unique_ptr<DeLICMImpl> Impl; - -public: -  static char ID; -  explicit DeLICMWrapperPass() : ScopPass(ID) {} - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.addRequiredTransitive<ScopInfoRegionPass>(); -    AU.addRequired<LoopInfoWrapperPass>(); -    AU.setPreservesAll(); -  } - -  bool runOnScop(Scop &S) override { -    // Free resources for previous scop's computation, if not yet done. -    releaseMemory(); - -    auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); -    Impl = runDeLICM(S, LI); - -    return Impl->isModified(); -  } - -  void printScop(raw_ostream &OS, Scop &S) const override { -    if (!Impl) -      return; -    assert(Impl->getScop() == &S); - -    OS << "DeLICM result:\n"; -    Impl->print(OS); -  } - -  void releaseMemory() override { Impl.reset(); } -}; - -char DeLICMWrapperPass::ID; - -/// Print result from DeLICMWrapperPass. -class DeLICMPrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  DeLICMPrinterLegacyPass() : DeLICMPrinterLegacyPass(outs()) {} -  explicit DeLICMPrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    DeLICMWrapperPass &P = getAnalysis<DeLICMWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<DeLICMWrapperPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char DeLICMPrinterLegacyPass::ID = 0;  } // anonymous namespace -Pass *polly::createDeLICMWrapperPass() { return new DeLICMWrapperPass(); } - -llvm::Pass *polly::createDeLICMPrinterLegacyPass(llvm::raw_ostream &OS) { -  return new DeLICMPrinterLegacyPass(OS); -} -  llvm::PreservedAnalyses polly::DeLICMPass::run(Scop &S,                                                 ScopAnalysisManager &SAM,                                                 ScopStandardAnalysisResults &SAR, @@ -1527,15 +1452,21 @@ bool polly::isConflicting(    return Knowledge::isConflicting(Existing, Proposed, OS, Indent);  } -INITIALIZE_PASS_BEGIN(DeLICMWrapperPass, "polly-delicm", "Polly - DeLICM/DePRE", -                      false, false) -INITIALIZE_PASS_DEPENDENCY(ScopInfoWrapperPass) -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) -INITIALIZE_PASS_END(DeLICMWrapperPass, "polly-delicm", "Polly - DeLICM/DePRE", -                    false, false) - -INITIALIZE_PASS_BEGIN(DeLICMPrinterLegacyPass, "polly-print-delicm", -                      "Polly - Print DeLICM/DePRE", false, false) -INITIALIZE_PASS_DEPENDENCY(ScopInfoWrapperPass) -INITIALIZE_PASS_END(DeLICMPrinterLegacyPass, "polly-print-delicm", -                    "Polly - Print DeLICM/DePRE", false, false) +bool polly::runDeLICM(Scop &S) { +  LoopInfo &LI = *S.getLI(); +  std::unique_ptr<DeLICMImpl> Impl = runDeLICMImpl(S, LI); + +  if (PollyPrintDeLICM) { +    outs() << "Printing analysis 'Polly - DeLICM/DePRE' for region: '" +           << S.getName() << "' in function '" << S.getFunction().getName() +           << "':\n"; +    if (Impl) { +      assert(Impl->getScop() == &S); + +      outs() << "DeLICM result:\n"; +      Impl->print(outs()); +    } +  } + +  return Impl->isModified(); +} diff --git a/polly/lib/Transform/DeadCodeElimination.cpp b/polly/lib/Transform/DeadCodeElimination.cpp index 5cb89fe..df95e51 100644 --- a/polly/lib/Transform/DeadCodeElimination.cpp +++ b/polly/lib/Transform/DeadCodeElimination.cpp @@ -33,7 +33,6 @@  #include "polly/DeadCodeElimination.h"  #include "polly/DependenceInfo.h" -#include "polly/LinkAllPasses.h"  #include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "llvm/Support/CommandLine.h" @@ -51,20 +50,6 @@ cl::opt<int> DCEPreciseSteps(               "before the actual dead code elimination."),      cl::init(-1), cl::cat(PollyCategory)); -class DeadCodeElimWrapperPass final : public ScopPass { -public: -  static char ID; -  explicit DeadCodeElimWrapperPass() : ScopPass(ID) {} - -  /// Remove dead iterations from the schedule of @p S. -  bool runOnScop(Scop &S) override; - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; -}; - -char DeadCodeElimWrapperPass::ID = 0; -  /// Return the set of live iterations.  ///  /// The set of live iterations are all iterations that write to memory and for @@ -144,29 +129,19 @@ static bool runDeadCodeElimination(Scop &S, int PreciseSteps,    return S.restrictDomains(Live);  } -bool DeadCodeElimWrapperPass::runOnScop(Scop &S) { -  auto &DI = getAnalysis<DependenceInfo>(); -  const Dependences &Deps = DI.getDependences(Dependences::AL_Statement); +} // namespace + +bool polly::runDeadCodeElim(Scop &S, DependenceAnalysis::Result &DA) { +  const Dependences &Deps = DA.getDependences(Dependences::AL_Statement);    bool Changed = runDeadCodeElimination(S, DCEPreciseSteps, Deps);    // FIXME: We can probably avoid the recomputation of all dependences by    // updating them explicitly.    if (Changed) -    DI.recomputeDependences(Dependences::AL_Statement); - -  return false; -} - -void DeadCodeElimWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { -  ScopPass::getAnalysisUsage(AU); -  AU.addRequired<DependenceInfo>(); -} - -} // namespace +    DA.recomputeDependences(Dependences::AL_Statement); -Pass *polly::createDeadCodeElimWrapperPass() { -  return new DeadCodeElimWrapperPass(); +  return Changed;  }  llvm::PreservedAnalyses DeadCodeElimPass::run(Scop &S, ScopAnalysisManager &SAM, @@ -191,10 +166,3 @@ llvm::PreservedAnalyses DeadCodeElimPass::run(Scop &S, ScopAnalysisManager &SAM,    PA.preserveSet<AllAnalysesOn<Loop>>();    return PA;  } - -INITIALIZE_PASS_BEGIN(DeadCodeElimWrapperPass, "polly-dce", -                      "Polly - Remove dead iterations", false, false) -INITIALIZE_PASS_DEPENDENCY(DependenceInfo) -INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass) -INITIALIZE_PASS_END(DeadCodeElimWrapperPass, "polly-dce", -                    "Polly - Remove dead iterations", false, false) diff --git a/polly/lib/Transform/FlattenSchedule.cpp b/polly/lib/Transform/FlattenSchedule.cpp index f514ef3..35a8ce6 100644 --- a/polly/lib/Transform/FlattenSchedule.cpp +++ b/polly/lib/Transform/FlattenSchedule.cpp @@ -14,6 +14,7 @@  #include "polly/FlattenSchedule.h"  #include "polly/FlattenAlgo.h" +#include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/ScopPass.h"  #include "polly/Support/ISLOStream.h" @@ -26,6 +27,10 @@ using namespace llvm;  namespace { +static cl::opt<bool> PollyPrintFlattenSchedule("polly-print-flatten-schedule", +                                               cl::desc("A polly pass"), +                                               cl::cat(PollyCategory)); +  /// Print a schedule to @p OS.  ///  /// Prints the schedule for each statements on a new line. @@ -34,119 +39,45 @@ void printSchedule(raw_ostream &OS, const isl::union_map &Schedule,    for (isl::map Map : Schedule.get_map_list())      OS.indent(indent) << Map << "\n";  } +} // namespace -/// Flatten the schedule stored in an polly::Scop. -class FlattenSchedule final : public ScopPass { -private: -  FlattenSchedule(const FlattenSchedule &) = delete; -  const FlattenSchedule &operator=(const FlattenSchedule &) = delete; - -  std::shared_ptr<isl_ctx> IslCtx; -  isl::union_map OldSchedule; - -public: -  static char ID; -  explicit FlattenSchedule() : ScopPass(ID) {} - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.addRequiredTransitive<ScopInfoRegionPass>(); -    AU.setPreservesAll(); -  } - -  bool runOnScop(Scop &S) override { -    // Keep a reference to isl_ctx to ensure that it is not freed before we free -    // OldSchedule. -    IslCtx = S.getSharedIslCtx(); +void polly::runFlattenSchedulePass(Scop &S) { +  // Keep a reference to isl_ctx to ensure that it is not freed before we free +  // OldSchedule. +  auto IslCtx = S.getSharedIslCtx(); -    POLLY_DEBUG(dbgs() << "Going to flatten old schedule:\n"); -    OldSchedule = S.getSchedule(); -    POLLY_DEBUG(printSchedule(dbgs(), OldSchedule, 2)); +  POLLY_DEBUG(dbgs() << "Going to flatten old schedule:\n"); +  auto OldSchedule = S.getSchedule(); +  POLLY_DEBUG(printSchedule(dbgs(), OldSchedule, 2)); -    auto Domains = S.getDomains(); -    auto RestrictedOldSchedule = OldSchedule.intersect_domain(Domains); -    POLLY_DEBUG(dbgs() << "Old schedule with domains:\n"); -    POLLY_DEBUG(printSchedule(dbgs(), RestrictedOldSchedule, 2)); +  auto Domains = S.getDomains(); +  auto RestrictedOldSchedule = OldSchedule.intersect_domain(Domains); +  POLLY_DEBUG(dbgs() << "Old schedule with domains:\n"); +  POLLY_DEBUG(printSchedule(dbgs(), RestrictedOldSchedule, 2)); -    auto NewSchedule = flattenSchedule(RestrictedOldSchedule); +  auto NewSchedule = flattenSchedule(RestrictedOldSchedule); -    POLLY_DEBUG(dbgs() << "Flattened new schedule:\n"); -    POLLY_DEBUG(printSchedule(dbgs(), NewSchedule, 2)); +  POLLY_DEBUG(dbgs() << "Flattened new schedule:\n"); +  POLLY_DEBUG(printSchedule(dbgs(), NewSchedule, 2)); -    NewSchedule = NewSchedule.gist_domain(Domains); -    POLLY_DEBUG(dbgs() << "Gisted, flattened new schedule:\n"); -    POLLY_DEBUG(printSchedule(dbgs(), NewSchedule, 2)); +  NewSchedule = NewSchedule.gist_domain(Domains); +  POLLY_DEBUG(dbgs() << "Gisted, flattened new schedule:\n"); +  POLLY_DEBUG(printSchedule(dbgs(), NewSchedule, 2)); -    S.setSchedule(NewSchedule); -    return false; -  } +  S.setSchedule(NewSchedule); -  void printScop(raw_ostream &OS, Scop &S) const override { -    OS << "Schedule before flattening {\n"; -    printSchedule(OS, OldSchedule, 4); -    OS << "}\n\n"; +  if (PollyPrintFlattenSchedule) { +    outs() +        << "Printing analysis 'Polly - Print flattened schedule' for region: '" +        << S.getRegion().getNameStr() << "' in function '" +        << S.getFunction().getName() << "':\n"; -    OS << "Schedule after flattening {\n"; -    printSchedule(OS, S.getSchedule(), 4); -    OS << "}\n"; -  } +    outs() << "Schedule before flattening {\n"; +    printSchedule(outs(), OldSchedule, 4); +    outs() << "}\n\n"; -  void releaseMemory() override { -    OldSchedule = {}; -    IslCtx.reset(); +    outs() << "Schedule after flattening {\n"; +    printSchedule(outs(), S.getSchedule(), 4); +    outs() << "}\n";    } -}; - -char FlattenSchedule::ID; - -/// Print result from FlattenSchedule. -class FlattenSchedulePrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  FlattenSchedulePrinterLegacyPass() -      : FlattenSchedulePrinterLegacyPass(outs()) {} -  explicit FlattenSchedulePrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    FlattenSchedule &P = getAnalysis<FlattenSchedule>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<FlattenSchedule>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char FlattenSchedulePrinterLegacyPass::ID = 0; -} // anonymous namespace - -Pass *polly::createFlattenSchedulePass() { return new FlattenSchedule(); } - -Pass *polly::createFlattenSchedulePrinterLegacyPass(llvm::raw_ostream &OS) { -  return new FlattenSchedulePrinterLegacyPass(OS);  } - -INITIALIZE_PASS_BEGIN(FlattenSchedule, "polly-flatten-schedule", -                      "Polly - Flatten schedule", false, false) -INITIALIZE_PASS_END(FlattenSchedule, "polly-flatten-schedule", -                    "Polly - Flatten schedule", false, false) - -INITIALIZE_PASS_BEGIN(FlattenSchedulePrinterLegacyPass, -                      "polly-print-flatten-schedule", -                      "Polly - Print flattened schedule", false, false) -INITIALIZE_PASS_DEPENDENCY(FlattenSchedule) -INITIALIZE_PASS_END(FlattenSchedulePrinterLegacyPass, -                    "polly-print-flatten-schedule", -                    "Polly - Print flattened schedule", false, false) diff --git a/polly/lib/Transform/ForwardOpTree.cpp b/polly/lib/Transform/ForwardOpTree.cpp index e9be6c9..24d4a4a 100644 --- a/polly/lib/Transform/ForwardOpTree.cpp +++ b/polly/lib/Transform/ForwardOpTree.cpp @@ -28,7 +28,6 @@  #include "llvm/IR/Instruction.h"  #include "llvm/IR/Instructions.h"  #include "llvm/IR/Value.h" -#include "llvm/InitializePasses.h"  #include "llvm/Support/Casting.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/Compiler.h" @@ -62,6 +61,11 @@ static cl::opt<unsigned>                      "analysis; 0=no limit"),             cl::init(1000000), cl::cat(PollyCategory), cl::Hidden); +static cl::opt<bool> +    PollyPrintOptree("polly-print-optree", +                     cl::desc("Polly - Print forward operand tree result"), +                     cl::cat(PollyCategory)); +  STATISTIC(KnownAnalyzed, "Number of successfully analyzed SCoPs");  STATISTIC(KnownOutOfQuota,            "Analyses aborted because max_operations was reached"); @@ -1030,8 +1034,8 @@ public:    bool isModified() const { return Modified; }  }; -static std::unique_ptr<ForwardOpTreeImpl> runForwardOpTree(Scop &S, -                                                           LoopInfo &LI) { +static std::unique_ptr<ForwardOpTreeImpl> runForwardOpTreeImpl(Scop &S, +                                                               LoopInfo &LI) {    std::unique_ptr<ForwardOpTreeImpl> Impl;    {      IslMaxOperationsGuard MaxOpGuard(S.getIslCtx().get(), MaxOps, false); @@ -1073,7 +1077,7 @@ runForwardOpTreeUsingNPM(Scop &S, ScopAnalysisManager &SAM,                           raw_ostream *OS) {    LoopInfo &LI = SAR.LI; -  std::unique_ptr<ForwardOpTreeImpl> Impl = runForwardOpTree(S, LI); +  std::unique_ptr<ForwardOpTreeImpl> Impl = runForwardOpTreeImpl(S, LI);    if (OS) {      *OS << "Printing analysis 'Polly - Forward operand tree' for region: '"          << S.getName() << "' in function '" << S.getFunction().getName() @@ -1094,99 +1098,8 @@ runForwardOpTreeUsingNPM(Scop &S, ScopAnalysisManager &SAM,    PA.preserveSet<AllAnalysesOn<Loop>>();    return PA;  } - -/// Pass that redirects scalar reads to array elements that are known to contain -/// the same value. -/// -/// This reduces the number of scalar accesses and therefore potentially -/// increases the freedom of the scheduler. In the ideal case, all reads of a -/// scalar definition are redirected (We currently do not care about removing -/// the write in this case).  This is also useful for the main DeLICM pass as -/// there are less scalars to be mapped. -class ForwardOpTreeWrapperPass final : public ScopPass { -private: -  /// The pass implementation, also holding per-scop data. -  std::unique_ptr<ForwardOpTreeImpl> Impl; - -public: -  static char ID; - -  explicit ForwardOpTreeWrapperPass() : ScopPass(ID) {} -  ForwardOpTreeWrapperPass(const ForwardOpTreeWrapperPass &) = delete; -  ForwardOpTreeWrapperPass & -  operator=(const ForwardOpTreeWrapperPass &) = delete; - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.addRequiredTransitive<ScopInfoRegionPass>(); -    AU.addRequired<LoopInfoWrapperPass>(); -    AU.setPreservesAll(); -  } - -  bool runOnScop(Scop &S) override { -    // Free resources for previous SCoP's computation, if not yet done. -    releaseMemory(); - -    LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); - -    Impl = runForwardOpTree(S, LI); - -    return false; -  } - -  void printScop(raw_ostream &OS, Scop &S) const override { -    if (!Impl) -      return; - -    assert(Impl->getScop() == &S); -    Impl->print(OS); -  } - -  void releaseMemory() override { Impl.reset(); } -}; // class ForwardOpTree - -char ForwardOpTreeWrapperPass::ID; - -/// Print result from ForwardOpTreeWrapperPass. -class ForwardOpTreePrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  ForwardOpTreePrinterLegacyPass() : ForwardOpTreePrinterLegacyPass(outs()) {} -  explicit ForwardOpTreePrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    ForwardOpTreeWrapperPass &P = getAnalysis<ForwardOpTreeWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<ForwardOpTreeWrapperPass>(); -    AU.setPreservesAll(); -  } - -private: -  llvm::raw_ostream &OS; -}; - -char ForwardOpTreePrinterLegacyPass::ID = 0;  } // namespace -Pass *polly::createForwardOpTreeWrapperPass() { -  return new ForwardOpTreeWrapperPass(); -} - -Pass *polly::createForwardOpTreePrinterLegacyPass(llvm::raw_ostream &OS) { -  return new ForwardOpTreePrinterLegacyPass(OS); -} -  llvm::PreservedAnalyses ForwardOpTreePass::run(Scop &S,                                                 ScopAnalysisManager &SAM,                                                 ScopStandardAnalysisResults &SAR, @@ -1200,14 +1113,20 @@ ForwardOpTreePrinterPass::run(Scop &S, ScopAnalysisManager &SAM,    return runForwardOpTreeUsingNPM(S, SAM, SAR, U, &OS);  } -INITIALIZE_PASS_BEGIN(ForwardOpTreeWrapperPass, "polly-optree", -                      "Polly - Forward operand tree", false, false) -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) -INITIALIZE_PASS_END(ForwardOpTreeWrapperPass, "polly-optree", -                    "Polly - Forward operand tree", false, false) - -INITIALIZE_PASS_BEGIN(ForwardOpTreePrinterLegacyPass, "polly-print-optree", -                      "Polly - Print forward operand tree result", false, false) -INITIALIZE_PASS_DEPENDENCY(ForwardOpTreeWrapperPass) -INITIALIZE_PASS_END(ForwardOpTreePrinterLegacyPass, "polly-print-optree", -                    "Polly - Print forward operand tree result", false, false) +bool polly::runForwardOpTree(Scop &S) { +  LoopInfo &LI = *S.getLI(); + +  std::unique_ptr<ForwardOpTreeImpl> Impl = runForwardOpTreeImpl(S, LI); +  if (PollyPrintOptree) { +    outs() << "Printing analysis 'Polly - Forward operand tree' for region: '" +           << S.getName() << "' in function '" << S.getFunction().getName() +           << "':\n"; +    if (Impl) { +      assert(Impl->getScop() == &S); + +      Impl->print(outs()); +    } +  } + +  return Impl->isModified(); +} diff --git a/polly/lib/Transform/MaximalStaticExpansion.cpp b/polly/lib/Transform/MaximalStaticExpansion.cpp index 0719840..62a4d25 100644 --- a/polly/lib/Transform/MaximalStaticExpansion.cpp +++ b/polly/lib/Transform/MaximalStaticExpansion.cpp @@ -13,14 +13,13 @@  #include "polly/MaximalStaticExpansion.h"  #include "polly/DependenceInfo.h" -#include "polly/LinkAllPasses.h" +#include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/ScopPass.h"  #include "polly/Support/ISLTools.h"  #include "llvm/ADT/SmallPtrSet.h"  #include "llvm/ADT/StringRef.h"  #include "llvm/Analysis/OptimizationRemarkEmitter.h" -#include "llvm/InitializePasses.h"  #include "isl/isl-noexceptions.h"  #include "isl/union_map.h"  #include <cassert> @@ -35,28 +34,10 @@ using namespace polly;  namespace { -class MaximalStaticExpanderWrapperPass final : public ScopPass { -public: -  static char ID; - -  explicit MaximalStaticExpanderWrapperPass() : ScopPass(ID) {} - -  ~MaximalStaticExpanderWrapperPass() override = default; - -  /// Expand the accesses of the SCoP. -  /// -  /// @param S The SCoP that must be expanded. -  bool runOnScop(Scop &S) override; - -  /// Print the SCoP. -  /// -  /// @param OS The stream where to print. -  /// @param S The SCop that must be printed. -  void printScop(raw_ostream &OS, Scop &S) const override; - -  /// Register all analyses and transformations required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; -}; +static cl::opt<bool> +    PollyPrintMSE("polly-print-mse", +                  cl::desc("Polly - Print Maximal static expansion of SCoP"), +                  cl::cat(PollyCategory));  #ifndef NDEBUG  /// Whether a dimension of a set is bounded (lower and upper) by a constant, @@ -458,8 +439,8 @@ public:  };  static std::unique_ptr<MaximalStaticExpansionImpl> -runMaximalStaticExpansion(Scop &S, OptimizationRemarkEmitter &ORE, -                          const Dependences &D) { +runMaximalStaticExpansionImpl(Scop &S, OptimizationRemarkEmitter &ORE, +                              const Dependences &D) {    auto Dependences = D.getDependences(Dependences::TYPE_RAW);    std::unique_ptr<MaximalStaticExpansionImpl> Impl = @@ -478,7 +459,7 @@ static PreservedAnalyses runMSEUsingNPM(Scop &S, ScopAnalysisManager &SAM,    auto &D = DI.getDependences(Dependences::AL_Reference);    std::unique_ptr<MaximalStaticExpansionImpl> Impl = -      runMaximalStaticExpansion(S, ORE, D); +      runMaximalStaticExpansionImpl(S, ORE, D);    if (OS) {      *OS << "Printing analysis 'Polly - Maximal static expansion of SCoP' for " @@ -511,42 +492,24 @@ MaximalStaticExpansionPrinterPass::run(Scop &S, ScopAnalysisManager &SAM,    return runMSEUsingNPM(S, SAM, SAR, &OS);  } -char MaximalStaticExpanderWrapperPass::ID = 0; - -bool MaximalStaticExpanderWrapperPass::runOnScop(Scop &S) { -  // Get the ORE from OptimizationRemarkEmitterWrapperPass. -  OptimizationRemarkEmitter *ORE = -      &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(); +void polly::runMaximalStaticExpansion(Scop &S, DependenceAnalysis::Result &DI) { +  OptimizationRemarkEmitter ORE(&S.getFunction()); -  // Get the RAW Dependences. -  auto &DI = getAnalysis<DependenceInfo>();    auto &D = DI.getDependences(Dependences::AL_Reference);    std::unique_ptr<MaximalStaticExpansionImpl> Impl = -      runMaximalStaticExpansion(S, *ORE, D); +      runMaximalStaticExpansionImpl(S, ORE, D); -  return false; -} - -void MaximalStaticExpanderWrapperPass::printScop(raw_ostream &OS, -                                                 Scop &S) const { -  S.print(OS, false); -} - -void MaximalStaticExpanderWrapperPass::getAnalysisUsage( -    AnalysisUsage &AU) const { -  ScopPass::getAnalysisUsage(AU); -  AU.addRequired<DependenceInfo>(); -  AU.addRequired<OptimizationRemarkEmitterWrapperPass>(); -} +  if (PollyPrintMSE) { +    outs() +        << "Printing analysis 'Polly - Maximal static expansion of SCoP' for " +           "region: '" +        << S.getName() << "' in function '" << S.getFunction().getName() +        << "':\n"; -Pass *polly::createMaximalStaticExpansionPass() { -  return new MaximalStaticExpanderWrapperPass(); +    if (Impl) { +      outs() << "MSE result:\n"; +      Impl->print(llvm::outs()); +    } +  }  } - -INITIALIZE_PASS_BEGIN(MaximalStaticExpanderWrapperPass, "polly-mse", -                      "Polly - Maximal static expansion of SCoP", false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo); -INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass); -INITIALIZE_PASS_END(MaximalStaticExpanderWrapperPass, "polly-mse", -                    "Polly - Maximal static expansion of SCoP", false, false) diff --git a/polly/lib/Transform/ScheduleOptimizer.cpp b/polly/lib/Transform/ScheduleOptimizer.cpp index 070700a..6acdd68 100644 --- a/polly/lib/Transform/ScheduleOptimizer.cpp +++ b/polly/lib/Transform/ScheduleOptimizer.cpp @@ -57,7 +57,6 @@  #include "llvm/ADT/Sequence.h"  #include "llvm/ADT/Statistic.h"  #include "llvm/Analysis/OptimizationRemarkEmitter.h" -#include "llvm/InitializePasses.h"  #include "llvm/Support/CommandLine.h"  #include "isl/options.h" @@ -198,6 +197,10 @@ static cl::opt<bool> OptimizedScops(               "transformations is applied on the schedule tree"),      cl::cat(PollyCategory)); +static cl::opt<bool> PollyPrintOptIsl("polly-print-opt-isl", +                                      cl::desc("A polly pass"), +                                      cl::cat(PollyCategory)); +  STATISTIC(ScopsProcessed, "Number of scops processed");  STATISTIC(ScopsRescheduled, "Number of scops rescheduled");  STATISTIC(ScopsOptimized, "Number of scops optimized"); @@ -237,6 +240,7 @@ struct OptimizerAdditionalInfoTy {    bool Postopts;    bool Prevect;    bool &DepsChanged; +  IslMaxOperationsGuard &MaxOpGuard;  };  class ScheduleTreeOptimizer final { @@ -381,6 +385,8 @@ private:  isl::schedule_node  ScheduleTreeOptimizer::isolateFullPartialTiles(isl::schedule_node Node,                                                 int VectorWidth) { +  if (Node.is_null()) +    return {};    assert(isl_schedule_node_get_type(Node.get()) == isl_schedule_node_band);    Node = Node.child(0).child(0);    isl::union_map SchedRelUMap = Node.get_prefix_schedule_relation(); @@ -391,6 +397,8 @@ ScheduleTreeOptimizer::isolateFullPartialTiles(isl::schedule_node Node,    isl::union_set IsolateOption = getIsolateOptions(IsolateDomain, 1);    Node = Node.parent().parent();    isl::union_set Options = IsolateOption.unite(AtomicOption); +  if (Node.is_null()) +    return {};    isl::schedule_node_band Result =        Node.as<isl::schedule_node_band>().set_ast_build_options(Options);    return Result; @@ -411,9 +419,13 @@ struct InsertSimdMarkers final : ScheduleNodeRewriter<InsertSimdMarkers> {  isl::schedule_node ScheduleTreeOptimizer::prevectSchedBand(      isl::schedule_node Node, unsigned DimToVectorize, int VectorWidth) { +  if (Node.is_null()) +    return {};    assert(isl_schedule_node_get_type(Node.get()) == isl_schedule_node_band);    auto Space = isl::manage(isl_schedule_node_band_get_space(Node.get())); +  if (Space.is_null()) +    return {};    unsigned ScheduleDimensions = unsignedFromIslSize(Space.dim(isl::dim::set));    assert(DimToVectorize < ScheduleDimensions); @@ -439,12 +451,15 @@ isl::schedule_node ScheduleTreeOptimizer::prevectSchedBand(    // Sink the inner loop into the smallest possible statements to make them    // represent a single vector instruction if possible.    Node = isl::manage(isl_schedule_node_band_sink(Node.release())); +  if (Node.is_null()) +    return {};    // Add SIMD markers to those vector statements.    InsertSimdMarkers SimdMarkerInserter;    Node = SimdMarkerInserter.visit(Node); -  PrevectOpts++; +  if (!Node.is_null()) +    PrevectOpts++;    return Node.parent();  } @@ -535,6 +550,8 @@ ScheduleTreeOptimizer::applyTileBandOpt(isl::schedule_node Node) {  isl::schedule_node  ScheduleTreeOptimizer::applyPrevectBandOpt(isl::schedule_node Node) {    auto Space = isl::manage(isl_schedule_node_band_get_space(Node.get())); +  if (Space.is_null()) +    return {};    int Dims = unsignedFromIslSize(Space.dim(isl::dim::set));    for (int i = Dims - 1; i >= 0; i--) @@ -572,9 +589,14 @@ ScheduleTreeOptimizer::optimizeBand(__isl_take isl_schedule_node *NodeArg,      Node = applyTileBandOpt(Node);    if (OAI->Prevect) { +    IslQuotaScope MaxScope = OAI->MaxOpGuard.enter(); +      // FIXME: Prevectorization requirements are different from those checked by      // isTileableBandNode.      Node = applyPrevectBandOpt(Node); + +    if (OAI->MaxOpGuard.hasQuotaExceeded() || Node.is_null()) +      return (isl::schedule_node()).release();    }    return Node.release(); @@ -619,34 +641,6 @@ bool ScheduleTreeOptimizer::isProfitableSchedule(Scop &S,    return changed;  } -class IslScheduleOptimizerWrapperPass final : public ScopPass { -public: -  static char ID; - -  explicit IslScheduleOptimizerWrapperPass() : ScopPass(ID) {} - -  /// Optimize the schedule of the SCoP @p S. -  bool runOnScop(Scop &S) override; - -  /// Print the new schedule for the SCoP @p S. -  void printScop(raw_ostream &OS, Scop &S) const override; - -  /// Register all analyses and transformation required. -  void getAnalysisUsage(AnalysisUsage &AU) const override; - -  /// Release the internal memory. -  void releaseMemory() override { -    LastSchedule = {}; -    IslCtx.reset(); -  } - -private: -  std::shared_ptr<isl_ctx> IslCtx; -  isl::schedule LastSchedule; -}; - -char IslScheduleOptimizerWrapperPass::ID = 0; -  #ifndef NDEBUG  static void printSchedule(llvm::raw_ostream &OS, const isl::schedule &Schedule,                            StringRef Desc) { @@ -714,7 +708,7 @@ static void walkScheduleTreeForStatistics(isl::schedule Schedule, int Version) {        &Version);  } -static void runIslScheduleOptimizer( +static void runIslScheduleOptimizerImpl(      Scop &S,      function_ref<const Dependences &(Dependences::AnalysisLevel)> GetDeps,      TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE, @@ -771,6 +765,10 @@ static void runIslScheduleOptimizer(      return;    } +  isl_ctx *Ctx = S.getIslCtx().get(); +  IslMaxOperationsGuard MaxOpGuard(Ctx, ScheduleComputeOut, +                                   /*AutoEnter=*/false); +    // Apply ISL's algorithm only if not overridden by the user. Note that    // post-rescheduling optimizations (tiling, pattern-based, prevectorization)    // rely on the coincidence/permutable annotations on schedule tree bands that @@ -853,8 +851,6 @@ static void runIslScheduleOptimizer(        IslOuterCoincidence = 0;      } -    isl_ctx *Ctx = S.getIslCtx().get(); -      isl_options_set_schedule_outer_coincidence(Ctx, IslOuterCoincidence);      isl_options_set_schedule_maximize_band_depth(Ctx, IslMaximizeBands);      isl_options_set_schedule_max_constant_term(Ctx, MaxConstantTerm); @@ -870,28 +866,20 @@ static void runIslScheduleOptimizer(      SC = SC.set_coincidence(Validity);      { -      IslMaxOperationsGuard MaxOpGuard(Ctx, ScheduleComputeOut); +      IslQuotaScope MaxOpScope = MaxOpGuard.enter();        Schedule = SC.compute_schedule(); - -      if (MaxOpGuard.hasQuotaExceeded()) -        POLLY_DEBUG( -            dbgs() << "Schedule optimizer calculation exceeds ISL quota\n");      }      isl_options_set_on_error(Ctx, OnErrorStatus); -    ScopsRescheduled++; +    if (!Schedule.is_null()) +      ScopsRescheduled++;      POLLY_DEBUG(printSchedule(dbgs(), Schedule, "After rescheduling"));    }    walkScheduleTreeForStatistics(Schedule, 1); -  // In cases the scheduler is not able to optimize the code, we just do not -  // touch the schedule. -  if (Schedule.is_null()) -    return; - -  if (GreedyFusion) { +  if (GreedyFusion && !Schedule.is_null()) {      isl::union_map Validity = D.getDependences(          Dependences::TYPE_RAW | Dependences::TYPE_WAR | Dependences::TYPE_WAW);      Schedule = applyGreedyFusion(Schedule, Validity); @@ -905,14 +893,20 @@ static void runIslScheduleOptimizer(        /*PatternOpts=*/!HasUserTransformation && PMBasedOpts,        /*Postopts=*/!HasUserTransformation && EnablePostopts,        /*Prevect=*/PollyVectorizerChoice != VECTORIZER_NONE, -      DepsChanged}; -  if (OAI.PatternOpts || OAI.Postopts || OAI.Prevect) { +      DepsChanged, +      MaxOpGuard}; +  if (!Schedule.is_null() && (OAI.PatternOpts || OAI.Postopts || OAI.Prevect)) {      Schedule = ScheduleTreeOptimizer::optimizeSchedule(Schedule, &OAI);      Schedule = hoistExtensionNodes(Schedule);      POLLY_DEBUG(printSchedule(dbgs(), Schedule, "After post-optimizations"));      walkScheduleTreeForStatistics(Schedule, 2);    } +  if (MaxOpGuard.hasQuotaExceeded()) { +    POLLY_DEBUG(dbgs() << "Schedule optimizer calculation exceeds ISL quota\n"); +    return; +  } +    // Skip profitability check if user transformation(s) have been applied.    if (!HasUserTransformation &&        !ScheduleTreeOptimizer::isProfitableSchedule(S, Schedule)) @@ -931,30 +925,6 @@ static void runIslScheduleOptimizer(      errs() << S;  } -bool IslScheduleOptimizerWrapperPass::runOnScop(Scop &S) { -  releaseMemory(); - -  Function &F = S.getFunction(); -  IslCtx = S.getSharedIslCtx(); - -  auto getDependences = -      [this](Dependences::AnalysisLevel) -> const Dependences & { -    return getAnalysis<DependenceInfo>().getDependences( -        Dependences::AL_Statement); -  }; -  OptimizationRemarkEmitter &ORE = -      getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE(); -  TargetTransformInfo *TTI = -      &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F); - -  bool DepsChanged = false; -  runIslScheduleOptimizer(S, getDependences, TTI, &ORE, LastSchedule, -                          DepsChanged); -  if (DepsChanged) -    getAnalysis<DependenceInfo>().abandonDependences(); -  return false; -} -  static void runScheduleOptimizerPrinter(raw_ostream &OS,                                          isl::schedule LastSchedule) {    isl_printer *p; @@ -978,36 +948,8 @@ static void runScheduleOptimizerPrinter(raw_ostream &OS,    free(ScheduleStr);  } -void IslScheduleOptimizerWrapperPass::printScop(raw_ostream &OS, Scop &) const { -  runScheduleOptimizerPrinter(OS, LastSchedule); -} - -void IslScheduleOptimizerWrapperPass::getAnalysisUsage( -    AnalysisUsage &AU) const { -  ScopPass::getAnalysisUsage(AU); -  AU.addRequired<DependenceInfo>(); -  AU.addRequired<TargetTransformInfoWrapperPass>(); -  AU.addRequired<OptimizationRemarkEmitterWrapperPass>(); - -  AU.addPreserved<DependenceInfo>(); -  AU.addPreserved<OptimizationRemarkEmitterWrapperPass>(); -} -  } // namespace -Pass *polly::createIslScheduleOptimizerWrapperPass() { -  return new IslScheduleOptimizerWrapperPass(); -} - -INITIALIZE_PASS_BEGIN(IslScheduleOptimizerWrapperPass, "polly-opt-isl", -                      "Polly - Optimize schedule of SCoP", false, false); -INITIALIZE_PASS_DEPENDENCY(DependenceInfo); -INITIALIZE_PASS_DEPENDENCY(ScopInfoRegionPass); -INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass); -INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass); -INITIALIZE_PASS_END(IslScheduleOptimizerWrapperPass, "polly-opt-isl", -                    "Polly - Optimize schedule of SCoP", false, false) -  static llvm::PreservedAnalyses  runIslScheduleOptimizerUsingNPM(Scop &S, ScopAnalysisManager &SAM,                                  ScopStandardAnalysisResults &SAR, SPMUpdater &U, @@ -1020,7 +962,7 @@ runIslScheduleOptimizerUsingNPM(Scop &S, ScopAnalysisManager &SAM,    TargetTransformInfo *TTI = &SAR.TTI;    isl::schedule LastSchedule;    bool DepsChanged = false; -  runIslScheduleOptimizer(S, GetDeps, TTI, &ORE, LastSchedule, DepsChanged); +  runIslScheduleOptimizerImpl(S, GetDeps, TTI, &ORE, LastSchedule, DepsChanged);    if (DepsChanged)      Deps.abandonDependences(); @@ -1046,52 +988,23 @@ IslScheduleOptimizerPrinterPass::run(Scop &S, ScopAnalysisManager &SAM,    return runIslScheduleOptimizerUsingNPM(S, SAM, SAR, U, &OS);  } -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from IslScheduleOptimizerWrapperPass. -class IslScheduleOptimizerPrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  IslScheduleOptimizerPrinterLegacyPass() -      : IslScheduleOptimizerPrinterLegacyPass(outs()) {} -  explicit IslScheduleOptimizerPrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    IslScheduleOptimizerWrapperPass &P = -        getAnalysis<IslScheduleOptimizerWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } +void polly::runIslScheduleOptimizer(Scop &S, TargetTransformInfo *TTI, +                                    DependenceAnalysis::Result &Deps) { +  auto GetDeps = [&Deps](Dependences::AnalysisLevel) -> const Dependences & { +    return Deps.getDependences(Dependences::AL_Statement); +  }; +  OptimizationRemarkEmitter ORE(&S.getFunction()); +  isl::schedule LastSchedule; +  bool DepsChanged = false; +  runIslScheduleOptimizerImpl(S, GetDeps, TTI, &ORE, LastSchedule, DepsChanged); +  if (DepsChanged) +    Deps.abandonDependences(); -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<IslScheduleOptimizerWrapperPass>(); -    AU.setPreservesAll(); +  if (PollyPrintOptIsl) { +    outs() +        << "Printing analysis 'Polly - Optimize schedule of SCoP' for region: '" +        << S.getName() << "' in function '" << S.getFunction().getName() +        << "':\n"; +    runScheduleOptimizerPrinter(outs(), LastSchedule);    } - -private: -  llvm::raw_ostream &OS; -}; - -char IslScheduleOptimizerPrinterLegacyPass::ID = 0; -} // namespace - -Pass *polly::createIslScheduleOptimizerPrinterLegacyPass(raw_ostream &OS) { -  return new IslScheduleOptimizerPrinterLegacyPass(OS);  } - -INITIALIZE_PASS_BEGIN(IslScheduleOptimizerPrinterLegacyPass, -                      "polly-print-opt-isl", -                      "Polly - Print optimizer schedule of SCoP", false, false); -INITIALIZE_PASS_DEPENDENCY(IslScheduleOptimizerWrapperPass) -INITIALIZE_PASS_END(IslScheduleOptimizerPrinterLegacyPass, -                    "polly-print-opt-isl", -                    "Polly - Print optimizer schedule of SCoP", false, false) diff --git a/polly/lib/Transform/ScheduleTreeTransform.cpp b/polly/lib/Transform/ScheduleTreeTransform.cpp index 3f36300..c95c558 100644 --- a/polly/lib/Transform/ScheduleTreeTransform.cpp +++ b/polly/lib/Transform/ScheduleTreeTransform.cpp @@ -972,6 +972,9 @@ BandAttr *polly::getBandAttr(isl::schedule_node MarkOrBand) {  }  isl::schedule polly::hoistExtensionNodes(isl::schedule Sched) { +  if (Sched.is_null()) +    return {}; +    // If there is no extension node in the first place, return the original    // schedule tree.    if (!containsExtensionNode(Sched)) @@ -1126,6 +1129,8 @@ isl::set polly::getPartialTilePrefixes(isl::set ScheduleRange,  isl::union_set polly::getIsolateOptions(isl::set IsolateDomain,                                          unsigned OutDimsNum) { +  if (IsolateDomain.is_null()) +    return {};    unsigned Dims = unsignedFromIslSize(IsolateDomain.tuple_dim());    assert(OutDimsNum <= Dims &&           "The isl::set IsolateDomain is used to describe the range of schedule " diff --git a/polly/lib/Transform/ScopInliner.cpp b/polly/lib/Transform/ScopInliner.cpp index c04ba34..8e7a0de 100644 --- a/polly/lib/Transform/ScopInliner.cpp +++ b/polly/lib/Transform/ScopInliner.cpp @@ -95,53 +95,7 @@ template <typename SCC_t> bool runScopInlinerImpl(Function *F, SCC_t &SCC) {    return Changed;  } - -class ScopInlinerWrapperPass final : public CallGraphSCCPass { -  using llvm::Pass::doInitialization; - -public: -  static char ID; - -  ScopInlinerWrapperPass() : CallGraphSCCPass(ID) {} - -  bool doInitialization(CallGraph &CG) override { -    if (!polly::PollyAllowFullFunction) { -      report_fatal_error( -          "Aborting from ScopInliner because it only makes sense to run with " -          "-polly-allow-full-function. " -          "The heurtistic for ScopInliner checks that the full function is a " -          "Scop, which happens if and only if polly-allow-full-function is " -          " enabled. " -          " If not, the entry block is not included in the Scop"); -    } -    return true; -  } - -  bool runOnSCC(CallGraphSCC &SCC) override { -    Function *F = (*SCC.begin())->getFunction(); -    return runScopInlinerImpl(F, SCC); -  }; - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    CallGraphSCCPass::getAnalysisUsage(AU); -  } -};  } // namespace -char ScopInlinerWrapperPass::ID; - -Pass *polly::createScopInlinerWrapperPass() { -  ScopInlinerWrapperPass *pass = new ScopInlinerWrapperPass(); -  return pass; -} - -INITIALIZE_PASS_BEGIN( -    ScopInlinerWrapperPass, "polly-scop-inliner", -    "inline functions based on how much of the function is a scop.", false, -    false) -INITIALIZE_PASS_END( -    ScopInlinerWrapperPass, "polly-scop-inliner", -    "inline functions based on how much of the function is a scop.", false, -    false)  polly::ScopInlinerPass::ScopInlinerPass() {    if (!polly::PollyAllowFullFunction) { diff --git a/polly/lib/Transform/Simplify.cpp b/polly/lib/Transform/Simplify.cpp index 75e91cd..cf0f8c5 100644 --- a/polly/lib/Transform/Simplify.cpp +++ b/polly/lib/Transform/Simplify.cpp @@ -11,6 +11,7 @@  //===----------------------------------------------------------------------===//  #include "polly/Simplify.h" +#include "polly/Options.h"  #include "polly/ScopInfo.h"  #include "polly/ScopPass.h"  #include "polly/Support/GICHelper.h" @@ -18,7 +19,6 @@  #include "polly/Support/ISLTools.h"  #include "polly/Support/VirtualInstruction.h"  #include "llvm/ADT/Statistic.h" -#include "llvm/InitializePasses.h"  #include "llvm/Support/Debug.h"  #include <optional> @@ -30,6 +30,11 @@ using namespace polly;  namespace { +static cl::opt<bool> +    PollyPrintSimplify("polly-print-simplify", +                       cl::desc("Polly - Print Simplify actions"), +                       cl::cat(PollyCategory)); +  #define TWO_STATISTICS(VARNAME, DESC)                                          \    static llvm::Statistic VARNAME[2] = {                                        \        {DEBUG_TYPE, #VARNAME "0", DESC " (first)"},                             \ @@ -756,39 +761,6 @@ void SimplifyImpl::printScop(raw_ostream &OS, Scop &S) const {    printAccesses(OS);  } -class SimplifyWrapperPass final : public ScopPass { -public: -  static char ID; -  int CallNo; -  std::optional<SimplifyImpl> Impl; - -  explicit SimplifyWrapperPass(int CallNo = 0) : ScopPass(ID), CallNo(CallNo) {} - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.addRequiredTransitive<ScopInfoRegionPass>(); -    AU.addRequired<LoopInfoWrapperPass>(); -    AU.setPreservesAll(); -  } - -  bool runOnScop(Scop &S) override { -    LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); - -    Impl.emplace(CallNo); -    Impl->run(S, LI); - -    return false; -  } - -  void printScop(raw_ostream &OS, Scop &S) const override { -    if (Impl) -      Impl->printScop(OS, S); -  } - -  void releaseMemory() override { Impl.reset(); } -}; - -char SimplifyWrapperPass::ID; -  static llvm::PreservedAnalyses  runSimplifyUsingNPM(Scop &S, ScopAnalysisManager &SAM,                      ScopStandardAnalysisResults &SAR, SPMUpdater &U, int CallNo, @@ -843,58 +815,15 @@ SmallVector<MemoryAccess *, 32> polly::getAccessesInOrder(ScopStmt &Stmt) {    return Accesses;  } -Pass *polly::createSimplifyWrapperPass(int CallNo) { -  return new SimplifyWrapperPass(CallNo); -} - -INITIALIZE_PASS_BEGIN(SimplifyWrapperPass, "polly-simplify", "Polly - Simplify", -                      false, false) -INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) -INITIALIZE_PASS_END(SimplifyWrapperPass, "polly-simplify", "Polly - Simplify", -                    false, false) - -//===----------------------------------------------------------------------===// - -namespace { -/// Print result from SimplifyWrapperPass. -class SimplifyPrinterLegacyPass final : public ScopPass { -public: -  static char ID; - -  SimplifyPrinterLegacyPass() : SimplifyPrinterLegacyPass(outs()) {} -  explicit SimplifyPrinterLegacyPass(llvm::raw_ostream &OS) -      : ScopPass(ID), OS(OS) {} - -  bool runOnScop(Scop &S) override { -    SimplifyWrapperPass &P = getAnalysis<SimplifyWrapperPass>(); - -    OS << "Printing analysis '" << P.getPassName() << "' for region: '" -       << S.getRegion().getNameStr() << "' in function '" -       << S.getFunction().getName() << "':\n"; -    P.printScop(OS, S); - -    return false; -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    ScopPass::getAnalysisUsage(AU); -    AU.addRequired<SimplifyWrapperPass>(); -    AU.setPreservesAll(); +bool polly::runSimplify(Scop &S, int CallNo) { +  SimplifyImpl Impl(CallNo); +  Impl.run(S, S.getLI()); +  if (PollyPrintSimplify) { +    outs() << "Printing analysis 'Polly - Simplify' for region: '" +           << S.getName() << "' in function '" << S.getFunction().getName() +           << "':\n"; +    Impl.printScop(outs(), S);    } -private: -  llvm::raw_ostream &OS; -}; - -char SimplifyPrinterLegacyPass::ID = 0; -} // namespace - -Pass *polly::createSimplifyPrinterLegacyPass(raw_ostream &OS) { -  return new SimplifyPrinterLegacyPass(OS); +  return Impl.isModified();  } - -INITIALIZE_PASS_BEGIN(SimplifyPrinterLegacyPass, "polly-print-simplify", -                      "Polly - Print Simplify actions", false, false) -INITIALIZE_PASS_DEPENDENCY(SimplifyWrapperPass) -INITIALIZE_PASS_END(SimplifyPrinterLegacyPass, "polly-print-simplify", -                    "Polly - Print Simplify actions", false, false) diff --git a/polly/test/CodeGen/20100617.ll b/polly/test/CodeGen/20100617.ll index 7229a6e..7de1b84 100644 --- a/polly/test/CodeGen/20100617.ll +++ b/polly/test/CodeGen/20100617.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @init_array() nounwind { diff --git a/polly/test/CodeGen/20100622.ll b/polly/test/CodeGen/20100622.ll index bed7377..13a6159 100644 --- a/polly/test/CodeGen/20100622.ll +++ b/polly/test/CodeGen/20100622.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s | not FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s | not FileCheck %s  target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" diff --git a/polly/test/CodeGen/20100707.ll b/polly/test/CodeGen/20100707.ll index ee0422e..6a4763d 100644 --- a/polly/test/CodeGen/20100707.ll +++ b/polly/test/CodeGen/20100707.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @clause_SetSplitField(i32 %Length) nounwind inlinehint { diff --git a/polly/test/CodeGen/20100707_2.ll b/polly/test/CodeGen/20100707_2.ll index a4cd76a..648a064 100644 --- a/polly/test/CodeGen/20100707_2.ll +++ b/polly/test/CodeGen/20100707_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  @win193 = external global [4 x [36 x double]], align 32 ; <ptr> [#uses=3] diff --git a/polly/test/CodeGen/20100708.ll b/polly/test/CodeGen/20100708.ll index 9080451..52153d7 100644 --- a/polly/test/CodeGen/20100708.ll +++ b/polly/test/CodeGen/20100708.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define fastcc void @execute() nounwind { diff --git a/polly/test/CodeGen/20100708_2.ll b/polly/test/CodeGen/20100708_2.ll index 51dc9d3..075a494 100644 --- a/polly/test/CodeGen/20100708_2.ll +++ b/polly/test/CodeGen/20100708_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @init_array() nounwind { diff --git a/polly/test/CodeGen/20100713.ll b/polly/test/CodeGen/20100713.ll index a836795..0b0ed73 100644 --- a/polly/test/CodeGen/20100713.ll +++ b/polly/test/CodeGen/20100713.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @fft_float(i32 %NumSamples) nounwind { diff --git a/polly/test/CodeGen/20100713_2.ll b/polly/test/CodeGen/20100713_2.ll index 28b984b..5681f34 100644 --- a/polly/test/CodeGen/20100713_2.ll +++ b/polly/test/CodeGen/20100713_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define hidden void @luaD_callhook() nounwind { diff --git a/polly/test/CodeGen/20100717.ll b/polly/test/CodeGen/20100717.ll index 51c453c..97ed151 100644 --- a/polly/test/CodeGen/20100717.ll +++ b/polly/test/CodeGen/20100717.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly  -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @matrixTranspose(ptr %A) nounwind { diff --git a/polly/test/CodeGen/20100718-DomInfo-2.ll b/polly/test/CodeGen/20100718-DomInfo-2.ll index fdac75f..cbee80e 100644 --- a/polly/test/CodeGen/20100718-DomInfo-2.ll +++ b/polly/test/CodeGen/20100718-DomInfo-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -verify-dom-info -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -verify-dom-info -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @getNonAffNeighbour() nounwind { diff --git a/polly/test/CodeGen/20100718-DomInfo.ll b/polly/test/CodeGen/20100718-DomInfo.ll index da68eb0..e6fcaf6 100644 --- a/polly/test/CodeGen/20100718-DomInfo.ll +++ b/polly/test/CodeGen/20100718-DomInfo.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -verify-dom-info -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -verify-dom-info -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @intrapred_luma_16x16(i32 %predmode) nounwind { diff --git a/polly/test/CodeGen/20100720-MultipleConditions.ll b/polly/test/CodeGen/20100720-MultipleConditions.ll index 3dece4ef..66c9e2b 100644 --- a/polly/test/CodeGen/20100720-MultipleConditions.ll +++ b/polly/test/CodeGen/20100720-MultipleConditions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s  ;int bar1();  ;int bar2(); diff --git a/polly/test/CodeGen/20100809-IndependentBlock.ll b/polly/test/CodeGen/20100809-IndependentBlock.ll index f45b654..cc3a508 100644 --- a/polly/test/CodeGen/20100809-IndependentBlock.ll +++ b/polly/test/CodeGen/20100809-IndependentBlock.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @cfft2(ptr %x) nounwind {  entry: diff --git a/polly/test/CodeGen/20100811-ScalarDependencyBetweenBrAndCnd.ll b/polly/test/CodeGen/20100811-ScalarDependencyBetweenBrAndCnd.ll index 82da9d2..240c2a4 100644 --- a/polly/test/CodeGen/20100811-ScalarDependencyBetweenBrAndCnd.ll +++ b/polly/test/CodeGen/20100811-ScalarDependencyBetweenBrAndCnd.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  target datalayout =  "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/CodeGen/20101030-Overflow.ll b/polly/test/CodeGen/20101030-Overflow.ll index fecdb9d..c199f75 100644 --- a/polly/test/CodeGen/20101030-Overflow.ll +++ b/polly/test/CodeGen/20101030-Overflow.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @compdecomp() nounwind { diff --git a/polly/test/CodeGen/20101103-Overflow3.ll b/polly/test/CodeGen/20101103-Overflow3.ll index f1503e2..e8b425f 100644 --- a/polly/test/CodeGen/20101103-Overflow3.ll +++ b/polly/test/CodeGen/20101103-Overflow3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @Reflection_coefficients(ptr %r) nounwind {  bb20: diff --git a/polly/test/CodeGen/20101103-signmissmatch.ll b/polly/test/CodeGen/20101103-signmissmatch.ll index 3d0c929..0295ee0 100644 --- a/polly/test/CodeGen/20101103-signmissmatch.ll +++ b/polly/test/CodeGen/20101103-signmissmatch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @CleanNet() nounwind { diff --git a/polly/test/CodeGen/20110226-Ignore-Dead-Code.ll b/polly/test/CodeGen/20110226-Ignore-Dead-Code.ll index 0e62e67..6913dee 100644 --- a/polly/test/CodeGen/20110226-Ignore-Dead-Code.ll +++ b/polly/test/CodeGen/20110226-Ignore-Dead-Code.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @main() nounwind { diff --git a/polly/test/CodeGen/20110226-PHI-Node-removed.ll b/polly/test/CodeGen/20110226-PHI-Node-removed.ll index 32b018f..a39fced 100644 --- a/polly/test/CodeGen/20110226-PHI-Node-removed.ll +++ b/polly/test/CodeGen/20110226-PHI-Node-removed.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/CodeGen/20120316-InvalidCast.ll b/polly/test/CodeGen/20120316-InvalidCast.ll index b87a3dc..a7f709b 100644 --- a/polly/test/CodeGen/20120316-InvalidCast.ll +++ b/polly/test/CodeGen/20120316-InvalidCast.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ; CHECK: polly.start diff --git a/polly/test/CodeGen/20120403-RHS-type-mismatch.ll b/polly/test/CodeGen/20120403-RHS-type-mismatch.ll index dac78bf..554384c 100644 --- a/polly/test/CodeGen/20120403-RHS-type-mismatch.ll +++ b/polly/test/CodeGen/20120403-RHS-type-mismatch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  ; We just check that this compilation does not crash. diff --git a/polly/test/CodeGen/20130221.ll b/polly/test/CodeGen/20130221.ll index 5728a76..101930e1 100644 --- a/polly/test/CodeGen/20130221.ll +++ b/polly/test/CodeGen/20130221.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  define void @list_sequence(ptr %A) { diff --git a/polly/test/CodeGen/20150328-SCEVExpanderIntroducesNewIV.ll b/polly/test/CodeGen/20150328-SCEVExpanderIntroducesNewIV.ll index cafd68e..7ad8cbf 100644 --- a/polly/test/CodeGen/20150328-SCEVExpanderIntroducesNewIV.ll +++ b/polly/test/CodeGen/20150328-SCEVExpanderIntroducesNewIV.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/Intrinsics/llvm-expect.ll b/polly/test/CodeGen/Intrinsics/llvm-expect.ll index 47fd4f07..ba4ea15 100644 --- a/polly/test/CodeGen/Intrinsics/llvm-expect.ll +++ b/polly/test/CodeGen/Intrinsics/llvm-expect.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; Check that we generate code without crashing.  ; diff --git a/polly/test/CodeGen/LoopParallelMD/do_not_mutate_debug_info.ll b/polly/test/CodeGen/LoopParallelMD/do_not_mutate_debug_info.ll index eb7de01ba..a92917f 100644 --- a/polly/test/CodeGen/LoopParallelMD/do_not_mutate_debug_info.ll +++ b/polly/test/CodeGen/LoopParallelMD/do_not_mutate_debug_info.ll @@ -1,6 +1,6 @@  ; This test checks that we do not accidentally mutate the debug info when  ; inserting loop parallel metadata. -; RUN: opt %loadNPMPolly < %s  -S -polly -passes=polly-codegen -polly-ast-detect-parallel | FileCheck %s +; RUN: opt %loadNPMPolly -S -polly '-passes=polly<no-default-opts>' -polly-ast-detect-parallel < %s | FileCheck %s  ; CHECK-NOT: !7 = !{!7}  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/LoopParallelMD/loop_nest_param_parallel.ll b/polly/test/CodeGen/LoopParallelMD/loop_nest_param_parallel.ll index 9bb086f..0d94700 100644 --- a/polly/test/CodeGen/LoopParallelMD/loop_nest_param_parallel.ll +++ b/polly/test/CodeGen/LoopParallelMD/loop_nest_param_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-ast-detect-parallel -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-ast-detect-parallel -S < %s | FileCheck %s  ;  ; Check that we mark multiple parallel loops correctly including the memory instructions.  ; diff --git a/polly/test/CodeGen/LoopParallelMD/single_loop_param_parallel.ll b/polly/test/CodeGen/LoopParallelMD/single_loop_param_parallel.ll index 442600c..1293cd9 100644 --- a/polly/test/CodeGen/LoopParallelMD/single_loop_param_parallel.ll +++ b/polly/test/CodeGen/LoopParallelMD/single_loop_param_parallel.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=SEQUENTIAL -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-ast-detect-parallel -S < %s | FileCheck %s -check-prefix=PARALLEL +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=SEQUENTIAL +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-ast-detect-parallel -S < %s | FileCheck %s -check-prefix=PARALLEL  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; This is a trivially parallel loop. We just use it to ensure that we actually diff --git a/polly/test/CodeGen/MemAccess/bad_alignment.ll b/polly/test/CodeGen/MemAccess/bad_alignment.ll index 82fff27..be1c649 100644 --- a/polly/test/CodeGen/MemAccess/bad_alignment.ll +++ b/polly/test/CodeGen/MemAccess/bad_alignment.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly -passes=polly-import-jscop -disable-output 2>&1 < %s | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -disable-output 2>&1 < %s | FileCheck %s  ;  ; Check that we do not allow to access elements not accessed before because the  ; alignment information would become invalid. diff --git a/polly/test/CodeGen/MemAccess/codegen_address_space.ll b/polly/test/CodeGen/MemAccess/codegen_address_space.ll index 3360e10..283c8fb 100644 --- a/polly/test/CodeGen/MemAccess/codegen_address_space.ll +++ b/polly/test/CodeGen/MemAccess/codegen_address_space.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed < %s -S | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;int A[100];  ; diff --git a/polly/test/CodeGen/MemAccess/codegen_constant_offset.ll b/polly/test/CodeGen/MemAccess/codegen_constant_offset.ll index 0563ca8..ce44f2d 100644 --- a/polly/test/CodeGen/MemAccess/codegen_constant_offset.ll +++ b/polly/test/CodeGen/MemAccess/codegen_constant_offset.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed < %s -S | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;int A[100];  ; diff --git a/polly/test/CodeGen/MemAccess/codegen_simple.ll b/polly/test/CodeGen/MemAccess/codegen_simple.ll index ee0187f..ab1dca5 100644 --- a/polly/test/CodeGen/MemAccess/codegen_simple.ll +++ b/polly/test/CodeGen/MemAccess/codegen_simple.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed < %s -S | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;int A[100];  ; diff --git a/polly/test/CodeGen/MemAccess/codegen_simple_float.ll b/polly/test/CodeGen/MemAccess/codegen_simple_float.ll index 6970565..72f9c2ce 100644 --- a/polly/test/CodeGen/MemAccess/codegen_simple_float.ll +++ b/polly/test/CodeGen/MemAccess/codegen_simple_float.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed < %s -S | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ;float A[100];  ; diff --git a/polly/test/CodeGen/MemAccess/codegen_simple_md.ll b/polly/test/CodeGen/MemAccess/codegen_simple_md.ll index f0896e2..a6d9969 100644 --- a/polly/test/CodeGen/MemAccess/codegen_simple_md.ll +++ b/polly/test/CodeGen/MemAccess/codegen_simple_md.ll @@ -1,5 +1,5 @@ -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed+withconst < %s -S | FileCheck -check-prefix=WITHCONST %s -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed+withoutconst < %s -S | FileCheck -check-prefix=WITHOUTCONST %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed+withconst -S < %s | FileCheck -check-prefix=WITHCONST %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed+withoutconst -S < %s | FileCheck -check-prefix=WITHOUTCONST %s  ;int A[1040];  ; diff --git a/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll b/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll index 99fc369..568b0ff 100644 --- a/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll +++ b/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll @@ -1,5 +1,5 @@ -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed+withconst < %s -S | FileCheck -check-prefix=WITHCONST %s -;RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed+withoutconst < %s -S | FileCheck -check-prefix=WITHOUTCONST %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed+withconst -S < %s | FileCheck -check-prefix=WITHCONST %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed+withoutconst -S < %s | FileCheck -check-prefix=WITHOUTCONST %s  ;  ;float A[1040];  ; diff --git a/polly/test/CodeGen/MemAccess/create_arrays.ll b/polly/test/CodeGen/MemAccess/create_arrays.ll index 40ae8d6..8443e0f 100644 --- a/polly/test/CodeGen/MemAccess/create_arrays.ll +++ b/polly/test/CodeGen/MemAccess/create_arrays.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadPolly -polly-print-scops -polly-print-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-codegen -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly -polly-print-scops '-passes=polly-custom<import-jscop>' -polly-print-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ;  for (i = 0; i < _PB_NI; i++)  ;    for (j = 0; j < _PB_NJ; j++) diff --git a/polly/test/CodeGen/MemAccess/create_arrays_heap.ll b/polly/test/CodeGen/MemAccess/create_arrays_heap.ll index 1202d21..9c95378 100644 --- a/polly/test/CodeGen/MemAccess/create_arrays_heap.ll +++ b/polly/test/CodeGen/MemAccess/create_arrays_heap.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-print-scops -polly-print-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-codegen -S < %s | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-scops '-passes=polly-custom<import-jscop>' -polly-print-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s --check-prefix=CODEGEN  ;  ; #define Ni 1056  ; #define Nj 1056 diff --git a/polly/test/CodeGen/MemAccess/default_aligned_new_access_function.ll b/polly/test/CodeGen/MemAccess/default_aligned_new_access_function.ll index 7d8083c..f08fabd 100644 --- a/polly/test/CodeGen/MemAccess/default_aligned_new_access_function.ll +++ b/polly/test/CodeGen/MemAccess/default_aligned_new_access_function.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-import-jscop -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-print-import-jscop -disable-output < %s | FileCheck %s  ;  ; Check that we allow the new access functions even though they access  ; different locations than the original ones (but the alignment is the diff --git a/polly/test/CodeGen/MemAccess/different_types.ll b/polly/test/CodeGen/MemAccess/different_types.ll index 407e727..ae6168d 100644 --- a/polly/test/CodeGen/MemAccess/different_types.ll +++ b/polly/test/CodeGen/MemAccess/different_types.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN: \ -; RUN: -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -S < %s | FileCheck %s  ;  ;    void foo(float A[], float B[]) {  ;      for (long i = 0; i < 100; i++) diff --git a/polly/test/CodeGen/MemAccess/generate-all.ll b/polly/test/CodeGen/MemAccess/generate-all.ll index 7b2286b..099a3e0 100644 --- a/polly/test/CodeGen/MemAccess/generate-all.ll +++ b/polly/test/CodeGen/MemAccess/generate-all.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-codegen-generate-expressions=false \ -; RUN:     -S < %s | FileCheck %s -check-prefix=SCEV -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-codegen-generate-expressions=true \ -; RUN:     -S < %s | FileCheck %s -check-prefix=ASTEXPR +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-codegen-generate-expressions=false -S < %s | FileCheck %s -check-prefix=SCEV +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-codegen-generate-expressions=true -S < %s | FileCheck %s -check-prefix=ASTEXPR  ;  ;    void foo(float A[]) {  ;      for (long i = 0; i < 100; i++) diff --git a/polly/test/CodeGen/MemAccess/invariant_base_ptr.ll b/polly/test/CodeGen/MemAccess/invariant_base_ptr.ll index 5c926ac..d8d0df70 100644 --- a/polly/test/CodeGen/MemAccess/invariant_base_ptr.ll +++ b/polly/test/CodeGen/MemAccess/invariant_base_ptr.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN:   -polly-invariant-load-hoisting -S \ -; RUN:   2>&1 < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-invariant-load-hoisting -S 2>&1 < %s | FileCheck %s  ; Setting new access functions where the base pointer of the array that is newly  ; accessed is only loaded within the scop itself caused incorrect code to be diff --git a/polly/test/CodeGen/MemAccess/map_scalar_access.ll b/polly/test/CodeGen/MemAccess/map_scalar_access.ll index 7c845d4..4ea21b2 100644 --- a/polly/test/CodeGen/MemAccess/map_scalar_access.ll +++ b/polly/test/CodeGen/MemAccess/map_scalar_access.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-import-jscop-postfix=transformed -polly-print-import-jscop -disable-output < %s | FileCheck %s -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-import-jscop-postfix=transformed -polly-import-jscop -polly-codegen -S < %s | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-import-jscop-postfix=transformed '-passes=polly-custom<import-jscop>' -polly-print-import-jscop -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-import-jscop-postfix=transformed '-passes=polly-custom<import-jscop;codegen>' -S < %s | FileCheck %s --check-prefix=CODEGEN  define void @map_scalar_access(ptr noalias nonnull %A) {  entry: diff --git a/polly/test/CodeGen/MemAccess/multiple_types.ll b/polly/test/CodeGen/MemAccess/multiple_types.ll index 7848977..edc3888 100644 --- a/polly/test/CodeGen/MemAccess/multiple_types.ll +++ b/polly/test/CodeGen/MemAccess/multiple_types.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,polly-codegen' \ -; RUN: -polly-allow-differing-element-types \ -; RUN:   -S    < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;codegen>' -polly-allow-differing-element-types -S < %s | FileCheck %s  ;  ;    // Check that accessing one array with different types works.  ;    void multiple_types(char *Short, char *Float, char *Double) { diff --git a/polly/test/CodeGen/MemAccess/simple.ll b/polly/test/CodeGen/MemAccess/simple.ll index 5077e1a..63d66f1 100644 --- a/polly/test/CodeGen/MemAccess/simple.ll +++ b/polly/test/CodeGen/MemAccess/simple.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadNPMPolly -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -stats < %s 2>&1  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -stats < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;int A[100]; diff --git a/polly/test/CodeGen/MemAccess/simple_analyze.ll b/polly/test/CodeGen/MemAccess/simple_analyze.ll index 143651b..f07cb16 100644 --- a/polly/test/CodeGen/MemAccess/simple_analyze.ll +++ b/polly/test/CodeGen/MemAccess/simple_analyze.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadPolly -polly-print-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-print-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s  target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"  @A = common global [100 x i32] zeroinitializer, align 4 diff --git a/polly/test/CodeGen/MemAccess/update_access_functions.ll b/polly/test/CodeGen/MemAccess/update_access_functions.ll index 51fa97a..93f5f18 100644 --- a/polly/test/CodeGen/MemAccess/update_access_functions.ll +++ b/polly/test/CodeGen/MemAccess/update_access_functions.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN:                -polly-import-jscop-postfix=transformed \ -; RUN:                 < %s -S | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ; CHECK-LABEL: polly.stmt.loop1:  ; CHECK-NEXT:   %3 = mul nsw i64 5, %polly.indvar{{[0-9]*}} diff --git a/polly/test/CodeGen/Metadata/basic_vec_annotate.ll b/polly/test/CodeGen/Metadata/basic_vec_annotate.ll index ebe9163..344a6d0 100644 --- a/polly/test/CodeGen/Metadata/basic_vec_annotate.ll +++ b/polly/test/CodeGen/Metadata/basic_vec_annotate.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -polly-annotate-metadata-vectorize < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-annotate-metadata-vectorize < %s | FileCheck %s  ; Basic verification of vectorize metadata getting added when "-polly-vectorize-metadata" is  ; passed. diff --git a/polly/test/CodeGen/OpenMP/alias-metadata.ll b/polly/test/CodeGen/OpenMP/alias-metadata.ll index 121f630..541fbdd 100644 --- a/polly/test/CodeGen/OpenMP/alias-metadata.ll +++ b/polly/test/CodeGen/OpenMP/alias-metadata.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -S < %s | FileCheck %s  ;  ;    void foo(float *A, float *B) {  ;      for (long i = 0; i < 1000; i++) diff --git a/polly/test/CodeGen/OpenMP/floord-as-argument-to-subfunction.ll b/polly/test/CodeGen/OpenMP/floord-as-argument-to-subfunction.ll index 7177ae0..6579216 100644 --- a/polly/test/CodeGen/OpenMP/floord-as-argument-to-subfunction.ll +++ b/polly/test/CodeGen/OpenMP/floord-as-argument-to-subfunction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-opt-max-coefficient=-1 -polly-parallel -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-opt-max-coefficient=-1 -polly-parallel '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Check that we do not crash but generate parallel code  ; diff --git a/polly/test/CodeGen/OpenMP/inlineasm.ll b/polly/test/CodeGen/OpenMP/inlineasm.ll index 82a7378..ac6c707 100644 --- a/polly/test/CodeGen/OpenMP/inlineasm.ll +++ b/polly/test/CodeGen/OpenMP/inlineasm.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-opt-isl,polly-codegen' -polly-parallel -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts;opt-isl>' -polly-parallel -S < %s | FileCheck %s  ; llvm.org/PR51960  ; CHECK-LABEL: define internal void @foo_polly_subfn diff --git a/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded.ll b/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded.ll index aba3ae7..08c0cc7 100644 --- a/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded.ll +++ b/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-parallel \ -; RUN: -polly-parallel-force -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-parallel -polly-parallel-force -S < %s | FileCheck %s  ;  ; Test to verify that we hand down the preloaded A[0] to the OpenMP subfunction.  ; diff --git a/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_different_bb.ll b/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_different_bb.ll index 8cf6148..8246aaa 100644 --- a/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_different_bb.ll +++ b/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_different_bb.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-parallel \ -; RUN: -polly-parallel-force -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-parallel -polly-parallel-force -S < %s | FileCheck %s  ;  ; Test to verify that we hand down the preloaded A[0] to the OpenMP subfunction.  ; diff --git a/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_pass_only_needed.ll b/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_pass_only_needed.ll index 823e5ca..0c5208c 100644 --- a/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_pass_only_needed.ll +++ b/polly/test/CodeGen/OpenMP/invariant_base_pointer_preloaded_pass_only_needed.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-parallel \ -; RUN: -polly-parallel-force -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-parallel -polly-parallel-force -S < %s | FileCheck %s  ;  ; Test to verify that we hand down the preloaded A[0] to the OpenMP subfunction but  ; not B[0] as it is not needed diff --git a/polly/test/CodeGen/OpenMP/invariant_base_pointers_preloaded.ll b/polly/test/CodeGen/OpenMP/invariant_base_pointers_preloaded.ll index 5557839..fd039e7 100644 --- a/polly/test/CodeGen/OpenMP/invariant_base_pointers_preloaded.ll +++ b/polly/test/CodeGen/OpenMP/invariant_base_pointers_preloaded.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-parallel \ -; RUN: -polly-parallel-force -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-parallel -polly-parallel-force -S < %s | FileCheck %s  ;  ; Test to verify that we hand down the preloaded A[0] to the OpenMP subfunction.  ; diff --git a/polly/test/CodeGen/OpenMP/loop-body-references-outer-iv.ll b/polly/test/CodeGen/OpenMP/loop-body-references-outer-iv.ll index a987fac..fe8b8a3 100644 --- a/polly/test/CodeGen/OpenMP/loop-body-references-outer-iv.ll +++ b/polly/test/CodeGen/OpenMP/loop-body-references-outer-iv.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; This code has failed the scev based code generation as the scev in the scop  ; contains an AddRecExpr of an outer loop. When generating code, we did not diff --git a/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-2.ll b/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-2.ll index 96c6d90..d1f48d9 100644 --- a/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-2.ll +++ b/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; AST: #pragma simd  ; AST: #pragma omp parallel for diff --git a/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-3.ll b/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-3.ll index c4ad665..5b03280 100644 --- a/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-3.ll +++ b/polly/test/CodeGen/OpenMP/loop-body-references-outer-values-3.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-parallel -polly-parallel-force -polly-invariant-load-hoisting=true '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-parallel -polly-parallel-force -polly-invariant-load-hoisting=true -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-parallel -polly-parallel-force -polly-invariant-load-hoisting=true '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-parallel -polly-parallel-force -polly-invariant-load-hoisting=true '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; The interesting part of this test case is the instruction:  ;   %tmp = bitcast i8* %call to i64** diff --git a/polly/test/CodeGen/OpenMP/loop-body-references-outer-values.ll b/polly/test/CodeGen/OpenMP/loop-body-references-outer-values.ll index 82acba8..d612faf 100644 --- a/polly/test/CodeGen/OpenMP/loop-body-references-outer-values.ll +++ b/polly/test/CodeGen/OpenMP/loop-body-references-outer-values.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=IR  ; Make sure we correctly forward the reference to 'A' to the OpenMP subfunction.  ; diff --git a/polly/test/CodeGen/OpenMP/loop-bounds-reference-outer-ids.ll b/polly/test/CodeGen/OpenMP/loop-bounds-reference-outer-ids.ll index aa446581..213cc26 100644 --- a/polly/test/CodeGen/OpenMP/loop-bounds-reference-outer-ids.ll +++ b/polly/test/CodeGen/OpenMP/loop-bounds-reference-outer-ids.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=IR  ;  ; float A[100];  ; diff --git a/polly/test/CodeGen/OpenMP/mapped-phi-access.ll b/polly/test/CodeGen/OpenMP/mapped-phi-access.ll index 4deab1a..fef23f1 100644 --- a/polly/test/CodeGen/OpenMP/mapped-phi-access.ll +++ b/polly/test/CodeGen/OpenMP/mapped-phi-access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-parallel '-passes=polly-delicm,polly-codegen' -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-parallel '-passes=polly<no-default-opts;delicm>' -S < %s | FileCheck %s  ;  ; Verify that -polly-parallel can handle mapped scalar MemoryAccesses.  ; diff --git a/polly/test/CodeGen/OpenMP/matmul-parallel.ll b/polly/test/CodeGen/OpenMP/matmul-parallel.ll index 43326b2..fd8ce87 100644 --- a/polly/test/CodeGen/OpenMP/matmul-parallel.ll +++ b/polly/test/CodeGen/OpenMP/matmul-parallel.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel '-passes=polly-opt-isl,print<polly-ast>' -disable-output -debug-only=polly-ast < %s 2>&1 | FileCheck --check-prefix=AST %s -; RUN: opt %loadNPMPolly -polly-parallel '-passes=polly-opt-isl,polly-codegen' -S < %s | FileCheck --check-prefix=CODEGEN %s +; RUN: opt %loadNPMPolly -polly-parallel '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output -debug-only=polly-ast < %s 2>&1 | FileCheck --check-prefix=AST %s +; RUN: opt %loadNPMPolly -polly-parallel '-passes=polly<no-default-opts;opt-isl>' -S < %s | FileCheck --check-prefix=CODEGEN %s  ; REQUIRES: asserts  ; Parallelization of detected matrix-multiplication. diff --git a/polly/test/CodeGen/OpenMP/new_multidim_access.ll b/polly/test/CodeGen/OpenMP/new_multidim_access.ll index 5faabb4..8018acd 100644 --- a/polly/test/CodeGen/OpenMP/new_multidim_access.ll +++ b/polly/test/CodeGen/OpenMP/new_multidim_access.ll @@ -1,10 +1,6 @@ -; RUN: opt %loadPolly -polly-print-import-jscop \ -; RUN:                -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-print-import-jscop -disable-output < %s | FileCheck %s -; RUN: opt %loadPolly -polly-import-jscop \ -; RUN:                -polly-codegen -S < %s \ -; RUN:                -polly-parallel \ -; RUN:                | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -S -polly-parallel < %s | FileCheck %s -check-prefix=IR  ;    void new_multidim_access(long n, long m, float A[][m]) {  ;      for (long i = 0; i < n; i++) diff --git a/polly/test/CodeGen/OpenMP/recomputed-srem.ll b/polly/test/CodeGen/OpenMP/recomputed-srem.ll index b7b3a44..9906961 100644 --- a/polly/test/CodeGen/OpenMP/recomputed-srem.ll +++ b/polly/test/CodeGen/OpenMP/recomputed-srem.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -passes=polly-codegen -polly-parallel \ -; RUN: -polly-parallel-force -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly<no-default-opts>' -polly-parallel -polly-parallel-force -S < %s | FileCheck %s  ;  ; Test to verify that we pass %rem96 to the parallel subfunction.  ; diff --git a/polly/test/CodeGen/OpenMP/reference-argument-from-non-affine-region.ll b/polly/test/CodeGen/OpenMP/reference-argument-from-non-affine-region.ll index c207f58..236362a 100644 --- a/polly/test/CodeGen/OpenMP/reference-argument-from-non-affine-region.ll +++ b/polly/test/CodeGen/OpenMP/reference-argument-from-non-affine-region.ll @@ -1,17 +1,8 @@ -; RUN: opt %loadNPMPolly -polly-parallel \ -; RUN: -polly-parallel-force -passes=polly-codegen \ -; RUN: -S -verify-dom-info < %s \ -; RUN: | FileCheck %s -check-prefix=IR - -; RUN: opt %loadNPMPolly -polly-parallel \ -; RUN: -polly-parallel-force -passes=polly-codegen -polly-scheduling=runtime \ -; RUN: -S -verify-dom-info < %s \ -; RUN: | FileCheck %s -check-prefix=IR - -; RUN: opt %loadNPMPolly -polly-parallel \ -; RUN: -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM \ -; RUN: -S -verify-dom-info < %s \ -; RUN: | FileCheck %s -check-prefix=LIBOMP-IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR + +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-scheduling=runtime -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR + +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR  ; IR: @GOMP_parallel_loop_runtime_start diff --git a/polly/test/CodeGen/OpenMP/reference-other-bb.ll b/polly/test/CodeGen/OpenMP/reference-other-bb.ll index dbfbd9a..9925187 100644 --- a/polly/test/CodeGen/OpenMP/reference-other-bb.ll +++ b/polly/test/CodeGen/OpenMP/reference-other-bb.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; IR: @foo_polly_subfn  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/OpenMP/reference-preceeding-loop.ll b/polly/test/CodeGen/OpenMP/reference-preceeding-loop.ll index ee43b8aa..3738266 100644 --- a/polly/test/CodeGen/OpenMP/reference-preceeding-loop.ll +++ b/polly/test/CodeGen/OpenMP/reference-preceeding-loop.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; - Test the case where scalar evolution references a loop that is outside diff --git a/polly/test/CodeGen/OpenMP/reference_latest.ll b/polly/test/CodeGen/OpenMP/reference_latest.ll index 7a8cd77..fb420b0 100644 --- a/polly/test/CodeGen/OpenMP/reference_latest.ll +++ b/polly/test/CodeGen/OpenMP/reference_latest.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-delicm,polly-simplify,polly-codegen' -polly-parallel -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts;delicm;simplify>' -polly-parallel -S < %s | FileCheck %s  ;  ; Test that parallel codegen handles scalars mapped to other arrays.  ; After mapping "store double %add10" references the array "MemRef2". diff --git a/polly/test/CodeGen/OpenMP/scev-rewriting.ll b/polly/test/CodeGen/OpenMP/scev-rewriting.ll index 9b79f29..861a78e 100644 --- a/polly/test/CodeGen/OpenMP/scev-rewriting.ll +++ b/polly/test/CodeGen/OpenMP/scev-rewriting.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly < %s -polly-vectorizer=stripmine -polly-parallel -polly-parallel-force -polly-process-unprofitable -passes=polly-codegen -S | FileCheck %s +; RUN: opt %loadNPMPolly -polly-vectorizer=stripmine -polly-parallel -polly-parallel-force -polly-process-unprofitable '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK: define internal void @DoStringSort_polly_subfn  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"  target triple = "aarch64-unknown-linux-gnueabi" diff --git a/polly/test/CodeGen/OpenMP/single_loop.ll b/polly/test/CodeGen/OpenMP/single_loop.ll index e5aee84..5e8a58f 100644 --- a/polly/test/CodeGen/OpenMP/single_loop.ll +++ b/polly/test/CodeGen/OpenMP/single_loop.ll @@ -1,14 +1,14 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-import-jscop,print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST-STRIDE4 -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-import-jscop,polly-codegen' -S < %s | FileCheck %s -check-prefix=IR-STRIDE4 +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST-STRIDE4 +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<import-jscop;codegen>' -S < %s | FileCheck %s -check-prefix=IR-STRIDE4 -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM -polly-scheduling=static -polly-scheduling-chunksize=43 -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-STATIC-CHUNKED -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM -polly-scheduling=static -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-STATIC -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM -polly-scheduling=dynamic -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-DYNAMIC -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM -polly-scheduling=dynamic -polly-scheduling-chunksize=4 -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-DYNAMIC-FOUR -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-import-jscop,polly-codegen' -polly-omp-backend=LLVM -S < %s | FileCheck %s -check-prefix=LIBOMP-IR-STRIDE4 +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -polly-scheduling=static -polly-scheduling-chunksize=43 -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-STATIC-CHUNKED +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -polly-scheduling=static -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-STATIC +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -polly-scheduling=dynamic -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-DYNAMIC +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -polly-scheduling=dynamic -polly-scheduling-chunksize=4 -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR-DYNAMIC-FOUR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<import-jscop;codegen>' -polly-omp-backend=LLVM -S < %s | FileCheck %s -check-prefix=LIBOMP-IR-STRIDE4  ; This extensive test case tests the creation of the full set of OpenMP calls  ; as well as the subfunction creation using a trivial loop as example. diff --git a/polly/test/CodeGen/OpenMP/single_loop_with_loop_invariant_baseptr.ll b/polly/test/CodeGen/OpenMP/single_loop_with_loop_invariant_baseptr.ll index c519bfd..9532479 100644 --- a/polly/test/CodeGen/OpenMP/single_loop_with_loop_invariant_baseptr.ll +++ b/polly/test/CodeGen/OpenMP/single_loop_with_loop_invariant_baseptr.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -polly-parallel -polly-parallel-force -polly-parallel-force -polly-invariant-load-hoisting=true '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -polly-parallel -polly-parallel-force -polly-parallel-force -polly-invariant-load-hoisting=true -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -polly-parallel -polly-parallel-force -polly-parallel-force -polly-invariant-load-hoisting=true '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -polly-parallel -polly-parallel-force -polly-parallel-force -polly-invariant-load-hoisting=true '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; #define N 1024  ; float A[N]; diff --git a/polly/test/CodeGen/OpenMP/single_loop_with_param.ll b/polly/test/CodeGen/OpenMP/single_loop_with_param.ll index f6dfd62..7334762 100644 --- a/polly/test/CodeGen/OpenMP/single_loop_with_param.ll +++ b/polly/test/CodeGen/OpenMP/single_loop_with_param.ll @@ -1,18 +1,8 @@ -; RUN: opt %loadNPMPolly -polly-parallel \ -; RUN: -polly-parallel-force -passes=polly-codegen \ -; RUN: -S -verify-dom-info < %s \ -; RUN: | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR -; RUN: opt %loadNPMPolly -polly-parallel \ -; RUN: -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM \ -; RUN: -S -verify-dom-info < %s \ -; RUN: | FileCheck %s -check-prefix=LIBOMP-IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-IR -; RUN: opt %loadNPMPolly -polly-parallel \ -; RUN: -polly-parallel-force -passes=polly-codegen -polly-omp-backend=LLVM \ -; RUN: -polly-scheduling=static \ -; RUN: -S -verify-dom-info < %s \ -; RUN: | FileCheck %s -check-prefix=LIBOMP-STATIC-IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -polly-omp-backend=LLVM -polly-scheduling=static -S -verify-dom-info < %s | FileCheck %s -check-prefix=LIBOMP-STATIC-IR  ; Ensure the scalars are initialized before the OpenMP code is launched.  ; diff --git a/polly/test/CodeGen/OpenMP/two-parallel-loops-reference-outer-indvar.ll b/polly/test/CodeGen/OpenMP/two-parallel-loops-reference-outer-indvar.ll index 934e044..77c1b23 100644 --- a/polly/test/CodeGen/OpenMP/two-parallel-loops-reference-outer-indvar.ll +++ b/polly/test/CodeGen/OpenMP/two-parallel-loops-reference-outer-indvar.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=AST -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=AST +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s -check-prefix=IR  ; This test case verifies that we create correct code even if two OpenMP loops  ; share common outer variables. diff --git a/polly/test/CodeGen/PHIInExit.ll b/polly/test/CodeGen/PHIInExit.ll index 3e0c9d6..39bdac7 100644 --- a/polly/test/CodeGen/PHIInExit.ll +++ b/polly/test/CodeGen/PHIInExit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  %struct..0__pthread_mutex_s = type { i32, i32, i32, i32, i32, i32, %struct.__pthread_list_t } diff --git a/polly/test/CodeGen/RuntimeDebugBuilder/combine_different_values.ll b/polly/test/CodeGen/RuntimeDebugBuilder/combine_different_values.ll index ccb0d15..9ec9804 100644 --- a/polly/test/CodeGen/RuntimeDebugBuilder/combine_different_values.ll +++ b/polly/test/CodeGen/RuntimeDebugBuilder/combine_different_values.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-codegen-add-debug-printing \ -; RUN: -polly-ignore-aliasing < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-codegen-add-debug-printing -polly-ignore-aliasing < %s | FileCheck %s  ;    #define N 10  ;    void foo(float A[restrict], double B[restrict], char C[restrict], diff --git a/polly/test/CodeGen/RuntimeDebugBuilder/stmt_tracing.ll b/polly/test/CodeGen/RuntimeDebugBuilder/stmt_tracing.ll index 4ffb7fd..736c136 100644 --- a/polly/test/CodeGen/RuntimeDebugBuilder/stmt_tracing.ll +++ b/polly/test/CodeGen/RuntimeDebugBuilder/stmt_tracing.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-codegen-trace-stmts -polly-codegen-trace-scalars -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-codegen-trace-stmts -polly-codegen-trace-scalars '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  define void @func(i32 %n, ptr %A) { diff --git a/polly/test/CodeGen/alias-check-multi-dim.ll b/polly/test/CodeGen/alias-check-multi-dim.ll index 0440bda..bab2690 100644 --- a/polly/test/CodeGen/alias-check-multi-dim.ll +++ b/polly/test/CodeGen/alias-check-multi-dim.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ; CHECK: sext i32 %indvar.init to i64 diff --git a/polly/test/CodeGen/alias_metadata_too_many_arrays.ll b/polly/test/CodeGen/alias_metadata_too_many_arrays.ll index 4186b85..37ec2d5 100644 --- a/polly/test/CodeGen/alias_metadata_too_many_arrays.ll +++ b/polly/test/CodeGen/alias_metadata_too_many_arrays.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-ignore-aliasing -S < %s \ -; RUN:   | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-ignore-aliasing -S < %s | FileCheck %s  ;  ;    void manyarrays(float A1[], float A2[], float A3[], float A4[], float A5[],  ;                    float A6[], float A7[], float A8[], float A9[]) { diff --git a/polly/test/CodeGen/aliasing_different_base_and_access_type.ll b/polly/test/CodeGen/aliasing_different_base_and_access_type.ll index 8e1fc3b..7fed270 100644 --- a/polly/test/CodeGen/aliasing_different_base_and_access_type.ll +++ b/polly/test/CodeGen/aliasing_different_base_and_access_type.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; We have to cast %B to "short *" before we create RTCs.  ; diff --git a/polly/test/CodeGen/aliasing_different_pointer_types.ll b/polly/test/CodeGen/aliasing_different_pointer_types.ll index e601c22..5326af3 100644 --- a/polly/test/CodeGen/aliasing_different_pointer_types.ll +++ b/polly/test/CodeGen/aliasing_different_pointer_types.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Check that we cast the different pointer types correctly before we compare  ; them in the RTC's. We use i8* as max pointer type. diff --git a/polly/test/CodeGen/aliasing_multidimensional_access.ll b/polly/test/CodeGen/aliasing_multidimensional_access.ll index e1dae03..5d0b40d 100644 --- a/polly/test/CodeGen/aliasing_multidimensional_access.ll +++ b/polly/test/CodeGen/aliasing_multidimensional_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; Check that we calculate the maximal access into array A correctly and track the overflow state.  ; diff --git a/polly/test/CodeGen/aliasing_parametric_simple_1.ll b/polly/test/CodeGen/aliasing_parametric_simple_1.ll index a79ba25..1b7b858 100644 --- a/polly/test/CodeGen/aliasing_parametric_simple_1.ll +++ b/polly/test/CodeGen/aliasing_parametric_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ;    void jd(int *A, int *B, int c) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/CodeGen/aliasing_parametric_simple_2.ll b/polly/test/CodeGen/aliasing_parametric_simple_2.ll index efe4af1..fa8053c 100644 --- a/polly/test/CodeGen/aliasing_parametric_simple_2.ll +++ b/polly/test/CodeGen/aliasing_parametric_simple_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ;    void jd(int *A, int *B, int c) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/CodeGen/aliasing_struct_element.ll b/polly/test/CodeGen/aliasing_struct_element.ll index 3079e58..4e85709 100644 --- a/polly/test/CodeGen/aliasing_struct_element.ll +++ b/polly/test/CodeGen/aliasing_struct_element.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; We should only access (or compute the address of) "the first element" of %S  ; as it is a single struct not a struct array. The maximal access to S, thus diff --git a/polly/test/CodeGen/alignment.ll b/polly/test/CodeGen/alignment.ll index e0f6a95..daf7999 100644 --- a/polly/test/CodeGen/alignment.ll +++ b/polly/test/CodeGen/alignment.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Check that the special alignment information is kept  ; diff --git a/polly/test/CodeGen/annotated_alias_scopes.ll b/polly/test/CodeGen/annotated_alias_scopes.ll index ada03e0..7d2d903 100644 --- a/polly/test/CodeGen/annotated_alias_scopes.ll +++ b/polly/test/CodeGen/annotated_alias_scopes.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s --check-prefix=SCOPES +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s --check-prefix=SCOPES  ;  ; Check that we create alias scopes that indicate the accesses to A, B and C cannot alias in any way.  ; diff --git a/polly/test/CodeGen/blas_sscal_simplified.ll b/polly/test/CodeGen/blas_sscal_simplified.ll index 99f2eae..461af09 100644 --- a/polly/test/CodeGen/blas_sscal_simplified.ll +++ b/polly/test/CodeGen/blas_sscal_simplified.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  ;  ; Regression test for a bug in the runtime check generation. diff --git a/polly/test/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll b/polly/test/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll index 5dba933..5eb6076 100644 --- a/polly/test/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll +++ b/polly/test/CodeGen/conflict-between-loop-invariant-code-hosting-and-escape-map-computation.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly<no-default-opts>' -disable-output < %s  ;  ; CHECK: store i32 %tmp14_p_scalar_, ptr %tmp14.s2a  ; CHECK: %tmp14.final_reload = load i32, ptr %tmp14.s2a diff --git a/polly/test/CodeGen/constant_condition.ll b/polly/test/CodeGen/constant_condition.ll index 905aa52..9d3c5a8 100644 --- a/polly/test/CodeGen/constant_condition.ll +++ b/polly/test/CodeGen/constant_condition.ll @@ -1,4 +1,4 @@ -;RUN: opt %loadNPMPolly '-passes=polly-prepare,scop(print<polly-ast>)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<prepare;ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s  ;#include <string.h>  ;int A[1]; diff --git a/polly/test/CodeGen/create-conditional-scop.ll b/polly/test/CodeGen/create-conditional-scop.ll index b8c9a81..d4df48b 100644 --- a/polly/test/CodeGen/create-conditional-scop.ll +++ b/polly/test/CodeGen/create-conditional-scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen -verify-loop-info < %s -S | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' -verify-loop-info -S < %s | FileCheck %s  target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-a0:0-n32" diff --git a/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_1.ll b/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_1.ll index dfef42023..31b5e69 100644 --- a/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_1.ll +++ b/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  ;  ; Check we do not crash even though the dead %tmp8 is referenced by a parameter  ; and we do not pre-load it (as it is dead). diff --git a/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_2.ll b/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_2.ll index fcc6764..88b844b 100644 --- a/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_2.ll +++ b/polly/test/CodeGen/dead_invariant_load_instruction_referenced_by_parameter_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  ;  ; Check we do not crash even though there is a dead load that is referenced by  ; a parameter and we do not pre-load it (as it is dead). diff --git a/polly/test/CodeGen/debug-intrinsics.ll b/polly/test/CodeGen/debug-intrinsics.ll index ed4b81a..f397a4b 100644 --- a/polly/test/CodeGen/debug-intrinsics.ll +++ b/polly/test/CodeGen/debug-intrinsics.ll @@ -1,10 +1,6 @@ -; RUN: opt %loadNPMPolly \ -; RUN: -polly-analyze-read-only-scalars=false -passes=polly-codegen -S < %s | \ -; RUN: FileCheck %s +; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=false '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -; RUN: opt %loadNPMPolly \ -; RUN: -polly-analyze-read-only-scalars=true -passes=polly-codegen -S < %s | \ -; RUN: FileCheck %s +; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=true '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/dominance_problem_after_early_codegen_bailout.ll b/polly/test/CodeGen/dominance_problem_after_early_codegen_bailout.ll index edc0333..7f6f128 100644 --- a/polly/test/CodeGen/dominance_problem_after_early_codegen_bailout.ll +++ b/polly/test/CodeGen/dominance_problem_after_early_codegen_bailout.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  ;  ; This caused dominance problems at some point as we do bail out during  ; code generation. Just verify it runs through. diff --git a/polly/test/CodeGen/empty_domain_in_context.ll b/polly/test/CodeGen/empty_domain_in_context.ll index a2fe805f..f6c39eb 100644 --- a/polly/test/CodeGen/empty_domain_in_context.ll +++ b/polly/test/CodeGen/empty_domain_in_context.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-optree,polly-opt-isl,polly-codegen' -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree;opt-isl;codegen>' -S < %s | FileCheck %s  ;  ; llvm.org/PR35362  ; isl codegen does not allow to generate isl_ast_expr from pw_aff which have an diff --git a/polly/test/CodeGen/entry_with_trivial_phi.ll b/polly/test/CodeGen/entry_with_trivial_phi.ll index f2c9da0..0957093 100644 --- a/polly/test/CodeGen/entry_with_trivial_phi.ll +++ b/polly/test/CodeGen/entry_with_trivial_phi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s  ;  ; The entry of this scop's simple region (entry.split => for.end) has an trivial  ; PHI node. LCSSA may create such PHI nodes. This is a breakdown of this case in diff --git a/polly/test/CodeGen/entry_with_trivial_phi_other_bb.ll b/polly/test/CodeGen/entry_with_trivial_phi_other_bb.ll index 2f1ec1a..7d8ef7a 100644 --- a/polly/test/CodeGen/entry_with_trivial_phi_other_bb.ll +++ b/polly/test/CodeGen/entry_with_trivial_phi_other_bb.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; The entry of this scop's simple region (entry.split => for.end) has an trivial  ; PHI node that is used in a different of the scop region. LCSSA may create such diff --git a/polly/test/CodeGen/error-stmt-in-non-affine-region.ll b/polly/test/CodeGen/error-stmt-in-non-affine-region.ll index 63b6bec..c5c11c8 100644 --- a/polly/test/CodeGen/error-stmt-in-non-affine-region.ll +++ b/polly/test/CodeGen/error-stmt-in-non-affine-region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ; XFAIL: *  ;  ; CHECK-LABEL: polly.stmt.if.then: diff --git a/polly/test/CodeGen/error_block_contains_invalid_memory_access.ll b/polly/test/CodeGen/error_block_contains_invalid_memory_access.ll index abec288..1e38210 100644 --- a/polly/test/CodeGen/error_block_contains_invalid_memory_access.ll +++ b/polly/test/CodeGen/error_block_contains_invalid_memory_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  ;  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/exprModDiv.ll b/polly/test/CodeGen/exprModDiv.ll index c9b419ab..b123e90c 100644 --- a/polly/test/CodeGen/exprModDiv.ll +++ b/polly/test/CodeGen/exprModDiv.ll @@ -1,8 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN:     -S < %s | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN:     -polly-import-jscop-postfix=pow2 \ -; RUN:     -S < %s | FileCheck %s -check-prefix=POW2 +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=pow2 -S < %s | FileCheck %s -check-prefix=POW2  ;  ;    void exprModDiv(float *A, float *B, float *C, long N, long p) {  ;      for (long i = 0; i < N; i++) diff --git a/polly/test/CodeGen/hoisted_load_escapes_through_phi.ll b/polly/test/CodeGen/hoisted_load_escapes_through_phi.ll index 1ca2413..c7873ba 100644 --- a/polly/test/CodeGen/hoisted_load_escapes_through_phi.ll +++ b/polly/test/CodeGen/hoisted_load_escapes_through_phi.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen \ -; RUN: -polly-invariant-load-hoisting=false < %s | FileCheck %s -; RUN: opt %loadNPMPolly -S -passes=polly-codegen \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=false < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true < %s | FileCheck %s  ;  ; Check that we generate valid code even if the load of cont_STACKPOINTER is  ; hoisted in one SCoP and used (through the phi node %tmp2). diff --git a/polly/test/CodeGen/hoisting_1.ll b/polly/test/CodeGen/hoisting_1.ll index aa29bfd..31ae969 100644 --- a/polly/test/CodeGen/hoisting_1.ll +++ b/polly/test/CodeGen/hoisting_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -passes=polly-codegen -polly-allow-differing-element-types -disable-output %s +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa '-passes=polly<no-default-opts>' -polly-allow-differing-element-types -disable-output %s  ;  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/hoisting_2.ll b/polly/test/CodeGen/hoisting_2.ll index 1b913f2..eb6f7ae 100644 --- a/polly/test/CodeGen/hoisting_2.ll +++ b/polly/test/CodeGen/hoisting_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -passes=polly-codegen -polly-allow-differing-element-types -disable-output %s +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa '-passes=polly<no-default-opts>' -polly-allow-differing-element-types -disable-output %s  ;  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/inner_scev_sdiv_1.ll b/polly/test/CodeGen/inner_scev_sdiv_1.ll index d210105..f7595a6 100644 --- a/polly/test/CodeGen/inner_scev_sdiv_1.ll +++ b/polly/test/CodeGen/inner_scev_sdiv_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s  ;  ; Excerpt from the test-suite's oggenc reduced using bugpoint.  ; diff --git a/polly/test/CodeGen/inner_scev_sdiv_2.ll b/polly/test/CodeGen/inner_scev_sdiv_2.ll index 33233fe..247c102 100644 --- a/polly/test/CodeGen/inner_scev_sdiv_2.ll +++ b/polly/test/CodeGen/inner_scev_sdiv_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; The SCEV expression in this test case refers to a sequence of sdiv  ; instructions, which are part of different bbs in the SCoP. When code diff --git a/polly/test/CodeGen/inner_scev_sdiv_3.ll b/polly/test/CodeGen/inner_scev_sdiv_3.ll index a8c6263..fc1cce4 100644 --- a/polly/test/CodeGen/inner_scev_sdiv_3.ll +++ b/polly/test/CodeGen/inner_scev_sdiv_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; This test case has a inner SCEV sdiv that will escape the SCoP. Just check we  ; do not crash and generate valid code. diff --git a/polly/test/CodeGen/inner_scev_sdiv_in_lb.ll b/polly/test/CodeGen/inner_scev_sdiv_in_lb.ll index 31c14e8..1ff598a 100644 --- a/polly/test/CodeGen/inner_scev_sdiv_in_lb.ll +++ b/polly/test/CodeGen/inner_scev_sdiv_in_lb.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s --check-prefix=CODEGEN  ;  ; CHECK: [N] -> { Stmt_bb11[i0, i1] : i0 < N and i1 >= 0 and 3i1 <= -3 + i0 };  ; CODEGEN: polly diff --git a/polly/test/CodeGen/inner_scev_sdiv_in_lb_invariant.ll b/polly/test/CodeGen/inner_scev_sdiv_in_lb_invariant.ll index b42371b..4cd146d 100644 --- a/polly/test/CodeGen/inner_scev_sdiv_in_lb_invariant.ll +++ b/polly/test/CodeGen/inner_scev_sdiv_in_lb_invariant.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen \ -; RUN:     < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; Check that this will not crash our code generation.  ; diff --git a/polly/test/CodeGen/inner_scev_sdiv_in_rtc.ll b/polly/test/CodeGen/inner_scev_sdiv_in_rtc.ll index 45af634..586875b 100644 --- a/polly/test/CodeGen/inner_scev_sdiv_in_rtc.ll +++ b/polly/test/CodeGen/inner_scev_sdiv_in_rtc.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This will just check that we generate valid code here.  ; diff --git a/polly/test/CodeGen/intrinsics_lifetime.ll b/polly/test/CodeGen/intrinsics_lifetime.ll index a708548..0f35664 100644 --- a/polly/test/CodeGen/intrinsics_lifetime.ll +++ b/polly/test/CodeGen/intrinsics_lifetime.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Verify that we remove the lifetime markers from everywhere.  ; diff --git a/polly/test/CodeGen/intrinsics_misc.ll b/polly/test/CodeGen/intrinsics_misc.ll index a643b8a..4a64c1a 100644 --- a/polly/test/CodeGen/intrinsics_misc.ll +++ b/polly/test/CodeGen/intrinsics_misc.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Verify that we remove the misc intrinsics  from the optimized SCoP.  ; diff --git a/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-2.ll b/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-2.ll index e7cbf74..15fe0d9 100644 --- a/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-2.ll +++ b/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ;  ; This crashed our codegen at some point, verify it runs through  ; diff --git a/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-3.ll b/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-3.ll index 24e9240..c1ab026 100644 --- a/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-3.ll +++ b/polly/test/CodeGen/inv-load-lnt-crash-wrong-order-3.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ;  ; This crashed our codegen at some point, verify it runs through  ; diff --git a/polly/test/CodeGen/inv-load-lnt-crash-wrong-order.ll b/polly/test/CodeGen/inv-load-lnt-crash-wrong-order.ll index d1d861e..f0c833c 100644 --- a/polly/test/CodeGen/inv-load-lnt-crash-wrong-order.ll +++ b/polly/test/CodeGen/inv-load-lnt-crash-wrong-order.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ;  ; This crashed our codegen at some point, verify it runs through  ; diff --git a/polly/test/CodeGen/invariant-load-dimension.ll b/polly/test/CodeGen/invariant-load-dimension.ll index 21e5305..13576b9 100644 --- a/polly/test/CodeGen/invariant-load-dimension.ll +++ b/polly/test/CodeGen/invariant-load-dimension.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable -polly-invariant-load-hoisting '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOPS -; RUN: opt %loadNPMPolly -S < %s -passes=polly-codegen -polly-process-unprofitable -polly-invariant-load-hoisting | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly -polly-process-unprofitable -polly-invariant-load-hoisting '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOPS +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-process-unprofitable -polly-invariant-load-hoisting < %s | FileCheck %s -check-prefix=CODEGEN  target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n8:16:32-S64" diff --git a/polly/test/CodeGen/invariant-load-preload-base-pointer-origin-first.ll b/polly/test/CodeGen/invariant-load-preload-base-pointer-origin-first.ll index 1fd9cb8..d92d970 100644 --- a/polly/test/CodeGen/invariant-load-preload-base-pointer-origin-first.ll +++ b/polly/test/CodeGen/invariant-load-preload-base-pointer-origin-first.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -polly-invariant-load-hoisting=true < %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true < %s  ;  ; Check that we generate valid code as we did non preload the base pointer  ; origin of %tmp4 at some point. diff --git a/polly/test/CodeGen/invariant_cannot_handle_void.ll b/polly/test/CodeGen/invariant_cannot_handle_void.ll index 420cb60..f6dcac0 100644 --- a/polly/test/CodeGen/invariant_cannot_handle_void.ll +++ b/polly/test/CodeGen/invariant_cannot_handle_void.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -polly-invariant-load-hoisting=true %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true %s | FileCheck %s  ;  ; The offset of the %tmp1 load wrt. to %buff (62 bytes) is not divisible  ; by the type size (i32 = 4 bytes), thus we will have to represent %buff diff --git a/polly/test/CodeGen/invariant_load.ll b/polly/test/CodeGen/invariant_load.ll index 2d5e604..c89da73 100644 --- a/polly/test/CodeGen/invariant_load.ll +++ b/polly/test/CodeGen/invariant_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK-NEXT:    %polly.access.B = getelementptr i32, ptr %B, i64 0 diff --git a/polly/test/CodeGen/invariant_load_address_space.ll b/polly/test/CodeGen/invariant_load_address_space.ll index 3d1958e..7d5139c 100644 --- a/polly/test/CodeGen/invariant_load_address_space.ll +++ b/polly/test/CodeGen/invariant_load_address_space.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK-NEXT:    %polly.access.B = getelementptr i32, ptr addrspace(1) %B, i64 0 diff --git a/polly/test/CodeGen/invariant_load_alias_metadata.ll b/polly/test/CodeGen/invariant_load_alias_metadata.ll index 2524633..2a704ee 100644 --- a/polly/test/CodeGen/invariant_load_alias_metadata.ll +++ b/polly/test/CodeGen/invariant_load_alias_metadata.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true \ -; RUN: -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; This test case checks whether Polly generates alias metadata in case of  ; the ublas gemm kernel and polly-invariant-load-hoisting. diff --git a/polly/test/CodeGen/invariant_load_base_pointer.ll b/polly/test/CodeGen/invariant_load_base_pointer.ll index d4ac433..f6b8739 100644 --- a/polly/test/CodeGen/invariant_load_base_pointer.ll +++ b/polly/test/CodeGen/invariant_load_base_pointer.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly  -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK-NEXT:    %polly.access.BPLoc = getelementptr ptr, ptr %BPLoc, i64 0 diff --git a/polly/test/CodeGen/invariant_load_base_pointer_conditional.ll b/polly/test/CodeGen/invariant_load_base_pointer_conditional.ll index 06a9a93..4dbcc3b 100644 --- a/polly/test/CodeGen/invariant_load_base_pointer_conditional.ll +++ b/polly/test/CodeGen/invariant_load_base_pointer_conditional.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly  -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK-NEXT:    %0 = sext i32 %N to i64 diff --git a/polly/test/CodeGen/invariant_load_base_pointer_conditional_2.ll b/polly/test/CodeGen/invariant_load_base_pointer_conditional_2.ll index 66ab9a3..39520c8 100644 --- a/polly/test/CodeGen/invariant_load_base_pointer_conditional_2.ll +++ b/polly/test/CodeGen/invariant_load_base_pointer_conditional_2.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -polly-invariant-load-hoisting=true < %s | FileCheck %s --check-prefix=IR -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -polly-invariant-load-hoisting=true --polly-overflow-tracking=always < %s | FileCheck %s --check-prefix=IRA +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true < %s | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true --polly-overflow-tracking=always < %s | FileCheck %s --check-prefix=IRA  ;  ; As (p + q) can overflow we have to check that we load from  ; I[p + q] only if it does not. diff --git a/polly/test/CodeGen/invariant_load_canonicalize_array_baseptrs.ll b/polly/test/CodeGen/invariant_load_canonicalize_array_baseptrs.ll index fa904e9..414ca12 100644 --- a/polly/test/CodeGen/invariant_load_canonicalize_array_baseptrs.ll +++ b/polly/test/CodeGen/invariant_load_canonicalize_array_baseptrs.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting < %s | FileCheck %s  ; CHECK: %polly.access.A = getelementptr ptr, ptr %A, i64 0  ; CHECK: %polly.access.A.load = load ptr, ptr %polly.access.A diff --git a/polly/test/CodeGen/invariant_load_condition.ll b/polly/test/CodeGen/invariant_load_condition.ll index 36e5883..f0782c0 100644 --- a/polly/test/CodeGen/invariant_load_condition.ll +++ b/polly/test/CodeGen/invariant_load_condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK-NEXT:     %polly.access.C = getelementptr i32, ptr %C, i64 0 diff --git a/polly/test/CodeGen/invariant_load_different_sized_types.ll b/polly/test/CodeGen/invariant_load_different_sized_types.ll index 0a88bb7..034c358 100644 --- a/polly/test/CodeGen/invariant_load_different_sized_types.ll +++ b/polly/test/CodeGen/invariant_load_different_sized_types.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S \ -; RUN: -polly-allow-differing-element-types < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S -polly-allow-differing-element-types < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/invariant_load_escaping.ll b/polly/test/CodeGen/invariant_load_escaping.ll index 416148b7..85578d3 100644 --- a/polly/test/CodeGen/invariant_load_escaping.ll +++ b/polly/test/CodeGen/invariant_load_escaping.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ;    int f(int *A, int *B) {  ;      // Possible aliasing between A and B but if not then *B would be diff --git a/polly/test/CodeGen/invariant_load_escaping_second_scop.ll b/polly/test/CodeGen/invariant_load_escaping_second_scop.ll index 906bfc1..ff6e9a8 100644 --- a/polly/test/CodeGen/invariant_load_escaping_second_scop.ll +++ b/polly/test/CodeGen/invariant_load_escaping_second_scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true  -polly-process-unprofitable -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-process-unprofitable -S < %s | FileCheck %s  ;  ;    void fence(void);  ; diff --git a/polly/test/CodeGen/invariant_load_in_non_affine_subregion.ll b/polly/test/CodeGen/invariant_load_in_non_affine_subregion.ll index ab02e63..edd38ca 100644 --- a/polly/test/CodeGen/invariant_load_in_non_affine_subregion.ll +++ b/polly/test/CodeGen/invariant_load_in_non_affine_subregion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; This crashed at some point as the invariant load is in a non-affine  ; subregion. Just check it does not anymore. diff --git a/polly/test/CodeGen/invariant_load_loop_ub.ll b/polly/test/CodeGen/invariant_load_loop_ub.ll index 1db27ad..9231024 100644 --- a/polly/test/CodeGen/invariant_load_loop_ub.ll +++ b/polly/test/CodeGen/invariant_load_loop_ub.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-process-unprofitable -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-process-unprofitable -S < %s | FileCheck %s  ;  ; CHECK: polly.start  ; diff --git a/polly/test/CodeGen/invariant_load_not_executed_but_in_parameters.ll b/polly/test/CodeGen/invariant_load_not_executed_but_in_parameters.ll index 5a11adc..0e381b8 100644 --- a/polly/test/CodeGen/invariant_load_not_executed_but_in_parameters.ll +++ b/polly/test/CodeGen/invariant_load_not_executed_but_in_parameters.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -disable-output < %s  ;  ; Check that this does not crash as the invariant load is not executed (thus  ; not preloaded) but still referenced by one of the parameters. diff --git a/polly/test/CodeGen/invariant_load_outermost.ll b/polly/test/CodeGen/invariant_load_outermost.ll index 7e0550f..bbbe1f1 100644 --- a/polly/test/CodeGen/invariant_load_outermost.ll +++ b/polly/test/CodeGen/invariant_load_outermost.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ; CHECK: polly.start diff --git a/polly/test/CodeGen/invariant_load_parameters_cyclic_dependence.ll b/polly/test/CodeGen/invariant_load_parameters_cyclic_dependence.ll index abf957b..9fe343f 100644 --- a/polly/test/CodeGen/invariant_load_parameters_cyclic_dependence.ll +++ b/polly/test/CodeGen/invariant_load_parameters_cyclic_dependence.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; SCOP:         Assumed Context:  ; SCOP-NEXT:    [p_0, tmp4] -> {  :  } diff --git a/polly/test/CodeGen/invariant_load_ptr_ptr_noalias.ll b/polly/test/CodeGen/invariant_load_ptr_ptr_noalias.ll index b565f1b..dc1c2bc 100644 --- a/polly/test/CodeGen/invariant_load_ptr_ptr_noalias.ll +++ b/polly/test/CodeGen/invariant_load_ptr_ptr_noalias.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-ignore-aliasing -S  < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK:   %polly.access.A = getelementptr ptr, ptr %A, i64 42 diff --git a/polly/test/CodeGen/invariant_load_scalar_dep.ll b/polly/test/CodeGen/invariant_load_scalar_dep.ll index ba2999e..bb60c50 100644 --- a/polly/test/CodeGen/invariant_load_scalar_dep.ll +++ b/polly/test/CodeGen/invariant_load_scalar_dep.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly  -passes=polly-codegen -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -S < %s | FileCheck %s  ;  ; CHECK-LABEL: polly.preload.begin:  ; CHECK:    %polly.access.B = getelementptr i32, ptr %B, i64 0 diff --git a/polly/test/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll b/polly/test/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll index 26c964c..87c407e 100644 --- a/polly/test/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll +++ b/polly/test/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s | FileCheck %s  ;  ; Verify the preloaded %tmp0 is stored and communicated in the same alloca.  ; In this case, we do not reload %ncol.load from the scalar stack slot, but diff --git a/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_1.ll b/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_1.ll index 6bf11d5..5e2b28c 100644 --- a/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_1.ll +++ b/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true < %s  ;  ; Check we do not crash even though we pre-load values with different types  ; from the same base pointer. diff --git a/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_2.ll b/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_2.ll index 07ce941..20d9f6d 100644 --- a/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_2.ll +++ b/polly/test/CodeGen/invariant_loads_from_struct_with_different_types_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true < %s  ;  ; Check we do not crash even though we pre-load values with different types  ; from the same base pointer. diff --git a/polly/test/CodeGen/invariant_loads_ignore_parameter_bounds.ll b/polly/test/CodeGen/invariant_loads_ignore_parameter_bounds.ll index 19b30af..51f8a55 100644 --- a/polly/test/CodeGen/invariant_loads_ignore_parameter_bounds.ll +++ b/polly/test/CodeGen/invariant_loads_ignore_parameter_bounds.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting \ -; RUN:     -polly-ignore-parameter-bounds -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting -polly-ignore-parameter-bounds -S < %s | FileCheck %s  ; CHECK: polly.preload.begin:  ; CHECK-NEXT: %global.load = load i32, ptr @global, align 4, !alias.scope !0, !noalias !3 diff --git a/polly/test/CodeGen/invariant_verify_function_failed.ll b/polly/test/CodeGen/invariant_verify_function_failed.ll index 1dcc175..432c155 100644 --- a/polly/test/CodeGen/invariant_verify_function_failed.ll +++ b/polly/test/CodeGen/invariant_verify_function_failed.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,scop(polly-codegen)' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-print-detect -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; This crashed at some point as the pointer returned by the call  ; to @__errno_location is invariant and defined in the SCoP but not diff --git a/polly/test/CodeGen/invariant_verify_function_failed_2.ll b/polly/test/CodeGen/invariant_verify_function_failed_2.ll index 43b3d99..65ba2cd 100644 --- a/polly/test/CodeGen/invariant_verify_function_failed_2.ll +++ b/polly/test/CodeGen/invariant_verify_function_failed_2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -S '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOPS -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -polly-invariant-load-hoisting=true %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOPS +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true %s | FileCheck %s  ;  ; Check we generate valid code. diff --git a/polly/test/CodeGen/issue56692.ll b/polly/test/CodeGen/issue56692.ll index 34c4e39..5e225d7 100644 --- a/polly/test/CodeGen/issue56692.ll +++ b/polly/test/CodeGen/issue56692.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -polly-omp-backend=LLVM -polly-codegen-verify -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-parallel -polly-parallel-force -polly-omp-backend=LLVM -polly-codegen-verify '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; https://github.com/llvm/llvm-project/issues/56692  ;  ; CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_call({{.*}}), !dbg ![[OPTLOC:[0-9]+]] diff --git a/polly/test/CodeGen/large-numbers-in-boundary-context.ll b/polly/test/CodeGen/large-numbers-in-boundary-context.ll index b228baf..4d55273 100644 --- a/polly/test/CodeGen/large-numbers-in-boundary-context.ll +++ b/polly/test/CodeGen/large-numbers-in-boundary-context.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ; XFAIL: *  ;  ; The boundary context contains a constant that does not fit in 64 bits. Hence, diff --git a/polly/test/CodeGen/load_subset_with_context.ll b/polly/test/CodeGen/load_subset_with_context.ll index ccd4198..33b3d3b 100644 --- a/polly/test/CodeGen/load_subset_with_context.ll +++ b/polly/test/CodeGen/load_subset_with_context.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; A load must provide a value for every statement instance.  ; Statement instances not in the SCoP's context are irrelevant. diff --git a/polly/test/CodeGen/loop-invariant-load-type-mismatch.ll b/polly/test/CodeGen/loop-invariant-load-type-mismatch.ll index f43247b..dc0c551 100644 --- a/polly/test/CodeGen/loop-invariant-load-type-mismatch.ll +++ b/polly/test/CodeGen/loop-invariant-load-type-mismatch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/CodeGen/loop_with_condition.ll b/polly/test/CodeGen/loop_with_condition.ll index 49e3124..cf28a4d 100644 --- a/polly/test/CodeGen/loop_with_condition.ll +++ b/polly/test/CodeGen/loop_with_condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#include <string.h>  ;#define N 1024 diff --git a/polly/test/CodeGen/loop_with_condition_2.ll b/polly/test/CodeGen/loop_with_condition_2.ll index 8ae38ee..1d8a813 100644 --- a/polly/test/CodeGen/loop_with_condition_2.ll +++ b/polly/test/CodeGen/loop_with_condition_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ; Verify that we actually detect this loop as the innermost loop even though  ; there is a conditional inside. diff --git a/polly/test/CodeGen/loop_with_condition_ineq.ll b/polly/test/CodeGen/loop_with_condition_ineq.ll index 64019a6..c222f67 100644 --- a/polly/test/CodeGen/loop_with_condition_ineq.ll +++ b/polly/test/CodeGen/loop_with_condition_ineq.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#include <string.h>  ;#define N 1024 diff --git a/polly/test/CodeGen/loop_with_condition_nested.ll b/polly/test/CodeGen/loop_with_condition_nested.ll index 5dcb51d..32256a7 100644 --- a/polly/test/CodeGen/loop_with_condition_nested.ll +++ b/polly/test/CodeGen/loop_with_condition_nested.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen < %s | opt -passes='print<loops>' -disable-output 2>&1 | FileCheck %s -check-prefix=LOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' < %s | opt -passes='print<loops>' -disable-output 2>&1 | FileCheck %s -check-prefix=LOOPS  ;#include <string.h> diff --git a/polly/test/CodeGen/loop_with_conditional_entry_edge_split_hard_case.ll b/polly/test/CodeGen/loop_with_conditional_entry_edge_split_hard_case.ll index 26fe4eb..5d7f67f 100644 --- a/polly/test/CodeGen/loop_with_conditional_entry_edge_split_hard_case.ll +++ b/polly/test/CodeGen/loop_with_conditional_entry_edge_split_hard_case.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Test case to trigger the hard way of creating a unique entering  ; edge for the SCoP. It is triggered because the entering edge diff --git a/polly/test/CodeGen/memcpy_annotations.ll b/polly/test/CodeGen/memcpy_annotations.ll index 501aa8f..c3ffe4a 100644 --- a/polly/test/CodeGen/memcpy_annotations.ll +++ b/polly/test/CodeGen/memcpy_annotations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Verify that @llvm.memcpy does not get a !alias.scope annotation.  ; @llvm.memcpy takes two pointers, it is ambiguous to which the diff --git a/polly/test/CodeGen/multidim-non-matching-typesize-2.ll b/polly/test/CodeGen/multidim-non-matching-typesize-2.ll index f63eb18..b084672 100644 --- a/polly/test/CodeGen/multidim-non-matching-typesize-2.ll +++ b/polly/test/CodeGen/multidim-non-matching-typesize-2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -disable-basic-aa -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly --aa-pipeline= '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK: polly  target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128" diff --git a/polly/test/CodeGen/multidim-non-matching-typesize.ll b/polly/test/CodeGen/multidim-non-matching-typesize.ll index 63e43c8..66a4fdf 100644 --- a/polly/test/CodeGen/multidim-non-matching-typesize.ll +++ b/polly/test/CodeGen/multidim-non-matching-typesize.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -disable-basic-aa -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly --aa-pipeline= '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128" diff --git a/polly/test/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll b/polly/test/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll index 86b1757..d3f8b71 100644 --- a/polly/test/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll +++ b/polly/test/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Derived from the following code: diff --git a/polly/test/CodeGen/multidim_alias_check.ll b/polly/test/CodeGen/multidim_alias_check.ll index 93e34e2..e85d7c9 100644 --- a/polly/test/CodeGen/multidim_alias_check.ll +++ b/polly/test/CodeGen/multidim_alias_check.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ; CHECK: %polly.access.sext.A = sext i32 %n to i64 diff --git a/polly/test/CodeGen/multiple-codegens.ll b/polly/test/CodeGen/multiple-codegens.ll index a63f8a6..cb12700 100644 --- a/polly/test/CodeGen/multiple-codegens.ll +++ b/polly/test/CodeGen/multiple-codegens.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly "-passes=scop(polly-opt-isl,polly-codegen,polly-codegen)" -S < %s | FileCheck %s -; RUN: opt %loadNPMPolly "-passes=scop(polly-opt-isl,polly-codegen),scop(polly-codegen)" -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts;opt-isl>,polly<no-default-opts>' -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=function(polly<no-default-opts;opt-isl>),function(polly<no-default-opts>)' -S < %s | FileCheck %s  ;  ; llvm.org/PR34441  ; Properly handle multiple -polly-scops/-polly-codegen in the same diff --git a/polly/test/CodeGen/multiple-scops-in-a-row.ll b/polly/test/CodeGen/multiple-scops-in-a-row.ll index effae22..b923597 100644 --- a/polly/test/CodeGen/multiple-scops-in-a-row.ll +++ b/polly/test/CodeGen/multiple-scops-in-a-row.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ; This test case has two scops in a row. When code generating the first scop,  ; the second scop is invalidated. This test case verifies that we do not crash diff --git a/polly/test/CodeGen/multiple-types-invariant-load-2.ll b/polly/test/CodeGen/multiple-types-invariant-load-2.ll index 101fcaf..9661507 100644 --- a/polly/test/CodeGen/multiple-types-invariant-load-2.ll +++ b/polly/test/CodeGen/multiple-types-invariant-load-2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-allow-differing-element-types < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-allow-differing-element-types < %s | FileCheck %s  ; CHECK: polly diff --git a/polly/test/CodeGen/multiple-types-invariant-load.ll b/polly/test/CodeGen/multiple-types-invariant-load.ll index 930041e..ca89cb5 100644 --- a/polly/test/CodeGen/multiple-types-invariant-load.ll +++ b/polly/test/CodeGen/multiple-types-invariant-load.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-differing-element-types -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-differing-element-types '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ; CHECK: %polly.access.global.load = getelementptr i32, ptr %global.load, i64 0  ; CHECK: %polly.access.global.load.load = load i32, ptr %polly.access.global.load diff --git a/polly/test/CodeGen/multiple_sai_fro_same_base_address.ll b/polly/test/CodeGen/multiple_sai_fro_same_base_address.ll index 1e06a7e..8198108 100644 --- a/polly/test/CodeGen/multiple_sai_fro_same_base_address.ll +++ b/polly/test/CodeGen/multiple_sai_fro_same_base_address.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-position=before-vectorizer '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP -; RUN: opt %loadNPMPolly -polly-position=before-vectorizer -passes=polly-codegen -S < %s | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly -polly-position=before-vectorizer '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly -polly-position=before-vectorizer '-passes=polly<no-default-opts>' -S < %s | FileCheck %s --check-prefix=IR  ; The IR has two ScopArrayInfo for the value %next.0. This used to produce two  ; phi nodes in polly.merge_new_and_old, one illegaly using the result of the diff --git a/polly/test/CodeGen/no-overflow-tracking.ll b/polly/test/CodeGen/no-overflow-tracking.ll index d5ad9a7..f915b5a 100644 --- a/polly/test/CodeGen/no-overflow-tracking.ll +++ b/polly/test/CodeGen/no-overflow-tracking.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true -polly-overflow-tracking=never -passes=polly-codegen -S < %s | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true -polly-overflow-tracking=never '-passes=polly<no-default-opts>' -S < %s | FileCheck %s --check-prefix=IR  ;  ; As (p + q) can overflow we have to check that we load from  ; I[p + q] only if it does not. diff --git a/polly/test/CodeGen/no_guard_bb.ll b/polly/test/CodeGen/no_guard_bb.ll index a022083..604c5ac 100644 --- a/polly/test/CodeGen/no_guard_bb.ll +++ b/polly/test/CodeGen/no_guard_bb.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S -verify-dom-info < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s  ;  ; CHECK-NOT: br i1 true, label %polly.{{.*}}, label %polly.{{.*}}  ; diff --git a/polly/test/CodeGen/non-affine-dominance-generated-entering.ll b/polly/test/CodeGen/non-affine-dominance-generated-entering.ll index 6015516..ebb02a90 100644 --- a/polly/test/CodeGen/non-affine-dominance-generated-entering.ll +++ b/polly/test/CodeGen/non-affine-dominance-generated-entering.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; llvm.org/PR25439  ; Scalar reloads in the generated entering block were not recognized as diff --git a/polly/test/CodeGen/non-affine-exit-node-dominance.ll b/polly/test/CodeGen/non-affine-exit-node-dominance.ll index 0d0f634..ff9f504 100644 --- a/polly/test/CodeGen/non-affine-exit-node-dominance.ll +++ b/polly/test/CodeGen/non-affine-exit-node-dominance.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; llvm.org/PR25439  ; The dominance of the generated non-affine subregion block was based on the diff --git a/polly/test/CodeGen/non-affine-phi-node-expansion-2.ll b/polly/test/CodeGen/non-affine-phi-node-expansion-2.ll index bfa3c15..2ad1e75 100644 --- a/polly/test/CodeGen/non-affine-phi-node-expansion-2.ll +++ b/polly/test/CodeGen/non-affine-phi-node-expansion-2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/non-affine-phi-node-expansion-3.ll b/polly/test/CodeGen/non-affine-phi-node-expansion-3.ll index b938633..386fe5f 100644 --- a/polly/test/CodeGen/non-affine-phi-node-expansion-3.ll +++ b/polly/test/CodeGen/non-affine-phi-node-expansion-3.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  define void @foo(ptr %A, i1 %cond0, i1 %cond1) {  entry: diff --git a/polly/test/CodeGen/non-affine-phi-node-expansion-4.ll b/polly/test/CodeGen/non-affine-phi-node-expansion-4.ll index 6460c42..5e5f34d 100644 --- a/polly/test/CodeGen/non-affine-phi-node-expansion-4.ll +++ b/polly/test/CodeGen/non-affine-phi-node-expansion-4.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  define void @foo(ptr %A, i1 %cond0, i1 %cond1) {  entry: diff --git a/polly/test/CodeGen/non-affine-phi-node-expansion.ll b/polly/test/CodeGen/non-affine-phi-node-expansion.ll index 1b6802f..db9f0d5 100644 --- a/polly/test/CodeGen/non-affine-phi-node-expansion.ll +++ b/polly/test/CodeGen/non-affine-phi-node-expansion.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  %struct.wombat = type {[4 x i32]} diff --git a/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize-2.ll b/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize-2.ll index 007a4c5..096eb86 100644 --- a/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize-2.ll +++ b/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This caused the code generation to generate invalid code as the same operand  ; of the PHI node in the non-affine region was synthesized at the wrong place. diff --git a/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize.ll b/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize.ll index 20edbf2..2810a8a 100644 --- a/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize.ll +++ b/polly/test/CodeGen/non-affine-region-exit-phi-incoming-synthesize.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This caused the code generation to generate invalid code as the same BBMap was  ; used for the whole non-affine region. When %add is synthesized for the diff --git a/polly/test/CodeGen/non-affine-region-implicit-store.ll b/polly/test/CodeGen/non-affine-region-implicit-store.ll index 0ff39d3..cdb2000 100644 --- a/polly/test/CodeGen/non-affine-region-implicit-store.ll +++ b/polly/test/CodeGen/non-affine-region-implicit-store.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; llvm.org/PR25438  ; After loop versioning, a dominance check of a non-affine subregion's exit node diff --git a/polly/test/CodeGen/non-affine-region-phi-references-in-scop-value.ll b/polly/test/CodeGen/non-affine-region-phi-references-in-scop-value.ll index 7df3d89..b4889c7 100644 --- a/polly/test/CodeGen/non-affine-region-phi-references-in-scop-value.ll +++ b/polly/test/CodeGen/non-affine-region-phi-references-in-scop-value.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-allow-nonaffine-loops \ -; RUN: -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-allow-nonaffine-loops -S < %s | FileCheck %s  ; This test verifies that values defined in another scop statement and used by  ; PHI-nodes in non-affine regions are code generated correctly. diff --git a/polly/test/CodeGen/non-affine-subregion-dominance-reuse.ll b/polly/test/CodeGen/non-affine-subregion-dominance-reuse.ll index 179062d..45465c6 100644 --- a/polly/test/CodeGen/non-affine-subregion-dominance-reuse.ll +++ b/polly/test/CodeGen/non-affine-subregion-dominance-reuse.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S -verify-dom-info \ -; RUN:     < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -verify-dom-info < %s | FileCheck %s  ;  ; Check that we do not reuse the B[i-1] GEP created in block S again in  ; block Q. Hence, we create two GEPs for B[i-1]: diff --git a/polly/test/CodeGen/non-affine-switch.ll b/polly/test/CodeGen/non-affine-switch.ll index 427e7e2..90d5efd 100644 --- a/polly/test/CodeGen/non-affine-switch.ll +++ b/polly/test/CodeGen/non-affine-switch.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly \ -; RUN: -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/CodeGen/non-affine-synthesized-in-branch.ll b/polly/test/CodeGen/non-affine-synthesized-in-branch.ll index 292c0f2..5bb4fd1 100644 --- a/polly/test/CodeGen/non-affine-synthesized-in-branch.ll +++ b/polly/test/CodeGen/non-affine-synthesized-in-branch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; llvm.org/PR25412  ; %synthgep caused %gep to be synthesized in subregion_if which was reused for diff --git a/polly/test/CodeGen/non-affine-update.ll b/polly/test/CodeGen/non-affine-update.ll index 03f091a..5826077 100644 --- a/polly/test/CodeGen/non-affine-update.ll +++ b/polly/test/CodeGen/non-affine-update.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN:     -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -S < %s | FileCheck %s  ;  ;    void non-affine-update(double A[], double C[], double B[]) {  ;      for (int i = 0; i < 10; i++) { diff --git a/polly/test/CodeGen/non-hoisted-load-needed-as-base-ptr.ll b/polly/test/CodeGen/non-hoisted-load-needed-as-base-ptr.ll index 153cdb7..eaf74d9 100644 --- a/polly/test/CodeGen/non-hoisted-load-needed-as-base-ptr.ll +++ b/polly/test/CodeGen/non-hoisted-load-needed-as-base-ptr.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -passes=polly-codegen -disable-output %s +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa '-passes=polly<no-default-opts>' -disable-output %s  ;  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/non_affine_float_compare.ll b/polly/test/CodeGen/non_affine_float_compare.ll index a359b66..9709e23 100644 --- a/polly/test/CodeGen/non_affine_float_compare.ll +++ b/polly/test/CodeGen/non_affine_float_compare.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen \ -; RUN:     -polly-allow-nonaffine-branches -S -verify-dom-info \ -; RUN:     < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-allow-nonaffine-branches -S -verify-dom-info < %s | FileCheck %s  ;  ;    void f(float *A) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/CodeGen/only_non_affine_error_region.ll b/polly/test/CodeGen/only_non_affine_error_region.ll index 445cef0..be7a8a2 100644 --- a/polly/test/CodeGen/only_non_affine_error_region.ll +++ b/polly/test/CodeGen/only_non_affine_error_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; CHECK-NOT: polly.start  ; diff --git a/polly/test/CodeGen/openmp_limit_threads.ll b/polly/test/CodeGen/openmp_limit_threads.ll index 4c33be3..730c572 100644 --- a/polly/test/CodeGen/openmp_limit_threads.ll +++ b/polly/test/CodeGen/openmp_limit_threads.ll @@ -1,10 +1,10 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -S < %s | FileCheck %s --check-prefix=AUTO -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -polly-num-threads=1 -S < %s | FileCheck %s --check-prefix=ONE -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -polly-num-threads=4 -S < %s | FileCheck %s --check-prefix=FOUR +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -S < %s | FileCheck %s --check-prefix=AUTO +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -polly-num-threads=1 -S < %s | FileCheck %s --check-prefix=ONE +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -polly-num-threads=4 -S < %s | FileCheck %s --check-prefix=FOUR -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -polly-omp-backend=LLVM -S < %s | FileCheck %s --check-prefix=LIBOMP-AUTO -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -polly-omp-backend=LLVM -polly-num-threads=1 -S < %s | FileCheck %s --check-prefix=LIBOMP-ONE -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -polly-omp-backend=LLVM -polly-num-threads=4 -S < %s | FileCheck %s --check-prefix=LIBOMP-FOUR +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -polly-omp-backend=LLVM -S < %s | FileCheck %s --check-prefix=LIBOMP-AUTO +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -polly-omp-backend=LLVM -polly-num-threads=1 -S < %s | FileCheck %s --check-prefix=LIBOMP-ONE +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -polly-omp-backend=LLVM -polly-num-threads=4 -S < %s | FileCheck %s --check-prefix=LIBOMP-FOUR  ; Ensure that the provided thread numbers are forwarded to the OpenMP calls.  ; diff --git a/polly/test/CodeGen/out-of-scop-phi-node-use.ll b/polly/test/CodeGen/out-of-scop-phi-node-use.ll index dd0a24b..8d5f747 100644 --- a/polly/test/CodeGen/out-of-scop-phi-node-use.ll +++ b/polly/test/CodeGen/out-of-scop-phi-node-use.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/CodeGen/param_div_div_div_2.ll b/polly/test/CodeGen/param_div_div_div_2.ll index 8eba644..3ae9502 100644 --- a/polly/test/CodeGen/param_div_div_div_2.ll +++ b/polly/test/CodeGen/param_div_div_div_2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s --check-prefix=IR  ;  ; Check that we guard the divisions because we moved them and thereby increased  ; their domain. diff --git a/polly/test/CodeGen/partial_write_array.ll b/polly/test/CodeGen/partial_write_array.ll index fad4b21..fe5fd8c 100644 --- a/polly/test/CodeGen/partial_write_array.ll +++ b/polly/test/CodeGen/partial_write_array.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; Partial write of an array access.  ; diff --git a/polly/test/CodeGen/partial_write_emptyset.ll b/polly/test/CodeGen/partial_write_emptyset.ll index 6782880..d0e5615 100644 --- a/polly/test/CodeGen/partial_write_emptyset.ll +++ b/polly/test/CodeGen/partial_write_emptyset.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; Partial write, where "partial" is the empty set.  ; The store is never executed in this case and we do generate it in the diff --git a/polly/test/CodeGen/partial_write_full_write_that_appears_partial.ll b/polly/test/CodeGen/partial_write_full_write_that_appears_partial.ll index b26bd81..a364142 100644 --- a/polly/test/CodeGen/partial_write_full_write_that_appears_partial.ll +++ b/polly/test/CodeGen/partial_write_full_write_that_appears_partial.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK:      polly.stmt.if.then81:                             ; preds = %polly.stmt.if.end75  ; CHECK-NEXT:   store float undef, ptr %fX64, align 4, !alias.scope !0, !noalias !3 diff --git a/polly/test/CodeGen/partial_write_impossible_restriction.ll b/polly/test/CodeGen/partial_write_impossible_restriction.ll index 7577b13..e0069eb 100644 --- a/polly/test/CodeGen/partial_write_impossible_restriction.ll +++ b/polly/test/CodeGen/partial_write_impossible_restriction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; The isl scheduler isolates %cond.false into two instances.  ; A partial write access in one of the instances was never executed, diff --git a/polly/test/CodeGen/partial_write_in_region.ll b/polly/test/CodeGen/partial_write_in_region.ll index 7c138c8..e7f4225 100644 --- a/polly/test/CodeGen/partial_write_in_region.ll +++ b/polly/test/CodeGen/partial_write_in_region.ll @@ -1,7 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN: -polly-import-jscop-postfix=transformed \ -; RUN: -verify-dom-info \ -; RUN: -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -verify-dom-info -S < %s | FileCheck %s  ;  ;    void foo(long A[], float B[], float C[]) {  ;      for (long i = 0; i < 1024; i++) { diff --git a/polly/test/CodeGen/partial_write_in_region_with_loop.ll b/polly/test/CodeGen/partial_write_in_region_with_loop.ll index ba15a78..85b56fe 100644 --- a/polly/test/CodeGen/partial_write_in_region_with_loop.ll +++ b/polly/test/CodeGen/partial_write_in_region_with_loop.ll @@ -1,7 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' \ -; RUN: -polly-import-jscop-postfix=transformed \ -; RUN: -verify-dom-info -polly-allow-nonaffine-loops \ -; RUN: -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -verify-dom-info -polly-allow-nonaffine-loops -S < %s | FileCheck %s  ; This test verifies that partial writes within non-affine loops are code  ; generated correctly. diff --git a/polly/test/CodeGen/partial_write_mapped_scalar.ll b/polly/test/CodeGen/partial_write_mapped_scalar.ll index b8c4138..bb99d4e 100644 --- a/polly/test/CodeGen/partial_write_mapped_scalar.ll +++ b/polly/test/CodeGen/partial_write_mapped_scalar.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; Partial write of a (mapped) scalar.  ; diff --git a/polly/test/CodeGen/partial_write_mapped_scalar_subregion.ll b/polly/test/CodeGen/partial_write_mapped_scalar_subregion.ll index 8c1953a..37a9d98 100644 --- a/polly/test/CodeGen/partial_write_mapped_scalar_subregion.ll +++ b/polly/test/CodeGen/partial_write_mapped_scalar_subregion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; Partial write of a (mapped) scalar in a non-affine subregion.  ; diff --git a/polly/test/CodeGen/perf_monitoring.ll b/polly/test/CodeGen/perf_monitoring.ll index 4b91e50..61f1222 100644 --- a/polly/test/CodeGen/perf_monitoring.ll +++ b/polly/test/CodeGen/perf_monitoring.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-codegen-perf-monitoring \ -; RUN:   -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-codegen-perf-monitoring -S < %s | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/CodeGen/perf_monitoring_cycles_per_scop.ll b/polly/test/CodeGen/perf_monitoring_cycles_per_scop.ll index d5c33d6..4c47a12 100644 --- a/polly/test/CodeGen/perf_monitoring_cycles_per_scop.ll +++ b/polly/test/CodeGen/perf_monitoring_cycles_per_scop.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-codegen-perf-monitoring \ -; RUN:   -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-codegen-perf-monitoring -S < %s | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/CodeGen/perf_monitoring_trip_counts_per_scop.ll b/polly/test/CodeGen/perf_monitoring_trip_counts_per_scop.ll index ab99c4d..6d09d8b 100644 --- a/polly/test/CodeGen/perf_monitoring_trip_counts_per_scop.ll +++ b/polly/test/CodeGen/perf_monitoring_trip_counts_per_scop.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-codegen-perf-monitoring \ -; RUN:   -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-codegen-perf-monitoring -S < %s | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/CodeGen/phi-defined-before-scop.ll b/polly/test/CodeGen/phi-defined-before-scop.ll index 447a14e..2ccd796 100644 --- a/polly/test/CodeGen/phi-defined-before-scop.ll +++ b/polly/test/CodeGen/phi-defined-before-scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK-LABEL: polly.merge_new_and_old:  ; CHECK-NEXT: %tmp7.ph.merge = phi ptr [ %tmp7.ph.final_reload, %polly.exiting ], [ %tmp7.ph, %bb6.region_exiting ] diff --git a/polly/test/CodeGen/phi_after_error_block_outside_of_scop.ll b/polly/test/CodeGen/phi_after_error_block_outside_of_scop.ll index e096aa2..1655104 100644 --- a/polly/test/CodeGen/phi_after_error_block_outside_of_scop.ll +++ b/polly/test/CodeGen/phi_after_error_block_outside_of_scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; Make sure code generation does not break in case an 'error block' is detected  ; outside of the scope. In this situation, we should not affect code generation. diff --git a/polly/test/CodeGen/phi_condition_modeling_1.ll b/polly/test/CodeGen/phi_condition_modeling_1.ll index 9d73d8a7..1cadac0 100644 --- a/polly/test/CodeGen/phi_condition_modeling_1.ll +++ b/polly/test/CodeGen/phi_condition_modeling_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    void f(int *A, int c, int N) {  ;      int tmp; diff --git a/polly/test/CodeGen/phi_condition_modeling_2.ll b/polly/test/CodeGen/phi_condition_modeling_2.ll index 2d13648..8f2e2a5 100644 --- a/polly/test/CodeGen/phi_condition_modeling_2.ll +++ b/polly/test/CodeGen/phi_condition_modeling_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S  -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    void f(int *A, int c, int N) {  ;      int tmp; diff --git a/polly/test/CodeGen/phi_conditional_simple_1.ll b/polly/test/CodeGen/phi_conditional_simple_1.ll index 25bcf2a..5f0f8de 100644 --- a/polly/test/CodeGen/phi_conditional_simple_1.ll +++ b/polly/test/CodeGen/phi_conditional_simple_1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=AST -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    void jd(int *A, int c) {  ;      for (int i = 0; i < 1024; i++) { diff --git a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_1.ll b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_1.ll index 43d29b9..703e55f 100644 --- a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_1.ll +++ b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This caused an lnt crash at some point, just verify it will run through.  ; diff --git a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_2.ll b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_2.ll index 9f28024..3d911e0 100644 --- a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_2.ll +++ b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This caused an lnt crash at some point, just verify it will run through and  ; produce the PHI node in the exit we are looking for. diff --git a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_3.ll b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_3.ll index 73e99ac..5f81f52 100644 --- a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_3.ll +++ b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This caused an lnt crash at some point, just verify it will run through and  ; produce the PHI node in the exit we are looking for. diff --git a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_5.ll b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_5.ll index 6c9bd56..abb86e6 100644 --- a/polly/test/CodeGen/phi_in_exit_early_lnt_failure_5.ll +++ b/polly/test/CodeGen/phi_in_exit_early_lnt_failure_5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; This caused an lnt crash at some point, just verify it will run through and  ; produce the PHI node in the exit we are looking for. diff --git a/polly/test/CodeGen/phi_loop_carried_float.ll b/polly/test/CodeGen/phi_loop_carried_float.ll index 4cb392d..47a8a81 100644 --- a/polly/test/CodeGen/phi_loop_carried_float.ll +++ b/polly/test/CodeGen/phi_loop_carried_float.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S  -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    float f(float *A, int N) {  ;      float tmp = 0; diff --git a/polly/test/CodeGen/phi_loop_carried_float_escape.ll b/polly/test/CodeGen/phi_loop_carried_float_escape.ll index 9fd8ad4..81dd5cec 100644 --- a/polly/test/CodeGen/phi_loop_carried_float_escape.ll +++ b/polly/test/CodeGen/phi_loop_carried_float_escape.ll @@ -1,8 +1,6 @@ -; RUN: opt %loadNPMPolly -S \ -; RUN: -polly-analyze-read-only-scalars=false -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S -polly-analyze-read-only-scalars=false '-passes=polly<no-default-opts>' < %s | FileCheck %s -; RUN: opt %loadNPMPolly -S \ -; RUN: -polly-analyze-read-only-scalars=true -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S -polly-analyze-read-only-scalars=true '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    float f(float *A, int N) {  ;      float tmp = 0; diff --git a/polly/test/CodeGen/phi_scalar_simple_1.ll b/polly/test/CodeGen/phi_scalar_simple_1.ll index 80a1c41..6331c24 100644 --- a/polly/test/CodeGen/phi_scalar_simple_1.ll +++ b/polly/test/CodeGen/phi_scalar_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    int jd(int *restrict A, int x, int N) {  ;      for (int i = 1; i < N; i++) diff --git a/polly/test/CodeGen/phi_scalar_simple_2.ll b/polly/test/CodeGen/phi_scalar_simple_2.ll index 614c8ac..0adadf6 100644 --- a/polly/test/CodeGen/phi_scalar_simple_2.ll +++ b/polly/test/CodeGen/phi_scalar_simple_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    int jd(int *restrict A, int x, int N, int c) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/CodeGen/phi_with_multi_exiting_edges_2.ll b/polly/test/CodeGen/phi_with_multi_exiting_edges_2.ll index 7e21666..4d6ede6 100644 --- a/polly/test/CodeGen/phi_with_multi_exiting_edges_2.ll +++ b/polly/test/CodeGen/phi_with_multi_exiting_edges_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; CHECK: polly.merge_new_and_old:  ; CHECK:   %result.ph.merge = phi float [ %result.ph.final_reload, %polly.exiting ], [ %result.ph, %next.region_exiting ] diff --git a/polly/test/CodeGen/phi_with_one_exit_edge.ll b/polly/test/CodeGen/phi_with_one_exit_edge.ll index 36a8684..4de24fb 100644 --- a/polly/test/CodeGen/phi_with_one_exit_edge.ll +++ b/polly/test/CodeGen/phi_with_one_exit_edge.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ;  ; CHECK: polly.merge_new_and_old: diff --git a/polly/test/CodeGen/pointer-type-expressions-2.ll b/polly/test/CodeGen/pointer-type-expressions-2.ll index 918e4c6..706b01d 100644 --- a/polly/test/CodeGen/pointer-type-expressions-2.ll +++ b/polly/test/CodeGen/pointer-type-expressions-2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CODEGEN  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  define void @foo(ptr %start, ptr %end) { diff --git a/polly/test/CodeGen/pointer-type-expressions.ll b/polly/test/CodeGen/pointer-type-expressions.ll index e7feebc..2478e22 100644 --- a/polly/test/CodeGen/pointer-type-expressions.ll +++ b/polly/test/CodeGen/pointer-type-expressions.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CODEGEN  ; void f(int a[], int N, float *P) {  ;   int i; diff --git a/polly/test/CodeGen/pointer-type-pointer-type-comparison.ll b/polly/test/CodeGen/pointer-type-pointer-type-comparison.ll index 9ee050a..cac6f4f 100644 --- a/polly/test/CodeGen/pointer-type-pointer-type-comparison.ll +++ b/polly/test/CodeGen/pointer-type-pointer-type-comparison.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CODEGEN  ;  ;    void f(int a[], int N, float *P, float *Q) { diff --git a/polly/test/CodeGen/pointer_rem.ll b/polly/test/CodeGen/pointer_rem.ll index b820231..ca5d866 100644 --- a/polly/test/CodeGen/pointer_rem.ll +++ b/polly/test/CodeGen/pointer_rem.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=print<polly-function-scops>,scop(print<polly-ast>)' -disable-output -S < %s | FileCheck %s --check-prefix=AST -; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=print<polly-function-scops>,scop(polly-codegen)' -S < %s | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly-custom<ast>' -polly-print-scops -polly-print-ast -disable-output -S < %s | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly-custom<codegen>' -polly-print-scops -S < %s | FileCheck %s --check-prefix=CODEGEN  target datalayout = "e-m:e-i64:64-i128:128-n8:16:32:64-S128"  target triple = "aarch64--linux-gnu" diff --git a/polly/test/CodeGen/pr25241.ll b/polly/test/CodeGen/pr25241.ll index 7547b0b..94be6d78 100644 --- a/polly/test/CodeGen/pr25241.ll +++ b/polly/test/CodeGen/pr25241.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; PR25241 (https://llvm.org/bugs/show_bug.cgi?id=25241)  ; Ensure that synthesized values of a PHI node argument are generated in the diff --git a/polly/test/CodeGen/ptrtoint_as_parameter.ll b/polly/test/CodeGen/ptrtoint_as_parameter.ll index a551d81..49a8c38 100644 --- a/polly/test/CodeGen/ptrtoint_as_parameter.ll +++ b/polly/test/CodeGen/ptrtoint_as_parameter.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; CHECK:      if.then260:  ; CHECK-NEXT:   %p.4 = getelementptr inbounds i8, ptr null, i64 1 diff --git a/polly/test/CodeGen/read-only-scalars.ll b/polly/test/CodeGen/read-only-scalars.ll index 365cbbc..2ae0f9e 100644 --- a/polly/test/CodeGen/read-only-scalars.ll +++ b/polly/test/CodeGen/read-only-scalars.ll @@ -1,9 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=false -passes=polly-codegen \ -; RUN:     \ -; RUN:     -S < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=true -passes=polly-codegen \ -; RUN:     \ -; RUN:     -S < %s | FileCheck %s -check-prefix=SCALAR +; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=false '-passes=polly<no-default-opts>' -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=true '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=SCALAR  ; CHECK-NOT: alloca diff --git a/polly/test/CodeGen/reduction.ll b/polly/test/CodeGen/reduction.ll index 8c5f707..21d8c0f 100644 --- a/polly/test/CodeGen/reduction.ll +++ b/polly/test/CodeGen/reduction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s 2>&1 | not FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s 2>&1 | not FileCheck %s  ;#include <string.h>  ;#include <stdio.h> diff --git a/polly/test/CodeGen/reduction_2.ll b/polly/test/CodeGen/reduction_2.ll index 060a186..f957682 100644 --- a/polly/test/CodeGen/reduction_2.ll +++ b/polly/test/CodeGen/reduction_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-invariant-load-hoisting=true '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s --allow-empty +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-invariant-load-hoisting=true '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s --allow-empty  ;#include <string.h>  ;#include <stdio.h> diff --git a/polly/test/CodeGen/reduction_simple_binary.ll b/polly/test/CodeGen/reduction_simple_binary.ll index 0fe1085..53cbdf4 100644 --- a/polly/test/CodeGen/reduction_simple_binary.ll +++ b/polly/test/CodeGen/reduction_simple_binary.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK: pragma simd reduction  ; diff --git a/polly/test/CodeGen/reggen_domtree_crash.ll b/polly/test/CodeGen/reggen_domtree_crash.ll index 58c2709..9d5ba4c 100644 --- a/polly/test/CodeGen/reggen_domtree_crash.ll +++ b/polly/test/CodeGen/reggen_domtree_crash.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-parallel -S < %s | FileCheck %s  ; CHECK: define ptr @ham(ptr %arg, i64 %arg1, i1 %arg2) diff --git a/polly/test/CodeGen/region-with-instructions.ll b/polly/test/CodeGen/region-with-instructions.ll index e5f7d0f..f061ac0 100644 --- a/polly/test/CodeGen/region-with-instructions.ll +++ b/polly/test/CodeGen/region-with-instructions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK-LABEL:   polly.stmt.bb48:  ; CHECK-NEXT:   %[[offset:.*]] = shl i64 %polly.indvar, 3 diff --git a/polly/test/CodeGen/region_exiting-domtree.ll b/polly/test/CodeGen/region_exiting-domtree.ll index 06e0d9d..16b265c 100644 --- a/polly/test/CodeGen/region_exiting-domtree.ll +++ b/polly/test/CodeGen/region_exiting-domtree.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -verify-dom-info -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -verify-dom-info -disable-output < %s  ; Verify that the DominatorTree is preserved correctly for the inserted  ; %polly.stmt.exit.exit block, which serves as new exit block for the generated diff --git a/polly/test/CodeGen/region_multiexit_partialwrite.ll b/polly/test/CodeGen/region_multiexit_partialwrite.ll index 39e04db..9d21d16 100644 --- a/polly/test/CodeGen/region_multiexit_partialwrite.ll +++ b/polly/test/CodeGen/region_multiexit_partialwrite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-codegen' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;codegen>' -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; This text case has a partial write of PHI in a region-statement. It  ; requires that the new PHINode from the region's exiting block is diff --git a/polly/test/CodeGen/run-time-condition-with-scev-parameters.ll b/polly/test/CodeGen/run-time-condition-with-scev-parameters.ll index 4afaab5..7984b7c 100644 --- a/polly/test/CodeGen/run-time-condition-with-scev-parameters.ll +++ b/polly/test/CodeGen/run-time-condition-with-scev-parameters.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=AST -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; TODO: FIXME: Simplify the context.  ; AST: if (n >= 1 && 0 == n <= -1) diff --git a/polly/test/CodeGen/run-time-condition.ll b/polly/test/CodeGen/run-time-condition.ll index 914b76f..44d2a4f 100644 --- a/polly/test/CodeGen/run-time-condition.ll +++ b/polly/test/CodeGen/run-time-condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/polly/test/CodeGen/scalar-references-used-in-scop-compute.ll b/polly/test/CodeGen/scalar-references-used-in-scop-compute.ll index 77306c1..102ef04 100644 --- a/polly/test/CodeGen/scalar-references-used-in-scop-compute.ll +++ b/polly/test/CodeGen/scalar-references-used-in-scop-compute.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; Test the code generation in the presence of a scalar out-of-scop value being  ; used from within the SCoP. diff --git a/polly/test/CodeGen/scalar-store-from-same-bb.ll b/polly/test/CodeGen/scalar-store-from-same-bb.ll index 0c1164b..1988f77 100644 --- a/polly/test/CodeGen/scalar-store-from-same-bb.ll +++ b/polly/test/CodeGen/scalar-store-from-same-bb.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly \ -; RUN: -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; This test ensures that the expression N + 1 that is stored in the phi-node  ; alloca, is directly computed and not incorrectly transferred through memory. diff --git a/polly/test/CodeGen/scalar_codegen_crash.ll b/polly/test/CodeGen/scalar_codegen_crash.ll index 375f097..0179072 100644 --- a/polly/test/CodeGen/scalar_codegen_crash.ll +++ b/polly/test/CodeGen/scalar_codegen_crash.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly \ -; RUN:     -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; This test cases used to crash the scalar code generation. Check that we  ; can generate code for it. diff --git a/polly/test/CodeGen/scev-backedgetaken.ll b/polly/test/CodeGen/scev-backedgetaken.ll index e094169..09fcfe3e 100644 --- a/polly/test/CodeGen/scev-backedgetaken.ll +++ b/polly/test/CodeGen/scev-backedgetaken.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; llvm.org/PR48422  ; Use of ScalarEvolution in Codegen not possible because DominatorTree is not updated. diff --git a/polly/test/CodeGen/scev-division-invariant-load.ll b/polly/test/CodeGen/scev-division-invariant-load.ll index 70f090e..5942ecb 100644 --- a/polly/test/CodeGen/scev-division-invariant-load.ll +++ b/polly/test/CodeGen/scev-division-invariant-load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s  ;  ; Check that we generate valid code as we did not use the preloaded  ; value of %tmp1 for the access function of the preloaded %tmp4. diff --git a/polly/test/CodeGen/scev.ll b/polly/test/CodeGen/scev.ll index e2b5afd..a09d8c5 100644 --- a/polly/test/CodeGen/scev.ll +++ b/polly/test/CodeGen/scev.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define fastcc void @f () inlinehint align 2 { diff --git a/polly/test/CodeGen/scev_expansion_in_nonaffine.ll b/polly/test/CodeGen/scev_expansion_in_nonaffine.ll index 0adb0ba..095c362 100644 --- a/polly/test/CodeGen/scev_expansion_in_nonaffine.ll +++ b/polly/test/CodeGen/scev_expansion_in_nonaffine.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ; bugpoint-reduced testcase of MiBench/consumer-lame/quantize-pvt.c from the  ; test-suite. diff --git a/polly/test/CodeGen/scev_looking_through_bitcasts.ll b/polly/test/CodeGen/scev_looking_through_bitcasts.ll index 142e83f..81f4b96 100644 --- a/polly/test/CodeGen/scev_looking_through_bitcasts.ll +++ b/polly/test/CodeGen/scev_looking_through_bitcasts.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Scalar write of bitcasted value. Instead of writing %b of type  ; %structty, the SCEV expression looks through the bitcast such that diff --git a/polly/test/CodeGen/scop_expander_insert_point.ll b/polly/test/CodeGen/scop_expander_insert_point.ll index fd73132..1cba756 100644 --- a/polly/test/CodeGen/scop_expander_insert_point.ll +++ b/polly/test/CodeGen/scop_expander_insert_point.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ;  ; CHECK:      entry:  ; CHECK-NEXT:   %outvalue.141.phiops = alloca i64 diff --git a/polly/test/CodeGen/scop_expander_segfault.ll b/polly/test/CodeGen/scop_expander_segfault.ll index d94a1fd..56d37a0 100644 --- a/polly/test/CodeGen/scop_expander_segfault.ll +++ b/polly/test/CodeGen/scop_expander_segfault.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S %s | FileCheck %s  ;  ; This test was extracted from gcc in SPEC2006 and it crashed our code  ; generation, or to be more precise, the ScopExpander due to a endless diff --git a/polly/test/CodeGen/scop_never_executed_runtime_check_location.ll b/polly/test/CodeGen/scop_never_executed_runtime_check_location.ll index 9f968e5..cdcfe83 100644 --- a/polly/test/CodeGen/scop_never_executed_runtime_check_location.ll +++ b/polly/test/CodeGen/scop_never_executed_runtime_check_location.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; Verify that we generate the runtime check code after the conditional branch  ; in the SCoP region entering block (here %entry). diff --git a/polly/test/CodeGen/select-base-pointer.ll b/polly/test/CodeGen/select-base-pointer.ll index 85be377..144c05b 100644 --- a/polly/test/CodeGen/select-base-pointer.ll +++ b/polly/test/CodeGen/select-base-pointer.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa -passes=polly-codegen -disable-output %s +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa '-passes=polly<no-default-opts>' -disable-output %s  ;  ; Check that we do not crash here.  ; diff --git a/polly/test/CodeGen/sequential_loops.ll b/polly/test/CodeGen/sequential_loops.ll index 33a3ee9..eeb3048 100644 --- a/polly/test/CodeGen/sequential_loops.ll +++ b/polly/test/CodeGen/sequential_loops.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#include <string.h>  ;#define N 1024 diff --git a/polly/test/CodeGen/simple_loop_non_single_exit.ll b/polly/test/CodeGen/simple_loop_non_single_exit.ll index a7e36bc..1b3518b 100644 --- a/polly/test/CodeGen/simple_loop_non_single_exit.ll +++ b/polly/test/CodeGen/simple_loop_non_single_exit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=CHECK-CODE +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CHECK-CODE  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/CodeGen/simple_loop_non_single_exit_2.ll b/polly/test/CodeGen/simple_loop_non_single_exit_2.ll index 22e9da0..3af9913 100644 --- a/polly/test/CodeGen/simple_loop_non_single_exit_2.ll +++ b/polly/test/CodeGen/simple_loop_non_single_exit_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=CHECK-CODE +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CHECK-CODE  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/CodeGen/simple_non_single_entry.ll b/polly/test/CodeGen/simple_non_single_entry.ll index c33a77a..8800dc7 100644 --- a/polly/test/CodeGen/simple_non_single_entry.ll +++ b/polly/test/CodeGen/simple_non_single_entry.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s -check-prefix=CHECK-CODE +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CHECK-CODE  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/CodeGen/simple_nonaffine_loop.ll b/polly/test/CodeGen/simple_nonaffine_loop.ll index bc62047..5b1cd19 100644 --- a/polly/test/CodeGen/simple_nonaffine_loop.ll +++ b/polly/test/CodeGen/simple_nonaffine_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-allow-nonaffine -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-allow-nonaffine -disable-output < %s | FileCheck %s  ;#include <stdio.h>  ;#include <stdlib.h> diff --git a/polly/test/CodeGen/single_do_loop_int_max_iterations.ll b/polly/test/CodeGen/single_do_loop_int_max_iterations.ll index a65e3a2..f0142f7 100644 --- a/polly/test/CodeGen/single_do_loop_int_max_iterations.ll +++ b/polly/test/CodeGen/single_do_loop_int_max_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#define N 20  ;#include "limits.h" diff --git a/polly/test/CodeGen/single_do_loop_int_param_iterations.ll b/polly/test/CodeGen/single_do_loop_int_param_iterations.ll index acccb48..cc5e7b2 100644 --- a/polly/test/CodeGen/single_do_loop_int_param_iterations.ll +++ b/polly/test/CodeGen/single_do_loop_int_param_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; XFAIL: *  ;define N 20 diff --git a/polly/test/CodeGen/single_do_loop_ll_max_iterations.ll b/polly/test/CodeGen/single_do_loop_ll_max_iterations.ll index 7a67f6ba..1299362 100644 --- a/polly/test/CodeGen/single_do_loop_ll_max_iterations.ll +++ b/polly/test/CodeGen/single_do_loop_ll_max_iterations.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s  ;#define N 20  ;#include "limits.h" diff --git a/polly/test/CodeGen/single_do_loop_one_iteration.ll b/polly/test/CodeGen/single_do_loop_one_iteration.ll index 2d93916..d025ef2 100644 --- a/polly/test/CodeGen/single_do_loop_one_iteration.ll +++ b/polly/test/CodeGen/single_do_loop_one_iteration.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; XFAIL: *  ;#define N 20 diff --git a/polly/test/CodeGen/single_do_loop_scev_replace.ll b/polly/test/CodeGen/single_do_loop_scev_replace.ll index 83c9e9d..b473e26 100644 --- a/polly/test/CodeGen/single_do_loop_scev_replace.ll +++ b/polly/test/CodeGen/single_do_loop_scev_replace.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#define N 20  ;#include "limits.h" diff --git a/polly/test/CodeGen/single_loop.ll b/polly/test/CodeGen/single_loop.ll index 2db3466..c04738e 100644 --- a/polly/test/CodeGen/single_loop.ll +++ b/polly/test/CodeGen/single_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#include <string.h>  ;#define N 1024 diff --git a/polly/test/CodeGen/single_loop_int_max_iterations.ll b/polly/test/CodeGen/single_loop_int_max_iterations.ll index f83e882..82ec7ff 100644 --- a/polly/test/CodeGen/single_loop_int_max_iterations.ll +++ b/polly/test/CodeGen/single_loop_int_max_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#define N 20  ;#include "limits.h" diff --git a/polly/test/CodeGen/single_loop_ll_max_iterations.ll b/polly/test/CodeGen/single_loop_ll_max_iterations.ll index 1427189..8affb71f 100644 --- a/polly/test/CodeGen/single_loop_ll_max_iterations.ll +++ b/polly/test/CodeGen/single_loop_ll_max_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#include "limits.h"  ;#define N 20 diff --git a/polly/test/CodeGen/single_loop_one_iteration.ll b/polly/test/CodeGen/single_loop_one_iteration.ll index 1a70d4a..307b8358 100644 --- a/polly/test/CodeGen/single_loop_one_iteration.ll +++ b/polly/test/CodeGen/single_loop_one_iteration.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;#define N 20  ; diff --git a/polly/test/CodeGen/single_loop_param.ll b/polly/test/CodeGen/single_loop_param.ll index 44ce123..1d78c7a 100644 --- a/polly/test/CodeGen/single_loop_param.ll +++ b/polly/test/CodeGen/single_loop_param.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  @A = common global [1024 x i32] zeroinitializer, align 16 ; <ptr> [#uses=3] diff --git a/polly/test/CodeGen/single_loop_param_less_equal.ll b/polly/test/CodeGen/single_loop_param_less_equal.ll index fda9bfa..5fad1d4 100644 --- a/polly/test/CodeGen/single_loop_param_less_equal.ll +++ b/polly/test/CodeGen/single_loop_param_less_equal.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen  -S < %s | FileCheck %s -check-prefix=CODEGEN -; RUN: opt %loadNPMPolly -passes=polly-codegen < %s | opt -passes='print<loops>' -disable-output 2>&1 | FileCheck %s -check-prefix=LOOPS +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' < %s | opt -passes='print<loops>' -disable-output 2>&1 | FileCheck %s -check-prefix=LOOPS  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  @A = common global [1024 x i32] zeroinitializer diff --git a/polly/test/CodeGen/single_loop_param_less_than.ll b/polly/test/CodeGen/single_loop_param_less_than.ll index b888c86..75a8cb2 100644 --- a/polly/test/CodeGen/single_loop_param_less_than.ll +++ b/polly/test/CodeGen/single_loop_param_less_than.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen  -S < %s | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s -check-prefix=CODEGEN  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  @A = common global [1024 x i32] zeroinitializer diff --git a/polly/test/CodeGen/single_loop_zero_iterations.ll b/polly/test/CodeGen/single_loop_zero_iterations.ll index b1ce491..3194dba 100644 --- a/polly/test/CodeGen/single_loop_zero_iterations.ll +++ b/polly/test/CodeGen/single_loop_zero_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=SCALAR --allow-empty +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=SCALAR --allow-empty  ;#define N 20  ; diff --git a/polly/test/CodeGen/split_edge_of_exit.ll b/polly/test/CodeGen/split_edge_of_exit.ll index f4b17e6..73d6006 100644 --- a/polly/test/CodeGen/split_edge_of_exit.ll +++ b/polly/test/CodeGen/split_edge_of_exit.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -verify-region-info -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -verify-region-info -disable-output < %s  ;  ; This is a scop directly precedented by a region, i.e. the scop's entry is the  ; region's exit block. This test is to ensure that the RegionInfo is correctly diff --git a/polly/test/CodeGen/split_edges.ll b/polly/test/CodeGen/split_edges.ll index b921202..03363f4 100644 --- a/polly/test/CodeGen/split_edges.ll +++ b/polly/test/CodeGen/split_edges.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -verify-region-info -verify-dom-info -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -verify-region-info -verify-dom-info -S < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  @A = common global [1536 x float] zeroinitializer diff --git a/polly/test/CodeGen/split_edges_2.ll b/polly/test/CodeGen/split_edges_2.ll index 8f4d48f..59df161 100644 --- a/polly/test/CodeGen/split_edges_2.ll +++ b/polly/test/CodeGen/split_edges_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -verify-region-info -verify-dom-info -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -verify-region-info -verify-dom-info -S < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/CodeGen/srem-in-other-bb.ll b/polly/test/CodeGen/srem-in-other-bb.ll index a13a1b6..177d86a 100644 --- a/polly/test/CodeGen/srem-in-other-bb.ll +++ b/polly/test/CodeGen/srem-in-other-bb.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN:     < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ;    void pos(float *A, long n) {  ;      for (long i = 0; i < 100; i++) diff --git a/polly/test/CodeGen/stack-overflow-in-load-hoisting.ll b/polly/test/CodeGen/stack-overflow-in-load-hoisting.ll index b49c4e1..5a490b68 100644 --- a/polly/test/CodeGen/stack-overflow-in-load-hoisting.ll +++ b/polly/test/CodeGen/stack-overflow-in-load-hoisting.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -verify-dom-info -passes=polly-codegen -S < %s \ -; RUN: -polly-invariant-load-hoisting=true | FileCheck %s +; RUN: opt %loadNPMPolly -verify-dom-info '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s | FileCheck %s  ;  ; This caused an infinite recursion during invariant load hoisting at some  ; point. Check it does not and we add a "false" runtime check. diff --git a/polly/test/CodeGen/stmt_split_no_dependence.ll b/polly/test/CodeGen/stmt_split_no_dependence.ll index bb878cc..d41e4a8 100644 --- a/polly/test/CodeGen/stmt_split_no_dependence.ll +++ b/polly/test/CodeGen/stmt_split_no_dependence.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; CHECK:   store i32 %9, ptr %scevgep, align 4, !alias.scope !3, !noalias !6  ; CHECK:   store i32 %11, ptr %scevgep4, align 4, !alias.scope !6, !noalias !3 diff --git a/polly/test/CodeGen/switch-in-non-affine-region.ll b/polly/test/CodeGen/switch-in-non-affine-region.ll index 1a9e7081b..6696efc 100644 --- a/polly/test/CodeGen/switch-in-non-affine-region.ll +++ b/polly/test/CodeGen/switch-in-non-affine-region.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly \ -; RUN: -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/CodeGen/synthesizable_phi_write_after_loop.ll b/polly/test/CodeGen/synthesizable_phi_write_after_loop.ll index b2a06236..86395f2 100644 --- a/polly/test/CodeGen/synthesizable_phi_write_after_loop.ll +++ b/polly/test/CodeGen/synthesizable_phi_write_after_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Check for the correct written value of a scalar phi write whose value is  ; defined within the loop, but its effective value is its last definition when diff --git a/polly/test/CodeGen/test-invalid-operands-for-select-2.ll b/polly/test/CodeGen/test-invalid-operands-for-select-2.ll index 5668063..b5172ba 100644 --- a/polly/test/CodeGen/test-invalid-operands-for-select-2.ll +++ b/polly/test/CodeGen/test-invalid-operands-for-select-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen -verify-loop-info < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -verify-loop-info < %s | FileCheck %s  ;  ; Check that we do not crash as described here: http://llvm.org/bugs/show_bug.cgi?id=21167  ; diff --git a/polly/test/CodeGen/test-invalid-operands-for-select.ll b/polly/test/CodeGen/test-invalid-operands-for-select.ll index fdc98fb..39cadc7 100644 --- a/polly/test/CodeGen/test-invalid-operands-for-select.ll +++ b/polly/test/CodeGen/test-invalid-operands-for-select.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; Check that we do not crash as described here: http://llvm.org/PR21167  ; diff --git a/polly/test/CodeGen/test.ll b/polly/test/CodeGen/test.ll index aad998b..7c28ca4 100644 --- a/polly/test/CodeGen/test.ll +++ b/polly/test/CodeGen/test.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; XFAIL: *  ;int bar1(); diff --git a/polly/test/CodeGen/two-loops-right-after-each-other-2.ll b/polly/test/CodeGen/two-loops-right-after-each-other-2.ll index 1c68389..d97a632 100644 --- a/polly/test/CodeGen/two-loops-right-after-each-other-2.ll +++ b/polly/test/CodeGen/two-loops-right-after-each-other-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK:       polly.merge_new_and_old:  ; CHECK-NEXT:    merge = phi diff --git a/polly/test/CodeGen/two-scops-in-row-invalidate-scevs.ll b/polly/test/CodeGen/two-scops-in-row-invalidate-scevs.ll index 4396c38..845d106 100644 --- a/polly/test/CodeGen/two-scops-in-row-invalidate-scevs.ll +++ b/polly/test/CodeGen/two-scops-in-row-invalidate-scevs.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; CHECK-LABEL: for.cond:  ; CHECK:         %num.0 = phi i32 [ %add, %for.body15 ], [ 0, %for.cond.pre_entry_bb ] diff --git a/polly/test/CodeGen/two-scops-in-row.ll b/polly/test/CodeGen/two-scops-in-row.ll index dd3f310..4b9d49c 100644 --- a/polly/test/CodeGen/two-scops-in-row.ll +++ b/polly/test/CodeGen/two-scops-in-row.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ignore-aliasing -disable-output < %s | FileCheck %s -check-prefix=SCALAR -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-ignore-aliasing -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ignore-aliasing -disable-output < %s | FileCheck %s -check-prefix=SCALAR +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-ignore-aliasing -disable-output < %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ; SCALAR: if ( diff --git a/polly/test/CodeGen/udiv_expansion_position.ll b/polly/test/CodeGen/udiv_expansion_position.ll index 354e3cd..2a3ba8a 100644 --- a/polly/test/CodeGen/udiv_expansion_position.ll +++ b/polly/test/CodeGen/udiv_expansion_position.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ;  ; Verify we do not crash when we synthezise code for the udiv in the SCoP.  ; diff --git a/polly/test/CodeGen/uninitialized_scalar_memory.ll b/polly/test/CodeGen/uninitialized_scalar_memory.ll index e08af07..ad0e6ca 100644 --- a/polly/test/CodeGen/uninitialized_scalar_memory.ll +++ b/polly/test/CodeGen/uninitialized_scalar_memory.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s | FileCheck %s  ;  ; Verify we initialize the scalar locations reserved for the incoming phi  ; values. diff --git a/polly/test/CodeGen/unpredictable-loop-unsynthesizable.ll b/polly/test/CodeGen/unpredictable-loop-unsynthesizable.ll index 4670680..e7f4d60 100644 --- a/polly/test/CodeGen/unpredictable-loop-unsynthesizable.ll +++ b/polly/test/CodeGen/unpredictable-loop-unsynthesizable.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -passes=polly-codegen \ -; RUN: -polly-invariant-load-hoisting=true -disable-output < %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -disable-output < %s  ; The loop for.body is a scop with invariant load hoisting, but does not  ; terminate predictably for ScalarEvolution. The scalar %1 therefore is not diff --git a/polly/test/CodeGen/variant_load_empty_domain.ll b/polly/test/CodeGen/variant_load_empty_domain.ll index 6f2d3dc..d1f4450 100644 --- a/polly/test/CodeGen/variant_load_empty_domain.ll +++ b/polly/test/CodeGen/variant_load_empty_domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  ;  ;  ;    void f(int *A) { diff --git a/polly/test/CodeGen/whole-scop-non-affine-subregion.ll b/polly/test/CodeGen/whole-scop-non-affine-subregion.ll index b342b1c..44f6dbc 100644 --- a/polly/test/CodeGen/whole-scop-non-affine-subregion.ll +++ b/polly/test/CodeGen/whole-scop-non-affine-subregion.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly \ -; RUN: -passes=polly-codegen -S < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s  ; CHECK: polly.start  ;    int /* pure */ g() diff --git a/polly/test/DeLICM/confused_order.ll b/polly/test/DeLICM/confused_order.ll index 0c19eb6..de340ef 100644 --- a/polly/test/DeLICM/confused_order.ll +++ b/polly/test/DeLICM/confused_order.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-delicm>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-delicm' -polly-import-jscop-postfix=transformed -disable-output -pass-remarks-missed=polly-delicm < %s 2>&1 | FileCheck %s -check-prefix=REMARKS +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -disable-output -pass-remarks-missed=polly-delicm < %s 2>&1 | FileCheck %s -check-prefix=REMARKS  ;  ; ForwardOptree changes the SCoP and may already map some accesses.  ; DeLICM must be prepared to encounter implicit reads diff --git a/polly/test/DeLICM/contradicting_assumed_context_and_domain.ll b/polly/test/DeLICM/contradicting_assumed_context_and_domain.ll index 66d9ae8..ba42692 100644 --- a/polly/test/DeLICM/contradicting_assumed_context_and_domain.ll +++ b/polly/test/DeLICM/contradicting_assumed_context_and_domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; The domain of bb14 contradicts the SCoP's assumptions. This leads to  ; 'anything goes' inside the statement since it is never executed, diff --git a/polly/test/DeLICM/load-in-cond-inf-loop.ll b/polly/test/DeLICM/load-in-cond-inf-loop.ll index a78a469..19cc334 100644 --- a/polly/test/DeLICM/load-in-cond-inf-loop.ll +++ b/polly/test/DeLICM/load-in-cond-inf-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ; When %b is 0, %for.body13 is an infinite loop. In this case the loaded  ; value %1 is not used anywhere. diff --git a/polly/test/DeLICM/map_memset_zero.ll b/polly/test/DeLICM/map_memset_zero.ll index 9a8e598..cc4e0ab 100644 --- a/polly/test/DeLICM/map_memset_zero.ll +++ b/polly/test/DeLICM/map_memset_zero.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck -match-full-lines %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Check that PHI mapping works even in presence of a memset whose'  ; zero value is used. diff --git a/polly/test/DeLICM/nomap_alreadymapped.ll b/polly/test/DeLICM/nomap_alreadymapped.ll index da5f4ec..9e49300 100644 --- a/polly/test/DeLICM/nomap_alreadymapped.ll +++ b/polly/test/DeLICM/nomap_alreadymapped.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/nomap_escaping.ll b/polly/test/DeLICM/nomap_escaping.ll index 6095536..6460dbd 100644 --- a/polly/test/DeLICM/nomap_escaping.ll +++ b/polly/test/DeLICM/nomap_escaping.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/nomap_occupied.ll b/polly/test/DeLICM/nomap_occupied.ll index 9ba8ce2..72eea57 100644 --- a/polly/test/DeLICM/nomap_occupied.ll +++ b/polly/test/DeLICM/nomap_occupied.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/nomap_readonly.ll b/polly/test/DeLICM/nomap_readonly.ll index 7a185d3..67bac06 100644 --- a/polly/test/DeLICM/nomap_readonly.ll +++ b/polly/test/DeLICM/nomap_readonly.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      fsomeval = 21.0 + 21.0; diff --git a/polly/test/DeLICM/nomap_spuriouswrite.ll b/polly/test/DeLICM/nomap_spuriouswrite.ll index 0ed7f6e..f3fcb0c 100644 --- a/polly/test/DeLICM/nomap_spuriouswrite.ll +++ b/polly/test/DeLICM/nomap_spuriouswrite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/nomap_storagesize.ll b/polly/test/DeLICM/nomap_storagesize.ll index bf851ac..0f2943a 100644 --- a/polly/test/DeLICM/nomap_storagesize.ll +++ b/polly/test/DeLICM/nomap_storagesize.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(float *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/nomap_writewrite.ll b/polly/test/DeLICM/nomap_writewrite.ll index 9fcd52a..fc8459a 100644 --- a/polly/test/DeLICM/nomap_writewrite.ll +++ b/polly/test/DeLICM/nomap_writewrite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/outofquota-reverseDomain.ll b/polly/test/DeLICM/outofquota-reverseDomain.ll index 1f7527c8..d48665bd 100644 --- a/polly/test/DeLICM/outofquota-reverseDomain.ll +++ b/polly/test/DeLICM/outofquota-reverseDomain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-delicm-max-ops=1000000 '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-delicm-max-ops=1000000 '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; This causes an assertion to fail on out-of-quota after 1000000 operations.  ; (The error was specific to -polly-delicm-max-ops=1000000 and changes diff --git a/polly/test/DeLICM/pass_existence.ll b/polly/test/DeLICM/pass_existence.ll index 64302d9..d784655 100644 --- a/polly/test/DeLICM/pass_existence.ll +++ b/polly/test/DeLICM/pass_existence.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -passes=polly-delicm -disable-output < %s -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=scop(print<polly-delicm>)' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; Simple test for the existence of the DeLICM pass.  ; diff --git a/polly/test/DeLICM/pr41656.ll b/polly/test/DeLICM/pr41656.ll index 2a92503..82799e4 100644 --- a/polly/test/DeLICM/pr41656.ll +++ b/polly/test/DeLICM/pr41656.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>,scop(print<polly-delicm>)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-scops -polly-print-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ; llvm.org/PR41656  ; diff --git a/polly/test/DeLICM/pr48783.ll b/polly/test/DeLICM/pr48783.ll index deba8bf..10f8b64 100644 --- a/polly/test/DeLICM/pr48783.ll +++ b/polly/test/DeLICM/pr48783.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>,scop(print<polly-delicm>)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-scops -polly-print-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ; llvm.org/PR48783  ; diff --git a/polly/test/DeLICM/reduction.ll b/polly/test/DeLICM/reduction.ll index 29b7a36..5d6531f 100644 --- a/polly/test/DeLICM/reduction.ll +++ b/polly/test/DeLICM/reduction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-delicm-partial-writes=true '-passes=print<polly-delicm>' -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-delicm-partial-writes=true '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck -match-full-lines %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_constant_selfconflict.ll b/polly/test/DeLICM/reduction_constant_selfconflict.ll index 012e0a07..223a429 100644 --- a/polly/test/DeLICM/reduction_constant_selfconflict.ll +++ b/polly/test/DeLICM/reduction_constant_selfconflict.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<flatten;delicm>' -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate.ll b/polly/test/DeLICM/reduction_looprotate.ll index 341cc09..b8eefe5 100644 --- a/polly/test/DeLICM/reduction_looprotate.ll +++ b/polly/test/DeLICM/reduction_looprotate.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-flatten-schedule -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<flatten;delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_alwaystaken.ll b/polly/test/DeLICM/reduction_looprotate_alwaystaken.ll index a58eabb..627a445 100644 --- a/polly/test/DeLICM/reduction_looprotate_alwaystaken.ll +++ b/polly/test/DeLICM/reduction_looprotate_alwaystaken.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; Verify that delicm can cope with never taken PHI incoming edges.  ; The edge %body -> %body_phi is never taken, hence the access MemoryKind::PHI, diff --git a/polly/test/DeLICM/reduction_looprotate_gvnpre.ll b/polly/test/DeLICM/reduction_looprotate_gvnpre.ll index 5a81441..1d3a789 100644 --- a/polly/test/DeLICM/reduction_looprotate_gvnpre.ll +++ b/polly/test/DeLICM/reduction_looprotate_gvnpre.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-partial-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck -check-prefix=PARTIAL %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-partial-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck -check-prefix=PARTIAL %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_gvnpre_cond1.ll b/polly/test/DeLICM/reduction_looprotate_gvnpre_cond1.ll index d9c5268..37499cd 100644 --- a/polly/test/DeLICM/reduction_looprotate_gvnpre_cond1.ll +++ b/polly/test/DeLICM/reduction_looprotate_gvnpre_cond1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Load (but not store) of A[j] hoisted, reduction only over some iterations.  ; diff --git a/polly/test/DeLICM/reduction_looprotate_gvnpre_cond2.ll b/polly/test/DeLICM/reduction_looprotate_gvnpre_cond2.ll index 6a4223f..79a700f 100644 --- a/polly/test/DeLICM/reduction_looprotate_gvnpre_cond2.ll +++ b/polly/test/DeLICM/reduction_looprotate_gvnpre_cond2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Load (but not store) of A[j] hoisted, reduction not written in all iterations.  ; FIXME: %join is not mapped because the MemoryKind::Value mapping does not diff --git a/polly/test/DeLICM/reduction_looprotate_gvnpre_nopreheader.ll b/polly/test/DeLICM/reduction_looprotate_gvnpre_nopreheader.ll index bf4b801..7e82daa 100644 --- a/polly/test/DeLICM/reduction_looprotate_gvnpre_nopreheader.ll +++ b/polly/test/DeLICM/reduction_looprotate_gvnpre_nopreheader.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Hosted reduction load (but not the store) without preheader.  ; diff --git a/polly/test/DeLICM/reduction_looprotate_hoisted.ll b/polly/test/DeLICM/reduction_looprotate_hoisted.ll index 795b949..7dc6e0f 100644 --- a/polly/test/DeLICM/reduction_looprotate_hoisted.ll +++ b/polly/test/DeLICM/reduction_looprotate_hoisted.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-invariant-load-hoisting -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-invariant-load-hoisting '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(int *A, int* StartPtr) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_licm.ll b/polly/test/DeLICM/reduction_looprotate_licm.ll index 935f31a..a9c55a8 100644 --- a/polly/test/DeLICM/reduction_looprotate_licm.ll +++ b/polly/test/DeLICM/reduction_looprotate_licm.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_licm2.ll b/polly/test/DeLICM/reduction_looprotate_licm2.ll index 8b06e74..b98950b 100644 --- a/polly/test/DeLICM/reduction_looprotate_licm2.ll +++ b/polly/test/DeLICM/reduction_looprotate_licm2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; Use %phi instead of the normal %add; that is, the last last iteration will  ; be ignored such the %phi cannot be written to A[3] in %body. diff --git a/polly/test/DeLICM/reduction_looprotate_licm_double_write.ll b/polly/test/DeLICM/reduction_looprotate_licm_double_write.ll index 51bb729..4424d90 100644 --- a/polly/test/DeLICM/reduction_looprotate_licm_double_write.ll +++ b/polly/test/DeLICM/reduction_looprotate_licm_double_write.ll @@ -1,7 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule \ -; RUN: -polly-delicm-overapproximate-writes=true \ -; RUN: -polly-delicm-compute-known=true -polly-print-delicm \ -; RUN: -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; Make sure delicm works even in case two stores that store the same value.  ; diff --git a/polly/test/DeLICM/reduction_looprotate_licm_nopreheader.ll b/polly/test/DeLICM/reduction_looprotate_licm_nopreheader.ll index 027df44..7d20b8d 100644 --- a/polly/test/DeLICM/reduction_looprotate_licm_nopreheader.ll +++ b/polly/test/DeLICM/reduction_looprotate_licm_nopreheader.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ; Register-promoted reduction but without preheader.  ; diff --git a/polly/test/DeLICM/reduction_looprotate_load.ll b/polly/test/DeLICM/reduction_looprotate_load.ll index 6aa83ae1..e288a86 100644 --- a/polly/test/DeLICM/reduction_looprotate_load.ll +++ b/polly/test/DeLICM/reduction_looprotate_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(int *A, double* StartPtr) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_loopguard_gvnpre.ll b/polly/test/DeLICM/reduction_looprotate_loopguard_gvnpre.ll index 4ea3fa5..4582f0a 100644 --- a/polly/test/DeLICM/reduction_looprotate_loopguard_gvnpre.ll +++ b/polly/test/DeLICM/reduction_looprotate_loopguard_gvnpre.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Reduction over parametric number of elements and a loopguard if the  ; reduction loop is not executed at all. Load hoisted before loop. diff --git a/polly/test/DeLICM/reduction_looprotate_loopguard_licm1.ll b/polly/test/DeLICM/reduction_looprotate_loopguard_licm1.ll index 2e7abe4..7df2885 100644 --- a/polly/test/DeLICM/reduction_looprotate_loopguard_licm1.ll +++ b/polly/test/DeLICM/reduction_looprotate_loopguard_licm1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Reduction over parametric number of elements and a loopguard if the  ; reduction loop is not executed at all. diff --git a/polly/test/DeLICM/reduction_looprotate_loopguard_licm2.ll b/polly/test/DeLICM/reduction_looprotate_loopguard_licm2.ll index 60afdeb5f..a1bd5d3 100644 --- a/polly/test/DeLICM/reduction_looprotate_loopguard_licm2.ll +++ b/polly/test/DeLICM/reduction_looprotate_loopguard_licm2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Reduction over parametric number of elements and a loopguard if the  ; reduction loop is not executed at all, such that A[j] is also not written to. diff --git a/polly/test/DeLICM/reduction_looprotate_loopguard_licm3.ll b/polly/test/DeLICM/reduction_looprotate_loopguard_licm3.ll index e63b457..8329a85 100644 --- a/polly/test/DeLICM/reduction_looprotate_loopguard_licm3.ll +++ b/polly/test/DeLICM/reduction_looprotate_loopguard_licm3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Reduction over parametric number of elements and a loopguard if the  ; reduction loop is not executed at all, such that A[j] is also not accessed. diff --git a/polly/test/DeLICM/reduction_looprotate_readonly.ll b/polly/test/DeLICM/reduction_looprotate_readonly.ll index a953546..5227f42 100644 --- a/polly/test/DeLICM/reduction_looprotate_readonly.ll +++ b/polly/test/DeLICM/reduction_looprotate_readonly.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A, double Start) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_synthesizable.ll b/polly/test/DeLICM/reduction_looprotate_synthesizable.ll index 3d48691..77d823c 100644 --- a/polly/test/DeLICM/reduction_looprotate_synthesizable.ll +++ b/polly/test/DeLICM/reduction_looprotate_synthesizable.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(int *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_looprotate_undef.ll b/polly/test/DeLICM/reduction_looprotate_undef.ll index 8c0544e..f70df60 100644 --- a/polly/test/DeLICM/reduction_looprotate_undef.ll +++ b/polly/test/DeLICM/reduction_looprotate_undef.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-overapproximate-writes=true -polly-delicm-compute-known=true -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(int *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_overapproximate.ll b/polly/test/DeLICM/reduction_overapproximate.ll index 2d33d3a..d6cbb70 100644 --- a/polly/test/DeLICM/reduction_overapproximate.ll +++ b/polly/test/DeLICM/reduction_overapproximate.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-compute-known=true -polly-delicm-overapproximate-writes=true -polly-delicm-partial-writes=false -polly-print-delicm -disable-output < %s | FileCheck %s --check-prefix=APPROX -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-compute-known=true -polly-delicm-overapproximate-writes=false -polly-delicm-partial-writes=false  -polly-print-delicm -disable-output < %s | FileCheck %s --check-prefix=EXACT -; RUN: opt %loadPolly -polly-stmt-granularity=bb -polly-flatten-schedule -polly-delicm-compute-known=true -polly-delicm-partial-writes=true -polly-print-delicm -disable-output < %s | FileCheck %s --check-prefix=PARTIAL +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-compute-known=true -polly-delicm-overapproximate-writes=true -polly-delicm-partial-writes=false -polly-print-delicm -disable-output < %s | FileCheck %s --check-prefix=APPROX +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-compute-known=true -polly-delicm-overapproximate-writes=false -polly-delicm-partial-writes=false -polly-print-delicm -disable-output < %s | FileCheck %s --check-prefix=EXACT +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<flatten;delicm>' -polly-delicm-compute-known=true -polly-delicm-partial-writes=true -polly-print-delicm -disable-output < %s | FileCheck %s --check-prefix=PARTIAL  ;  ;    void func(double *A {  ;      for (int j = -1; j < 3; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_preheader.ll b/polly/test/DeLICM/reduction_preheader.ll index c6e3643..f3ce58b 100644 --- a/polly/test/DeLICM/reduction_preheader.ll +++ b/polly/test/DeLICM/reduction_preheader.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-flatten-schedule -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<flatten;delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reduction_unrelatedunusual.ll b/polly/test/DeLICM/reduction_unrelatedunusual.ll index 97826f6..542cec7 100644 --- a/polly/test/DeLICM/reduction_unrelatedunusual.ll +++ b/polly/test/DeLICM/reduction_unrelatedunusual.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-delicm-partial-writes=true '-passes=print<polly-delicm>' -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-delicm-partial-writes=true '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Map %add and %phi to A[j].  ; The non-analyzable store to C[0] is unrelated and can be ignored. diff --git a/polly/test/DeLICM/reject_loadafterstore.ll b/polly/test/DeLICM/reject_loadafterstore.ll index 4460620..d56b237 100644 --- a/polly/test/DeLICM/reject_loadafterstore.ll +++ b/polly/test/DeLICM/reject_loadafterstore.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output -pass-remarks-missed=polly-delicm < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output -pass-remarks-missed=polly-delicm < %s 2>&1 | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reject_outofquota.ll b/polly/test/DeLICM/reject_outofquota.ll index 9bc6bf1..9b7f8e5 100644 --- a/polly/test/DeLICM/reject_outofquota.ll +++ b/polly/test/DeLICM/reject_outofquota.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -pass-remarks-analysis=polly-delicm -polly-delicm-max-ops=1 -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=polly-delicm,print<polly-dependences>' -polly-delicm-max-ops=1 -polly-dependences-computeout=0 -disable-output < %s | FileCheck %s -check-prefix=DEP +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -pass-remarks-analysis=polly-delicm -polly-delicm-max-ops=1 -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps;delicm>' -polly-print-deps -polly-delicm-max-ops=1 -polly-dependences-computeout=0 -disable-output < %s | FileCheck %s -check-prefix=DEP  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reject_storeafterstore.ll b/polly/test/DeLICM/reject_storeafterstore.ll index ddd13da..0fea4d7 100644 --- a/polly/test/DeLICM/reject_storeafterstore.ll +++ b/polly/test/DeLICM/reject_storeafterstore.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reject_storeinsubregion.ll b/polly/test/DeLICM/reject_storeinsubregion.ll index c987156..0b75c16 100644 --- a/polly/test/DeLICM/reject_storeinsubregion.ll +++ b/polly/test/DeLICM/reject_storeinsubregion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/reject_unusualstore.ll b/polly/test/DeLICM/reject_unusualstore.ll index 342888c6..311a735 100644 --- a/polly/test/DeLICM/reject_unusualstore.ll +++ b/polly/test/DeLICM/reject_unusualstore.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-delicm>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -passes=polly-delicm -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=STATS +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<delicm>' -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=STATS  ; REQUIRES: asserts  ;  ;    void func(double *A) { diff --git a/polly/test/DeLICM/skip_maywrite.ll b/polly/test/DeLICM/skip_maywrite.ll index 0d30791..14de2b9 100644 --- a/polly/test/DeLICM/skip_maywrite.ll +++ b/polly/test/DeLICM/skip_maywrite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeLICM/skip_multiaccess.ll b/polly/test/DeLICM/skip_multiaccess.ll index a7c79f7..a213a91 100644 --- a/polly/test/DeLICM/skip_multiaccess.ll +++ b/polly/test/DeLICM/skip_multiaccess.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-delicm -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ; llvm.org/PR34485  ; llvm.org/PR34989 diff --git a/polly/test/DeLICM/skip_notinloop.ll b/polly/test/DeLICM/skip_notinloop.ll index 8e265e1..3a2dede 100644 --- a/polly/test/DeLICM/skip_notinloop.ll +++ b/polly/test/DeLICM/skip_notinloop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void func(double *A) {  ;      double phi = 0.0; diff --git a/polly/test/DeLICM/skip_scalaraccess.ll b/polly/test/DeLICM/skip_scalaraccess.ll index 2cf13af..a0ed9f7 100644 --- a/polly/test/DeLICM/skip_scalaraccess.ll +++ b/polly/test/DeLICM/skip_scalaraccess.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -pass-remarks-missed=polly-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void func(double *A) {  ;      for (int j = 0; j < 2; j += 1) { /* outer */ diff --git a/polly/test/DeadCodeElimination/chained_iterations.ll b/polly/test/DeadCodeElimination/chained_iterations.ll index f3bf07b..f1e4707 100644 --- a/polly/test/DeadCodeElimination/chained_iterations.ll +++ b/polly/test/DeadCodeElimination/chained_iterations.ll @@ -1,5 +1,5 @@ -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-dce,print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=CHECK-DCE +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-custom<dce;ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=CHECK-DCE  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;  ; for(i = 0; i < 200; i++ ) diff --git a/polly/test/DeadCodeElimination/chained_iterations_2.ll b/polly/test/DeadCodeElimination/chained_iterations_2.ll index 52f034f..6ecc07c 100644 --- a/polly/test/DeadCodeElimination/chained_iterations_2.ll +++ b/polly/test/DeadCodeElimination/chained_iterations_2.ll @@ -1,5 +1,5 @@ -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-dce,print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=CHECK-DCE +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-custom<dce;ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=CHECK-DCE  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;  ; for(i = 0; i < 200; i++ ) diff --git a/polly/test/DeadCodeElimination/computeout.ll b/polly/test/DeadCodeElimination/computeout.ll index e54df42..b43142b 100644 --- a/polly/test/DeadCodeElimination/computeout.ll +++ b/polly/test/DeadCodeElimination/computeout.ll @@ -1,5 +1,5 @@ -; RUN: opt -S %loadNPMPolly "-passes=scop(polly-dce,print<polly-ast>)" < %s | FileCheck %s -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa "-passes=scop(polly-dce,print<polly-ast>)" -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s -check-prefix=TIMEOUT +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<dce;ast>' -polly-print-ast < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<dce;ast>' -polly-print-ast -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s -check-prefix=TIMEOUT  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;     for(i = 0; i < 100; i++ ) diff --git a/polly/test/DeadCodeElimination/dead_iteration_elimination.ll b/polly/test/DeadCodeElimination/dead_iteration_elimination.ll index c102f60..85eea91 100644 --- a/polly/test/DeadCodeElimination/dead_iteration_elimination.ll +++ b/polly/test/DeadCodeElimination/dead_iteration_elimination.ll @@ -1,4 +1,4 @@ -; RUN: opt -S %loadNPMPolly "-passes=scop(polly-dce,print<polly-ast>)" -polly-dependences-analysis-type=value-based -polly-dce-precise-steps=2 < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<dce;ast>' -polly-print-ast -polly-dependences-analysis-type=value-based -polly-dce-precise-steps=2 < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;  ; for(i = 0; i < 200; i++ ) diff --git a/polly/test/DeadCodeElimination/non-affine-affine-mix.ll b/polly/test/DeadCodeElimination/non-affine-affine-mix.ll index 36f5547..21b7c5c 100644 --- a/polly/test/DeadCodeElimination/non-affine-affine-mix.ll +++ b/polly/test/DeadCodeElimination/non-affine-affine-mix.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-dce,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<dce;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;    void f(int *A) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/DeadCodeElimination/non-affine.ll b/polly/test/DeadCodeElimination/non-affine.ll index ef528b4..86cabe65 100644 --- a/polly/test/DeadCodeElimination/non-affine.ll +++ b/polly/test/DeadCodeElimination/non-affine.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-dce,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<dce;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ; CHECK: for (int c0 = 0; c0 <= 1023; c0 += 1)  ; diff --git a/polly/test/DeadCodeElimination/null_schedule.ll b/polly/test/DeadCodeElimination/null_schedule.ll index 01d34e9..507d6901 100644 --- a/polly/test/DeadCodeElimination/null_schedule.ll +++ b/polly/test/DeadCodeElimination/null_schedule.ll @@ -1,4 +1,4 @@ -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-dce,print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=CHECK-DCE +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-dependences-analysis-type=value-based '-passes=polly-custom<dce;ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=CHECK-DCE  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; A[0] = 1;  ; diff --git a/polly/test/DependenceInfo/computeout.ll b/polly/test/DependenceInfo/computeout.ll index c2a3456..3fdc400 100644 --- a/polly/test/DependenceInfo/computeout.ll +++ b/polly/test/DependenceInfo/computeout.ll @@ -1,5 +1,5 @@ -; RUN: opt -S %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s -check-prefix=VALUE -; RUN: opt -S %loadNPMPolly '-passes=print<polly-dependences>' -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s -check-prefix=TIMEOUT +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s -check-prefix=VALUE +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s -check-prefix=TIMEOUT  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;     for(i = 0; i < 100; i++ ) diff --git a/polly/test/DependenceInfo/different_schedule_dimensions.ll b/polly/test/DependenceInfo/different_schedule_dimensions.ll index f89791f..69274f1 100644 --- a/polly/test/DependenceInfo/different_schedule_dimensions.ll +++ b/polly/test/DependenceInfo/different_schedule_dimensions.ll @@ -1,5 +1,4 @@ -; RUN: opt -S %loadNPMPolly '-passes=print<polly-dependences>' \ -; RUN:                   -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ; CHECK: RAW dependences:  ; CHECK:   { Stmt_bb9[0] -> Stmt_bb10[0] } diff --git a/polly/test/DependenceInfo/do_pluto_matmult.ll b/polly/test/DependenceInfo/do_pluto_matmult.ll index b88cf9b..2a0027b 100644 --- a/polly/test/DependenceInfo/do_pluto_matmult.ll +++ b/polly/test/DependenceInfo/do_pluto_matmult.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -polly-dependences-analysis-type=value-based -disable-output < %s | FileCheck %s -check-prefix=VALUE -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -polly-dependences-analysis-type=memory-based -disable-output < %s | FileCheck %s -check-prefix=MEMORY +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -disable-output < %s | FileCheck %s -check-prefix=VALUE +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=memory-based -disable-output < %s | FileCheck %s -check-prefix=MEMORY  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/DependenceInfo/fine_grain_dep_0.ll b/polly/test/DependenceInfo/fine_grain_dep_0.ll index 5abbf48..06a1968 100644 --- a/polly/test/DependenceInfo/fine_grain_dep_0.ll +++ b/polly/test/DependenceInfo/fine_grain_dep_0.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-dependences>' -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=reference-wise -disable-output < %s | FileCheck %s --check-prefix=REF -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-dependences>' -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s --check-prefix=ACC +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=reference-wise -disable-output < %s | FileCheck %s --check-prefix=REF +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s --check-prefix=ACC  ; REF:      RAW dependences:  ; REF-NEXT:     [N] -> { [Stmt_for_body[i0] -> MemRef_b[]] -> [Stmt_for_body[6 + i0] -> MemRef_b[]] : 0 <= i0 <= -13 + N; Stmt_for_body[i0] -> Stmt_for_body[6 + i0] : 0 <= i0 <= -13 + N; Stmt_for_body[i0] -> Stmt_for_body[4 + i0] : 0 <= i0 <= -11 + N; [Stmt_for_body[i0] -> MemRef_a[]] -> [Stmt_for_body[4 + i0] -> MemRef_a[]] : 0 <= i0 <= -11 + N } diff --git a/polly/test/DependenceInfo/generate_may_write_dependence_info.ll b/polly/test/DependenceInfo/generate_may_write_dependence_info.ll index 6773234..9875257 100644 --- a/polly/test/DependenceInfo/generate_may_write_dependence_info.ll +++ b/polly/test/DependenceInfo/generate_may_write_dependence_info.ll @@ -1,4 +1,4 @@ -; RUN: opt -S %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s -check-prefix=VALUE +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s -check-prefix=VALUE  target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"  ;                     for (int i = 0; i < N; i++) { diff --git a/polly/test/DependenceInfo/infeasible_context.ll b/polly/test/DependenceInfo/infeasible_context.ll index cde3102d..c9473e6 100644 --- a/polly/test/DependenceInfo/infeasible_context.ll +++ b/polly/test/DependenceInfo/infeasible_context.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  | FileCheck %s -check-prefix=FUNC-SCOP -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,scop(print<polly-dependences>)' -disable-output < %s 2>&1 \ -; RUN:  | FileCheck %s -check-prefix=FUNC-DEPS +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=FUNC-SCOP +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-detect -polly-print-deps -disable-output < %s 2>&1 | FileCheck %s -check-prefix=FUNC-DEPS  ;  ; FUNC-SCOP-NOT: Statement  ; FUNC-DEPS-NOT: RAW dependences diff --git a/polly/test/DependenceInfo/may_writes_do_not_block_must_writes_for_war.ll b/polly/test/DependenceInfo/may_writes_do_not_block_must_writes_for_war.ll index 392a347..92e6cb8 100644 --- a/polly/test/DependenceInfo/may_writes_do_not_block_must_writes_for_war.ll +++ b/polly/test/DependenceInfo/may_writes_do_not_block_must_writes_for_war.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; Verify that the presence of a may-write (S1) between a read (S0) and a  ; must-write (S2) does not block the generation of RAW dependences. This makes diff --git a/polly/test/DependenceInfo/nonaffine-condition-buildMemoryAccess.ll b/polly/test/DependenceInfo/nonaffine-condition-buildMemoryAccess.ll index ae5fd3b..b147597 100644 --- a/polly/test/DependenceInfo/nonaffine-condition-buildMemoryAccess.ll +++ b/polly/test/DependenceInfo/nonaffine-condition-buildMemoryAccess.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-allow-nonaffine-loops -polly-allow-nonaffine -debug-only=polly-dependence < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-allow-nonaffine-loops -polly-allow-nonaffine -debug-only=polly-dependence < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ; CHECK:        MayWriteAccess :=   [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/DependenceInfo/reduction_complex_location.ll b/polly/test/DependenceInfo/reduction_complex_location.ll index 7722ee9..4578908 100644 --- a/polly/test/DependenceInfo/reduction_complex_location.ll +++ b/polly/test/DependenceInfo/reduction_complex_location.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -polly-dependences-analysis-level=reference-wise -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-level=reference-wise -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     {  } diff --git a/polly/test/DependenceInfo/reduction_dependences_equal_non_reduction_dependences.ll b/polly/test/DependenceInfo/reduction_dependences_equal_non_reduction_dependences.ll index 840d1f3..7923975 100644 --- a/polly/test/DependenceInfo/reduction_dependences_equal_non_reduction_dependences.ll +++ b/polly/test/DependenceInfo/reduction_dependences_equal_non_reduction_dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; This loopnest contains a reduction which imposes the same dependences as the  ; accesses to the array A. We need to ensure we keep the dependences of A. diff --git a/polly/test/DependenceInfo/reduction_dependences_not_null.ll b/polly/test/DependenceInfo/reduction_dependences_not_null.ll index 56d84a9..fdcd5f3 100644 --- a/polly/test/DependenceInfo/reduction_dependences_not_null.ll +++ b/polly/test/DependenceInfo/reduction_dependences_not_null.ll @@ -1,7 +1,7 @@  ; Test that the reduction dependences are always initialised, even in a case  ; where we have no reduction. If this object is NULL, then isl operations on  ; it will fail. -; RUN: opt -S %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s -check-prefix=VALUE +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s -check-prefix=VALUE  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;     for(i = 0; i < 100; i++ ) diff --git a/polly/test/DependenceInfo/reduction_indirect_access.ll b/polly/test/DependenceInfo/reduction_indirect_access.ll index 3b4bd9ef..13675ad 100644 --- a/polly/test/DependenceInfo/reduction_indirect_access.ll +++ b/polly/test/DependenceInfo/reduction_indirect_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -polly-allow-nonaffine -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-allow-nonaffine -disable-output < %s | FileCheck %s  ;  ; CHECK: Reduction dependences:  ; CHECK:   [N] -> { Stmt_for_body[i0] -> Stmt_for_body[1 + i0] : 0 <= i0 <= -2 + N } diff --git a/polly/test/DependenceInfo/reduction_mixed_reduction_and_non_reduction_dependences.ll b/polly/test/DependenceInfo/reduction_mixed_reduction_and_non_reduction_dependences.ll index 76c7fc6..e6ce425 100644 --- a/polly/test/DependenceInfo/reduction_mixed_reduction_and_non_reduction_dependences.ll +++ b/polly/test/DependenceInfo/reduction_mixed_reduction_and_non_reduction_dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     { Stmt_for_body3[i0, i1] -> Stmt_for_body3[i0 + i1, o1] : i0 >= 0 and 0 <= i1 <= 1023 - i0 and i1 <= 1 and 0 < o1 <= 511 } diff --git a/polly/test/DependenceInfo/reduction_multiple_loops_array_sum.ll b/polly/test/DependenceInfo/reduction_multiple_loops_array_sum.ll index 02b814a..8203719 100644 --- a/polly/test/DependenceInfo/reduction_multiple_loops_array_sum.ll +++ b/polly/test/DependenceInfo/reduction_multiple_loops_array_sum.ll @@ -1,6 +1,6 @@ -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=print<polly-dependences>' -polly-dependences-analysis-level=reference-wise -disable-output < %s | FileCheck %s -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=print<polly-dependences>' -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-level=reference-wise -disable-output < %s | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s  ;  ; Verify that only the inner reduction like accesses cause reduction dependences  ; diff --git a/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_2.ll b/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_2.ll index 91bd35d..9792f79 100644 --- a/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_2.ll +++ b/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     {  } diff --git a/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_3.ll b/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_3.ll index 040d513..9bde285 100644 --- a/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_3.ll +++ b/polly/test/DependenceInfo/reduction_multiple_loops_array_sum_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s  ;  ; CHECK:      Reduction dependences:  ; CHECK-NEXT:     { Stmt_for_inc[i0, i1] -> Stmt_for_inc[i0, 1 + i1] : 0 <= i0 <= 99 and 0 <= i1 <= 98 } diff --git a/polly/test/DependenceInfo/reduction_multiple_reductions.ll b/polly/test/DependenceInfo/reduction_multiple_reductions.ll index 527a8cf..ac3adb9 100644 --- a/polly/test/DependenceInfo/reduction_multiple_reductions.ll +++ b/polly/test/DependenceInfo/reduction_multiple_reductions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; Verify we do not have dependences between the if and the else clause  ; diff --git a/polly/test/DependenceInfo/reduction_multiple_reductions_2.ll b/polly/test/DependenceInfo/reduction_multiple_reductions_2.ll index fb5fd96..16ca85b 100644 --- a/polly/test/DependenceInfo/reduction_multiple_reductions_2.ll +++ b/polly/test/DependenceInfo/reduction_multiple_reductions_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ;  ; These are the important RAW dependences, as they need to originate/end in only one iteration: diff --git a/polly/test/DependenceInfo/reduction_only_reduction_like_access.ll b/polly/test/DependenceInfo/reduction_only_reduction_like_access.ll index 3ec3920..de506a3 100644 --- a/polly/test/DependenceInfo/reduction_only_reduction_like_access.ll +++ b/polly/test/DependenceInfo/reduction_only_reduction_like_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; FIXME: Change the comment once we allow different pointers  ; The statement is "almost" reduction like but should not yield any reduction dependences diff --git a/polly/test/DependenceInfo/reduction_partially_escaping_intermediate_in_other_stmt.ll b/polly/test/DependenceInfo/reduction_partially_escaping_intermediate_in_other_stmt.ll index 23bd8ef..fbf1409 100644 --- a/polly/test/DependenceInfo/reduction_partially_escaping_intermediate_in_other_stmt.ll +++ b/polly/test/DependenceInfo/reduction_partially_escaping_intermediate_in_other_stmt.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s  ;  ; CHECK:      Reduction dependences:  ; CHECK-NEXT:     [N] -> { Stmt_for_body3[i0, i1] -> Stmt_for_body3[i0, 1 + i1] : 0 <= i0 <= 1023 and i1 >= 0 and 1024 - N + i0 <= i1 <= 1022 } diff --git a/polly/test/DependenceInfo/reduction_privatization_deps.ll b/polly/test/DependenceInfo/reduction_privatization_deps.ll index 0e0f717..0d66f88 100644 --- a/polly/test/DependenceInfo/reduction_privatization_deps.ll +++ b/polly/test/DependenceInfo/reduction_privatization_deps.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     { Stmt_S1[i0, i1] -> Stmt_S2[-1 + i0 + i1] : 0 <= i0 <= 1023 and i1 >= 0 and -i0 < i1 <= 1024 - i0 and i1 <= 1023; Stmt_S0[i0] -> Stmt_S1[o0, i0 - o0] : i0 <= 1023 and 0 <= o0 <= i0 } diff --git a/polly/test/DependenceInfo/reduction_privatization_deps_2.ll b/polly/test/DependenceInfo/reduction_privatization_deps_2.ll index cafa319..81235d6 100644 --- a/polly/test/DependenceInfo/reduction_privatization_deps_2.ll +++ b/polly/test/DependenceInfo/reduction_privatization_deps_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; We have privatization dependences from a textually later statement to a  ; textually earlier one, but the dependences still go forward in time. diff --git a/polly/test/DependenceInfo/reduction_privatization_deps_3.ll b/polly/test/DependenceInfo/reduction_privatization_deps_3.ll index d86da92..6b48ab5 100644 --- a/polly/test/DependenceInfo/reduction_privatization_deps_3.ll +++ b/polly/test/DependenceInfo/reduction_privatization_deps_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     { Stmt_S1[i0] -> Stmt_S3[2 + i0] : 0 <= i0 <= 96; Stmt_S2[i0, i1] -> Stmt_S3[o0] : i1 <= 1 - i0 and -i1 < o0 <= 1 and o0 <= 1 + i0 - i1; Stmt_S3[i0] -> Stmt_S2[o0, 1 - i0] : 0 <= i0 <= 1 and i0 < o0 <= 98 } diff --git a/polly/test/DependenceInfo/reduction_privatization_deps_4.ll b/polly/test/DependenceInfo/reduction_privatization_deps_4.ll index d84c04f..1fef004 100644 --- a/polly/test/DependenceInfo/reduction_privatization_deps_4.ll +++ b/polly/test/DependenceInfo/reduction_privatization_deps_4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     { Stmt_S1[i0] -> Stmt_S2[i0, i0] : 0 <= i0 <= 98; Stmt_S2[i0, i0] -> Stmt_S3[i0] : 0 <= i0 <= 98; Stmt_S3[i0] -> Stmt_S2[o0, i0] : i0 >= 0 and i0 < o0 <= 98; Stmt_S2[i0, i1] -> Stmt_S1[i1] : i0 >= 0 and i0 < i1 <= 98 } diff --git a/polly/test/DependenceInfo/reduction_privatization_deps_5.ll b/polly/test/DependenceInfo/reduction_privatization_deps_5.ll index 592c723..f40a7c0 100644 --- a/polly/test/DependenceInfo/reduction_privatization_deps_5.ll +++ b/polly/test/DependenceInfo/reduction_privatization_deps_5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     { Stmt_S1[i0, 0] -> Stmt_S2[i0, 0] : 0 <= i0 <= 98; Stmt_S2[i0, 0] -> Stmt_S1[1 + i0, 0] : 0 <= i0 <= 97 } diff --git a/polly/test/DependenceInfo/reduction_sequence.ll b/polly/test/DependenceInfo/reduction_sequence.ll index 7ce9d37..d881a99 100644 --- a/polly/test/DependenceInfo/reduction_sequence.ll +++ b/polly/test/DependenceInfo/reduction_sequence.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;    void manyreductions(long *A) {  ;      for (long i = 0; i < 1024; i++) diff --git a/polly/test/DependenceInfo/reduction_simple_iv.ll b/polly/test/DependenceInfo/reduction_simple_iv.ll index d13d14e..b811d15 100644 --- a/polly/test/DependenceInfo/reduction_simple_iv.ll +++ b/polly/test/DependenceInfo/reduction_simple_iv.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     {  } diff --git a/polly/test/DependenceInfo/reduction_simple_iv_debug_wrapped_dependences.ll b/polly/test/DependenceInfo/reduction_simple_iv_debug_wrapped_dependences.ll index 4c97fbb..0a5d36f 100644 --- a/polly/test/DependenceInfo/reduction_simple_iv_debug_wrapped_dependences.ll +++ b/polly/test/DependenceInfo/reduction_simple_iv_debug_wrapped_dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -debug-only=polly-dependence -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -debug-only=polly-dependence -disable-output < %s 2>&1 | FileCheck %s  ;  ; REQUIRES: asserts  ; diff --git a/polly/test/DependenceInfo/reduction_simple_privatization_deps_2.ll b/polly/test/DependenceInfo/reduction_simple_privatization_deps_2.ll index 804005c..90f9d76 100644 --- a/polly/test/DependenceInfo/reduction_simple_privatization_deps_2.ll +++ b/polly/test/DependenceInfo/reduction_simple_privatization_deps_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     { Stmt_S1[i0, i1] -> Stmt_S2[i0] : 0 <= i0 <= 99 and 0 <= i1 <= 99; Stmt_S0[i0] -> Stmt_S1[i0, o1] : 0 <= i0 <= 99 and 0 <= o1 <= 99; Stmt_S2[i0] -> Stmt_S0[1 + i0] : 0 <= i0 <= 98 } diff --git a/polly/test/DependenceInfo/reduction_simple_privatization_deps_w_parameter.ll b/polly/test/DependenceInfo/reduction_simple_privatization_deps_w_parameter.ll index 9596827..2b194bb 100644 --- a/polly/test/DependenceInfo/reduction_simple_privatization_deps_w_parameter.ll +++ b/polly/test/DependenceInfo/reduction_simple_privatization_deps_w_parameter.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     [N] -> { Stmt_S1[i0] -> Stmt_S2[] : N >= 11 and 0 <= i0 <= 1023; Stmt_S0[] -> Stmt_S1[o0] : N >= 11 and 0 <= o0 <= 1023 } diff --git a/polly/test/DependenceInfo/reduction_two_reductions_different_rloops.ll b/polly/test/DependenceInfo/reduction_two_reductions_different_rloops.ll index d67683d..70d5bdf 100644 --- a/polly/test/DependenceInfo/reduction_two_reductions_different_rloops.ll +++ b/polly/test/DependenceInfo/reduction_two_reductions_different_rloops.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s  ;  ; CHECK:      RAW dependences:  ; CHECK-NEXT:     {  } diff --git a/polly/test/DependenceInfo/sequential_loops.ll b/polly/test/DependenceInfo/sequential_loops.ll index 6ae7200..023c2d4 100644 --- a/polly/test/DependenceInfo/sequential_loops.ll +++ b/polly/test/DependenceInfo/sequential_loops.ll @@ -1,6 +1,6 @@ -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -polly-dependences-analysis-type=value-based -disable-output < %s | FileCheck %s -check-prefix=VALUE -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -polly-dependences-analysis-type=memory-based -disable-output < %s | FileCheck %s -check-prefix=MEMORY -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-dependences>' -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s -check-prefix=VALUE_ACCESS +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -disable-output < %s | FileCheck %s -check-prefix=VALUE +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=memory-based -disable-output < %s | FileCheck %s -check-prefix=MEMORY +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s -check-prefix=VALUE_ACCESS  ; VALUE:      RAW dependences:  ; VALUE-NEXT:          {  } diff --git a/polly/test/FlattenSchedule/gemm.ll b/polly/test/FlattenSchedule/gemm.ll index b20293b..11dc405 100644 --- a/polly/test/FlattenSchedule/gemm.ll +++ b/polly/test/FlattenSchedule/gemm.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-flatten-schedule -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<flatten>' -polly-print-flatten-schedule -disable-output < %s | FileCheck %s  ;  ; dgemm kernel  ; C := alpha*A*B + beta*C diff --git a/polly/test/ForwardOpTree/atax.ll b/polly/test/ForwardOpTree/atax.ll index 6c81fb1..3dfe3fa 100644 --- a/polly/test/ForwardOpTree/atax.ll +++ b/polly/test/ForwardOpTree/atax.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-optree-normalize-phi=true '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-optree-normalize-phi=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ForwardOpTree/changed-kind.ll b/polly/test/ForwardOpTree/changed-kind.ll index b9081f37..ec8869d 100644 --- a/polly/test/ForwardOpTree/changed-kind.ll +++ b/polly/test/ForwardOpTree/changed-kind.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ; In the code below, %0 is known to be equal to the content of @c (constant 0).  ; Thus, in order to save a scalar dependency, forward-optree replaces diff --git a/polly/test/ForwardOpTree/forward_from_region.ll b/polly/test/ForwardOpTree/forward_from_region.ll index 767a580..de47bc4 100644 --- a/polly/test/ForwardOpTree/forward_from_region.ll +++ b/polly/test/ForwardOpTree/forward_from_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Move instructions from region statements.  ; diff --git a/polly/test/ForwardOpTree/forward_hoisted.ll b/polly/test/ForwardOpTree/forward_hoisted.ll index 5d0b0a8..39f9954 100644 --- a/polly/test/ForwardOpTree/forward_hoisted.ll +++ b/polly/test/ForwardOpTree/forward_hoisted.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Move %val to %bodyB, so %bodyA can be removed (by -polly-simplify).  ; This involves making the load-hoisted %val1 to be made available in %bodyB. diff --git a/polly/test/ForwardOpTree/forward_instruction.ll b/polly/test/ForwardOpTree/forward_instruction.ll index 50a9b07..a9f5d3d 100644 --- a/polly/test/ForwardOpTree/forward_instruction.ll +++ b/polly/test/ForwardOpTree/forward_instruction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Move %val to %bodyB, so %bodyA can be removed (by -polly-simplify)  ; diff --git a/polly/test/ForwardOpTree/forward_into_region.ll b/polly/test/ForwardOpTree/forward_into_region.ll index ef71b11..2279a89 100644 --- a/polly/test/ForwardOpTree/forward_into_region.ll +++ b/polly/test/ForwardOpTree/forward_into_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Move instructions to region statements.  ; diff --git a/polly/test/ForwardOpTree/forward_into_region_redundant_use.ll b/polly/test/ForwardOpTree/forward_into_region_redundant_use.ll index 1c58544..f7901e1 100644 --- a/polly/test/ForwardOpTree/forward_into_region_redundant_use.ll +++ b/polly/test/ForwardOpTree/forward_into_region_redundant_use.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  define void @foo(ptr %A, i32 %p, ptr %B) { diff --git a/polly/test/ForwardOpTree/forward_load.ll b/polly/test/ForwardOpTree/forward_load.ll index 0bba4183..860e603 100644 --- a/polly/test/ForwardOpTree/forward_load.ll +++ b/polly/test/ForwardOpTree/forward_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-optree>)" -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load.  ; diff --git a/polly/test/ForwardOpTree/forward_load_differentarray.ll b/polly/test/ForwardOpTree/forward_load_differentarray.ll index 364bf3e..24b008c 100644 --- a/polly/test/ForwardOpTree/forward_load_differentarray.ll +++ b/polly/test/ForwardOpTree/forward_load_differentarray.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; To forward %val, B[j] cannot be reused in bodyC because it is overwritten  ; between. Verify that instead the alternative C[j] is used. diff --git a/polly/test/ForwardOpTree/forward_load_double_write.ll b/polly/test/ForwardOpTree/forward_load_double_write.ll index 4c30c7f..522e803 100644 --- a/polly/test/ForwardOpTree/forward_load_double_write.ll +++ b/polly/test/ForwardOpTree/forward_load_double_write.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load even in case two writes of identical values are in  ; one scop statement. diff --git a/polly/test/ForwardOpTree/forward_load_fromloop.ll b/polly/test/ForwardOpTree/forward_load_fromloop.ll index 1494e87..5c64221 100644 --- a/polly/test/ForwardOpTree/forward_load_fromloop.ll +++ b/polly/test/ForwardOpTree/forward_load_fromloop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Forward a the LoadInst %val into %bodyB. %val is executed multiple times,  ; we must get the last loaded values. diff --git a/polly/test/ForwardOpTree/forward_load_indirect.ll b/polly/test/ForwardOpTree/forward_load_indirect.ll index 51ce94d..5b06c35 100644 --- a/polly/test/ForwardOpTree/forward_load_indirect.ll +++ b/polly/test/ForwardOpTree/forward_load_indirect.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Forward an operand tree consisting of a speculatable instruction (%add)  ; and a load (%val). diff --git a/polly/test/ForwardOpTree/forward_load_memset_after.ll b/polly/test/ForwardOpTree/forward_load_memset_after.ll index bd2cad4..b889783 100644 --- a/polly/test/ForwardOpTree/forward_load_memset_after.ll +++ b/polly/test/ForwardOpTree/forward_load_memset_after.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load in the presence of a non-store WRITE access.  ; diff --git a/polly/test/ForwardOpTree/forward_load_memset_before.ll b/polly/test/ForwardOpTree/forward_load_memset_before.ll index 3e89dea..c8f0e0e 100644 --- a/polly/test/ForwardOpTree/forward_load_memset_before.ll +++ b/polly/test/ForwardOpTree/forward_load_memset_before.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load in the presence of a non-store WRITE access.  ; diff --git a/polly/test/ForwardOpTree/forward_load_tripleuse.ll b/polly/test/ForwardOpTree/forward_load_tripleuse.ll index 7526a83..df57bf7 100644 --- a/polly/test/ForwardOpTree/forward_load_tripleuse.ll +++ b/polly/test/ForwardOpTree/forward_load_tripleuse.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-optree>,polly-codegen' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; %val1 is used three times: Twice by its own operand tree of %val2 and once  ; more by the store in %bodyB. diff --git a/polly/test/ForwardOpTree/forward_load_unrelatedunusual.ll b/polly/test/ForwardOpTree/forward_load_unrelatedunusual.ll index daf289d..ba84a1a 100644 --- a/polly/test/ForwardOpTree/forward_load_unrelatedunusual.ll +++ b/polly/test/ForwardOpTree/forward_load_unrelatedunusual.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load.  ; The non-analyzable store to C[0] is unrelated and can be ignored. diff --git a/polly/test/ForwardOpTree/forward_phi_load.ll b/polly/test/ForwardOpTree/forward_phi_load.ll index 1457aa9..c763af4 100644 --- a/polly/test/ForwardOpTree/forward_phi_load.ll +++ b/polly/test/ForwardOpTree/forward_phi_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-optree-normalize-phi=true '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-optree-normalize-phi=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load.  ; diff --git a/polly/test/ForwardOpTree/forward_readonly.ll b/polly/test/ForwardOpTree/forward_readonly.ll index 646121c..69c7f10 100644 --- a/polly/test/ForwardOpTree/forward_readonly.ll +++ b/polly/test/ForwardOpTree/forward_readonly.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=true  '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines -check-prefixes=STATS,MODEL -; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=false '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines -check-prefixes=STATS,NOMODEL +; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines -check-prefixes=STATS,MODEL +; RUN: opt %loadNPMPolly -polly-analyze-read-only-scalars=false '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines -check-prefixes=STATS,NOMODEL  ;  ; Move %val to %bodyB, so %bodyA can be removed (by -polly-simplify)  ; diff --git a/polly/test/ForwardOpTree/forward_reusue.ll b/polly/test/ForwardOpTree/forward_reusue.ll index d8ad317..e39e7b5 100644 --- a/polly/test/ForwardOpTree/forward_reusue.ll +++ b/polly/test/ForwardOpTree/forward_reusue.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Move operand tree without duplicating values used multiple times.  ; diff --git a/polly/test/ForwardOpTree/forward_store.ll b/polly/test/ForwardOpTree/forward_store.ll index 17cb8b3..8cd6e24 100644 --- a/polly/test/ForwardOpTree/forward_store.ll +++ b/polly/test/ForwardOpTree/forward_store.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Rematerialize a load.  ; diff --git a/polly/test/ForwardOpTree/forward_synthesizable_definloop.ll b/polly/test/ForwardOpTree/forward_synthesizable_definloop.ll index 57b6818..f70965f 100644 --- a/polly/test/ForwardOpTree/forward_synthesizable_definloop.ll +++ b/polly/test/ForwardOpTree/forward_synthesizable_definloop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Copy %val to bodyB, assuming the exit value of %i.  ; diff --git a/polly/test/ForwardOpTree/forward_synthesizable_indvar.ll b/polly/test/ForwardOpTree/forward_synthesizable_indvar.ll index b4828e4..c95c458 100644 --- a/polly/test/ForwardOpTree/forward_synthesizable_indvar.ll +++ b/polly/test/ForwardOpTree/forward_synthesizable_indvar.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Test support for (synthesizable) inducation variables.  ; diff --git a/polly/test/ForwardOpTree/forward_synthesizable_useinloop.ll b/polly/test/ForwardOpTree/forward_synthesizable_useinloop.ll index 3228bb6..14fb8d8 100644 --- a/polly/test/ForwardOpTree/forward_synthesizable_useinloop.ll +++ b/polly/test/ForwardOpTree/forward_synthesizable_useinloop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Synthesizable values defined outside of a loop can be used  ; inside the loop. diff --git a/polly/test/ForwardOpTree/forward_transitive.ll b/polly/test/ForwardOpTree/forward_transitive.ll index aacf135..7b55d9e 100644 --- a/polly/test/ForwardOpTree/forward_transitive.ll +++ b/polly/test/ForwardOpTree/forward_transitive.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Move %v and %val to %bodyB, so %bodyA can be removed (by -polly-simplify)  ; diff --git a/polly/test/ForwardOpTree/jacobi-1d.ll b/polly/test/ForwardOpTree/jacobi-1d.ll index cb035bb..3bc504d 100644 --- a/polly/test/ForwardOpTree/jacobi-1d.ll +++ b/polly/test/ForwardOpTree/jacobi-1d.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-optree-normalize-phi=true '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-optree-normalize-phi=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ForwardOpTree/noforward_from_region.ll b/polly/test/ForwardOpTree/noforward_from_region.ll index bd5864c..0729241 100644 --- a/polly/test/ForwardOpTree/noforward_from_region.ll +++ b/polly/test/ForwardOpTree/noforward_from_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Ensure we do not move instructions from region statements in case the  ; instruction to move loads from an array which is also written to from diff --git a/polly/test/ForwardOpTree/noforward_load_conditional.ll b/polly/test/ForwardOpTree/noforward_load_conditional.ll index 5474e74..d33ef99 100644 --- a/polly/test/ForwardOpTree/noforward_load_conditional.ll +++ b/polly/test/ForwardOpTree/noforward_load_conditional.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; B[j] is overwritten by at least one statement between the  ; definition of %val and its use. Hence, it cannot be forwarded. diff --git a/polly/test/ForwardOpTree/noforward_load_writebetween.ll b/polly/test/ForwardOpTree/noforward_load_writebetween.ll index 697c940..e7deb38 100644 --- a/polly/test/ForwardOpTree/noforward_load_writebetween.ll +++ b/polly/test/ForwardOpTree/noforward_load_writebetween.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Cannot rematerialize %val from B[0] at bodyC because B[0] has been  ; overwritten in bodyB. diff --git a/polly/test/ForwardOpTree/noforward_outofquota.ll b/polly/test/ForwardOpTree/noforward_outofquota.ll index 306bb8d..5e30cf8 100644 --- a/polly/test/ForwardOpTree/noforward_outofquota.ll +++ b/polly/test/ForwardOpTree/noforward_outofquota.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-optree-max-ops=1 '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines -; RUN: opt %loadNPMPolly -polly-optree-max-ops=1 -passes=polly-optree -disable-output -stats < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=STATS +; RUN: opt %loadNPMPolly -polly-optree-max-ops=1 '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-optree-max-ops=1 '-passes=polly-custom<optree>' -disable-output -stats < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=STATS  ; REQUIRES: asserts  ;  ; for (int j = 0; j < n; j += 1) { diff --git a/polly/test/ForwardOpTree/noforward_partial.ll b/polly/test/ForwardOpTree/noforward_partial.ll index edb5d34..f95bb77 100644 --- a/polly/test/ForwardOpTree/noforward_partial.ll +++ b/polly/test/ForwardOpTree/noforward_partial.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Not the entire operand tree can be forwarded,  ; some scalar dependencies would remain. diff --git a/polly/test/ForwardOpTree/noforward_phi.ll b/polly/test/ForwardOpTree/noforward_phi.ll index 755abad..025fe647 100644 --- a/polly/test/ForwardOpTree/noforward_phi.ll +++ b/polly/test/ForwardOpTree/noforward_phi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Do not move PHI nodes.  ; diff --git a/polly/test/ForwardOpTree/noforward_selfrefphi.ll b/polly/test/ForwardOpTree/noforward_selfrefphi.ll index be7e82f..8b301378 100644 --- a/polly/test/ForwardOpTree/noforward_selfrefphi.ll +++ b/polly/test/ForwardOpTree/noforward_selfrefphi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-optree-normalize-phi=true '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-optree-normalize-phi=true '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Contains a self-referencing PHINode that would require a  ; transitive closure to handle. diff --git a/polly/test/ForwardOpTree/noforward_sideffects.ll b/polly/test/ForwardOpTree/noforward_sideffects.ll index c01b72a..179b02a 100644 --- a/polly/test/ForwardOpTree/noforward_sideffects.ll +++ b/polly/test/ForwardOpTree/noforward_sideffects.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly  '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Do not forward instructions with side-effects (here: function call).  ; diff --git a/polly/test/ForwardOpTree/noforward_synthesizable_unknownit.ll b/polly/test/ForwardOpTree/noforward_synthesizable_unknownit.ll index 776d848..6baec6d9 100644 --- a/polly/test/ForwardOpTree/noforward_synthesizable_unknownit.ll +++ b/polly/test/ForwardOpTree/noforward_synthesizable_unknownit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Do not try to forward %i.trunc, it is not synthesizable in %body.  ; diff --git a/polly/test/ForwardOpTree/out-of-quota1.ll b/polly/test/ForwardOpTree/out-of-quota1.ll index ee3e326..95df49a5 100644 --- a/polly/test/ForwardOpTree/out-of-quota1.ll +++ b/polly/test/ForwardOpTree/out-of-quota1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-optree>' -disable-output %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree>' -polly-print-optree -disable-output %s | FileCheck %s  ; This used to loop infinitely because of UINT_MAX returned by ISL on out-of-quota. diff --git a/polly/test/IstAstInfo/OpenMP/multiple_loops_outer_parallel.ll b/polly/test/IstAstInfo/OpenMP/multiple_loops_outer_parallel.ll index ec1ccdc..a5102b3 100644 --- a/polly/test/IstAstInfo/OpenMP/multiple_loops_outer_parallel.ll +++ b/polly/test/IstAstInfo/OpenMP/multiple_loops_outer_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s  ;  ;       void jd(int *A) {  ; CHECK:  #pragma omp parallel for diff --git a/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel.ll b/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel.ll index 9c00690..d086b59f 100644 --- a/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel.ll +++ b/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; for (i = 0; i < 1024; i++) diff --git a/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel_parametric.ll b/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel_parametric.ll index 356762a2..49a6b05 100644 --- a/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel_parametric.ll +++ b/polly/test/IstAstInfo/OpenMP/nested_loop_both_parallel_parametric.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; int A[1024][1024];  ; void bar(int n) { diff --git a/polly/test/IstAstInfo/OpenMP/nested_loop_inner_parallel.ll b/polly/test/IstAstInfo/OpenMP/nested_loop_inner_parallel.ll index 066fc39..d2d7917 100644 --- a/polly/test/IstAstInfo/OpenMP/nested_loop_inner_parallel.ll +++ b/polly/test/IstAstInfo/OpenMP/nested_loop_inner_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; for (i = 0; i < n; i++) diff --git a/polly/test/IstAstInfo/OpenMP/nested_loop_outer_parallel.ll b/polly/test/IstAstInfo/OpenMP/nested_loop_outer_parallel.ll index 77dd55c..c03189a 100644 --- a/polly/test/IstAstInfo/OpenMP/nested_loop_outer_parallel.ll +++ b/polly/test/IstAstInfo/OpenMP/nested_loop_outer_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; for (i = 0; i < n; i++) diff --git a/polly/test/IstAstInfo/OpenMP/single_loop_param_non_parallel.ll b/polly/test/IstAstInfo/OpenMP/single_loop_param_non_parallel.ll index b61ebc9..6829211 100644 --- a/polly/test/IstAstInfo/OpenMP/single_loop_param_non_parallel.ll +++ b/polly/test/IstAstInfo/OpenMP/single_loop_param_non_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; for (i = 0; i < n; i++) diff --git a/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel.ll b/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel.ll index 5c92a91..7199a33 100644 --- a/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel.ll +++ b/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -polly-parallel-force -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; for (i = 0; i < n; i++) diff --git a/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel_computeout.ll b/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel_computeout.ll index 352d879..41d35bf 100644 --- a/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel_computeout.ll +++ b/polly/test/IstAstInfo/OpenMP/single_loop_param_parallel_computeout.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-parallel -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-parallel -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; for (i = 0; i < n; i++) diff --git a/polly/test/IstAstInfo/alias_checks_with_empty_context.ll b/polly/test/IstAstInfo/alias_checks_with_empty_context.ll index 81c2953..356269c 100644 --- a/polly/test/IstAstInfo/alias_checks_with_empty_context.ll +++ b/polly/test/IstAstInfo/alias_checks_with_empty_context.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s \ -; RUN:     | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/IstAstInfo/alias_simple_1.ll b/polly/test/IstAstInfo/alias_simple_1.ll index 904f55d..039c5f7 100644 --- a/polly/test/IstAstInfo/alias_simple_1.ll +++ b/polly/test/IstAstInfo/alias_simple_1.ll @@ -1,8 +1,8 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s --check-prefix=BASI -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=scev-aa -disable-output < %s | FileCheck %s --check-prefix=SCEV -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=globals-aa -disable-output < %s | FileCheck %s --check-prefix=GLOB +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s --check-prefix=BASI +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=scev-aa -disable-output < %s | FileCheck %s --check-prefix=SCEV +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=globals-aa -disable-output < %s | FileCheck %s --check-prefix=GLOB  ;  ;    int A[1024];  ; diff --git a/polly/test/IstAstInfo/alias_simple_2.ll b/polly/test/IstAstInfo/alias_simple_2.ll index 5fae579..1783a04 100644 --- a/polly/test/IstAstInfo/alias_simple_2.ll +++ b/polly/test/IstAstInfo/alias_simple_2.ll @@ -1,9 +1,9 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s --check-prefix=BASI -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=scev-aa -disable-output < %s | FileCheck %s --check-prefix=SCEV -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=globals-aa -disable-output < %s | FileCheck %s --check-prefix=GLOB -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=globals-aa -polly-allow-nonaffine -disable-output < %s | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s --check-prefix=BASI +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=scev-aa -disable-output < %s | FileCheck %s --check-prefix=SCEV +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=globals-aa -disable-output < %s | FileCheck %s --check-prefix=GLOB +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=globals-aa -polly-allow-nonaffine -disable-output < %s | FileCheck %s --check-prefix=NONAFFINE  ;  ;    int A[1024], B[1024];  ; diff --git a/polly/test/IstAstInfo/alias_simple_3.ll b/polly/test/IstAstInfo/alias_simple_3.ll index 8599c29..8d507fb 100644 --- a/polly/test/IstAstInfo/alias_simple_3.ll +++ b/polly/test/IstAstInfo/alias_simple_3.ll @@ -1,8 +1,8 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s --check-prefix=BASI -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=scev-aa -disable-output < %s | FileCheck %s --check-prefix=SCEV -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>'  -aa-pipeline=globals-aa -disable-output < %s | FileCheck %s --check-prefix=GLOB +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=basic-aa -disable-output < %s | FileCheck %s --check-prefix=BASI +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=scev-aa -disable-output < %s | FileCheck %s --check-prefix=SCEV +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=globals-aa -disable-output < %s | FileCheck %s --check-prefix=GLOB  ;  ;    int A[1024];  ;    float B[1024]; diff --git a/polly/test/IstAstInfo/aliasing_arrays_with_identical_base.ll b/polly/test/IstAstInfo/aliasing_arrays_with_identical_base.ll index dc21dc1..01b5372 100644 --- a/polly/test/IstAstInfo/aliasing_arrays_with_identical_base.ll +++ b/polly/test/IstAstInfo/aliasing_arrays_with_identical_base.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s \ -; RUN:   -polly-invariant-load-hoisting \ -; RUN:   | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output -polly-invariant-load-hoisting < %s | FileCheck %s  ; CHECK: if (1 && 1 && (&MemRef_X[1] <= &MemRef_BaseA[0] || &MemRef_BaseA[1024] <= &MemRef_X[0]) && (&MemRef_X[1] <= &MemRef_BaseB[0] || &MemRef_BaseB[1024] <= &MemRef_X[0])) diff --git a/polly/test/IstAstInfo/aliasing_multiple_alias_groups.ll b/polly/test/IstAstInfo/aliasing_multiple_alias_groups.ll index 8d4adfa..3835c23 100644 --- a/polly/test/IstAstInfo/aliasing_multiple_alias_groups.ll +++ b/polly/test/IstAstInfo/aliasing_multiple_alias_groups.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -aa-pipeline=      -disable-output < %s | FileCheck %s --check-prefix=NOAA -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline= -disable-output < %s | FileCheck %s --check-prefix=NOAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -aa-pipeline=tbaa -disable-output < %s | FileCheck %s --check-prefix=TBAA  ;  ;    void jd(int *Int0, int *Int1, float *Float0, float *Float1) {  ;      for (int i = 0; i < 1024; i++) { diff --git a/polly/test/IstAstInfo/aliasing_parametric_simple_1.ll b/polly/test/IstAstInfo/aliasing_parametric_simple_1.ll index be37b27..71bac9a 100644 --- a/polly/test/IstAstInfo/aliasing_parametric_simple_1.ll +++ b/polly/test/IstAstInfo/aliasing_parametric_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output %s | FileCheck %s  ;  ;    void jd(int *A, int *B, int c) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/IstAstInfo/aliasing_parametric_simple_2.ll b/polly/test/IstAstInfo/aliasing_parametric_simple_2.ll index 1555058..e5ece1f 100644 --- a/polly/test/IstAstInfo/aliasing_parametric_simple_2.ll +++ b/polly/test/IstAstInfo/aliasing_parametric_simple_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;    void jd(int *A, int *B, int c) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/IstAstInfo/dependence_distance_constant.ll b/polly/test/IstAstInfo/dependence_distance_constant.ll index 9b7fb93..43b13ee 100644 --- a/polly/test/IstAstInfo/dependence_distance_constant.ll +++ b/polly/test/IstAstInfo/dependence_distance_constant.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;        void f(int *A, int N) {  ; CHECK:   #pragma minimal dependence distance: 1 diff --git a/polly/test/IstAstInfo/dependence_distance_minimal.ll b/polly/test/IstAstInfo/dependence_distance_minimal.ll index d69cc3f..35a503c 100644 --- a/polly/test/IstAstInfo/dependence_distance_minimal.ll +++ b/polly/test/IstAstInfo/dependence_distance_minimal.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; The minimal dependence distance of the innermost loop should be 1 instead of 250.  ; CHECK:    #pragma minimal dependence distance: 1 diff --git a/polly/test/IstAstInfo/dependence_distance_multiple_constant.ll b/polly/test/IstAstInfo/dependence_distance_multiple_constant.ll index bc21e9e..a7de5c4 100644 --- a/polly/test/IstAstInfo/dependence_distance_multiple_constant.ll +++ b/polly/test/IstAstInfo/dependence_distance_multiple_constant.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-stmt-granularity=bb -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;        void f(int *restrict A, int *restrict B, int N) {  ; CHECK:   #pragma minimal dependence distance: 5 diff --git a/polly/test/IstAstInfo/dependence_distance_parametric.ll b/polly/test/IstAstInfo/dependence_distance_parametric.ll index fa569a8..fa05e4c 100644 --- a/polly/test/IstAstInfo/dependence_distance_parametric.ll +++ b/polly/test/IstAstInfo/dependence_distance_parametric.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;        void f(int *A, int N, int c) {  ; CHECK:   #pragma minimal dependence distance: 1 diff --git a/polly/test/IstAstInfo/dependence_distance_parametric_expr.ll b/polly/test/IstAstInfo/dependence_distance_parametric_expr.ll index 7f280e0..73f74b3b 100644 --- a/polly/test/IstAstInfo/dependence_distance_parametric_expr.ll +++ b/polly/test/IstAstInfo/dependence_distance_parametric_expr.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;        void f(int *A, int N, int c, int v) {  ; CHECK:   #pragma minimal dependence distance: 1 diff --git a/polly/test/IstAstInfo/dependence_distance_varying.ll b/polly/test/IstAstInfo/dependence_distance_varying.ll index d609c2f..e908954 100644 --- a/polly/test/IstAstInfo/dependence_distance_varying.ll +++ b/polly/test/IstAstInfo/dependence_distance_varying.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;         void f(int *A, int N) {  ; CHECK:    #pragma minimal dependence distance: -(N % 2) + 2 diff --git a/polly/test/IstAstInfo/dependence_distance_varying_in_outer_loop.ll b/polly/test/IstAstInfo/dependence_distance_varying_in_outer_loop.ll index 8ed3220..1668fc0 100644 --- a/polly/test/IstAstInfo/dependence_distance_varying_in_outer_loop.ll +++ b/polly/test/IstAstInfo/dependence_distance_varying_in_outer_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-canonicalize -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;        void f(int *restrict A, int *restrict sum) {  ; CHECK:   #pragma minimal dependence distance: 1 diff --git a/polly/test/IstAstInfo/dependence_distance_varying_multiple.ll b/polly/test/IstAstInfo/dependence_distance_varying_multiple.ll index 73768e9..0d0aa8b 100644 --- a/polly/test/IstAstInfo/dependence_distance_varying_multiple.ll +++ b/polly/test/IstAstInfo/dependence_distance_varying_multiple.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-stmt-granularity=bb -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ;        void f(int *restrict A, int *restrict B, int *restrict C, int *restrict D,  ;               int *restrict E, int N) { diff --git a/polly/test/IstAstInfo/domain_bounded_only_with_context.ll b/polly/test/IstAstInfo/domain_bounded_only_with_context.ll index e2cf0bd..2ed94e5 100644 --- a/polly/test/IstAstInfo/domain_bounded_only_with_context.ll +++ b/polly/test/IstAstInfo/domain_bounded_only_with_context.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; CHECK:      {  ; CHECK-NEXT:    if (p <= -1 || p >= 1) diff --git a/polly/test/IstAstInfo/non_affine_access.ll b/polly/test/IstAstInfo/non_affine_access.ll index 98e8d2d..a285a8f 100644 --- a/polly/test/IstAstInfo/non_affine_access.ll +++ b/polly/test/IstAstInfo/non_affine_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-print-accesses -polly-allow-nonaffine -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-print-accesses -polly-allow-nonaffine -disable-output < %s | FileCheck %s  ;  ;    void non_affine_access(float A[]) {  ;      for (long i = 0; i < 1024; i++) diff --git a/polly/test/IstAstInfo/reduction_clauses_multidimensional_access.ll b/polly/test/IstAstInfo/reduction_clauses_multidimensional_access.ll index 697b6ca..3fefc74 100644 --- a/polly/test/IstAstInfo/reduction_clauses_multidimensional_access.ll +++ b/polly/test/IstAstInfo/reduction_clauses_multidimensional_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK: #pragma known-parallel reduction (^ : MemRef_sum)  ;        void f(int N, int M, int P, int sum[P][M]) { diff --git a/polly/test/IstAstInfo/reduction_clauses_onedimensional_access.ll b/polly/test/IstAstInfo/reduction_clauses_onedimensional_access.ll index c20a7d6..41bd178 100644 --- a/polly/test/IstAstInfo/reduction_clauses_onedimensional_access.ll +++ b/polly/test/IstAstInfo/reduction_clauses_onedimensional_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK: #pragma known-parallel reduction (^ : MemRef_sum)  ;        void f(int N, int M, int *sum) { diff --git a/polly/test/IstAstInfo/reduction_dependences_equal_non_reduction_dependences.ll b/polly/test/IstAstInfo/reduction_dependences_equal_non_reduction_dependences.ll index e6092f0..5aa8a0c 100644 --- a/polly/test/IstAstInfo/reduction_dependences_equal_non_reduction_dependences.ll +++ b/polly/test/IstAstInfo/reduction_dependences_equal_non_reduction_dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; This loopnest contains a reduction which imposes the same dependences as the  ; accesses to the array A. We need to ensure we do __not__ parallelize anything diff --git a/polly/test/IstAstInfo/reduction_different_reduction_clauses.ll b/polly/test/IstAstInfo/reduction_different_reduction_clauses.ll index 14de70f..91f7c9d 100644 --- a/polly/test/IstAstInfo/reduction_different_reduction_clauses.ll +++ b/polly/test/IstAstInfo/reduction_different_reduction_clauses.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK: #pragma simd reduction (+ : MemRef_sum{{[1,2]}}, MemRef_sum{{[1,2]}}) reduction (* : MemRef_prod) reduction (| : MemRef_or) reduction (& : MemRef_and)  ; CHECK: #pragma known-parallel reduction (+ : MemRef_sum{{[1,2]}}, MemRef_sum{{[1,2]}}) reduction (* : MemRef_prod) reduction (| : MemRef_or) reduction (& : MemRef_and) diff --git a/polly/test/IstAstInfo/reduction_in_one_dimension.ll b/polly/test/IstAstInfo/reduction_in_one_dimension.ll index 797115b..d0173bc 100644 --- a/polly/test/IstAstInfo/reduction_in_one_dimension.ll +++ b/polly/test/IstAstInfo/reduction_in_one_dimension.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; Verify that we won't privatize anything in the outer dimension  ; diff --git a/polly/test/IstAstInfo/reduction_loop_reversal.ll b/polly/test/IstAstInfo/reduction_loop_reversal.ll index d301197..d010e26 100644 --- a/polly/test/IstAstInfo/reduction_loop_reversal.ll +++ b/polly/test/IstAstInfo/reduction_loop_reversal.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-import-jscop -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK-NOT: #pragma simd{{\s*$}}  ; CHECK: #pragma simd reduction diff --git a/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule.ll b/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule.ll index 15fca88..7f78bad 100644 --- a/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule.ll +++ b/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK:          #pragma known-parallel reduction (+ : MemRef_A)  ; CHECK-NEXT:     for (int c0 = 0; c0 <= 2; c0 += 1) { diff --git a/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule_2.ll b/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule_2.ll index 44e9aa4..42e9c3b 100644 --- a/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule_2.ll +++ b/polly/test/IstAstInfo/reduction_modulo_and_loop_reversal_schedule_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK:    #pragma known-parallel reduction  ; CHECK:    for (int c0 = 0; c0 <= 2; c0 += 1) { diff --git a/polly/test/IstAstInfo/reduction_modulo_schedule.ll b/polly/test/IstAstInfo/reduction_modulo_schedule.ll index c39ffa59..8bdd529 100644 --- a/polly/test/IstAstInfo/reduction_modulo_schedule.ll +++ b/polly/test/IstAstInfo/reduction_modulo_schedule.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-import-jscop -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK:          #pragma known-parallel reduction (+ : MemRef_A)  ; CHECK-NEXT:     for (int c0 = 0; c0 <= 2; c0 += 1) { diff --git a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions.ll b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions.ll index 2667535..4811069 100644 --- a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions.ll +++ b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK:    #pragma known-parallel  ; CHECK:    for (int c0 = 0; c0 <= 1; c0 += 1) diff --git a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_2.ll b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_2.ll index d7f9029..4f5ac24 100644 --- a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_2.ll +++ b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; Verify that the outer dimension doesn't carry reduction dependences  ; diff --git a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_3.ll b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_3.ll index f18060a..472a048 100644 --- a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_3.ll +++ b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; Verify that the outer dimension doesn't carry reduction dependences  ; diff --git a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_4.ll b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_4.ll index 8e2a590..2cc911d 100644 --- a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_4.ll +++ b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; Verify that the outer dimension doesn't carry reduction dependences  ; diff --git a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_5.ll b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_5.ll index b889db4..1b2d0eb 100644 --- a/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_5.ll +++ b/polly/test/IstAstInfo/reduction_modulo_schedule_multiple_dimensions_5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; Verify that only the outer dimension needs privatization  ; diff --git a/polly/test/IstAstInfo/reduction_multiple_dimensions.ll b/polly/test/IstAstInfo/reduction_multiple_dimensions.ll index 2a8fd7a..884cea7 100644 --- a/polly/test/IstAstInfo/reduction_multiple_dimensions.ll +++ b/polly/test/IstAstInfo/reduction_multiple_dimensions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK-NOT:#pragma known-parallel reduction  ; CHECK:    #pragma known-parallel diff --git a/polly/test/IstAstInfo/reduction_multiple_dimensions_2.ll b/polly/test/IstAstInfo/reduction_multiple_dimensions_2.ll index 25f2fa5..013a7d4 100644 --- a/polly/test/IstAstInfo/reduction_multiple_dimensions_2.ll +++ b/polly/test/IstAstInfo/reduction_multiple_dimensions_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK-NOT:#pragma known-parallel reduction  ; CHECK:    #pragma known-parallel diff --git a/polly/test/IstAstInfo/reduction_multiple_dimensions_3.ll b/polly/test/IstAstInfo/reduction_multiple_dimensions_3.ll index 0d6be9a..2dc6d86 100644 --- a/polly/test/IstAstInfo/reduction_multiple_dimensions_3.ll +++ b/polly/test/IstAstInfo/reduction_multiple_dimensions_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK-NOT:#pragma known-parallel reduction  ; CHECK:    #pragma known-parallel diff --git a/polly/test/IstAstInfo/reduction_multiple_dimensions_4.ll b/polly/test/IstAstInfo/reduction_multiple_dimensions_4.ll index 8b53751..dcd75945 100644 --- a/polly/test/IstAstInfo/reduction_multiple_dimensions_4.ll +++ b/polly/test/IstAstInfo/reduction_multiple_dimensions_4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s | FileCheck %s  ;  ; CHECK-NOT:#pragma known-parallel reduction  ; CHECK:    #pragma known-parallel diff --git a/polly/test/IstAstInfo/run-time-condition.ll b/polly/test/IstAstInfo/run-time-condition.ll index 44d3534..67fc4b7 100644 --- a/polly/test/IstAstInfo/run-time-condition.ll +++ b/polly/test/IstAstInfo/run-time-condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; for (i = 0; i < 1024; i++)  ;   A[i] = B[i]; diff --git a/polly/test/IstAstInfo/runtime_context_with_error_blocks.ll b/polly/test/IstAstInfo/runtime_context_with_error_blocks.ll index aef509a..d674f42 100644 --- a/polly/test/IstAstInfo/runtime_context_with_error_blocks.ll +++ b/polly/test/IstAstInfo/runtime_context_with_error_blocks.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-invariant-load-hoisting=true -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-invariant-load-hoisting=true -disable-output < %s | FileCheck %s  ;  ; Verify we do not simplify the runtime check to "true" due to the domain  ; constraints as the test contains an error block that influenced the domains diff --git a/polly/test/IstAstInfo/simple-run-time-condition.ll b/polly/test/IstAstInfo/simple-run-time-condition.ll index 488cd18..73a7c59 100644 --- a/polly/test/IstAstInfo/simple-run-time-condition.ll +++ b/polly/test/IstAstInfo/simple-run-time-condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-precise-inbounds -polly-precise-fold-accesses -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-precise-inbounds -polly-precise-fold-accesses -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/polly/test/IstAstInfo/single_loop_strip_mine.ll b/polly/test/IstAstInfo/single_loop_strip_mine.ll index afe6179..f546972 100644 --- a/polly/test/IstAstInfo/single_loop_strip_mine.ll +++ b/polly/test/IstAstInfo/single_loop_strip_mine.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-ast-print-accesses -polly-ast-detect-parallel '-passes=polly-import-jscop,print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=CHECK-VECTOR +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-ast-print-accesses -polly-ast-detect-parallel '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=CHECK-VECTOR  ; for (i = 0; i < 1024; i++)  ;   A[i] = B[i]; diff --git a/polly/test/IstAstInfo/single_loop_uint_max_iterations.ll b/polly/test/IstAstInfo/single_loop_uint_max_iterations.ll index f614f90..c9ae9e8 100644 --- a/polly/test/IstAstInfo/single_loop_uint_max_iterations.ll +++ b/polly/test/IstAstInfo/single_loop_uint_max_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; XFAIL: *  ;#include "limits.h" diff --git a/polly/test/IstAstInfo/single_loop_ull_max_iterations.ll b/polly/test/IstAstInfo/single_loop_ull_max_iterations.ll index e91ea13..4522716 100644 --- a/polly/test/IstAstInfo/single_loop_ull_max_iterations.ll +++ b/polly/test/IstAstInfo/single_loop_ull_max_iterations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; XFAIL: *  ;#include "limits.h" diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Bad-relation.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Bad-relation.ll index 49a9625..28b6a7c 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Bad-relation.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Bad-relation.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: expecting other token  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-No-accesses-key.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-No-accesses-key.ll index 749b962..f19a632 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-No-accesses-key.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-No-accesses-key.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: Statement from JScop file has no key name 'accesses' for index 1.  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-MemAcc.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-MemAcc.ll index 1d97e3e..77b9acf 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-MemAcc.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-MemAcc.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: The number of memory accesses in the JSop file and the number of memory accesses differ for index 0.  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-statements.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-statements.ll index f4b7393..0a06ff6 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-statements.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Not-enough-statements.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: The number of indices and the number of statements differ.  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Relation-mispelled.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Relation-mispelled.ll index 1f5cda35..35b7af0 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Relation-mispelled.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Relation-mispelled.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: Memory access number 0 has no key name 'relation' for statement number 1.  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Statements-mispelled.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Statements-mispelled.ll index 0c75084..109665a 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Statements-mispelled.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Statements-mispelled.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: JScop file has no key name 'statements'.  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Undeclared-ScopArrayInfo.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Undeclared-ScopArrayInfo.ll index d8c9c3f..f345d1c 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Undeclared-ScopArrayInfo.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Undeclared-ScopArrayInfo.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: JScop file contains access function with undeclared ScopArrayInfo  ; diff --git a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Wrong-number-dimensions.ll b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Wrong-number-dimensions.ll index f8d7cb8..a66d5c8 100644 --- a/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Wrong-number-dimensions.ll +++ b/polly/test/JSONExporter/ImportAccesses/ImportAccesses-Wrong-number-dimensions.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: JScop file changes the number of parameter dimensions.  ; diff --git a/polly/test/JSONExporter/ImportArrays/ImportArrays-Mispelled-type.ll b/polly/test/JSONExporter/ImportArrays/ImportArrays-Mispelled-type.ll index 6e13a5e..ae0b4ed 100644 --- a/polly/test/JSONExporter/ImportArrays/ImportArrays-Mispelled-type.ll +++ b/polly/test/JSONExporter/ImportArrays/ImportArrays-Mispelled-type.ll @@ -1,4 +1,4 @@ -  ; RUN: not --crash opt %loadNPMPolly -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Array has not a valid type.  ; diff --git a/polly/test/JSONExporter/ImportArrays/ImportArrays-Negative-size.ll b/polly/test/JSONExporter/ImportArrays/ImportArrays-Negative-size.ll index 7f657877..6c434e15 100644 --- a/polly/test/JSONExporter/ImportArrays/ImportArrays-Negative-size.ll +++ b/polly/test/JSONExporter/ImportArrays/ImportArrays-Negative-size.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly -polly-stmt-granularity=bb -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s +; RUN: not --crash opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s  ;  ; #define Ni 1056  ; #define Nj 1056 diff --git a/polly/test/JSONExporter/ImportArrays/ImportArrays-No-name.ll b/polly/test/JSONExporter/ImportArrays/ImportArrays-No-name.ll index e698bdc..b004c47 100644 --- a/polly/test/JSONExporter/ImportArrays/ImportArrays-No-name.ll +++ b/polly/test/JSONExporter/ImportArrays/ImportArrays-No-name.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Array has no key 'name'.  ; diff --git a/polly/test/JSONExporter/ImportArrays/ImportArrays-No-sizes-key.ll b/polly/test/JSONExporter/ImportArrays/ImportArrays-No-sizes-key.ll index f130b65..5f62a45 100644 --- a/polly/test/JSONExporter/ImportArrays/ImportArrays-No-sizes-key.ll +++ b/polly/test/JSONExporter/ImportArrays/ImportArrays-No-sizes-key.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Array has no key 'sizes'.  ; diff --git a/polly/test/JSONExporter/ImportArrays/ImportArrays-No-type-key.ll b/polly/test/JSONExporter/ImportArrays/ImportArrays-No-type-key.ll index 68d2e50..029fde1 100644 --- a/polly/test/JSONExporter/ImportArrays/ImportArrays-No-type-key.ll +++ b/polly/test/JSONExporter/ImportArrays/ImportArrays-No-type-key.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop>' -polly-import-jscop-postfix=transformed -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Array has no key 'type'.  ; diff --git a/polly/test/JSONExporter/ImportContext/ImportContext-Context-mispelled.ll b/polly/test/JSONExporter/ImportContext/ImportContext-Context-mispelled.ll index 94c77dc..9ac371b 100644 --- a/polly/test/JSONExporter/ImportContext/ImportContext-Context-mispelled.ll +++ b/polly/test/JSONExporter/ImportContext/ImportContext-Context-mispelled.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: JScop file has no key named 'context'.  ; diff --git a/polly/test/JSONExporter/ImportContext/ImportContext-Not-parameter-set.ll b/polly/test/JSONExporter/ImportContext/ImportContext-Not-parameter-set.ll index c20d5c0..82afcd9 100644 --- a/polly/test/JSONExporter/ImportContext/ImportContext-Not-parameter-set.ll +++ b/polly/test/JSONExporter/ImportContext/ImportContext-Not-parameter-set.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: The isl_set is not a parameter set.  ; diff --git a/polly/test/JSONExporter/ImportContext/ImportContext-Unvalid-Context.ll b/polly/test/JSONExporter/ImportContext/ImportContext-Unvalid-Context.ll index 92f4d61..0308452 100644 --- a/polly/test/JSONExporter/ImportContext/ImportContext-Unvalid-Context.ll +++ b/polly/test/JSONExporter/ImportContext/ImportContext-Unvalid-Context.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: unexpected isl_token  ; diff --git a/polly/test/JSONExporter/ImportContext/ImportContext-Wrong-dimension.ll b/polly/test/JSONExporter/ImportContext/ImportContext-Wrong-dimension.ll index 89668d8..debb9bc 100644 --- a/polly/test/JSONExporter/ImportContext/ImportContext-Wrong-dimension.ll +++ b/polly/test/JSONExporter/ImportContext/ImportContext-Wrong-dimension.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: Imported context has the wrong number of parameters : Found 2 Expected 1  ; diff --git a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-No-schedule-key.ll b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-No-schedule-key.ll index efe15c1..6eee005 100644 --- a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-No-schedule-key.ll +++ b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-No-schedule-key.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: Statement 0 has no 'schedule' key.  ; diff --git a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Schedule-not-valid.ll b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Schedule-not-valid.ll index db516f6..59feb00 100644 --- a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Schedule-not-valid.ll +++ b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Schedule-not-valid.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: expecting other token  ; diff --git a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Statements-mispelled.ll b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Statements-mispelled.ll index b93c984..78d5243 100644 --- a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Statements-mispelled.ll +++ b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Statements-mispelled.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: JScop file has no key name 'statements'.  ; diff --git a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Wrong-number-statements.ll b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Wrong-number-statements.ll index 3fa14c6..877547c 100644 --- a/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Wrong-number-statements.ll +++ b/polly/test/JSONExporter/ImportSchedule/ImportSchedule-Wrong-number-statements.ll @@ -1,4 +1,4 @@ -; RUN: not --crash opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-ast>' -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s +; RUN: not --crash opt %loadNPMPolly '-passes=polly-custom<import-jscop;ast>' -polly-print-ast -polly-ast-detect-parallel -disable-output < %s 2>&1 >/dev/null | FileCheck %s  ;  ; CHECK: The number of indices and the number of statements differ.  ; diff --git a/polly/test/MaximalStaticExpansion/load_after_store_same_statement.ll b/polly/test/MaximalStaticExpansion/load_after_store_same_statement.ll index 1d81ff7..9f99920 100644 --- a/polly/test/MaximalStaticExpansion/load_after_store_same_statement.ll +++ b/polly/test/MaximalStaticExpansion/load_after_store_same_statement.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -pass-remarks-analysis=polly-mse -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE  ;  ; Verify that the expansion of an array with load after store in a same statement is not done.  ; diff --git a/polly/test/MaximalStaticExpansion/read_from_original.ll b/polly/test/MaximalStaticExpansion/read_from_original.ll index 57017381..1a733c1 100644 --- a/polly/test/MaximalStaticExpansion/read_from_original.ll +++ b/polly/test/MaximalStaticExpansion/read_from_original.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -pass-remarks-analysis=polly-mse -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE  ;  ; Verify that Polly detects problems and does not expand the array  ; diff --git a/polly/test/MaximalStaticExpansion/too_many_writes.ll b/polly/test/MaximalStaticExpansion/too_many_writes.ll index 7e33de1..a7aa162 100644 --- a/polly/test/MaximalStaticExpansion/too_many_writes.ll +++ b/polly/test/MaximalStaticExpansion/too_many_writes.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -pass-remarks-analysis=polly-mse -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE  ;  ; Verify that Polly detects problems and does not expand the array  ; diff --git a/polly/test/MaximalStaticExpansion/working_deps_between_inners.ll b/polly/test/MaximalStaticExpansion/working_deps_between_inners.ll index 355fc02..06e08c4 100644 --- a/polly/test/MaximalStaticExpansion/working_deps_between_inners.ll +++ b/polly/test/MaximalStaticExpansion/working_deps_between_inners.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s  ;  ; Verify that the accesses are correctly expanded for MemoryKind::Array  ; diff --git a/polly/test/MaximalStaticExpansion/working_deps_between_inners_phi.ll b/polly/test/MaximalStaticExpansion/working_deps_between_inners_phi.ll index 9305395..076f471 100644 --- a/polly/test/MaximalStaticExpansion/working_deps_between_inners_phi.ll +++ b/polly/test/MaximalStaticExpansion/working_deps_between_inners_phi.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -pass-remarks-analysis=polly-mse -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE  ;  ; Verify that the accesses are correctly expanded for MemoryKind::Array and MemoryKind::PHI.  ; tmp_06_phi is not expanded because it need copy in. diff --git a/polly/test/MaximalStaticExpansion/working_expansion.ll b/polly/test/MaximalStaticExpansion/working_expansion.ll index a055e50..2b040f3 100644 --- a/polly/test/MaximalStaticExpansion/working_expansion.ll +++ b/polly/test/MaximalStaticExpansion/working_expansion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s  ;  ; Verify that the accesses are correctly expanded for MemoryKind::Array  ; diff --git a/polly/test/MaximalStaticExpansion/working_expansion_multiple_dependences_per_statement.ll b/polly/test/MaximalStaticExpansion/working_expansion_multiple_dependences_per_statement.ll index 77338c9..f863c0e 100644 --- a/polly/test/MaximalStaticExpansion/working_expansion_multiple_dependences_per_statement.ll +++ b/polly/test/MaximalStaticExpansion/working_expansion_multiple_dependences_per_statement.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s  ;  ; Verify that the accesses are correctly expanded  ; diff --git a/polly/test/MaximalStaticExpansion/working_expansion_multiple_instruction_per_statement.ll b/polly/test/MaximalStaticExpansion/working_expansion_multiple_instruction_per_statement.ll index 9cfa553..a823bdb 100644 --- a/polly/test/MaximalStaticExpansion/working_expansion_multiple_instruction_per_statement.ll +++ b/polly/test/MaximalStaticExpansion/working_expansion_multiple_instruction_per_statement.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s  ;  ; Verify that the accesses are correctly expanded  ; diff --git a/polly/test/MaximalStaticExpansion/working_phi_expansion.ll b/polly/test/MaximalStaticExpansion/working_phi_expansion.ll index 63e4d48..0898f99 100644 --- a/polly/test/MaximalStaticExpansion/working_phi_expansion.ll +++ b/polly/test/MaximalStaticExpansion/working_phi_expansion.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -pass-remarks-analysis=polly-mse -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE  ;  ; Verify that the accesses are correctly expanded for MemoryKind::PHI  ; tmp_04 is not expanded because it need copy-in. diff --git a/polly/test/MaximalStaticExpansion/working_phi_two_scalars.ll b/polly/test/MaximalStaticExpansion/working_phi_two_scalars.ll index 87bd57a..2a332ba7 100644 --- a/polly/test/MaximalStaticExpansion/working_phi_two_scalars.ll +++ b/polly/test/MaximalStaticExpansion/working_phi_two_scalars.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-mse>)" -pass-remarks-analysis="polly-mse" -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<mse>' -polly-print-mse -pass-remarks-analysis=polly-mse -disable-output < %s 2>&1 | FileCheck %s --check-prefix=MSE  ;  ; Verify that the accesses are correctly expanded for MemoryKind::PHI  ; tmp_05 and tmp2_06 are not expanded because they need copy-in. diff --git a/polly/test/MaximalStaticExpansion/working_value_expansion.ll b/polly/test/MaximalStaticExpansion/working_value_expansion.ll index cc28a78..77f20bb 100644 --- a/polly/test/MaximalStaticExpansion/working_value_expansion.ll +++ b/polly/test/MaximalStaticExpansion/working_value_expansion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-mse>)" -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<mse>' -polly-print-mse -disable-output < %s | FileCheck %s  ;  ; Verify that the accesses are correctly expanded for MemoryKind::Value  ; diff --git a/polly/test/PruneUnprofitable/prune_only_scalardeps.ll b/polly/test/PruneUnprofitable/prune_only_scalardeps.ll index 9cc2aec..b4524c2 100644 --- a/polly/test/PruneUnprofitable/prune_only_scalardeps.ll +++ b/polly/test/PruneUnprofitable/prune_only_scalardeps.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-process-unprofitable=false -polly-unprofitable-scalar-accs=false "-passes=scop(polly-prune-unprofitable)" -disable-output -stats < %s 2>&1 | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-process-unprofitable=false -polly-unprofitable-scalar-accs=false '-passes=polly-custom<prune>' -disable-output -stats < %s 2>&1 | FileCheck -match-full-lines %s  ; REQUIRES: asserts  ;  ; Skip this SCoP for having scalar dependencies between all statements, diff --git a/polly/test/ScheduleOptimizer/2012-03-16-Empty-Domain.ll b/polly/test/ScheduleOptimizer/2012-03-16-Empty-Domain.ll index 38facb1..c8c006c 100644 --- a/polly/test/ScheduleOptimizer/2012-03-16-Empty-Domain.ll +++ b/polly/test/ScheduleOptimizer/2012-03-16-Empty-Domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -S < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -S < %s  target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-a0:0-n32"  define void @sdbout_label() nounwind { diff --git a/polly/test/ScheduleOptimizer/2013-04-11-Empty-Domain-two.ll b/polly/test/ScheduleOptimizer/2013-04-11-Empty-Domain-two.ll index 8359860..23033fa 100644 --- a/polly/test/ScheduleOptimizer/2013-04-11-Empty-Domain-two.ll +++ b/polly/test/ScheduleOptimizer/2013-04-11-Empty-Domain-two.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -S < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -S < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Check that we handle statements with an empty iteration domain correctly. diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-double.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-double.ll index 5e4ce82..fdaed3c 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-double.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-double.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s  define void @func(i32 %n, ptr  noalias nonnull %A,  ptr  noalias nonnull %B) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-first.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-first.ll index de4c387..65d4957 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-first.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-first.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK,OPT +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK,OPT  define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, i32 %k) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-third.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-third.ll index 91bd549..06d55f4 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-third.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-except-third.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK  define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, i32 %k) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-carried.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-carried.ll index 8b69d9e..0af703c 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-carried.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-carried.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK,OPT +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK,OPT  define void @func(i32 %n, ptr noalias nonnull %A) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-third.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-third.ll index 49d1124..ca6840b 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-third.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner-third.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefixes=CHECK +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK,RAW +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefixes=CHECK  define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, i32 %k) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner.ll index a449a2f..f96e4ba 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-inner.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s  define void @func(i32 %n, ptr noalias nonnull %A) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-simple.ll b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-simple.ll index 798e9b9..229d13a 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/fuse-simple.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/fuse-simple.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s  define void @func(i32 %n, ptr noalias nonnull %A) {  entry: diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-simple.ll b/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-simple.ll index 4d0ccc9..9bc9a25 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-simple.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-simple.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s  ; This could theoretically be fused by adjusting the offset of the second loop by %k (instead of relying on schedule dimensions). diff --git a/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-with-middle.ll b/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-with-middle.ll index bf470b9..5b0cefb 100644 --- a/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-with-middle.ll +++ b/polly/test/ScheduleOptimizer/GreedyFuse/nofuse-with-middle.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=1 -polly-loopfusion-greedy=1 -polly-postopts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s  define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, i32 %k) {  entry: diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/disable_nonforced.ll b/polly/test/ScheduleOptimizer/ManualOptimization/disable_nonforced.ll index b0f75dd..2225f05 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/disable_nonforced.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/disable_nonforced.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Check that the disable_nonforced metadata is honored; optimization  ; heuristics/rescheduling must not be applied. diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll index 900360d..4add219 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_heuristic.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-pragma-based-opts=1 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines --check-prefix=ON -; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-pragma-based-opts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines --check-prefix=OFF +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-pragma-based-opts=1 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines --check-prefix=ON +; RUN: opt %loadNPMPolly -polly-reschedule=0 -polly-pragma-based-opts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines --check-prefix=OFF  ;  define void @func(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B) {  entry: diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll index d45b624..d59f9e5 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_looploc.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-reschedule=0 -polly-pragma-based-opts=1 -disable-output < %s 2>&1 | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-reschedule=0 -polly-pragma-based-opts=1 -disable-output < %s 2>&1 | FileCheck %s --match-full-lines  ;  ; CHECK: warning: distribute_illegal.c:2:3: not applying loop fission/distribution: cannot ensure semantic equivalence due to possible dependency violations  ; diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll index d835e66..a1caaf5 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/distribute_illegal_pragmaloc.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-reschedule=0 -polly-pragma-based-opts=1 -disable-output < %s 2>&1 | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-reschedule=0 -polly-pragma-based-opts=1 -disable-output < %s 2>&1 | FileCheck %s --match-full-lines  ;  ; CHECK: warning: distribute_illegal.c:1:42: not applying loop fission/distribution: cannot ensure semantic equivalence due to possible dependency violations  ; diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_disable.ll b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_disable.ll index a5781a7f..b0571020 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_disable.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_disable.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pragma-based-opts=1 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly -polly-pragma-based-opts=1 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines  ;  ; Override unroll metadata with llvm.loop.unroll.disable.  ; diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_double.ll b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_double.ll index cccf136..8992bc9 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_double.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_double.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines  ;  ; Apply two loop transformations. First partial, then full unrolling.  ; diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_full.ll b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_full.ll index 4d49907..7bea96f 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_full.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_full.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines  ;  ; Full unroll of a loop with 5 iterations.  ; diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_heuristic.ll b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_heuristic.ll index d67472a..34a6f48 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_heuristic.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_heuristic.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-pragma-based-opts=1 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines -; RUN: opt %loadNPMPolly -polly-pragma-based-opts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly -polly-pragma-based-opts=1 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly -polly-pragma-based-opts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines  ;  ; Unrolling with heuristic factor.  ; Currently not supported and expected to be handled by LLVM's unroll pass. diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial.ll b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial.ll index 90101b4..ce22813 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-pragma-based-opts=1 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --match-full-lines -; RUN: opt %loadNPMPolly -polly-pragma-based-opts=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefix=OFF --match-full-lines +; RUN: opt %loadNPMPolly -polly-pragma-based-opts=1 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --match-full-lines +; RUN: opt %loadNPMPolly -polly-pragma-based-opts=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefix=OFF --match-full-lines  ;  ; Partial unroll by a factor of 4.  ; diff --git a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial_followup.ll b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial_followup.ll index 4cfa3fb..f6810ba 100644 --- a/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial_followup.ll +++ b/polly/test/ScheduleOptimizer/ManualOptimization/unroll_partial_followup.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s --check-prefix=OPT --match-full-lines -; RUN: opt %loadNPMPolly '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=AST --match-full-lines -; RUN: opt %loadNPMPolly '-passes=scop(polly-opt-isl,polly-codegen),simplifycfg' -S < %s | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s --check-prefix=OPT --match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=AST --match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts;opt-isl>' -S < %s | FileCheck %s --check-prefix=CODEGEN  ;  ; Partial unroll by a factor of 4.  ; @@ -54,6 +54,6 @@ return:  ; AST-NEXT:  for (int c0 = 0; c0 < n; c0 += 4) { -; CODEGEN: br i1 %polly.loop_cond, label %polly.loop_header, label %polly.exiting, !llvm.loop ![[LOOPID:[0-9]+]] +; CODEGEN: br i1 %polly.loop_cond, label %polly.loop_header, label %polly.loop_exit, !llvm.loop ![[LOOPID:[0-9]+]]  ; CODEGEN: ![[LOOPID]] = distinct !{![[LOOPID]], ![[LOOPNAME:[0-9]+]]}  ; CODEGEN: ![[LOOPNAME]] = !{!"llvm.loop.id", !"This-is-the-unrolled-loop"} diff --git a/polly/test/ScheduleOptimizer/SIMDInParallelFor.ll b/polly/test/ScheduleOptimizer/SIMDInParallelFor.ll index 3f6f50e..b03d475 100644 --- a/polly/test/ScheduleOptimizer/SIMDInParallelFor.ll +++ b/polly/test/ScheduleOptimizer/SIMDInParallelFor.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-parallel -polly-vectorizer=stripmine -passes=polly-codegen-verify '-passes=polly-opt-isl,print<polly-ast>,polly-codegen' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-parallel -polly-vectorizer=stripmine -passes=polly-codegen-verify '-passes=polly-custom<opt-isl;ast;codegen>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ; Check that there are no nested #pragma omp parallel for inside a  ; #pragma omp parallel for loop. diff --git a/polly/test/ScheduleOptimizer/computeout.ll b/polly/test/ScheduleOptimizer/computeout.ll index a3286b4..6f34f4e 100644 --- a/polly/test/ScheduleOptimizer/computeout.ll +++ b/polly/test/ScheduleOptimizer/computeout.ll @@ -1,5 +1,5 @@ -; RUN: opt -S %loadNPMPolly "-passes=scop(polly-opt-isl,print<polly-ast>)" -polly-isl-arg=--no-schedule-serialize-sccs -disable-output < %s | FileCheck %s -; RUN: opt -S %loadNPMPolly "-passes=scop(polly-opt-isl,print<polly-ast>)" -polly-isl-arg=--no-schedule-serialize-sccs -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s -check-prefix=TIMEOUT +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -polly-isl-arg=--no-schedule-serialize-sccs -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -polly-isl-arg=--no-schedule-serialize-sccs -polly-dependences-computeout=1 -disable-output < %s | FileCheck %s -check-prefix=TIMEOUT  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ;     for(i = 0; i < 100; i++ ) diff --git a/polly/test/ScheduleOptimizer/ensure-correct-tile-sizes.ll b/polly/test/ScheduleOptimizer/ensure-correct-tile-sizes.ll index 928ee85..4be0b94 100644 --- a/polly/test/ScheduleOptimizer/ensure-correct-tile-sizes.ll +++ b/polly/test/ScheduleOptimizer/ensure-correct-tile-sizes.ll @@ -1,9 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable -polly-remarks-minimal \ -; RUN:     '-passes=polly-opt-isl,print<polly-ast>' -polly-pattern-matching-based-opts=true \ -; RUN:     -polly-target-throughput-vector-fma=1 \ -; RUN:     -polly-target-latency-vector-fma=1 \ -; RUN:     -polly-target-vector-register-bitwidth=4096 \ -; RUN:     -polly-target-1st-cache-level-associativity=3 -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable -polly-remarks-minimal '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=1 -polly-target-vector-register-bitwidth=4096 -polly-target-1st-cache-level-associativity=3 -disable-output < %s | FileCheck %s  ;  ;     /* Test that Polly does not crash due to configurations that can lead to  ;    incorrect tile size computations. diff --git a/polly/test/ScheduleOptimizer/focaltech_test_detail_threshold-7bc17e.ll b/polly/test/ScheduleOptimizer/focaltech_test_detail_threshold-7bc17e.ll index b533cb8..548a8aa 100644 --- a/polly/test/ScheduleOptimizer/focaltech_test_detail_threshold-7bc17e.ll +++ b/polly/test/ScheduleOptimizer/focaltech_test_detail_threshold-7bc17e.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-opt-isl>)" -polly-vectorizer=stripmine -polly-invariant-load-hoisting -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -polly-vectorizer=stripmine -polly-invariant-load-hoisting -disable-output < %s | FileCheck %s  ;  ; llvm.org/PR46578  ; diff --git a/polly/test/ScheduleOptimizer/full_partial_tile_separation.ll b/polly/test/ScheduleOptimizer/full_partial_tile_separation.ll index 3dd579e..6de5e3a 100644 --- a/polly/test/ScheduleOptimizer/full_partial_tile_separation.ll +++ b/polly/test/ScheduleOptimizer/full_partial_tile_separation.ll @@ -1,4 +1,4 @@ -; RUN: opt -S %loadNPMPolly -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; CHECK:          // 1st level tiling - Tiles  ; CHECK-NEXT:    #pragma known-parallel  ; CHECK-NEXT:    for (int c0 = 0; c0 <= floord(ni - 1, 32); c0 += 1) diff --git a/polly/test/ScheduleOptimizer/line-tiling-2.ll b/polly/test/ScheduleOptimizer/line-tiling-2.ll index 3a2c566..6256adf 100644 --- a/polly/test/ScheduleOptimizer/line-tiling-2.ll +++ b/polly/test/ScheduleOptimizer/line-tiling-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-tile-sizes=1,64 '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-tile-sizes=1,64 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; CHECK: for (int c0 = 0; c0 <= 1023; c0 += 1)  ; CHECK:   for (int c1 = 0; c1 <= 7; c1 += 1) diff --git a/polly/test/ScheduleOptimizer/line-tiling.ll b/polly/test/ScheduleOptimizer/line-tiling.ll index 0dbdeff..51e0259 100644 --- a/polly/test/ScheduleOptimizer/line-tiling.ll +++ b/polly/test/ScheduleOptimizer/line-tiling.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-tile-sizes=64,1 '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-tile-sizes=64,1 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ; CHECK: for (int c0 = 0; c0 <= 15; c0 += 1)  ; CHECK:   for (int c1 = 0; c1 <= 511; c1 += 1) diff --git a/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout.ll b/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout.ll index 8f270b9..79deedc 100644 --- a/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout.ll +++ b/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout.ll @@ -1,13 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -polly-optimized-scops \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-2nd-cache-level-size=262144 -polly-optimized-scops -polly-target-vector-register-bitwidth=256 -disable-output < %s  ;  ;    /* C := alpha*A*B + beta*C */  ;    for (i = 0; i < _PB_NI; i++) diff --git a/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout_2.ll b/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout_2.ll index de1c815..e3ae1a0 100644 --- a/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout_2.ll +++ b/polly/test/ScheduleOptimizer/mat_mul_pattern_data_layout_2.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-2nd-cache-level-size=262144 -polly-target-vector-register-bitwidth=256 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;    /* C := alpha*A*B + beta*C */  ;    /* _PB_NK % Kc != 0 */ diff --git a/polly/test/ScheduleOptimizer/one-dimensional-band.ll b/polly/test/ScheduleOptimizer/one-dimensional-band.ll index a097d4a..f37f1e5 100644 --- a/polly/test/ScheduleOptimizer/one-dimensional-band.ll +++ b/polly/test/ScheduleOptimizer/one-dimensional-band.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;    void jacobi1d(long T, long N, float *A, float *B) {  ;      long t, i, j; diff --git a/polly/test/ScheduleOptimizer/outer_coincidence.ll b/polly/test/ScheduleOptimizer/outer_coincidence.ll index 7c1af80..e0a7a63 100644 --- a/polly/test/ScheduleOptimizer/outer_coincidence.ll +++ b/polly/test/ScheduleOptimizer/outer_coincidence.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-tiling=0 -polly-parallel -polly-opt-outer-coincidence=no  '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-tiling=0 -polly-parallel -polly-opt-outer-coincidence=yes '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=OUTER +; RUN: opt %loadNPMPolly -polly-tiling=0 -polly-parallel -polly-opt-outer-coincidence=no '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-tiling=0 -polly-parallel -polly-opt-outer-coincidence=yes '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=OUTER  ; By skewing, the diagonal can be made parallel. ISL does this when the Check  ; the 'outer_coincidence' option is enabled. diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm.ll index a19b93d..84f1ca0 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm.ll @@ -1,8 +1,4 @@ -; RUN: opt %loadNPMPolly \ -; RUN: -polly-pattern-matching-based-opts=true \ -; RUN: '-passes=polly-optree,polly-delicm,polly-simplify,polly-opt-isl' \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true '-passes=polly-custom<optree;delicm;simplify;opt-isl>' -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ; Check that the pattern matching detects the matrix multiplication pattern diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm_2.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm_2.ll index 4ef0605..72fb4f1 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm_2.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts-after-delicm_2.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-delicm,polly-simplify,polly-opt-isl' \ -; RUN: -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm;simplify-1;opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ; Check that the pattern matching detects the tensor contraction pattern diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts.ll index 09118e2..933b2d4 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts.ll @@ -1,8 +1,7 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=false \ -; RUN: -debug -polly-tc-opt -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true -debug -polly-tc-opt -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PATTERN-MATCHING-OPTS -; RUN: opt %loadNPMPolly '-passes=polly-opt-isl,print<polly-ast>' -polly-pattern-matching-based-opts=true -polly-ast-detect-parallel -disable-output  < %s | FileCheck %s --check-prefix=PARALLEL-AST -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true -stats -disable-output < %s 2>&1 | FileCheck %s --check-prefix=STATS -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=false -debug -polly-tc-opt -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -debug -polly-tc-opt -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PATTERN-MATCHING-OPTS +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -polly-pattern-matching-based-opts=true -polly-ast-detect-parallel -disable-output < %s | FileCheck %s --check-prefix=PARALLEL-AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -stats -disable-output < %s 2>&1 | FileCheck %s --check-prefix=STATS -match-full-lines  ; REQUIRES: asserts  ;  ;    /* C := alpha*A*B + beta*C */ diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_11.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_11.ll index b771d1f..03e2303 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_11.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_11.ll @@ -1,16 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-opt-isl' \ -; RUN: -polly-import-jscop-postfix=transformed \ -; RUN: -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -debug \ -; RUN: -polly-tc-opt=true -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;opt-isl>' -polly-import-jscop-postfix=transformed -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 -debug -polly-tc-opt=true -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ; Check that the pattern matching detects the matrix multiplication pattern diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_12.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_12.ll index 238f6dd..4e174e3 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_12.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_12.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -passes=polly-opt-isl -disable-output < %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl>' -disable-output < %s  ;  ; Test whether isolation works as expected.  ; diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_13.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_13.ll index 0e4540e..c3d8b6e 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_13.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_13.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=2 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=128 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=2 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=128 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ; Test whether isolation works as expected.  ; diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_14.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_14.ll index 9678ad83..3705c3f 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_14.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_14.ll @@ -1,13 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,polly-opt-isl,polly-codegen'  \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -polly-import-jscop-postfix=transformed -S < %s \ -; RUN: | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;opt-isl;ast;codegen>' -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 -polly-import-jscop-postfix=transformed -S < %s | FileCheck %s  ;  ; Check that we disable the Loop Vectorizer.  ; diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_15.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_15.ll index e74884d..7ada105 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_15.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_15.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -debug-only=polly-opt-isl -disable-output \ -; RUN: -polly-tc-opt=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -debug-only=polly-opt-isl -disable-output -polly-tc-opt=true < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;    for (i = 0; i < _PB_NI; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_16.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_16.ll index 9c99a09..6647380 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_16.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_16.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;      for (i = 0; i < 1024; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_17.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_17.ll index 8e14035..fba77d5e 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_17.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_17.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;      for (i = 0; i < 32; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_18.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_18.ll index 4f562c3..4884360 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_18.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_18.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;      for (i = 0; i < 32; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_19.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_19.ll index 32ded89..c7a5d475b 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_19.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_19.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;   for (i = 0; i < 8; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_2.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_2.ll index f0c0177..1dba8be 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_2.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;    /* C := alpha*A*B + beta*C */ diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_20.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_20.ll index 155177b..3656a94 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_20.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_20.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;   for (i = 0; i < 16; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_21.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_21.ll index 3d21ac3..bd0cb05 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_21.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_21.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;    for (int i = 0; i < 32; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_22.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_22.ll index 00a4bf8..6e6788b 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_22.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_22.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;    for (int i = 0; i < 32; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_24.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_24.ll index bfe5c52..82356ae 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_24.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_24.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-reschedule=0 -passes=polly-opt-isl \ -; RUN: -polly-pattern-matching-based-opts=true -polly-tc-opt=true \ -; RUN: -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-reschedule=0 '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;      for (i = 0; i < 1024; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_25.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_25.ll index a2e1ced..ea28bb8 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_25.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_25.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -polly-tc-opt=true -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ;    for (int i = 0; i < 32; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_3.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_3.ll index 9844d37..f80d63c 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_3.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_3.ll @@ -1,19 +1,6 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-size=0 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-size=0 -polly-target-vector-register-bitwidth=256 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=EXTRACTION-OF-MACRO-KERNEL +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=EXTRACTION-OF-MACRO-KERNEL  ;  ;    /* C := alpha*A*B + beta*C */  ;    for (i = 0; i < _PB_NI; i++) diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_4.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_4.ll index 250641d..100b17e 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_4.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_4.ll @@ -1,13 +1,5 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \ -; RUN: -debug -polly-tc-opt=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=polly-opt-isl,print<polly-ast>' -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -polly-tc-opt=true -disable-output < %s |  \ -; RUN: FileCheck %s --check-prefix=PATTERN-MATCHING-OPTS +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -polly-pattern-matching-based-opts=true -debug -polly-tc-opt=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 -polly-tc-opt=true -disable-output < %s | FileCheck %s --check-prefix=PATTERN-MATCHING-OPTS  ; REQUIRES: asserts  ;  ;    C := A * B + C diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_5.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_5.ll index ad2c195..050af1b 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_5.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_5.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ; opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \  ; -polly-target-throughput-vector-fma=1 \ diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_6.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_6.ll index 1d3cdbd..ba1ddfe 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_6.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_6.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;  opt %loadNPMPolly -passes=polly-opt-isl -polly-pattern-matching-based-opts=true \  ;  -polly-target-throughput-vector-fma=1 \ diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_7.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_7.ll index 59eaa4a..e50b3a0 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_7.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_7.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;    /* C := A * B + C */  ;    /* Elements of the matrices A, B, C have the float type. */ diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_8.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_8.ll index 2544d502..3f57fe8 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_8.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_8.ll @@ -1,12 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;    /* C := A * B + C */  ;    /* Elements of the matrices B, C have the double type. */ diff --git a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_9.ll b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_9.ll index 85c1435..b87ed4f 100644 --- a/polly/test/ScheduleOptimizer/pattern-matching-based-opts_9.ll +++ b/polly/test/ScheduleOptimizer/pattern-matching-based-opts_9.ll @@ -1,14 +1,6 @@ -; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true \ -; RUN: -polly-target-throughput-vector-fma=1 \ -; RUN: -polly-target-latency-vector-fma=8 \ -; RUN: -polly-target-1st-cache-level-associativity=8 \ -; RUN: -polly-target-2nd-cache-level-associativity=8 \ -; RUN: -polly-target-1st-cache-level-size=32768 \ -; RUN: -polly-target-vector-register-bitwidth=256 \ -; RUN: -polly-target-2nd-cache-level-size=262144 \ -; RUN: -passes=polly-opt-isl -disable-output < %s +; RUN: opt %loadNPMPolly -polly-pattern-matching-based-opts=true -polly-target-throughput-vector-fma=1 -polly-target-latency-vector-fma=8 -polly-target-1st-cache-level-associativity=8 -polly-target-2nd-cache-level-associativity=8 -polly-target-1st-cache-level-size=32768 -polly-target-vector-register-bitwidth=256 -polly-target-2nd-cache-level-size=262144 '-passes=polly-custom<opt-isl>' -disable-output < %s  ; -; RUN: opt %loadNPMPolly '-passes=print<polly-dependences>' -disable-output < %s | FileCheck %s --check-prefix=DEPENDENCES +; RUN: opt %loadNPMPolly '-passes=polly-custom<deps>' -polly-print-deps -disable-output < %s | FileCheck %s --check-prefix=DEPENDENCES  ;  ;    /* C := A * B + C */  ;    /* Elements of the matrices A, B, C have the char type. */ diff --git a/polly/test/ScheduleOptimizer/pattern_matching_based_opts_splitmap.ll b/polly/test/ScheduleOptimizer/pattern_matching_based_opts_splitmap.ll index 6428589..98c1db6 100644 --- a/polly/test/ScheduleOptimizer/pattern_matching_based_opts_splitmap.ll +++ b/polly/test/ScheduleOptimizer/pattern_matching_based_opts_splitmap.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-import-jscop -polly-import-jscop-postfix=transformed -passes=polly-opt-isl -debug-only=polly-opt-isl -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-import-jscop-postfix=transformed '-passes=polly-custom<import-jscop;opt-isl>' -debug-only=polly-opt-isl -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ;  ; void pattern_matching_based_opts_splitmap(double C[static const restrict 2][2], double A[static const restrict 2][784], double B[static const restrict 784][2]) { diff --git a/polly/test/ScheduleOptimizer/prevectorization-without-tiling.ll b/polly/test/ScheduleOptimizer/prevectorization-without-tiling.ll index 1c6d289..4784dc8 100644 --- a/polly/test/ScheduleOptimizer/prevectorization-without-tiling.ll +++ b/polly/test/ScheduleOptimizer/prevectorization-without-tiling.ll @@ -1,4 +1,4 @@ -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-tiling=false -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-tiling=false -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  @C = common global [1536 x [1536 x float]] zeroinitializer, align 16 diff --git a/polly/test/ScheduleOptimizer/prevectorization.ll b/polly/test/ScheduleOptimizer/prevectorization.ll index 1ff20d1..6d1592c 100644 --- a/polly/test/ScheduleOptimizer/prevectorization.ll +++ b/polly/test/ScheduleOptimizer/prevectorization.ll @@ -1,5 +1,5 @@ -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine                         '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine -polly-prevect-width=16 '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s -check-prefix=VEC16 +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa -polly-pattern-matching-based-opts=false -polly-vectorizer=stripmine -polly-prevect-width=16 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s -check-prefix=VEC16  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScheduleOptimizer/prevectorization_islbound.ll b/polly/test/ScheduleOptimizer/prevectorization_islbound.ll new file mode 100644 index 0000000..f346e53 --- /dev/null +++ b/polly/test/ScheduleOptimizer/prevectorization_islbound.ll @@ -0,0 +1,37 @@ +; RUN: opt %loadNPMPolly -S -polly-vectorizer=stripmine '-passes=polly-custom<opt-isl>' -polly-debug -disable-output < %s 2>&1 | FileCheck %s +; REQUIRES: asserts + +define void @ham(ptr %arg, ptr %arg1, i32 %arg2, i32 %arg3, ptr %arg4, i32 %arg5, i32 %arg6) { +bb: +  %getelementptr = getelementptr [7 x float], ptr null, i32 0, i32 %arg3 +  br label %bb7 + +bb7:                                              ; preds = %bb11, %bb +  %phi = phi i32 [ 0, %bb ], [ %add16, %bb11 ] +  br label %bb8 + +bb8:                                              ; preds = %bb8, %bb7 +  %phi9 = phi i32 [ 0, %bb7 ], [ %add, %bb8 ] +  %getelementptr10 = getelementptr [7 x float], ptr null, i32 0, i32 %phi9 +  store float 0.000000e+00, ptr %getelementptr10, align 4 +  %add = add i32 %phi9, 1 +  %icmp = icmp eq i32 %phi9, 0 +  br i1 %icmp, label %bb8, label %bb11 + +bb11:                                             ; preds = %bb8 +  %load = load float, ptr %getelementptr, align 4 +  store float %load, ptr %arg4, align 4 +  %getelementptr12 = getelementptr [7 x float], ptr null, i32 0, i32 %arg5 +  %load13 = load float, ptr %getelementptr12, align 4 +  store float %load13, ptr %arg, align 4 +  %getelementptr14 = getelementptr [7 x float], ptr null, i32 0, i32 %arg6 +  %load15 = load float, ptr %getelementptr14, align 4 +  store float %load15, ptr %arg1, align 4 +  %add16 = add i32 %phi, 1 +  %icmp17 = icmp ne i32 %phi, %arg2 +  br i1 %icmp17, label %bb7, label %bb18 + +bb18:                                             ; preds = %bb11 +  ret void +} +; CHECK:Schedule optimizer calculation exceeds ISL quota diff --git a/polly/test/ScheduleOptimizer/rectangular-tiling.ll b/polly/test/ScheduleOptimizer/rectangular-tiling.ll index e1d768b..3fd4907 100644 --- a/polly/test/ScheduleOptimizer/rectangular-tiling.ll +++ b/polly/test/ScheduleOptimizer/rectangular-tiling.ll @@ -1,7 +1,7 @@ -; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16                                                                                                                                        '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s -; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 -polly-tiling=false                                                                                                                    '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=NOTILING -; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 -polly-2nd-level-tiling -polly-2nd-level-tile-sizes=16,8                                                                               '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=TWOLEVEL -; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 -polly-2nd-level-tiling -polly-2nd-level-tile-sizes=16,8 -polly-register-tiling                                                        '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s --check-prefix=TWO-PLUS-REGISTER +; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 -polly-tiling=false '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=NOTILING +; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 -polly-2nd-level-tiling -polly-2nd-level-tile-sizes=16,8 '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=TWOLEVEL +; RUN: opt %loadNPMPolly -polly-tile-sizes=256,16 -polly-2nd-level-tiling -polly-2nd-level-tile-sizes=16,8 -polly-register-tiling '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s --check-prefix=TWO-PLUS-REGISTER  ; CHECK: // 1st level tiling - Tiles  ; CHECK: for (int c0 = 0; c0 <= 3; c0 += 1) diff --git a/polly/test/ScheduleOptimizer/schedule_computeout.ll b/polly/test/ScheduleOptimizer/schedule_computeout.ll index 1e1359e..1ee8a90 100644 --- a/polly/test/ScheduleOptimizer/schedule_computeout.ll +++ b/polly/test/ScheduleOptimizer/schedule_computeout.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -S -passes=polly-optree -passes=polly-delicm  -passes=polly-opt-isl -polly-schedule-computeout=10000 -debug-only="polly-opt-isl" < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly-custom<optree;delicm;opt-isl>' -polly-schedule-computeout=10000 -debug-only=polly-opt-isl < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ; Bailout if the computations of schedule compute exceeds the max scheduling quota. diff --git a/polly/test/ScheduleOptimizer/statistics.ll b/polly/test/ScheduleOptimizer/statistics.ll index 84eb593..bb705ac 100644 --- a/polly/test/ScheduleOptimizer/statistics.ll +++ b/polly/test/ScheduleOptimizer/statistics.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-opt-isl -stats -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<opt-isl>' -stats -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ; REQUIRES: asserts diff --git a/polly/test/ScheduleOptimizer/tile_after_fusion.ll b/polly/test/ScheduleOptimizer/tile_after_fusion.ll index 50a46d6..e3d7c24 100644 --- a/polly/test/ScheduleOptimizer/tile_after_fusion.ll +++ b/polly/test/ScheduleOptimizer/tile_after_fusion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-isl-arg=--no-schedule-serialize-sccs '-passes=polly-opt-isl,print<polly-ast>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-isl-arg=--no-schedule-serialize-sccs '-passes=polly-custom<opt-isl;ast>' -polly-print-ast -disable-output < %s | FileCheck %s  ;  ;  ;    void tf(int C[256][256][256], int A0[256][256][256], int A1[256][256][256]) { diff --git a/polly/test/ScheduleOptimizer/vivid-vbi-gen-vivid_vbi_gen_sliced-before-llvmreduced.ll b/polly/test/ScheduleOptimizer/vivid-vbi-gen-vivid_vbi_gen_sliced-before-llvmreduced.ll index e59a316..bb472b9 100644 --- a/polly/test/ScheduleOptimizer/vivid-vbi-gen-vivid_vbi_gen_sliced-before-llvmreduced.ll +++ b/polly/test/ScheduleOptimizer/vivid-vbi-gen-vivid_vbi_gen_sliced-before-llvmreduced.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-vectorizer=stripmine -polly-isl-arg=--no-schedule-serialize-sccs -polly-tiling=0 '-passes=print<polly-opt-isl>' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-vectorizer=stripmine -polly-isl-arg=--no-schedule-serialize-sccs -polly-tiling=0 '-passes=polly-custom<opt-isl>' -polly-print-opt-isl -disable-output < %s | FileCheck %s  ; isl_schedule_node_band_sink may sink into multiple children.  ; https://llvm.org/PR52637 diff --git a/polly/test/ScopDetect/aliasing_parametric_simple_1.ll b/polly/test/ScopDetect/aliasing_parametric_simple_1.ll index cee1c06..d83c822 100644 --- a/polly/test/ScopDetect/aliasing_parametric_simple_1.ll +++ b/polly/test/ScopDetect/aliasing_parametric_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Valid Region for Scop:  ; diff --git a/polly/test/ScopDetect/aliasing_parametric_simple_2.ll b/polly/test/ScopDetect/aliasing_parametric_simple_2.ll index 5506b3c..63c9addd 100644 --- a/polly/test/ScopDetect/aliasing_parametric_simple_2.ll +++ b/polly/test/ScopDetect/aliasing_parametric_simple_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Valid Region for Scop:  ; diff --git a/polly/test/ScopDetect/aliasing_simple_1.ll b/polly/test/ScopDetect/aliasing_simple_1.ll index 5f43ec1..ea8a768 100644 --- a/polly/test/ScopDetect/aliasing_simple_1.ll +++ b/polly/test/ScopDetect/aliasing_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Valid Region for Scop:  ; diff --git a/polly/test/ScopDetect/aliasing_simple_2.ll b/polly/test/ScopDetect/aliasing_simple_2.ll index e853dfc..df68289 100644 --- a/polly/test/ScopDetect/aliasing_simple_2.ll +++ b/polly/test/ScopDetect/aliasing_simple_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Valid Region for Scop:  ; diff --git a/polly/test/ScopDetect/base_pointer.ll b/polly/test/ScopDetect/base_pointer.ll index e500f9b..0f0e219 100644 --- a/polly/test/ScopDetect/base_pointer.ll +++ b/polly/test/ScopDetect/base_pointer.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -disable-basic-aa -polly-invariant-load-hoisting=true -polly-print-detect -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly --aa-pipeline= -polly-invariant-load-hoisting=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" diff --git a/polly/test/ScopDetect/base_pointer_load_setNewAccessRelation.ll b/polly/test/ScopDetect/base_pointer_load_setNewAccessRelation.ll index eeb9e11..b00ec77 100644 --- a/polly/test/ScopDetect/base_pointer_load_setNewAccessRelation.ll +++ b/polly/test/ScopDetect/base_pointer_load_setNewAccessRelation.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-ignore-aliasing -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>,scop(polly-import-jscop,polly-codegen)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-ignore-aliasing -polly-invariant-load-hoisting=true '-passes=polly<no-default-opts;import-jscop>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; This violated an assertion in setNewAccessRelation that assumed base pointers  ; to be load-hoisted. Without this assertion, it codegen would generate invalid diff --git a/polly/test/ScopDetect/base_pointer_setNewAccessRelation.ll b/polly/test/ScopDetect/base_pointer_setNewAccessRelation.ll index 16976e6..1cd04b6 100644 --- a/polly/test/ScopDetect/base_pointer_setNewAccessRelation.ll +++ b/polly/test/ScopDetect/base_pointer_setNewAccessRelation.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,scop(polly-import-jscop,polly-codegen)' -disable-output < %s 2>&1 | FileCheck %s --allow-empty +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts;import-jscop>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --allow-empty  ;  ; Polly codegen used to generate invalid code (referring to %ptr from the  ; original region) when regeneration of the access function is necessary. @@ -35,3 +35,5 @@ exit:  ; CHECK-NOT: Valid Region for Scop +; CHECK: Detected Scops in Function base_pointer_is_inst_inside_invariant_1 +; CHECK-NOT: Valid Region for Scop diff --git a/polly/test/ScopDetect/callbr.ll b/polly/test/ScopDetect/callbr.ll index 4182974..4200339 100644 --- a/polly/test/ScopDetect/callbr.ll +++ b/polly/test/ScopDetect/callbr.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -polly-detect-track-failures -disable-output -pass-remarks-missed=polly-detect < %s 2>&1 | FileCheck %s --check-prefix=REMARK -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -polly-detect-track-failures -disable-output -stats                            < %s 2>&1 | FileCheck %s --check-prefix=STAT +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -polly-detect-track-failures -disable-output -pass-remarks-missed=polly-detect < %s 2>&1 | FileCheck %s --check-prefix=REMARK +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -polly-detect-track-failures -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=STAT  ; REQUIRES: asserts  ; REMARK: Branch from indirect terminator. diff --git a/polly/test/ScopDetect/collective_invariant_loads.ll b/polly/test/ScopDetect/collective_invariant_loads.ll index f451bcc..f5263e4 100644 --- a/polly/test/ScopDetect/collective_invariant_loads.ll +++ b/polly/test/ScopDetect/collective_invariant_loads.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting -disable-output< %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting -disable-output < %s 2>&1 | FileCheck %s  ;CHECK:     Function: test_init_chpl  ;CHECK-NEXT:     Region: %bb1---%bb16 diff --git a/polly/test/ScopDetect/cross_loop_non_single_exit.ll b/polly/test/ScopDetect/cross_loop_non_single_exit.ll index fe39221..d7605c3 100644 --- a/polly/test/ScopDetect/cross_loop_non_single_exit.ll +++ b/polly/test/ScopDetect/cross_loop_non_single_exit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/cross_loop_non_single_exit_2.ll b/polly/test/ScopDetect/cross_loop_non_single_exit_2.ll index 4cac173..c3a2ad4 100644 --- a/polly/test/ScopDetect/cross_loop_non_single_exit_2.ll +++ b/polly/test/ScopDetect/cross_loop_non_single_exit_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/dependency_to_phi_node_outside_of_region.ll b/polly/test/ScopDetect/dependency_to_phi_node_outside_of_region.ll index 7d74764..e896e18 100644 --- a/polly/test/ScopDetect/dependency_to_phi_node_outside_of_region.ll +++ b/polly/test/ScopDetect/dependency_to_phi_node_outside_of_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"  define void @f(ptr %A, i64 %N, i64 %M) nounwind { diff --git a/polly/test/ScopDetect/detect-full-functions.ll b/polly/test/ScopDetect/detect-full-functions.ll index 178ef32..adad0e89 100644 --- a/polly/test/ScopDetect/detect-full-functions.ll +++ b/polly/test/ScopDetect/detect-full-functions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -polly-process-unprofitable=false -disable-output -polly-detect-full-functions  < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -polly-process-unprofitable=false -disable-output -polly-detect-full-functions < %s 2>&1 | FileCheck %s  ; Verify if a simple function with basic block not part of loop doesn't crash with polly-process-unprofitable=false and polly-detect-full-functions flags. diff --git a/polly/test/ScopDetect/dom-tree-crash.ll b/polly/test/ScopDetect/dom-tree-crash.ll index efc732c..0f670ca 100644 --- a/polly/test/ScopDetect/dom-tree-crash.ll +++ b/polly/test/ScopDetect/dom-tree-crash.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Detected Scops in Function foo diff --git a/polly/test/ScopDetect/dot-scops-npm.ll b/polly/test/ScopDetect/dot-scops-npm.ll index d14bf8a..de1f528 100644 --- a/polly/test/ScopDetect/dot-scops-npm.ll +++ b/polly/test/ScopDetect/dot-scops-npm.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-scop-printer' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-dot -disable-output < %s  ; RUN: FileCheck %s -input-file=scops.func_npm.dot  ;  ; Check that the ScopPrinter does not crash. diff --git a/polly/test/ScopDetect/dot-scops.ll b/polly/test/ScopDetect/dot-scops.ll index 63163b2..a719d21 100644 --- a/polly/test/ScopDetect/dot-scops.ll +++ b/polly/test/ScopDetect/dot-scops.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>,polly-scop-printer' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; Check that the ScopPrinter does not crash.  ; ScopPrinter needs the ScopDetection pass, which should depend on diff --git a/polly/test/ScopDetect/error-block-always-executed.ll b/polly/test/ScopDetect/error-block-always-executed.ll index 20d02b1..0e82e37 100644 --- a/polly/test/ScopDetect/error-block-always-executed.ll +++ b/polly/test/ScopDetect/error-block-always-executed.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK-NOT: Valid Region for Scop: diff --git a/polly/test/ScopDetect/error-block-referenced-from-scop.ll b/polly/test/ScopDetect/error-block-referenced-from-scop.ll index 6c66f6d..338fe20 100644 --- a/polly/test/ScopDetect/error-block-referenced-from-scop.ll +++ b/polly/test/ScopDetect/error-block-referenced-from-scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK-NOT: Valid Region for Scop: diff --git a/polly/test/ScopDetect/error-block-unreachable.ll b/polly/test/ScopDetect/error-block-unreachable.ll index 6ba7698a..85f248d 100644 --- a/polly/test/ScopDetect/error-block-unreachable.ll +++ b/polly/test/ScopDetect/error-block-unreachable.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s  ; Verify that the scop detection does not crash on inputs with unreachable  ; blocks. Earlier we crashed when detecting error blocks. diff --git a/polly/test/ScopDetect/expand-region-correctly-2.ll b/polly/test/ScopDetect/expand-region-correctly-2.ll index a5c9626..43fdda8 100644 --- a/polly/test/ScopDetect/expand-region-correctly-2.ll +++ b/polly/test/ScopDetect/expand-region-correctly-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Valid Region for Scop: if.end.1631 => for.cond.1647.outer  ; diff --git a/polly/test/ScopDetect/expand-region-correctly.ll b/polly/test/ScopDetect/expand-region-correctly.ll index a8c90c0..b4caac4 100644 --- a/polly/test/ScopDetect/expand-region-correctly.ll +++ b/polly/test/ScopDetect/expand-region-correctly.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Valid Region for Scop: if.end.1631 => for.cond.1647.outer diff --git a/polly/test/ScopDetect/ignore_func_flag_regex.ll b/polly/test/ScopDetect/ignore_func_flag_regex.ll index a75e705..ef1c666 100644 --- a/polly/test/ScopDetect/ignore_func_flag_regex.ll +++ b/polly/test/ScopDetect/ignore_func_flag_regex.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-ignore-func=f.*,g.* '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-polly-ignore-func=f.*,g.*' '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the flag `-polly-ignore-func` works with regexes.  ; diff --git a/polly/test/ScopDetect/index_from_unpredictable_loop.ll b/polly/test/ScopDetect/index_from_unpredictable_loop.ll index f6d6cfa..a6f7079 100644 --- a/polly/test/ScopDetect/index_from_unpredictable_loop.ll +++ b/polly/test/ScopDetect/index_from_unpredictable_loop.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly                        '-passes=print<polly-function-scops>' -disable-output < %s | FileCheck %s --check-prefix=AFFINE -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s --check-prefix=AFFINE +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s --check-prefix=NONAFFINE  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopDetect/index_from_unpredictable_loop2.ll b/polly/test/ScopDetect/index_from_unpredictable_loop2.ll index 16d4761..be76e0b 100644 --- a/polly/test/ScopDetect/index_from_unpredictable_loop2.ll +++ b/polly/test/ScopDetect/index_from_unpredictable_loop2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly                        '-passes=print<polly-function-scops>' -disable-output < %s | FileCheck %s --check-prefix=AFFINE -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s --check-prefix=AFFINE +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s --check-prefix=NONAFFINE  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopDetect/indvars.ll b/polly/test/ScopDetect/indvars.ll index 3fbc4d6..e45e4fb 100644 --- a/polly/test/ScopDetect/indvars.ll +++ b/polly/test/ScopDetect/indvars.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,scop(polly-codegen)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopDetect/intrinsics_1.ll b/polly/test/ScopDetect/intrinsics_1.ll index 58c9197..43fa4ca 100644 --- a/polly/test/ScopDetect/intrinsics_1.ll +++ b/polly/test/ScopDetect/intrinsics_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Valid Region for Scop: for.cond => for.end  ; diff --git a/polly/test/ScopDetect/intrinsics_2.ll b/polly/test/ScopDetect/intrinsics_2.ll index f71016e..b4cc3df 100644 --- a/polly/test/ScopDetect/intrinsics_2.ll +++ b/polly/test/ScopDetect/intrinsics_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we allow the lifetime markers for the tmp array.  ; diff --git a/polly/test/ScopDetect/intrinsics_3.ll b/polly/test/ScopDetect/intrinsics_3.ll index 579d5bd..08fdee5 100644 --- a/polly/test/ScopDetect/intrinsics_3.ll +++ b/polly/test/ScopDetect/intrinsics_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we allow the misc intrinsics.  ; diff --git a/polly/test/ScopDetect/invalid-latch-conditions.ll b/polly/test/ScopDetect/invalid-latch-conditions.ll index db4898c..c7d7c51 100644 --- a/polly/test/ScopDetect/invalid-latch-conditions.ll +++ b/polly/test/ScopDetect/invalid-latch-conditions.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly                              -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops                                   '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NALOOPS -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NALOOPS +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT  ; The latch conditions of the outer loop are not affine, thus the loop cannot  ; handled by the domain generation and needs to be overapproximated. diff --git a/polly/test/ScopDetect/invalidate_scalar_evolution.ll b/polly/test/ScopDetect/invalidate_scalar_evolution.ll index ddef510..977918e 100644 --- a/polly/test/ScopDetect/invalidate_scalar_evolution.ll +++ b/polly/test/ScopDetect/invalidate_scalar_evolution.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PHI +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PHI  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/invariant-load-before-scop.ll b/polly/test/ScopDetect/invariant-load-before-scop.ll index 1047964..932c218 100644 --- a/polly/test/ScopDetect/invariant-load-before-scop.ll +++ b/polly/test/ScopDetect/invariant-load-before-scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; The LoadInst %.b761 is defined outside the SCoP, hence is always constant  ; within it. It is no "required invariant load". diff --git a/polly/test/ScopDetect/keep_going_expansion.ll b/polly/test/ScopDetect/keep_going_expansion.ll index 074aae9..efd81c6 100644 --- a/polly/test/ScopDetect/keep_going_expansion.ll +++ b/polly/test/ScopDetect/keep_going_expansion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-detect-track-failures -polly-detect-keep-going '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-detect-track-failures -polly-detect-keep-going '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopDetect/mod_ref_read_pointer.ll b/polly/test/ScopDetect/mod_ref_read_pointer.ll index 64535d8..c7972cc 100644 --- a/polly/test/ScopDetect/mod_ref_read_pointer.ll +++ b/polly/test/ScopDetect/mod_ref_read_pointer.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-modref-calls '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=MODREF -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa                           '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-modref-calls '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=MODREF +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK-NOT: Valid Region for Scop: for.body => for.end  ; MODREF: Valid Region for Scop: for.body => for.end diff --git a/polly/test/ScopDetect/more-than-one-loop.ll b/polly/test/ScopDetect/more-than-one-loop.ll index 3009065..1835342 100644 --- a/polly/test/ScopDetect/more-than-one-loop.ll +++ b/polly/test/ScopDetect/more-than-one-loop.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-process-unprofitable=true '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Valid Region for Scop: diff --git a/polly/test/ScopDetect/multidim-with-undef-size.ll b/polly/test/ScopDetect/multidim-with-undef-size.ll index 2a5f8b1..e89cea9 100644 --- a/polly/test/ScopDetect/multidim-with-undef-size.ll +++ b/polly/test/ScopDetect/multidim-with-undef-size.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ; CHECK: Valid Region for Scop: bb14 => bb17 diff --git a/polly/test/ScopDetect/multidim.ll b/polly/test/ScopDetect/multidim.ll index 9120237..cbe7d07 100644 --- a/polly/test/ScopDetect/multidim.ll +++ b/polly/test/ScopDetect/multidim.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ; CHECK: Valid Region for Scop: bb19 => bb20 diff --git a/polly/test/ScopDetect/multidim_indirect_access.ll b/polly/test/ScopDetect/multidim_indirect_access.ll index a9cd446..4af37ba 100644 --- a/polly/test/ScopDetect/multidim_indirect_access.ll +++ b/polly/test/ScopDetect/multidim_indirect_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we will recognize this SCoP.  ; diff --git a/polly/test/ScopDetect/multidim_two_accesses_different_delinearization.ll b/polly/test/ScopDetect/multidim_two_accesses_different_delinearization.ll index 9c91fbf..0286642 100644 --- a/polly/test/ScopDetect/multidim_two_accesses_different_delinearization.ll +++ b/polly/test/ScopDetect/multidim_two_accesses_different_delinearization.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Derived from the following code: diff --git a/polly/test/ScopDetect/nested_loop_single_exit.ll b/polly/test/ScopDetect/nested_loop_single_exit.ll index a074211..89071df 100644 --- a/polly/test/ScopDetect/nested_loop_single_exit.ll +++ b/polly/test/ScopDetect/nested_loop_single_exit.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  ; void f(long A[], long N) {  ;   long i, j; diff --git a/polly/test/ScopDetect/non-affine-conditional.ll b/polly/test/ScopDetect/non-affine-conditional.ll index e74619c..b20828d 100644 --- a/polly/test/ScopDetect/non-affine-conditional.ll +++ b/polly/test/ScopDetect/non-affine-conditional.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/ScopDetect/non-affine-float-compare.ll b/polly/test/ScopDetect/non-affine-float-compare.ll index 9326cd4..77427397 100644 --- a/polly/test/ScopDetect/non-affine-float-compare.ll +++ b/polly/test/ScopDetect/non-affine-float-compare.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(float *A) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/ScopDetect/non-affine-loop-condition-dependent-access.ll b/polly/test/ScopDetect/non-affine-loop-condition-dependent-access.ll index 1ab6b35..f6ae9fe 100644 --- a/polly/test/ScopDetect/non-affine-loop-condition-dependent-access.ll +++ b/polly/test/ScopDetect/non-affine-loop-condition-dependent-access.ll @@ -1,7 +1,7 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false                                                          '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                                                           '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true  -polly-allow-nonaffine                                   '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true  -polly-allow-nonaffine -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT  ;  ; Here we have a non-affine loop but also a non-affine access which should  ; be rejected as long as -polly-allow-nonaffine isn't given. diff --git a/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll b/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll index 921f6ab..23c1765 100644 --- a/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll +++ b/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_2.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false                        '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                         '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true  -polly-allow-nonaffine '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES  ;  ; Here we have a non-affine loop (in the context of the loop nest)  ; and also a non-affine access (A[k]). While we can always detect the diff --git a/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll b/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll index 78774d9..6e239a6 100644 --- a/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll +++ b/polly/test/ScopDetect/non-affine-loop-condition-dependent-access_3.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false                        '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                         '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true  -polly-allow-nonaffine '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES  ;  ; Here we have a non-affine loop (in the context of the loop nest)  ; and also a non-affine access (A[k]). While we can always detect the diff --git a/polly/test/ScopDetect/non-affine-loop.ll b/polly/test/ScopDetect/non-affine-loop.ll index 5136b3b..dd675cc 100644 --- a/polly/test/ScopDetect/non-affine-loop.ll +++ b/polly/test/ScopDetect/non-affine-loop.ll @@ -1,8 +1,8 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false                                                          '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                                                           '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false -polly-allow-nonaffine                                   '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINEREGIONSANDACCESSES -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true  -polly-allow-nonaffine                                   '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true  -polly-allow-nonaffine -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false -polly-allow-nonaffine '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINEREGIONSANDACCESSES +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPSANDACCESSES +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT  ;  ; This function/region does contain a loop, however it is non-affine, hence the access  ; A[i] is also. Furthermore, it is the only loop, thus when we over approximate diff --git a/polly/test/ScopDetect/non-beneficial-loops-small-trip-count.ll b/polly/test/ScopDetect/non-beneficial-loops-small-trip-count.ll index fd52c5d..63b1cdb 100644 --- a/polly/test/ScopDetect/non-beneficial-loops-small-trip-count.ll +++ b/polly/test/ScopDetect/non-beneficial-loops-small-trip-count.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK-NOT: Valid  ; diff --git a/polly/test/ScopDetect/non-constant-add-rec-start-expr.ll b/polly/test/ScopDetect/non-constant-add-rec-start-expr.ll index d0c1f7a..ff4ad32 100644 --- a/polly/test/ScopDetect/non-constant-add-rec-start-expr.ll +++ b/polly/test/ScopDetect/non-constant-add-rec-start-expr.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Valid Region for Scop: bb11 => bb25 diff --git a/polly/test/ScopDetect/non-simple-memory-accesses.ll b/polly/test/ScopDetect/non-simple-memory-accesses.ll index bdc4898..5b9ed2b 100644 --- a/polly/test/ScopDetect/non-simple-memory-accesses.ll +++ b/polly/test/ScopDetect/non-simple-memory-accesses.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we do not model atomic memory accesses. We did not reason about  ; how to handle them correctly and the Alias Set Tracker models some of them diff --git a/polly/test/ScopDetect/non_affine_loop_condition.ll b/polly/test/ScopDetect/non_affine_loop_condition.ll index 63bd7b3..3c48737 100644 --- a/polly/test/ScopDetect/non_affine_loop_condition.ll +++ b/polly/test/ScopDetect/non_affine_loop_condition.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops                                   '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -polly-process-unprofitable=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT  ;  ;    void f(int *A) {  ;      for (int i = 0; i < 1024; i++) { diff --git a/polly/test/ScopDetect/only-one-affine-loop.ll b/polly/test/ScopDetect/only-one-affine-loop.ll index 1d36f4d..a8ce5bc 100644 --- a/polly/test/ScopDetect/only-one-affine-loop.ll +++ b/polly/test/ScopDetect/only-one-affine-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable=false -polly-allow-nonaffine-loops '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable=false -polly-allow-nonaffine-loops '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Even if we allow non-affine loops we can only model the outermost loop, all  ; other loops are boxed in non-affine regions. However, the inner loops can be diff --git a/polly/test/ScopDetect/only_func_flag.ll b/polly/test/ScopDetect/only_func_flag.ll index 4742375..f4f3504 100644 --- a/polly/test/ScopDetect/only_func_flag.ll +++ b/polly/test/ScopDetect/only_func_flag.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-only-func=f,g '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-only-func=f,g '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the flag `-polly-only-func` limits analysis to `f` and `g`.  ; diff --git a/polly/test/ScopDetect/only_func_flag_regex.ll b/polly/test/ScopDetect/only_func_flag_regex.ll index 2ad22c9..f180fa7 100644 --- a/polly/test/ScopDetect/only_func_flag_regex.ll +++ b/polly/test/ScopDetect/only_func_flag_regex.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-only-func=f.*,g.* '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-polly-only-func=f.*,g.*' '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the flag `-polly-only-func` works with regexes.  ; diff --git a/polly/test/ScopDetect/parametric-multiply-in-scev-2.ll b/polly/test/ScopDetect/parametric-multiply-in-scev-2.ll index 271825a..71d1ba0 100644 --- a/polly/test/ScopDetect/parametric-multiply-in-scev-2.ll +++ b/polly/test/ScopDetect/parametric-multiply-in-scev-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-NOT: Valid Region diff --git a/polly/test/ScopDetect/parametric-multiply-in-scev.ll b/polly/test/ScopDetect/parametric-multiply-in-scev.ll index 2ab8997..6768c96 100644 --- a/polly/test/ScopDetect/parametric-multiply-in-scev.ll +++ b/polly/test/ScopDetect/parametric-multiply-in-scev.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  foo(float *A, long n, long k) {  ;    if (true) diff --git a/polly/test/ScopDetect/phi_with_multi_exiting_edges.ll b/polly/test/ScopDetect/phi_with_multi_exiting_edges.ll index 248bb43..2e16b75 100644 --- a/polly/test/ScopDetect/phi_with_multi_exiting_edges.ll +++ b/polly/test/ScopDetect/phi_with_multi_exiting_edges.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Region with an exit node that has a PHI node multiple incoming edges from  ; inside the region. Motivation for supporting such cases in Polly. diff --git a/polly/test/ScopDetect/profitability-large-basic-blocks.ll b/polly/test/ScopDetect/profitability-large-basic-blocks.ll index d74185b..ac27016 100644 --- a/polly/test/ScopDetect/profitability-large-basic-blocks.ll +++ b/polly/test/ScopDetect/profitability-large-basic-blocks.ll @@ -1,12 +1,8 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable=false \ -; RUN:                -polly-detect-profitability-min-per-loop-insts=40 \ -; RUN: '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PROFITABLE +; RUN: opt %loadNPMPolly -polly-process-unprofitable=false -polly-detect-profitability-min-per-loop-insts=40 '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PROFITABLE -; RUN: opt %loadNPMPolly -polly-process-unprofitable=true \ -; RUN: '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PROFITABLE +; RUN: opt %loadNPMPolly -polly-process-unprofitable=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PROFITABLE -; RUN: opt %loadNPMPolly -polly-process-unprofitable=false \ -; RUN: '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=UNPROFITABLE +; RUN: opt %loadNPMPolly -polly-process-unprofitable=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=UNPROFITABLE  ; UNPROFITABLE-NOT: Valid Region for Scop:  ; PROFITABLE: Valid Region for Scop: diff --git a/polly/test/ScopDetect/profitability-two-nested-loops.ll b/polly/test/ScopDetect/profitability-two-nested-loops.ll index 0291d3b..80379bc 100644 --- a/polly/test/ScopDetect/profitability-two-nested-loops.ll +++ b/polly/test/ScopDetect/profitability-two-nested-loops.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Valid Region for Scop: next => bb3  ; diff --git a/polly/test/ScopDetect/remove_all_children.ll b/polly/test/ScopDetect/remove_all_children.ll index d95e9bd..1c77d73 100644 --- a/polly/test/ScopDetect/remove_all_children.ll +++ b/polly/test/ScopDetect/remove_all_children.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/polly/test/ScopDetect/report-scop-location.ll b/polly/test/ScopDetect/report-scop-location.ll index 5e4c38d..530a22f 100644 --- a/polly/test/ScopDetect/report-scop-location.ll +++ b/polly/test/ScopDetect/report-scop-location.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -polly-report -disable-output < %s  2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -polly-report -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-i64:64-f80:128-s:64-n8:16:32:64-S128"  ; Function Attrs: nounwind uwtable diff --git a/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll b/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll index f49190b3..2ade0a9 100644 --- a/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll +++ b/polly/test/ScopDetect/restrict-undef-size-scopdetect.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-NOT: Valid Region for Scop:  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopDetect/run_time_alias_check.ll b/polly/test/ScopDetect/run_time_alias_check.ll index 74cbedb..6f327e3 100644 --- a/polly/test/ScopDetect/run_time_alias_check.ll +++ b/polly/test/ScopDetect/run_time_alias_check.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" diff --git a/polly/test/ScopDetect/scev_remove_max.ll b/polly/test/ScopDetect/scev_remove_max.ll index f76c832..4f03845 100644 --- a/polly/test/ScopDetect/scev_remove_max.ll +++ b/polly/test/ScopDetect/scev_remove_max.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect < %s  ; This test case helps to determine whether SCEVRemoveMax::remove produces  ; an infinite loop and a segmentation fault, if it processes, for example, diff --git a/polly/test/ScopDetect/sequential_loops.ll b/polly/test/ScopDetect/sequential_loops.ll index 4a84f35..338a9ae 100644 --- a/polly/test/ScopDetect/sequential_loops.ll +++ b/polly/test/ScopDetect/sequential_loops.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" diff --git a/polly/test/ScopDetect/simple_loop.ll b/polly/test/ScopDetect/simple_loop.ll index 33823b2..5da4898 100644 --- a/polly/test/ScopDetect/simple_loop.ll +++ b/polly/test/ScopDetect/simple_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/simple_loop_non_single_entry.ll b/polly/test/ScopDetect/simple_loop_non_single_entry.ll index 1bba2c2..00e11ab 100644 --- a/polly/test/ScopDetect/simple_loop_non_single_entry.ll +++ b/polly/test/ScopDetect/simple_loop_non_single_entry.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/simple_loop_non_single_exit.ll b/polly/test/ScopDetect/simple_loop_non_single_exit.ll index 93ec84e..9f75b80 100644 --- a/polly/test/ScopDetect/simple_loop_non_single_exit.ll +++ b/polly/test/ScopDetect/simple_loop_non_single_exit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll b/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll index 33b0d8d..c6ce482 100644 --- a/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll +++ b/polly/test/ScopDetect/simple_loop_non_single_exit_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll b/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll index 9b47b7c..c90c491 100644 --- a/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll +++ b/polly/test/ScopDetect/simple_loop_two_phi_nodes.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/simple_loop_with_param.ll b/polly/test/ScopDetect/simple_loop_with_param.ll index 4a0a3ad..67f6778 100644 --- a/polly/test/ScopDetect/simple_loop_with_param.ll +++ b/polly/test/ScopDetect/simple_loop_with_param.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PHI +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PHI  ; void f(long A[], long N, long *init_ptr) {  ;   long i, j; diff --git a/polly/test/ScopDetect/simple_loop_with_param_2.ll b/polly/test/ScopDetect/simple_loop_with_param_2.ll index 670936b..9e7b55e 100644 --- a/polly/test/ScopDetect/simple_loop_with_param_2.ll +++ b/polly/test/ScopDetect/simple_loop_with_param_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], int N, int *init_ptr) {  ;   long i, j; diff --git a/polly/test/ScopDetect/simple_non_single_entry.ll b/polly/test/ScopDetect/simple_non_single_entry.ll index 6ace3b6..e56c022 100644 --- a/polly/test/ScopDetect/simple_non_single_entry.ll +++ b/polly/test/ScopDetect/simple_non_single_entry.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetect/skip_function_attribute.ll b/polly/test/ScopDetect/skip_function_attribute.ll index 2150a3e..789942a 100644 --- a/polly/test/ScopDetect/skip_function_attribute.ll +++ b/polly/test/ScopDetect/skip_function_attribute.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify polly skips this function  ; diff --git a/polly/test/ScopDetect/srem_with_parametric_divisor.ll b/polly/test/ScopDetect/srem_with_parametric_divisor.ll index 66c3b04..4716029 100644 --- a/polly/test/ScopDetect/srem_with_parametric_divisor.ll +++ b/polly/test/ScopDetect/srem_with_parametric_divisor.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK-NOT: Valid Region for Scop:  ; diff --git a/polly/test/ScopDetect/statistics.ll b/polly/test/ScopDetect/statistics.ll index a1dcebe..5d87599 100644 --- a/polly/test/ScopDetect/statistics.ll +++ b/polly/test/ScopDetect/statistics.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -stats -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -stats -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts diff --git a/polly/test/ScopDetect/switch-in-loop-patch.ll b/polly/test/ScopDetect/switch-in-loop-patch.ll index 2f9b670..1e825f4 100644 --- a/polly/test/ScopDetect/switch-in-loop-patch.ll +++ b/polly/test/ScopDetect/switch-in-loop-patch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-NOT: Valid diff --git a/polly/test/ScopDetect/tlr_is_hoistable_load.ll b/polly/test/ScopDetect/tlr_is_hoistable_load.ll index 5c33522..24a3f55 100644 --- a/polly/test/ScopDetect/tlr_is_hoistable_load.ll +++ b/polly/test/ScopDetect/tlr_is_hoistable_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-invariant-load-hoisting -polly-detect-full-functions -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting -polly-detect-full-functions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  ;  ; This testcase checks for compatibility of the -detect-full-functions  ; flag in combination with the -invariant-load-hoisting option. More diff --git a/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll b/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll index 4ae86a9..e7245d8 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportAlias-01.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-use-runtime-alias-checks=false -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly -polly-use-runtime-alias-checks=false -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ;void f(int A[], int B[]) {  ;  for (int i=0; i<42; i++) diff --git a/polly/test/ScopDetectionDiagnostics/ReportEntry.ll b/polly/test/ScopDetectionDiagnostics/ReportEntry.ll index adb14b5..2a0b281 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportEntry.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportEntry.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -pass-remarks-missed="polly-detect" -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -pass-remarks-missed=polly-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: remark: <unknown>:0:0: Scop contains function entry (not yet supported). diff --git a/polly/test/ScopDetectionDiagnostics/ReportFuncCall-01.ll b/polly/test/ScopDetectionDiagnostics/ReportFuncCall-01.ll index 428a7cf8..fc4c1fb 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportFuncCall-01.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportFuncCall-01.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; #define N 1024  ; double invalidCall(double A[N]); diff --git a/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegion.ll b/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegion.ll index 30e5fb9..7a540d6 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegion.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -pass-remarks-missed="polly-detect" -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -pass-remarks-missed=polly-detect -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ;void foo(int a, int b) { diff --git a/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegionWithoutDebugLoc.ll b/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegionWithoutDebugLoc.ll index 2bc515e..512366f 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegionWithoutDebugLoc.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportIrreducibleRegionWithoutDebugLoc.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -pass-remarks-missed="polly-detect" -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -pass-remarks-missed=polly-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: remark: <unknown>:0:0: Irreducible region encountered in control flow. diff --git a/polly/test/ScopDetectionDiagnostics/ReportLoopBound-01.ll b/polly/test/ScopDetectionDiagnostics/ReportLoopBound-01.ll index a96b64e..e844aea 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportLoopBound-01.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportLoopBound-01.ll @@ -1,16 +1,6 @@ -; RUN: opt %loadNPMPolly \ -; RUN:     -pass-remarks-missed="polly-detect" -polly-detect-track-failures \ -; RUN:     -polly-allow-nonaffine-loops=false '-passes=print<polly-detect>' -disable-output \ -; RUN:     < %s 2>&1| FileCheck %s --check-prefix=REJECTNONAFFINELOOPS -; RUN: opt %loadNPMPolly \ -; RUN:     -pass-remarks-missed="polly-detect" -polly-detect-track-failures \ -; RUN:     -polly-allow-nonaffine-loops=true '-passes=print<polly-detect>' -disable-output \ -; RUN:     < %s 2>&1| FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" \ -; RUN:     -polly-process-unprofitable=false \ -; RUN:     -polly-detect-track-failures -polly-allow-nonaffine-loops=true \ -; RUN:     -polly-allow-nonaffine '-passes=print<polly-detect>' -disable-output < %s 2>&1 \ -; RUN:     | FileCheck %s --check-prefix=ALLOWNONAFFINEALL +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures -polly-allow-nonaffine-loops=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REJECTNONAFFINELOOPS +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures -polly-allow-nonaffine-loops=true '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINELOOPS +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-process-unprofitable=false -polly-detect-track-failures -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALLOWNONAFFINEALL  ; void f(int A[], int n) {  ;   for (int i = 0; i < A[n+i]; i++) diff --git a/polly/test/ScopDetectionDiagnostics/ReportLoopHasNoExit.ll b/polly/test/ScopDetectionDiagnostics/ReportLoopHasNoExit.ll index 6156efa..d80911c 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportLoopHasNoExit.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportLoopHasNoExit.ll @@ -4,8 +4,8 @@  ; the PostDominatorTree. Infinite loops are postdominated only by the virtual  ; root, which causes them not to appear in regions in ScopDetection anymore. -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-allow-nonaffine-loops '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-allow-nonaffine-loops=false '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-allow-nonaffine-loops '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-allow-nonaffine-loops=false '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void func (int param0, int N, int *A)  ; { diff --git a/polly/test/ScopDetectionDiagnostics/ReportMultipleNonAffineAccesses.ll b/polly/test/ScopDetectionDiagnostics/ReportMultipleNonAffineAccesses.ll index dd95bd6..d8c2916 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportMultipleNonAffineAccesses.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportMultipleNonAffineAccesses.ll @@ -1,9 +1,9 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output < %s 2>&1| FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -polly-delinearize=false -polly-detect-keep-going -disable-output < %s 2>&1| FileCheck %s -check-prefix=ALL -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output < %s 2>&1| FileCheck %s -check-prefix=DELIN -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -polly-detect-keep-going -disable-output < %s 2>&1| FileCheck %s -check-prefix=DELIN-ALL -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -polly-allow-nonaffine -disable-output < %s 2>&1| FileCheck %s -check-prefix=NONAFFINE -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -polly-allow-nonaffine -disable-output < %s 2>&1| FileCheck %s -check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -polly-delinearize=false -polly-detect-keep-going -disable-output < %s 2>&1 | FileCheck %s -check-prefix=ALL +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DELIN +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -polly-detect-keep-going -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DELIN-ALL +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NONAFFINE  ;  1 void manyaccesses(float A[restrict], long n, float B[restrict][n])  ;  2 { diff --git a/polly/test/ScopDetectionDiagnostics/ReportNonAffineAccess-01.ll b/polly/test/ScopDetectionDiagnostics/ReportNonAffineAccess-01.ll index 13ac9d5..ee0aa74 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportNonAffineAccess-01.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportNonAffineAccess-01.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; void f(int A[]) {  ;   for(int i=0; i<42; ++i) diff --git a/polly/test/ScopDetectionDiagnostics/ReportUnprofitable.ll b/polly/test/ScopDetectionDiagnostics/ReportUnprofitable.ll index 93e9e8b..ad2c813 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportUnprofitable.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportUnprofitable.ll @@ -1,10 +1,6 @@ -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" \ -; RUN:     -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output \ -; RUN:     -polly-process-unprofitable=false < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output -polly-process-unprofitable=false < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" \ -; RUN:     -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output \ -; RUN:     -polly-process-unprofitable=false < %s 2>&1 -pass-remarks-output=%t.yaml +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output -polly-process-unprofitable=false -pass-remarks-output=%t.yaml < %s 2>&1  ; RUN: cat %t.yaml | FileCheck -check-prefix=YAML %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopDetectionDiagnostics/ReportUnreachableInExit.ll b/polly/test/ScopDetectionDiagnostics/ReportUnreachableInExit.ll index d110cfe..d97032c 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportUnreachableInExit.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportUnreachableInExit.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s \ -; RUN:     -pass-remarks-missed="polly-detect" 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output -pass-remarks-missed=polly-detect < %s 2>&1 | FileCheck %s  ; void f(long A[], long N) {  ;   long i; diff --git a/polly/test/ScopDetectionDiagnostics/ReportVariantBasePtr-01.ll b/polly/test/ScopDetectionDiagnostics/ReportVariantBasePtr-01.ll index 5f296fa..7a5025c 100644 --- a/polly/test/ScopDetectionDiagnostics/ReportVariantBasePtr-01.ll +++ b/polly/test/ScopDetectionDiagnostics/ReportVariantBasePtr-01.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s  ; struct b {  ;   double **b; diff --git a/polly/test/ScopDetectionDiagnostics/loop_has_multiple_exits.ll b/polly/test/ScopDetectionDiagnostics/loop_has_multiple_exits.ll index 3cdeed1..e15c045 100644 --- a/polly/test/ScopDetectionDiagnostics/loop_has_multiple_exits.ll +++ b/polly/test/ScopDetectionDiagnostics/loop_has_multiple_exits.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-missed="polly-detect" -polly-detect-track-failures '-passes=print<polly-detect>' -disable-output 2>&1 < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -pass-remarks-missed=polly-detect -polly-detect-track-failures '-passes=polly-custom<detect>' -polly-print-detect -disable-output 2>&1 < %s | FileCheck %s -match-full-lines  ;  ; Derived from test-suite/MultiSource/Benchmarks/BitBench/uuencode/uuencode.c  ; diff --git a/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop-2.ll b/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop-2.ll index 4a9a200..b5918d9 100644 --- a/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop-2.ll +++ b/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -pass-remarks-missed="polly-detect" -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -pass-remarks-missed=polly-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: remark: <unknown>:0:0: Loop cannot be handled because not all latches are part of loop region. diff --git a/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop.ll b/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop.ll index 61ff033..502abf8 100644 --- a/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop.ll +++ b/polly/test/ScopDetectionDiagnostics/loop_partially_in_scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -pass-remarks-missed="polly-detect" -disable-output < %s 2>&1| FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -pass-remarks-missed=polly-detect -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: remark: <unknown>:0:0: Loop cannot be handled because not all latches are part of loop region.  ; CHECK: remark: <unknown>:0:0: Loop cannot be handled because not all latches are part of loop region. diff --git a/polly/test/ScopInfo/20110312-Fail-without-basicaa.ll b/polly/test/ScopInfo/20110312-Fail-without-basicaa.ll index c5efec3..accb562 100644 --- a/polly/test/ScopInfo/20110312-Fail-without-basicaa.ll +++ b/polly/test/ScopInfo/20110312-Fail-without-basicaa.ll @@ -1,5 +1,5 @@  ; This should be run without alias analysis enabled. -;RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>'  -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"  define i32 @main() nounwind { diff --git a/polly/test/ScopInfo/20111108-Parameter-not-detected.ll b/polly/test/ScopInfo/20111108-Parameter-not-detected.ll index 81c7efb..57ae977 100644 --- a/polly/test/ScopInfo/20111108-Parameter-not-detected.ll +++ b/polly/test/ScopInfo/20111108-Parameter-not-detected.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  declare void @foo() diff --git a/polly/test/ScopInfo/2012-03-16-Crash-because-of-unsigned-in-scev.ll b/polly/test/ScopInfo/2012-03-16-Crash-because-of-unsigned-in-scev.ll index 5abf8ff..3cb63cc 100644 --- a/polly/test/ScopInfo/2012-03-16-Crash-because-of-unsigned-in-scev.ll +++ b/polly/test/ScopInfo/2012-03-16-Crash-because-of-unsigned-in-scev.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-a0:0-n32" diff --git a/polly/test/ScopInfo/2015-10-04-Crash-in-domain-generation.ll b/polly/test/ScopInfo/2015-10-04-Crash-in-domain-generation.ll index d16ba45..668fcd8 100644 --- a/polly/test/ScopInfo/2015-10-04-Crash-in-domain-generation.ll +++ b/polly/test/ScopInfo/2015-10-04-Crash-in-domain-generation.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/Alias-0.ll b/polly/test/ScopInfo/Alias-0.ll index ebbe744..50c1b65 100644 --- a/polly/test/ScopInfo/Alias-0.ll +++ b/polly/test/ScopInfo/Alias-0.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-use-runtime-alias-checks=false -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=RTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-use-runtime-alias-checks=false -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=NORTA  ; REQUIRES: asserts  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/Alias-1.ll b/polly/test/ScopInfo/Alias-1.ll index b1711c2..15fd6c9 100644 --- a/polly/test/ScopInfo/Alias-1.ll +++ b/polly/test/ScopInfo/Alias-1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-use-runtime-alias-checks=false -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=RTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-use-runtime-alias-checks=false -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=NORTA  ; REQUIRES: asserts  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/Alias-2.ll b/polly/test/ScopInfo/Alias-2.ll index b94f130..598ad0f 100644 --- a/polly/test/ScopInfo/Alias-2.ll +++ b/polly/test/ScopInfo/Alias-2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-use-runtime-alias-checks=false -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=RTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-use-runtime-alias-checks=false -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=NORTA  ; REQUIRES: asserts  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/Alias-3.ll b/polly/test/ScopInfo/Alias-3.ll index af78165..388a2de 100644 --- a/polly/test/ScopInfo/Alias-3.ll +++ b/polly/test/ScopInfo/Alias-3.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-use-runtime-alias-checks=false -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=RTA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-use-runtime-alias-checks=false -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=NORTA  ; REQUIRES: asserts  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/Alias-4.ll b/polly/test/ScopInfo/Alias-4.ll index fe651c8..e9f4f95 100644 --- a/polly/test/ScopInfo/Alias-4.ll +++ b/polly/test/ScopInfo/Alias-4.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline= '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=RTA -; RUN: opt %loadNPMPolly -aa-pipeline= '-passes=print<polly-detect>,print<polly-function-scops>' -polly-use-runtime-alias-checks=false -disable-output < %s -stats 2>&1 | FileCheck %s --check-prefix=NORTA +; RUN: opt %loadNPMPolly -aa-pipeline= '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=RTA +; RUN: opt %loadNPMPolly -aa-pipeline= '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -polly-use-runtime-alias-checks=false -disable-output -stats < %s 2>&1 | FileCheck %s --check-prefix=NORTA  ; REQUIRES: asserts  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/BoundChecks/single-loop.ll b/polly/test/ScopInfo/BoundChecks/single-loop.ll index 0b69beaa..d44c18c 100644 --- a/polly/test/ScopInfo/BoundChecks/single-loop.ll +++ b/polly/test/ScopInfo/BoundChecks/single-loop.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ; This only works after the post-dominator tree has been fixed.  ; diff --git a/polly/test/ScopInfo/BoundChecks/two-loops.ll b/polly/test/ScopInfo/BoundChecks/two-loops.ll index f2ba17d..9034f75 100644 --- a/polly/test/ScopInfo/BoundChecks/two-loops.ll +++ b/polly/test/ScopInfo/BoundChecks/two-loops.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output< %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ; This only works after the post-dominator tree has fixed.  ; XFAIL: * diff --git a/polly/test/ScopInfo/NonAffine/div_backedge.ll b/polly/test/ScopInfo/NonAffine/div_backedge.ll index 3b0c673..e8edad9 100644 --- a/polly/test/ScopInfo/NonAffine/div_backedge.ll +++ b/polly/test/ScopInfo/NonAffine/div_backedge.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(float *A) {  ;      for (long i = 1;; i++) { diff --git a/polly/test/ScopInfo/NonAffine/div_domain.ll b/polly/test/ScopInfo/NonAffine/div_domain.ll index 34a5cec..c195bb4 100644 --- a/polly/test/ScopInfo/NonAffine/div_domain.ll +++ b/polly/test/ScopInfo/NonAffine/div_domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(float *A) {  ;      for (long i = 0; i < 16; i++) { diff --git a/polly/test/ScopInfo/NonAffine/invariant_loads_dependent_in_non_affine_region.ll b/polly/test/ScopInfo/NonAffine/invariant_loads_dependent_in_non_affine_region.ll index 7d02fae..31ecdaa 100644 --- a/polly/test/ScopInfo/NonAffine/invariant_loads_dependent_in_non_affine_region.ll +++ b/polly/test/ScopInfo/NonAffine/invariant_loads_dependent_in_non_affine_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int *B, int *C) {  ;      for (int i = 0; i < 1000; i++) diff --git a/polly/test/ScopInfo/NonAffine/modulo_backedge.ll b/polly/test/ScopInfo/NonAffine/modulo_backedge.ll index d5c808d..e0cd1e5 100644 --- a/polly/test/ScopInfo/NonAffine/modulo_backedge.ll +++ b/polly/test/ScopInfo/NonAffine/modulo_backedge.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Domain :=  ; CHECK:   { Stmt_for_body[i0] : 0 <= i0 <= 6 }; diff --git a/polly/test/ScopInfo/NonAffine/modulo_domain.ll b/polly/test/ScopInfo/NonAffine/modulo_domain.ll index 13fe53f..53bbe15 100644 --- a/polly/test/ScopInfo/NonAffine/modulo_domain.ll +++ b/polly/test/ScopInfo/NonAffine/modulo_domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; TODO: The new domain generation cannot handle modulo domain constraints,  ;       hence modulo handling has been disabled completely. Once this is diff --git a/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll b/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll index 2b8427d..7d34ef9 100644 --- a/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll +++ b/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                                   '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCALAR -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-process-unprofitable=false '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PROFIT +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCALAR +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-process-unprofitable=false '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=PROFIT  ;  ; SCALAR:      Function: f  ; SCALAR-NEXT: Region: %bb1---%bb13 diff --git a/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_2.ll b/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_2.ll index 30f756e..a40afdd 100644 --- a/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_2.ll +++ b/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_2.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false                       '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                        '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL  ;  ; Here we have a non-affine loop (in the context of the loop nest)  ; and also a non-affine access (A[k]). While we can always model the diff --git a/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_3.ll b/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_3.ll index 6dacd71..f3678d3 100644 --- a/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_3.ll +++ b/polly/test/ScopInfo/NonAffine/non-affine-loop-condition-dependent-access_3.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false                       '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true                        '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=false '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL  ;  ; Here we have a non-affine loop (in the context of the loop nest)  ; and also a non-affine access (A[k]). While we can always model the diff --git a/polly/test/ScopInfo/NonAffine/non_affine_access_with_range_2.ll b/polly/test/ScopInfo/NonAffine/non_affine_access_with_range_2.ll index 8a13f79..85a1081 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_access_with_range_2.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_access_with_range_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A) {  ;      for (int i = 0; i < 128; i++) diff --git a/polly/test/ScopInfo/NonAffine/non_affine_but_sdiv.ll b/polly/test/ScopInfo/NonAffine/non_affine_but_sdiv.ll index 1e70d2c..65513a5 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_but_sdiv.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_but_sdiv.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Statements {  ; CHECK-NEXT:     Stmt_for_body diff --git a/polly/test/ScopInfo/NonAffine/non_affine_but_srem.ll b/polly/test/ScopInfo/NonAffine/non_affine_but_srem.ll index dcfaa92..0185774 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_but_srem.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_but_srem.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void pos(float *A, long n) {  ;      for (long i = 0; i < 100; i++) diff --git a/polly/test/ScopInfo/NonAffine/non_affine_conditional_nested.ll b/polly/test/ScopInfo/NonAffine/non_affine_conditional_nested.ll index 24bfe60..ab47dc0 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_conditional_nested.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_conditional_nested.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_affine_loop.ll b/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_affine_loop.ll index 931ad36..51a7d54 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_affine_loop.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_affine_loop.ll @@ -1,12 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-nonaffine-loops=true \ -; RUN:     '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST -; RUN: opt %loadNPMPolly -polly-allow-nonaffine \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \ -; RUN:     '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s \ -; RUN:     --check-prefix=ALL +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-invariant-load-hoisting=true -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL  ;  ; Negative test for INNERMOST.  ; At the moment we will optimistically assume A[i] in the conditional before the inner diff --git a/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll b/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll index 37b51ceb..b1f7e65 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_conditional_surrounding_non_affine_loop.ll @@ -1,16 +1,6 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-nonaffine-loops=true \ -; RUN:     '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST -; RUN: opt %loadNPMPolly -polly-allow-nonaffine \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \ -; RUN:     '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL -; RUN: opt %loadNPMPolly -polly-allow-nonaffine \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-process-unprofitable=false \ -; RUN:     -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true \ -; RUN:     '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-invariant-load-hoisting=true -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=INNERMOST +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=ALL +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-process-unprofitable=false -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops=true '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT  ;  ; Negative test for INNERMOST.  ; At the moment we will optimistically assume A[i] in the conditional before the inner diff --git a/polly/test/ScopInfo/NonAffine/non_affine_float_compare.ll b/polly/test/ScopInfo/NonAffine/non_affine_float_compare.ll index 7bfd7f8..ac77dfb 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_float_compare.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_float_compare.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(float *A) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/ScopInfo/NonAffine/non_affine_loop_condition.ll b/polly/test/ScopInfo/NonAffine/non_affine_loop_condition.ll index fc779d5..db08544 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_loop_condition.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_loop_condition.ll @@ -1,6 +1,6 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops                                   '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-process-unprofitable=false '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-detect-reductions=false    '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NO-REDUCTION +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-process-unprofitable=false '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-detect-reductions=false '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NO-REDUCTION  ;  ;    void f(int *A, int *C) {  ;      for (int i = 0; i < 1024; i++) { diff --git a/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll b/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll index 63ff354..cde2dc4 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_loop_used_later.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops                                                                        '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-unprofitable-scalar-accs=true -polly-process-unprofitable=false '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-allow-nonaffine-branches -polly-allow-nonaffine-loops -polly-unprofitable-scalar-accs=true -polly-process-unprofitable=false '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=PROFIT  ;  ; Verify that we over approximate the read access of A[j] in the last statement as j is  ; computed in a non-affine loop we do not model. diff --git a/polly/test/ScopInfo/NonAffine/non_affine_parametric_loop.ll b/polly/test/ScopInfo/NonAffine/non_affine_parametric_loop.ll index d33befe..ce4cc61 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_parametric_loop.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_parametric_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, double A[], int INDEX[]) { diff --git a/polly/test/ScopInfo/NonAffine/non_affine_region_guaranteed_non-entry.ll b/polly/test/ScopInfo/NonAffine/non_affine_region_guaranteed_non-entry.ll index 77c2df4..b46ce87 100644 --- a/polly/test/ScopInfo/NonAffine/non_affine_region_guaranteed_non-entry.ll +++ b/polly/test/ScopInfo/NonAffine/non_affine_region_guaranteed_non-entry.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -polly-detect '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -polly-detect '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/NonAffine/whole-scop-non-affine-subregion-in-loop.ll b/polly/test/ScopInfo/NonAffine/whole-scop-non-affine-subregion-in-loop.ll index 9ed340d..58e5ccd 100644 --- a/polly/test/ScopInfo/NonAffine/whole-scop-non-affine-subregion-in-loop.ll +++ b/polly/test/ScopInfo/NonAffine/whole-scop-non-affine-subregion-in-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; Regression test that triggered a memory leak at some point (24947).  ; diff --git a/polly/test/ScopInfo/aliasing_conditional_alias_groups_1.ll b/polly/test/ScopInfo/aliasing_conditional_alias_groups_1.ll index cbd024b..d94fc5f 100644 --- a/polly/test/ScopInfo/aliasing_conditional_alias_groups_1.ll +++ b/polly/test/ScopInfo/aliasing_conditional_alias_groups_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that there is no alias group because we either access A or B never both.  ; diff --git a/polly/test/ScopInfo/aliasing_conditional_alias_groups_2.ll b/polly/test/ScopInfo/aliasing_conditional_alias_groups_2.ll index 3858d8a..df7f75d 100644 --- a/polly/test/ScopInfo/aliasing_conditional_alias_groups_2.ll +++ b/polly/test/ScopInfo/aliasing_conditional_alias_groups_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we create two alias groups since the minimal/maximal accesses  ; depend on %b. diff --git a/polly/test/ScopInfo/aliasing_dead_access.ll b/polly/test/ScopInfo/aliasing_dead_access.ll index 7baa3dc..0ebc39c 100644 --- a/polly/test/ScopInfo/aliasing_dead_access.ll +++ b/polly/test/ScopInfo/aliasing_dead_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do not create a SCoP if there is no statement executed.  ; diff --git a/polly/test/ScopInfo/aliasing_many_arrays_to_compare.ll b/polly/test/ScopInfo/aliasing_many_arrays_to_compare.ll index 7265aab..8e5bab66 100644 --- a/polly/test/ScopInfo/aliasing_many_arrays_to_compare.ll +++ b/polly/test/ScopInfo/aliasing_many_arrays_to_compare.ll @@ -1,8 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output \ -; RUN:                < %s 2>&1 | FileCheck %s --check-prefix=FOUND -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output \ -; RUN:                -polly-rtc-max-arrays-per-group=3 < %s 2>&1 | FileCheck %s \ -; RUN:                --check-prefix=IGNORED +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=FOUND +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output -polly-rtc-max-arrays-per-group=3 < %s 2>&1 | FileCheck %s --check-prefix=IGNORED  ;  ; FOUND: Function: foo  ; IGNORED-NOT: Function: foo diff --git a/polly/test/ScopInfo/aliasing_many_parameters_not_all_involved.ll b/polly/test/ScopInfo/aliasing_many_parameters_not_all_involved.ll index c7592bc..aec6ea0bf 100644 --- a/polly/test/ScopInfo/aliasing_many_parameters_not_all_involved.ll +++ b/polly/test/ScopInfo/aliasing_many_parameters_not_all_involved.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadPolly -polly-analysis-computeout=0 -polly-print-scops -polly-rtc-max-parameters=8 -disable-output < %s | FileCheck %s --check-prefix=MAX8 -; RUN: opt %loadPolly -polly-analysis-computeout=0 -polly-print-scops -polly-rtc-max-parameters=7 -disable-output < %s | FileCheck %s --check-prefix=MAX7 +; RUN: opt %loadNPMPolly -polly-analysis-computeout=0 '-passes=polly-custom<scops>' -polly-print-scops -polly-rtc-max-parameters=8 -disable-output < %s | FileCheck %s --check-prefix=MAX8 +; RUN: opt %loadNPMPolly -polly-analysis-computeout=0 '-passes=polly-custom<scops>' -polly-print-scops -polly-rtc-max-parameters=7 -disable-output < %s | FileCheck %s --check-prefix=MAX7  ;  ; Check that we allow this SCoP even though it has 10 parameters involved in possibly aliasing accesses.  ; However, only 7 are involved in accesses through B, 8 through C and none in accesses through A. diff --git a/polly/test/ScopInfo/aliasing_many_read_only_acesses.ll b/polly/test/ScopInfo/aliasing_many_read_only_acesses.ll index d66a10b..a7dbe0b 100644 --- a/polly/test/ScopInfo/aliasing_many_read_only_acesses.ll +++ b/polly/test/ScopInfo/aliasing_many_read_only_acesses.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Assumed Context:  ; CHECK-NEXT: { : } diff --git a/polly/test/ScopInfo/aliasing_multiple_alias_groups.ll b/polly/test/ScopInfo/aliasing_multiple_alias_groups.ll index 9943802..db54a16 100644 --- a/polly/test/ScopInfo/aliasing_multiple_alias_groups.ll +++ b/polly/test/ScopInfo/aliasing_multiple_alias_groups.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -aa-pipeline=         < %s 2>&1 | FileCheck %s --check-prefix=NOAA -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -aa-pipeline=tbaa    < %s 2>&1 | FileCheck %s --check-prefix=TBAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -aa-pipeline= < %s 2>&1 | FileCheck %s --check-prefix=NOAA +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -aa-pipeline=tbaa < %s 2>&1 | FileCheck %s --check-prefix=TBAA  ;  ;    void jd(int *Int0, int *Int1, float *Float0, float *Float1) {  ;      for (int i = 0; i < 1024; i++) { diff --git a/polly/test/ScopInfo/aliasing_with_non_affine_access.ll b/polly/test/ScopInfo/aliasing_with_non_affine_access.ll index 900d5d4..0001b8a 100644 --- a/polly/test/ScopInfo/aliasing_with_non_affine_access.ll +++ b/polly/test/ScopInfo/aliasing_with_non_affine_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -polly-process-unprofitable -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -polly-process-unprofitable -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s  ;  ; @test1  ; Make sure we generate the correct aliasing check for a fixed-size memset operation. diff --git a/polly/test/ScopInfo/allow-all-parameters-dereferencable.ll b/polly/test/ScopInfo/allow-all-parameters-dereferencable.ll index 70c3c56..93253b7 100644 --- a/polly/test/ScopInfo/allow-all-parameters-dereferencable.ll +++ b/polly/test/ScopInfo/allow-all-parameters-dereferencable.ll @@ -1,14 +1,9 @@ -; RUN: opt %loadNPMPolly -disable-output -polly-invariant-load-hoisting \ -; RUN: -polly-allow-dereference-of-all-function-parameters \ -; RUN: '-passes=print<polly-function-scops>' < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly -disable-output -polly-invariant-load-hoisting -polly-allow-dereference-of-all-function-parameters '-passes=polly-custom<scops>' -polly-print-scops < %s 2>&1 | FileCheck %s --check-prefix=SCOP -; RUN: opt %loadNPMPolly -S -polly-invariant-load-hoisting \ -; RUN: -passes=polly-codegen < %s 2>&1 | FileCheck %s --check-prefix=CODE-RTC +; RUN: opt %loadNPMPolly -S -polly-invariant-load-hoisting '-passes=polly<no-default-opts>' < %s 2>&1 | FileCheck %s --check-prefix=CODE-RTC -; RUN: opt %loadNPMPolly -S -polly-invariant-load-hoisting \ -; RUN: -polly-allow-dereference-of-all-function-parameters \ -; RUN: -passes=polly-codegen < %s 2>&1 | FileCheck %s --check-prefix=CODE +; RUN: opt %loadNPMPolly -S -polly-invariant-load-hoisting -polly-allow-dereference-of-all-function-parameters '-passes=polly<no-default-opts>' < %s 2>&1 | FileCheck %s --check-prefix=CODE  ; SCOP:      Function: hoge  ; SCOP-NEXT: Region: %bb15---%bb37 diff --git a/polly/test/ScopInfo/assume_gep_bounds.ll b/polly/test/ScopInfo/assume_gep_bounds.ll index bd14e38..994d49e 100644 --- a/polly/test/ScopInfo/assume_gep_bounds.ll +++ b/polly/test/ScopInfo/assume_gep_bounds.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;    void foo(float A[][20][30], long n, long m, long p) {  ;      for (long i = 0; i < n; i++) diff --git a/polly/test/ScopInfo/assume_gep_bounds_2.ll b/polly/test/ScopInfo/assume_gep_bounds_2.ll index 7a8c187..be43be5 100644 --- a/polly/test/ScopInfo/assume_gep_bounds_2.ll +++ b/polly/test/ScopInfo/assume_gep_bounds_2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-precise-inbounds | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-precise-inbounds < %s 2>&1 | FileCheck %s  ;  ;    void foo(float A[restrict][20], float B[restrict][20], long n, long m,  ;             long p) { diff --git a/polly/test/ScopInfo/assume_gep_bounds_many.ll b/polly/test/ScopInfo/assume_gep_bounds_many.ll index 01fc12c..cfd9008 100644 --- a/polly/test/ScopInfo/assume_gep_bounds_many.ll +++ b/polly/test/ScopInfo/assume_gep_bounds_many.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -disable-output '-passes=print<polly-function-scops>' -polly-ignore-aliasing \ -; RUN:    < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -disable-output '-passes=polly-custom<scops>' -polly-print-scops -polly-ignore-aliasing < %s 2>&1 | FileCheck %s  ; CHECK: Assumed Context:  ; CHECK-NEXT: [n1_a, n1_b, n1_c, n1_d, n2_a, n2_b, n2_c, n2_d, n3_a, n3_b, n3_c, n3_d, n4_a, n4_b, n4_c, n4_d, n5_a, n5_b, n5_c, n5_d, n6_a, n6_b, n6_c, n6_d, n7_a, n7_b, n7_c, n7_d, n8_a, n8_b, n8_c, n8_d, n9_a, n9_b, n9_c, n9_d, p1_b, p1_c, p1_d, p2_b, p2_c, p2_d, p3_b, p3_c, p3_d, p4_b, p4_c, p4_d, p5_b, p5_c, p5_d, p6_b, p6_c, p6_d, p7_b, p7_c, p7_d, p8_b, p8_c, p8_d, p9_b, p9_c, p9_d] -> {  : p1_b >= n1_b and p1_c >= n1_c and p1_d >= n1_d and p2_b >= n2_b and p2_c >= n2_c and p2_d >= n2_d and p3_b >= n3_b and p3_c >= n3_c and p3_d >= n3_d and p4_b >= n4_b and p4_c >= n4_c and p4_d >= n4_d and p5_b >= n5_b and p5_c >= n5_c and p5_d >= n5_d and p6_b >= n6_b and p6_c >= n6_c and p6_d >= n6_d and p7_b >= n7_b and p7_c >= n7_c and p7_d >= n7_d and p8_b >= n8_b and p8_c >= n8_c and p8_d >= n8_d and p9_b >= n9_b and p9_c >= n9_c and p9_d >= n9_d } diff --git a/polly/test/ScopInfo/avoid_new_parameters_from_geps.ll b/polly/test/ScopInfo/avoid_new_parameters_from_geps.ll index 3fb7a13..b3aa768 100644 --- a/polly/test/ScopInfo/avoid_new_parameters_from_geps.ll +++ b/polly/test/ScopInfo/avoid_new_parameters_from_geps.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do no introduce a parameter here that is actually not needed.  ; diff --git a/polly/test/ScopInfo/bool-addrec.ll b/polly/test/ScopInfo/bool-addrec.ll index 81fcade..01c6d52 100644 --- a/polly/test/ScopInfo/bool-addrec.ll +++ b/polly/test/ScopInfo/bool-addrec.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -disable-output '-passes=print<polly-ast>' -polly-process-unprofitable < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -disable-output '-passes=polly-custom<ast>' -polly-print-ast -polly-process-unprofitable < %s 2>&1 | FileCheck %s  ; CHECK:      for (int c0 = 0; c0 <= 19999; c0 += 1) {  ; CHECK-NEXT:   if (c0 % 2 == 0) diff --git a/polly/test/ScopInfo/bounded_loop_assumptions.ll b/polly/test/ScopInfo/bounded_loop_assumptions.ll index 5628092..21ba391 100644 --- a/polly/test/ScopInfo/bounded_loop_assumptions.ll +++ b/polly/test/ScopInfo/bounded_loop_assumptions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The assumed context is tricky here as the equality test for the inner loop  ; allows an "unbounded" loop trip count. We assume that does not happen, thus diff --git a/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-2.ll b/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-2.ll index 83743e4..d25a8e6 100644 --- a/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-2.ll +++ b/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-2.ll @@ -1,8 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | \ -; RUN:     FileCheck %s -check-prefix=DETECT +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DETECT -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | \ -; RUN:     FileCheck %s -check-prefix=SCOP +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOP  ; DETECT: Valid Region for Scop: loop => barrier  ; DETECT-NEXT: Valid Region for Scop: branch => end diff --git a/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-3.ll b/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-3.ll index 9685ba3..91aa96e 100644 --- a/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-3.ll +++ b/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations-3.ll @@ -1,8 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | \ -; RUN:     FileCheck %s -check-prefix=NONAFFINE -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output \ -; RUN:     -polly-allow-nonaffine-branches=false < %s 2>&1 | \ -; RUN:     FileCheck %s -check-prefix=NO-NONEAFFINE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-allow-nonaffine-branches=false < %s 2>&1 | FileCheck %s -check-prefix=NO-NONEAFFINE  ; NONAFFINE:      Statements {  ; NONAFFINE-NEXT: 	Stmt_loop diff --git a/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations.ll b/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations.ll index f41e650..22a60c7 100644 --- a/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations.ll +++ b/polly/test/ScopInfo/branch-references-loop-scev-with-unknown-iterations.ll @@ -1,8 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | \ -; RUN:     FileCheck %s -check-prefix=NONAFFINE -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output \ -; RUN:     -polly-allow-nonaffine-branches=false < %s 2>&1 | \ -; RUN:     FileCheck %s -check-prefix=NO-NONEAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output -polly-allow-nonaffine-branches=false < %s 2>&1 | FileCheck %s -check-prefix=NO-NONEAFFINE  ; NONAFFINE-NOT: Statements diff --git a/polly/test/ScopInfo/bug_2010_10_22.ll b/polly/test/ScopInfo/bug_2010_10_22.ll index 71e7051..1d24889 100644 --- a/polly/test/ScopInfo/bug_2010_10_22.ll +++ b/polly/test/ScopInfo/bug_2010_10_22.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/bug_2011_1_5.ll b/polly/test/ScopInfo/bug_2011_1_5.ll index f4a24e0..7c76c3e 100644 --- a/polly/test/ScopInfo/bug_2011_1_5.ll +++ b/polly/test/ScopInfo/bug_2011_1_5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ; Bug description: Alias Analysis thinks IntToPtrInst aliases with alloca instructions created by IndependentBlocks Pass.  ;                  This will trigger the assertion when we are verifying the SCoP after IndependentBlocks. diff --git a/polly/test/ScopInfo/bug_scev_not_fully_eval.ll b/polly/test/ScopInfo/bug_scev_not_fully_eval.ll index ed6bbafd..6e1ef23 100644 --- a/polly/test/ScopInfo/bug_scev_not_fully_eval.ll +++ b/polly/test/ScopInfo/bug_scev_not_fully_eval.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | not FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | not FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  @edge.8265 = external global [72 x i32], align 32 ; <ptr> [#uses=1] diff --git a/polly/test/ScopInfo/cfg_consequences.ll b/polly/test/ScopInfo/cfg_consequences.ll index 9161d3d..2b702e2 100644 --- a/polly/test/ScopInfo/cfg_consequences.ll +++ b/polly/test/ScopInfo/cfg_consequences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; void consequences(int *A, int bool_cond, int lhs, int rhs) {  ; diff --git a/polly/test/ScopInfo/complex-branch-structure.ll b/polly/test/ScopInfo/complex-branch-structure.ll index de79c22..f48089a 100644 --- a/polly/test/ScopInfo/complex-branch-structure.ll +++ b/polly/test/ScopInfo/complex-branch-structure.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; We build a scop of the following form to check that the domain construction  ; does not take a huge amount of time, but that we instead just bail out. diff --git a/polly/test/ScopInfo/complex-condition.ll b/polly/test/ScopInfo/complex-condition.ll index c3b8d2b..9164959 100644 --- a/polly/test/ScopInfo/complex-condition.ll +++ b/polly/test/ScopInfo/complex-condition.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Low complexity assumption: {  : false }  ; diff --git a/polly/test/ScopInfo/complex-expression.ll b/polly/test/ScopInfo/complex-expression.ll index 4a2a1d2..456edb0 100644 --- a/polly/test/ScopInfo/complex-expression.ll +++ b/polly/test/ScopInfo/complex-expression.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; This test case has an SCEVSMax expression with a very high arity. The  ; piecewise affine function we would create for it would have a huge amount of diff --git a/polly/test/ScopInfo/complex-loop-nesting.ll b/polly/test/ScopInfo/complex-loop-nesting.ll index 36cb078..4ffd868 100644 --- a/polly/test/ScopInfo/complex-loop-nesting.ll +++ b/polly/test/ScopInfo/complex-loop-nesting.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/complex-successor-structure-2.ll b/polly/test/ScopInfo/complex-successor-structure-2.ll index f4a78bf..32425d7 100644 --- a/polly/test/ScopInfo/complex-successor-structure-2.ll +++ b/polly/test/ScopInfo/complex-successor-structure-2.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ; We build a scop for the region for.body->B13. The CFG is of the following  ; form and the branch conditions are build from "smax" SCEVs. However, in diff --git a/polly/test/ScopInfo/complex-successor-structure-3.ll b/polly/test/ScopInfo/complex-successor-structure-3.ll index 6da1fe3..c01eca5 100644 --- a/polly/test/ScopInfo/complex-successor-structure-3.ll +++ b/polly/test/ScopInfo/complex-successor-structure-3.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -disable-output '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -disable-output '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ;  ; Check that propagation of domains from A(X) to A(X+1) will keep the  ; domains small and concise. diff --git a/polly/test/ScopInfo/complex-successor-structure.ll b/polly/test/ScopInfo/complex-successor-structure.ll index 6c87ba3..1b39f4c 100644 --- a/polly/test/ScopInfo/complex-successor-structure.ll +++ b/polly/test/ScopInfo/complex-successor-structure.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ; We build a scop from the region for.body->B13. The CFG is of the  ; following form. The test checks that the condition construction does not take diff --git a/polly/test/ScopInfo/complex_domain_binary_condition.ll b/polly/test/ScopInfo/complex_domain_binary_condition.ll index 6e28c9d..42a114e 100644 --- a/polly/test/ScopInfo/complex_domain_binary_condition.ll +++ b/polly/test/ScopInfo/complex_domain_binary_condition.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Low complexity assumption: {  : false }  ; diff --git a/polly/test/ScopInfo/complex_execution_context.ll b/polly/test/ScopInfo/complex_execution_context.ll index 9880a1d..9896fba 100644 --- a/polly/test/ScopInfo/complex_execution_context.ll +++ b/polly/test/ScopInfo/complex_execution_context.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Low complexity assumption:  ; diff --git a/polly/test/ScopInfo/cond_constant_in_loop.ll b/polly/test/ScopInfo/cond_constant_in_loop.ll index 552fddc..ecc2767 100644 --- a/polly/test/ScopInfo/cond_constant_in_loop.ll +++ b/polly/test/ScopInfo/cond_constant_in_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;void f(long a[], long N, long M) {  ;  long i, j, k; diff --git a/polly/test/ScopInfo/cond_in_loop.ll b/polly/test/ScopInfo/cond_in_loop.ll index c06dcd9..0f31904 100644 --- a/polly/test/ScopInfo/cond_in_loop.ll +++ b/polly/test/ScopInfo/cond_in_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;void f(long a[], long N, long M) {  ;  long i, j, k; diff --git a/polly/test/ScopInfo/condition-after-error-block-2.ll b/polly/test/ScopInfo/condition-after-error-block-2.ll index 8c4b217..257b2ed 100644 --- a/polly/test/ScopInfo/condition-after-error-block-2.ll +++ b/polly/test/ScopInfo/condition-after-error-block-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Verify that we do not allow PHI nodes such as %phi, if they reference an error  ; block and are used by anything else than a terminator instruction. diff --git a/polly/test/ScopInfo/condition-after-error-block-before-scop.ll b/polly/test/ScopInfo/condition-after-error-block-before-scop.ll index d5069da9..d86b48e 100644 --- a/polly/test/ScopInfo/condition-after-error-block-before-scop.ll +++ b/polly/test/ScopInfo/condition-after-error-block-before-scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"  target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/ScopInfo/condtion-after-error-block.ll b/polly/test/ScopInfo/condtion-after-error-block.ll index d9de4fc..8ad98b4 100644 --- a/polly/test/ScopInfo/condtion-after-error-block.ll +++ b/polly/test/ScopInfo/condtion-after-error-block.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Verify that we allow scops containing uniform branch conditions, where all  ; but one incoming block comes from an error condition. diff --git a/polly/test/ScopInfo/const_srem_sdiv.ll b/polly/test/ScopInfo/const_srem_sdiv.ll index b4c2f11..b50c4bd 100644 --- a/polly/test/ScopInfo/const_srem_sdiv.ll +++ b/polly/test/ScopInfo/const_srem_sdiv.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ;  ; See http://research.microsoft.com/pubs/151917/divmodnote-letter.pdf  ; diff --git a/polly/test/ScopInfo/constant-non-integer-branch-condition.ll b/polly/test/ScopInfo/constant-non-integer-branch-condition.ll index 86dd94e..f09f82f 100644 --- a/polly/test/ScopInfo/constant-non-integer-branch-condition.ll +++ b/polly/test/ScopInfo/constant-non-integer-branch-condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; At some point this caused a problem in the domain generation as we  ; assumed any constant branch condition to be valid. However, only constant diff --git a/polly/test/ScopInfo/constant_factor_in_parameter.ll b/polly/test/ScopInfo/constant_factor_in_parameter.ll index b58d413..26c73bd 100644 --- a/polly/test/ScopInfo/constant_factor_in_parameter.ll +++ b/polly/test/ScopInfo/constant_factor_in_parameter.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -disable-output '-passes=print<polly-function-scops>' < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -disable-output '-passes=print<polly-function-scops>' < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -disable-output '-passes=polly-custom<scops>' -polly-print-scops < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -disable-output '-passes=polly-custom<scops>' -polly-print-scops < %s 2>&1 | FileCheck %s  ;  ; Check that the constant part of the N * M * 4 expression is not part of the  ; parameter but explicit in the access function. This can avoid existentially diff --git a/polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll b/polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll index 62e6cd4..762132f 100644 --- a/polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll +++ b/polly/test/ScopInfo/constant_functions_outside_scop_as_unknown.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" diff --git a/polly/test/ScopInfo/constant_start_integer.ll b/polly/test/ScopInfo/constant_start_integer.ll index 8991f82..6d17288 100644 --- a/polly/test/ScopInfo/constant_start_integer.ll +++ b/polly/test/ScopInfo/constant_start_integer.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(float *input) { diff --git a/polly/test/ScopInfo/debug_call.ll b/polly/test/ScopInfo/debug_call.ll index a6761ec..63c1bac 100644 --- a/polly/test/ScopInfo/debug_call.ll +++ b/polly/test/ScopInfo/debug_call.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-debug-func=dbg_printf '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-debug-func=dbg_printf '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; Check that the call to dbg_printf is accepted as a debug-function.  ; diff --git a/polly/test/ScopInfo/delinearize-together-all-data-refs.ll b/polly/test/ScopInfo/delinearize-together-all-data-refs.ll index 676c8a2..7126fb9 100644 --- a/polly/test/ScopInfo/delinearize-together-all-data-refs.ll +++ b/polly/test/ScopInfo/delinearize-together-all-data-refs.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void foo(long n, long m, long o, double A[n][m][o]) {  ;   for (long i = 0; i < n-3; i++) diff --git a/polly/test/ScopInfo/div_by_zero.ll b/polly/test/ScopInfo/div_by_zero.ll index aecd168..62a13de 100644 --- a/polly/test/ScopInfo/div_by_zero.ll +++ b/polly/test/ScopInfo/div_by_zero.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/do-not-model-error-block-accesses.ll b/polly/test/ScopInfo/do-not-model-error-block-accesses.ll index a3ca595..333175b 100644 --- a/polly/test/ScopInfo/do-not-model-error-block-accesses.ll +++ b/polly/test/ScopInfo/do-not-model-error-block-accesses.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ; Check that we do not crash on this input. Earlier this indeed crashed as  ; we tried to model the access functions in an error block. diff --git a/polly/test/ScopInfo/eager-binary-and-or-conditions.ll b/polly/test/ScopInfo/eager-binary-and-or-conditions.ll index a988b3f..b1118519 100644 --- a/polly/test/ScopInfo/eager-binary-and-or-conditions.ll +++ b/polly/test/ScopInfo/eager-binary-and-or-conditions.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output< %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  ;  ; void or(float *A, long n, long m) {  ;   for (long i = 0; i < 100; i++) { diff --git a/polly/test/ScopInfo/early_exit_for_complex_domains.ll b/polly/test/ScopInfo/early_exit_for_complex_domains.ll index 9a1edcb..3ee6ff7 100644 --- a/polly/test/ScopInfo/early_exit_for_complex_domains.ll +++ b/polly/test/ScopInfo/early_exit_for_complex_domains.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; Check we do not crash.  ; diff --git a/polly/test/ScopInfo/error-blocks-1.ll b/polly/test/ScopInfo/error-blocks-1.ll index 047b095..902ea15 100644 --- a/polly/test/ScopInfo/error-blocks-1.ll +++ b/polly/test/ScopInfo/error-blocks-1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:         Context:  ; CHECK-NEXT:    [N] -> {  : -2147483648 <= N <= 2147483647 } diff --git a/polly/test/ScopInfo/error-blocks-2.ll b/polly/test/ScopInfo/error-blocks-2.ll index 6fa1294..613b00a 100644 --- a/polly/test/ScopInfo/error-blocks-2.ll +++ b/polly/test/ScopInfo/error-blocks-2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ;  ; CHECK:         Invariant Accesses: {  ; CHECK-NEXT:            ReadAccess :=	[Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/error-blocks-3.ll b/polly/test/ScopInfo/error-blocks-3.ll index e764360..9521037 100644 --- a/polly/test/ScopInfo/error-blocks-3.ll +++ b/polly/test/ScopInfo/error-blocks-3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-scops -polly-detect-keep-going -polly-allow-nonaffine -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-detect-keep-going -polly-allow-nonaffine -disable-output < %s | FileCheck %s  ;  ; The instruction  ; diff --git a/polly/test/ScopInfo/escaping_empty_scop.ll b/polly/test/ScopInfo/escaping_empty_scop.ll index 2efaef3..d47b286 100644 --- a/polly/test/ScopInfo/escaping_empty_scop.ll +++ b/polly/test/ScopInfo/escaping_empty_scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void g();  ;    int f(int *A) { diff --git a/polly/test/ScopInfo/exit-phi-1.ll b/polly/test/ScopInfo/exit-phi-1.ll index cbd6c28..21f13cf 100644 --- a/polly/test/ScopInfo/exit-phi-1.ll +++ b/polly/test/ScopInfo/exit-phi-1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -passes=polly-codegen -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly<no-default-opts>' -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ; Check for correct code generation of exit PHIs, even if the same PHI value  ; is used again inside the the SCoP. diff --git a/polly/test/ScopInfo/exit-phi-2.ll b/polly/test/ScopInfo/exit-phi-2.ll index 695c617..b8da9ab 100644 --- a/polly/test/ScopInfo/exit-phi-2.ll +++ b/polly/test/ScopInfo/exit-phi-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that there is no MK_ExitPHI READ access.  ; diff --git a/polly/test/ScopInfo/exit_phi_accesses-2.ll b/polly/test/ScopInfo/exit_phi_accesses-2.ll index b3b7cb1..928b564 100644 --- a/polly/test/ScopInfo/exit_phi_accesses-2.ll +++ b/polly/test/ScopInfo/exit_phi_accesses-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-LABEL: Function: foo  ; diff --git a/polly/test/ScopInfo/exit_phi_accesses.ll b/polly/test/ScopInfo/exit_phi_accesses.ll index 77b038e..a54ca4a 100644 --- a/polly/test/ScopInfo/exit_phi_accesses.ll +++ b/polly/test/ScopInfo/exit_phi_accesses.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Check that PHI nodes only create PHI access and nothing else (e.g. unnecessary  ; SCALAR accesses). In this case, for a PHI in the exit node, hence there is no diff --git a/polly/test/ScopInfo/expensive-boundary-context.ll b/polly/test/ScopInfo/expensive-boundary-context.ll index 95212f8..c0d2dcd 100644 --- a/polly/test/ScopInfo/expensive-boundary-context.ll +++ b/polly/test/ScopInfo/expensive-boundary-context.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output \ -; RUN:                < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-NOT:   Assumed Context:  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/extract_constant_factor_introduces_new_parameter.ll b/polly/test/ScopInfo/extract_constant_factor_introduces_new_parameter.ll index 5e833e7..2f446b6 100644 --- a/polly/test/ScopInfo/extract_constant_factor_introduces_new_parameter.ll +++ b/polly/test/ScopInfo/extract_constant_factor_introduces_new_parameter.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ; CHECK: Valid Region for Scop: bb10 => bb16 diff --git a/polly/test/ScopInfo/full-function.ll b/polly/test/ScopInfo/full-function.ll index 596c3d0..20cb137 100644 --- a/polly/test/ScopInfo/full-function.ll +++ b/polly/test/ScopInfo/full-function.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -polly-detect-full-functions < %s 2>&1 \ -; RUN: | FileCheck %s -check-prefix=FULL -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s -check-prefix=WITHOUT-FULL +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-detect-full-functions < %s 2>&1 | FileCheck %s -check-prefix=FULL +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=WITHOUT-FULL  ; FULL:      Region: %bb---FunctionExit  ; FULL:      Statements { diff --git a/polly/test/ScopInfo/granularity_same_name.ll b/polly/test/ScopInfo/granularity_same_name.ll index 17f75fb..638b098 100644 --- a/polly/test/ScopInfo/granularity_same_name.ll +++ b/polly/test/ScopInfo/granularity_same_name.ll @@ -1,7 +1,7 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb           -polly-use-llvm-names=0 '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=IDX -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb           -polly-use-llvm-names=1 '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=BB -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-use-llvm-names=0 '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=IDX -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-use-llvm-names=1 '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=BB +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-use-llvm-names=0 '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=IDX +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-use-llvm-names=1 '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=BB +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-use-llvm-names=0 '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=IDX +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-use-llvm-names=1 '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines -check-prefix=BB  ;  ; Check that the statement has the same name, regardless of how the  ; basic block is split into multiple statements. diff --git a/polly/test/ScopInfo/granularity_scalar-indep.ll b/polly/test/ScopInfo/granularity_scalar-indep.ll index 5c4484f..f4d864d 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; Split a block into two independent statements that share no scalar.  ; This case has the instructions of the two statements interleaved, such that diff --git a/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi1.ll b/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi1.ll index 7ae0d96..f2c37f6 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi1.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; Two PHIs, cross-referencing each other. The PHI READs must be carried-out  ; before the PHI WRITEs to ensure that the value when entering the block is diff --git a/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi2.ll b/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi2.ll index 7839e51..f7bd882 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi2.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_cross-referencing-phi2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; Two PHIs, cross-referencing each other. The PHI READs must be carried-out  ; before the PHI WRITEs to ensure that the value when entering the block is diff --git a/polly/test/ScopInfo/granularity_scalar-indep_epilogue.ll b/polly/test/ScopInfo/granularity_scalar-indep_epilogue.ll index 8643e85..80aa9fb 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_epilogue.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_epilogue.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; Split a block into two independent statements that share no scalar.  ; This case has an independent statement just for PHI writes. diff --git a/polly/test/ScopInfo/granularity_scalar-indep_epilogue_last.ll b/polly/test/ScopInfo/granularity_scalar-indep_epilogue_last.ll index bc71cbe4..66ef9fa 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_epilogue_last.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_epilogue_last.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; Check that the PHI Write of value that is defined in the same basic  ; block is in the statement where it is defined. diff --git a/polly/test/ScopInfo/granularity_scalar-indep_noepilogue.ll b/polly/test/ScopInfo/granularity_scalar-indep_noepilogue.ll index f3864ba..3837219 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_noepilogue.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_noepilogue.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; This case has no explicit epilogue for PHI writes because it would  ; have a scalar dependency to the previous statement. diff --git a/polly/test/ScopInfo/granularity_scalar-indep_ordered-2.ll b/polly/test/ScopInfo/granularity_scalar-indep_ordered-2.ll index 43101a8..c43ad76 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_ordered-2.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_ordered-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; This case should be split into two statements because {X[0], Y[0]}  ; and {A[0], B[0]} do not intersect. diff --git a/polly/test/ScopInfo/granularity_scalar-indep_ordered.ll b/polly/test/ScopInfo/granularity_scalar-indep_ordered.ll index 4974f7e..cfa7739 100644 --- a/polly/test/ScopInfo/granularity_scalar-indep_ordered.ll +++ b/polly/test/ScopInfo/granularity_scalar-indep_ordered.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ;  ; This case cannot be split into two statements because the order of  ; loads and store would be violated. diff --git a/polly/test/ScopInfo/i1_params.ll b/polly/test/ScopInfo/i1_params.ll index be3e287..cf5b533 100644 --- a/polly/test/ScopInfo/i1_params.ll +++ b/polly/test/ScopInfo/i1_params.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that both a signed as well as an unsigned extended i1 parameter  ; is represented correctly. diff --git a/polly/test/ScopInfo/infeasible-rtc.ll b/polly/test/ScopInfo/infeasible-rtc.ll index 7a0bfe0..9221ddf 100644 --- a/polly/test/ScopInfo/infeasible-rtc.ll +++ b/polly/test/ScopInfo/infeasible-rtc.ll @@ -1,8 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 \ -; RUN:  | FileCheck %s -check-prefix=DETECT +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DETECT -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  | FileCheck %s -check-prefix=SCOPS +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOPS  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/infeasible_invalid_context.ll b/polly/test/ScopInfo/infeasible_invalid_context.ll index 006901a..7ab6477 100644 --- a/polly/test/ScopInfo/infeasible_invalid_context.ll +++ b/polly/test/ScopInfo/infeasible_invalid_context.ll @@ -1,8 +1,6 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 \ -; RUN:  | FileCheck %s -check-prefix=DETECT +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DETECT -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  | FileCheck %s -check-prefix=SCOPS +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCOPS  ; DETECT: Valid Region for Scop: if.end116 => for.inc216  ; SCOPS-NOT: Statements diff --git a/polly/test/ScopInfo/int2ptr_ptr2int.ll b/polly/test/ScopInfo/int2ptr_ptr2int.ll index 578015a..adefe79 100644 --- a/polly/test/ScopInfo/int2ptr_ptr2int.ll +++ b/polly/test/ScopInfo/int2ptr_ptr2int.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -S -passes=polly-codegen < %s 2>&1 | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' < %s 2>&1 | FileCheck %s --check-prefix=IR  ;  ;    void f(long *A, long *ptr, long val) {  ;      for (long i = 0; i < 100; i++) { diff --git a/polly/test/ScopInfo/int2ptr_ptr2int_2.ll b/polly/test/ScopInfo/int2ptr_ptr2int_2.ll index 627524c..a88fcdc 100644 --- a/polly/test/ScopInfo/int2ptr_ptr2int_2.ll +++ b/polly/test/ScopInfo/int2ptr_ptr2int_2.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -S -passes=polly-codegen \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s --check-prefix=IR  ;  ;    void f(long *A, long *B, long *ptr, long val) {  ;      for (long i = 0; i < 100; i++) { diff --git a/polly/test/ScopInfo/integers.ll b/polly/test/ScopInfo/integers.ll index 4f6d111..5f89243 100644 --- a/polly/test/ScopInfo/integers.ll +++ b/polly/test/ScopInfo/integers.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Check that we correctly convert integers to isl values. diff --git a/polly/test/ScopInfo/inter-error-bb-dependence.ll b/polly/test/ScopInfo/inter-error-bb-dependence.ll index 761fcbb..0829f34 100644 --- a/polly/test/ScopInfo/inter-error-bb-dependence.ll +++ b/polly/test/ScopInfo/inter-error-bb-dependence.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 > /dev/null | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 > /dev/null | FileCheck %s  ;  ; Error statements (%bb33) do not require their uses to be verified.  ; In this case it uses %tmp32 from %bb31 which is not available because diff --git a/polly/test/ScopInfo/inter_bb_scalar_dep.ll b/polly/test/ScopInfo/inter_bb_scalar_dep.ll index 7313618..f640664 100644 --- a/polly/test/ScopInfo/inter_bb_scalar_dep.ll +++ b/polly/test/ScopInfo/inter_bb_scalar_dep.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], int N, int *init_ptr) {  ;   long i, j; diff --git a/polly/test/ScopInfo/intra-non-affine-stmt-phi-node.ll b/polly/test/ScopInfo/intra-non-affine-stmt-phi-node.ll index d2ed3c1..3150204 100644 --- a/polly/test/ScopInfo/intra-non-affine-stmt-phi-node.ll +++ b/polly/test/ScopInfo/intra-non-affine-stmt-phi-node.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN:     < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK:      Statements {  ; CHECK-NEXT:     Stmt_loop__TO__backedge diff --git a/polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll b/polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll index b3286cd..b0b6365 100644 --- a/polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll +++ b/polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ; void f(long A[], int N, int *init_ptr) {  ;   long i, j; diff --git a/polly/test/ScopInfo/intra_bb_scalar_dep.ll b/polly/test/ScopInfo/intra_bb_scalar_dep.ll index 86855e7..0ef6b2d 100644 --- a/polly/test/ScopInfo/intra_bb_scalar_dep.ll +++ b/polly/test/ScopInfo/intra_bb_scalar_dep.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ; void f(long A[], int N, int *init_ptr) {  ;   long i, j; diff --git a/polly/test/ScopInfo/intrinsics.ll b/polly/test/ScopInfo/intrinsics.ll index e6d9e73..e17d06f 100644 --- a/polly/test/ScopInfo/intrinsics.ll +++ b/polly/test/ScopInfo/intrinsics.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-print-instructions -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-print-instructions -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we remove the ignored intrinsics from the instruction list.  ; diff --git a/polly/test/ScopInfo/invalid_add_rec_after_invariant_load_remapping.ll b/polly/test/ScopInfo/invalid_add_rec_after_invariant_load_remapping.ll index 7239426..d3439d8 100644 --- a/polly/test/ScopInfo/invalid_add_rec_after_invariant_load_remapping.ll +++ b/polly/test/ScopInfo/invalid_add_rec_after_invariant_load_remapping.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; This crashed at some point as we place %1 and %4 in the same equivalence class  ; for invariant loads and when we remap SCEVs to use %4 instead of %1 AddRec SCEVs diff --git a/polly/test/ScopInfo/invalidate_iterator_during_MA_removal.ll b/polly/test/ScopInfo/invalidate_iterator_during_MA_removal.ll index c493c22..ff5b0f6 100644 --- a/polly/test/ScopInfo/invalidate_iterator_during_MA_removal.ll +++ b/polly/test/ScopInfo/invalidate_iterator_during_MA_removal.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; Check that no invalidated iterator is accessed while elements from  ; the list of MemoryAccesses are removed. diff --git a/polly/test/ScopInfo/invariant-load-instlist.ll b/polly/test/ScopInfo/invariant-load-instlist.ll index ecb80e4..1ec36e6 100644 --- a/polly/test/ScopInfo/invariant-load-instlist.ll +++ b/polly/test/ScopInfo/invariant-load-instlist.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ; The load is a required invariant load and at the same time used in a store.  ; Polly used to add two MemoryAccesses for it which caused an assertion to fail. diff --git a/polly/test/ScopInfo/invariant-loads-leave-read-only-statements.ll b/polly/test/ScopInfo/invariant-loads-leave-read-only-statements.ll index 89eac6c..2d14287 100644 --- a/polly/test/ScopInfo/invariant-loads-leave-read-only-statements.ll +++ b/polly/test/ScopInfo/invariant-loads-leave-read-only-statements.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -disable-output < %s  ; CHECK:      Statements {  ; CHECK-NEXT: 	Stmt_L_4 diff --git a/polly/test/ScopInfo/invariant_load.ll b/polly/test/ScopInfo/invariant_load.ll index 9dc0642..8974b7f 100644 --- a/polly/test/ScopInfo/invariant_load.ll +++ b/polly/test/ScopInfo/invariant_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type.ll b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type.ll index 40aa309..7b5a759 100644 --- a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type.ll +++ b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ;    struct {  ;      int a; diff --git a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll index 2876760..0c2f57d 100644 --- a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll +++ b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_escaping.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ;    struct {  ;      int a; diff --git a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer.ll b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer.ll index cb745b4..865bd78 100644 --- a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer.ll +++ b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ;    int U;  ;    void f(int *A) { diff --git a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll index fa5429d..f63fe9cc 100644 --- a/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll +++ b/polly/test/ScopInfo/invariant_load_access_classes_different_base_type_same_pointer_escaping.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ;    int U;  ;    int f(int *A) { diff --git a/polly/test/ScopInfo/invariant_load_addrec_sum.ll b/polly/test/ScopInfo/invariant_load_addrec_sum.ll index 2e639f7..e70aa80 100644 --- a/polly/test/ScopInfo/invariant_load_addrec_sum.ll +++ b/polly/test/ScopInfo/invariant_load_addrec_sum.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Region: %entry.split---%if.end  ; CHECK:     Invariant Accesses: { diff --git a/polly/test/ScopInfo/invariant_load_base_pointer.ll b/polly/test/ScopInfo/invariant_load_base_pointer.ll index f2539af9..1176d1c 100644 --- a/polly/test/ScopInfo/invariant_load_base_pointer.ll +++ b/polly/test/ScopInfo/invariant_load_base_pointer.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_base_pointer_conditional.ll b/polly/test/ScopInfo/invariant_load_base_pointer_conditional.ll index f854b1f..81fd3b9 100644 --- a/polly/test/ScopInfo/invariant_load_base_pointer_conditional.ll +++ b/polly/test/ScopInfo/invariant_load_base_pointer_conditional.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-ignore-aliasing -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_base_pointer_in_conditional.ll b/polly/test/ScopInfo/invariant_load_base_pointer_in_conditional.ll index 5a9c5c6..7313176 100644 --- a/polly/test/ScopInfo/invariant_load_base_pointer_in_conditional.ll +++ b/polly/test/ScopInfo/invariant_load_base_pointer_in_conditional.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_branch_condition.ll b/polly/test/ScopInfo/invariant_load_branch_condition.ll index d12750c..f6cadff 100644 --- a/polly/test/ScopInfo/invariant_load_branch_condition.ll +++ b/polly/test/ScopInfo/invariant_load_branch_condition.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN:     -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; CHECK:      Invariant Accesses: {  ; CHECK-NEXT:         ReadAccess :=	[Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs.ll index 34d50a1..76cc557 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; CHECK:      Stmt_body1  ; CHECK-NEXT:       Domain := diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_2.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_2.ll index 51f3cf6..9cc9391 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_2.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_2.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; Make sure we choose a canonical element that is not the first invariant load,  ; but the first that is an array base pointer. diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_3.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_3.ll index 3a742bb..7f609f9 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_3.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_3.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; Verify that we canonicalize accesses even tough one of the accesses (even  ; the canonical base) has a partial execution context. This is correct as diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4.ll index 6bd8b31..216e076 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; Verify that a delinearized and a not delinearized access are not  ; canonicalized. diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4b.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4b.ll index cb7e564..5da3d0c 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4b.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4b.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; Verify that two arrays delinearized with different sizes are not coalesced. diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4c.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4c.ll index 6f7fbacc..b71a092 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4c.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_4c.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; Verify that arrays with different element types are not coalesced. diff --git a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_5.ll b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_5.ll index 4458328..2c4683e 100644 --- a/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_5.ll +++ b/polly/test/ScopInfo/invariant_load_canonicalize_array_baseptrs_5.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 \ -; RUN:  -polly-invariant-load-hoisting \ -; RUN:  | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting < %s 2>&1 | FileCheck %s  ; Verify that nested arrays with invariant base pointers are handled correctly.  ; Specifically, we currently do not canonicalize arrays where some accesses are diff --git a/polly/test/ScopInfo/invariant_load_complex_condition.ll b/polly/test/ScopInfo/invariant_load_complex_condition.ll index 11e7088..e6ea03200 100644 --- a/polly/test/ScopInfo/invariant_load_complex_condition.ll +++ b/polly/test/ScopInfo/invariant_load_complex_condition.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -S '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -S '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/invariant_load_condition.ll b/polly/test/ScopInfo/invariant_load_condition.ll index c7d7b3c..8b1dc8b 100644 --- a/polly/test/ScopInfo/invariant_load_condition.ll +++ b/polly/test/ScopInfo/invariant_load_condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_dereferenceable.ll b/polly/test/ScopInfo/invariant_load_dereferenceable.ll index 526bdc6..fc5527c 100644 --- a/polly/test/ScopInfo/invariant_load_dereferenceable.ll +++ b/polly/test/ScopInfo/invariant_load_dereferenceable.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true \ -; RUN: -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect;scops>' -polly-print-detect -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-NOT: Function: foo_undereferanceable diff --git a/polly/test/ScopInfo/invariant_load_distinct_parameter_valuations.ll b/polly/test/ScopInfo/invariant_load_distinct_parameter_valuations.ll index eb14806..b5525a8 100644 --- a/polly/test/ScopInfo/invariant_load_distinct_parameter_valuations.ll +++ b/polly/test/ScopInfo/invariant_load_distinct_parameter_valuations.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do not consolidate the invariant loads to smp[order - 1] and  ; smp[order - 2] in the blocks %0 and %16. While they have the same pointer diff --git a/polly/test/ScopInfo/invariant_load_in_non_affine.ll b/polly/test/ScopInfo/invariant_load_in_non_affine.ll index 5261113..69a7932 100644 --- a/polly/test/ScopInfo/invariant_load_in_non_affine.ll +++ b/polly/test/ScopInfo/invariant_load_in_non_affine.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output \ -; RUN:   -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ;  ; CHECK-NOT: Valid Region for Scop  ; diff --git a/polly/test/ScopInfo/invariant_load_loop_ub.ll b/polly/test/ScopInfo/invariant_load_loop_ub.ll index ee889e6..9258d75 100644 --- a/polly/test/ScopInfo/invariant_load_loop_ub.ll +++ b/polly/test/ScopInfo/invariant_load_loop_ub.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-process-unprofitable -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_ptr_ptr_noalias.ll b/polly/test/ScopInfo/invariant_load_ptr_ptr_noalias.ll index 6af7cae..50b0103 100644 --- a/polly/test/ScopInfo/invariant_load_ptr_ptr_noalias.ll +++ b/polly/test/ScopInfo/invariant_load_ptr_ptr_noalias.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=tbaa '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -polly-ignore-aliasing \ -; RUN:                -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=tbaa '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s  ;  ; Note: The order of the invariant accesses is important because A is the  ;       base pointer of tmp3 and we will generate code in the same order as diff --git a/polly/test/ScopInfo/invariant_load_scalar_dep.ll b/polly/test/ScopInfo/invariant_load_scalar_dep.ll index 319f24b..ae1423e 100644 --- a/polly/test/ScopInfo/invariant_load_scalar_dep.ll +++ b/polly/test/ScopInfo/invariant_load_scalar_dep.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Invariant Accesses:  ; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_load_stmt_domain.ll b/polly/test/ScopInfo/invariant_load_stmt_domain.ll index 7159480..8062d87 100644 --- a/polly/test/ScopInfo/invariant_load_stmt_domain.ll +++ b/polly/test/ScopInfo/invariant_load_stmt_domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ; This test case verifies that the statement domain of the invariant access  ; is the universe. In earlier versions of Polly, we accidentally computed an diff --git a/polly/test/ScopInfo/invariant_load_zext_parameter-2.ll b/polly/test/ScopInfo/invariant_load_zext_parameter-2.ll index a610832..9ee4a54 100644 --- a/polly/test/ScopInfo/invariant_load_zext_parameter-2.ll +++ b/polly/test/ScopInfo/invariant_load_zext_parameter-2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -scalar-evolution-max-value-compare-depth=3 '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -scalar-evolution-max-value-compare-depth=3 -passes=polly-codegen -polly-invariant-load-hoisting=true -disable-output < %s +; RUN: opt %loadNPMPolly -scalar-evolution-max-value-compare-depth=3 '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -scalar-evolution-max-value-compare-depth=3 '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -disable-output < %s  ;  ; Stress test for the code generation of invariant accesses.  ; diff --git a/polly/test/ScopInfo/invariant_load_zext_parameter.ll b/polly/test/ScopInfo/invariant_load_zext_parameter.ll index e3c183a..5bd2c51 100644 --- a/polly/test/ScopInfo/invariant_load_zext_parameter.ll +++ b/polly/test/ScopInfo/invariant_load_zext_parameter.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=CODEGEN  ;  ;    void f(int *I0, int *I1, int *V) {  ;      for (int i = 0; i < 1000; i++) { diff --git a/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll b/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll index b5168e9..426c14c 100644 --- a/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll +++ b/polly/test/ScopInfo/invariant_load_zextended_in_own_execution_context.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -disable-output < %s  ;  ; CHECK: Execution Context: [p_0_loaded_from_currpc] -> {  :  }  ; diff --git a/polly/test/ScopInfo/invariant_loads_complicated_dependences.ll b/polly/test/ScopInfo/invariant_loads_complicated_dependences.ll index 8536082..77f74df 100644 --- a/polly/test/ScopInfo/invariant_loads_complicated_dependences.ll +++ b/polly/test/ScopInfo/invariant_loads_complicated_dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Invariant Accesses: {  ; CHECK-NEXT:         ReadAccess :=    [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_loads_cyclic_dependences.ll b/polly/test/ScopInfo/invariant_loads_cyclic_dependences.ll index 134eac2..f18534d 100644 --- a/polly/test/ScopInfo/invariant_loads_cyclic_dependences.ll +++ b/polly/test/ScopInfo/invariant_loads_cyclic_dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Negative test. If we assume UB[*V] to be invariant we get a cyclic  ; dependence in the invariant loads that needs to be resolved by diff --git a/polly/test/ScopInfo/invariant_loop_bounds.ll b/polly/test/ScopInfo/invariant_loop_bounds.ll index f22199c..dcf7f50 100644 --- a/polly/test/ScopInfo/invariant_loop_bounds.ll +++ b/polly/test/ScopInfo/invariant_loop_bounds.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Invariant Accesses: {  ; CHECK-NEXT:         ReadAccess :=    [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-1.ll b/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-1.ll index e3292b4..df57986 100644 --- a/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-1.ll +++ b/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we only have one parameter and one invariant load for all  ; three loads that occur in the region but actually access the same diff --git a/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-2.ll b/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-2.ll index d69438d..3d8c232 100644 --- a/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-2.ll +++ b/polly/test/ScopInfo/invariant_same_loop_bound_multiple_times-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we only have one parameter and one invariant load for all  ; three loads that occur in the region but actually access the same diff --git a/polly/test/ScopInfo/isl_aff_out_of_bounds.ll b/polly/test/ScopInfo/isl_aff_out_of_bounds.ll index 2df96fa..965531f 100644 --- a/polly/test/ScopInfo/isl_aff_out_of_bounds.ll +++ b/polly/test/ScopInfo/isl_aff_out_of_bounds.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' < %s 2>&1 +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect < %s 2>&1  ; Used to fail with:  ; ../../isl/isl_aff.c:591: position out of bounds diff --git a/polly/test/ScopInfo/isl_trip_count_01.ll b/polly/test/ScopInfo/isl_trip_count_01.ll index 480b6e9..79621ce 100644 --- a/polly/test/ScopInfo/isl_trip_count_01.ll +++ b/polly/test/ScopInfo/isl_trip_count_01.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: [M, N] -> { Stmt_while_body[i0] : i0 > 0 and 4i0 <= -M + N; Stmt_while_body[0] };  ; diff --git a/polly/test/ScopInfo/isl_trip_count_02.ll b/polly/test/ScopInfo/isl_trip_count_02.ll index b78fb83..3052299 100644 --- a/polly/test/ScopInfo/isl_trip_count_02.ll +++ b/polly/test/ScopInfo/isl_trip_count_02.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; TODO: We do not allow unbounded loops at the moment.  ; diff --git a/polly/test/ScopInfo/isl_trip_count_03.ll b/polly/test/ScopInfo/isl_trip_count_03.ll index 96df05f..52fde26 100644 --- a/polly/test/ScopInfo/isl_trip_count_03.ll +++ b/polly/test/ScopInfo/isl_trip_count_03.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Test comes from a bug (15771) or better a feature request. It was not allowed  ; in Polly in the old domain generation as ScalarEvolution cannot figure out the diff --git a/polly/test/ScopInfo/isl_trip_count_multiple_exiting_blocks.ll b/polly/test/ScopInfo/isl_trip_count_multiple_exiting_blocks.ll index fd310ec..657b8f6 100644 --- a/polly/test/ScopInfo/isl_trip_count_multiple_exiting_blocks.ll +++ b/polly/test/ScopInfo/isl_trip_count_multiple_exiting_blocks.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/licm_load.ll b/polly/test/ScopInfo/licm_load.ll index ade6409..8f1cf4f 100644 --- a/polly/test/ScopInfo/licm_load.ll +++ b/polly/test/ScopInfo/licm_load.ll @@ -1,7 +1,4 @@ -; RUN: opt %loadNPMPolly -passes='loop(loop-rotate,indvars),polly-prepare,print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s -; RUN: opt %loadNPMPolly -passes='loop-mssa(loop-rotate,indvars,licm),polly-prepare,print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<prepare;scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(int n, float A[static const restrict n],  ;             float B[static const restrict n], int j) { @@ -14,26 +11,30 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  define void @foo(i32 %n, ptr noalias nonnull %A, ptr noalias nonnull %B, i32 %j) {  entry:    %tmp = sext i32 %n to i64 -  br label %for.cond +  %cmp1 = icmp slt i64 0, %tmp +  br i1 %cmp1, label %for.body.lr.ph, label %for.end -for.cond:                                         ; preds = %for.inc, %entry -  %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] -  %cmp = icmp slt i64 %indvars.iv, %tmp -  br i1 %cmp, label %for.body, label %for.end - -for.body:                                         ; preds = %for.cond +for.body.lr.ph:                                   ; preds = %entry    %idxprom = sext i32 %j to i64    %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom    %tmp2 = load i32, ptr %arrayidx, align 4 -  %arrayidx2 = getelementptr inbounds float, ptr %A, i64 %indvars.iv +  br label %for.body + +for.body:                                         ; preds = %for.body.lr.ph, %for.inc +  %indvars.iv2 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %for.inc ] +  %arrayidx2 = getelementptr inbounds float, ptr %A, i64 %indvars.iv2    store i32 %tmp2, ptr %arrayidx2, align 4    br label %for.inc  for.inc:                                          ; preds = %for.body -  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 -  br label %for.cond +  %indvars.iv.next = add nuw nsw i64 %indvars.iv2, 1 +  %exitcond = icmp ne i64 %indvars.iv.next, %tmp +  br i1 %exitcond, label %for.body, label %for.cond.for.end_crit_edge + +for.cond.for.end_crit_edge:                       ; preds = %for.inc +  br label %for.end -for.end:                                          ; preds = %for.cond +for.end:                                          ; preds = %for.cond.for.end_crit_edge, %entry    ret void  } diff --git a/polly/test/ScopInfo/licm_potential_store.ll b/polly/test/ScopInfo/licm_potential_store.ll index 8a36ee8..cbd8e41 100644 --- a/polly/test/ScopInfo/licm_potential_store.ll +++ b/polly/test/ScopInfo/licm_potential_store.ll @@ -1,10 +1,4 @@ -; RUN: opt %loadNPMPolly -passes='sroa,instcombine,simplifycfg,reassociate,loop(loop-rotate),instcombine,indvars,polly-prepare,print<polly-function-scops>' \ -; RUN:    -tailcallopt -disable-output < %s 2>&1 \ -; RUN:     | FileCheck %s --check-prefix=NOLICM - -; RUN: opt %loadNPMPolly -passes='sroa,instcombine,simplifycfg,reassociate,loop(loop-rotate),instcombine,indvars,loop-mssa(licm),polly-prepare,print<polly-function-scops>' \ -; RUN:    -tailcallopt -disable-output < %s 2>&1 \ -; RUN:     | FileCheck %s --check-prefix=LICM +; RUN: opt %loadNPMPolly '-passes=polly-custom<prepare;scops>' -polly-print-scops -tailcallopt -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NOLICM  ;    void foo(int n, float A[static const restrict n], float x) {  ;      //      (0) @@ -17,67 +11,40 @@  ;      // (4)  ;    } -; LICM:   Statements  ; NOLICM: Statements  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  define void @foo(i32 %n, ptr noalias nonnull %A, float %x) {  entry: -  %n.addr = alloca i32, align 4 -  %A.addr = alloca ptr, align 8 -  %x.addr = alloca float, align 4 -  %i = alloca i32, align 4 -  %j = alloca i32, align 4 -  store i32 %n, ptr %n.addr, align 4 -  store ptr %A, ptr %A.addr, align 8 -  store float %x, ptr %x.addr, align 4 -  %tmp = load i32, ptr %n.addr, align 4 -  %tmp1 = zext i32 %tmp to i64 -  store i32 0, ptr %i, align 4 -  br label %for.cond - -for.cond:                                         ; preds = %for.inc.4, %entry -  %tmp2 = load i32, ptr %i, align 4 -  %cmp = icmp slt i32 %tmp2, 5 -  br i1 %cmp, label %for.body, label %for.end.6 +  %smax = call i32 @llvm.smax.i32(i32 %n, i32 0) +  %0 = add nuw i32 %smax, 1 +  br label %for.cond.1.preheader -for.body:                                         ; preds = %for.cond -  store i32 0, ptr %j, align 4 +for.cond.1.preheader:                             ; preds = %entry, %for.end +  %i.05 = phi i32 [ 0, %entry ], [ %add5, %for.end ] +  %x.addr.04 = phi float [ %x, %entry ], [ %x.addr.1.lcssa, %for.end ]    br label %for.cond.1 -for.cond.1:                                       ; preds = %for.inc, %for.body -  %tmp3 = load i32, ptr %j, align 4 -  %tmp4 = load i32, ptr %n.addr, align 4 -  %cmp2 = icmp slt i32 %tmp3, %tmp4 -  br i1 %cmp2, label %for.body.3, label %for.end - -for.body.3:                                       ; preds = %for.cond.1 -  store float 7.000000e+00, ptr %x.addr, align 4 -  br label %for.inc - -for.inc:                                          ; preds = %for.body.3 -  %tmp5 = load i32, ptr %j, align 4 -  %add = add nsw i32 %tmp5, 1 -  store i32 %add, ptr %j, align 4 -  br label %for.cond.1 +for.cond.1:                                       ; preds = %for.cond.1, %for.cond.1.preheader +  %x.addr.1 = phi float [ 7.000000e+00, %for.cond.1 ], [ %x.addr.04, %for.cond.1.preheader ] +  %j.0 = phi i32 [ %add, %for.cond.1 ], [ 0, %for.cond.1.preheader ] +  %add = add nuw i32 %j.0, 1 +  %exitcond = icmp ne i32 %add, %0 +  br i1 %exitcond, label %for.cond.1, label %for.end  for.end:                                          ; preds = %for.cond.1 -  %tmp6 = load float, ptr %x.addr, align 4 -  %tmp7 = load ptr, ptr %A.addr, align 8 -  store float %tmp6, ptr %tmp7, align 4 -  br label %for.inc.4 - -for.inc.4:                                        ; preds = %for.end -  %tmp8 = load i32, ptr %i, align 4 -  %add5 = add nsw i32 %tmp8, 1 -  store i32 %add5, ptr %i, align 4 -  br label %for.cond +  %x.addr.1.lcssa = phi float [ %x.addr.1, %for.cond.1 ] +  store float %x.addr.1.lcssa, ptr %A, align 4 +  %add5 = add nuw nsw i32 %i.05, 1 +  %exitcond6 = icmp ne i32 %add5, 5 +  br i1 %exitcond6, label %for.cond.1.preheader, label %for.end.6 -for.end.6:                                        ; preds = %for.cond +for.end.6:                                        ; preds = %for.end    ret void  } -; CHECK: Statements { -; CHECK:     Stmt_for_end -; CHECK: } +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) +declare i32 @llvm.smax.i32(i32, i32) #0 + +attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }     diff --git a/polly/test/ScopInfo/licm_potential_store_mssa.ll b/polly/test/ScopInfo/licm_potential_store_mssa.ll new file mode 100644 index 0000000..ce785d6 --- /dev/null +++ b/polly/test/ScopInfo/licm_potential_store_mssa.ll @@ -0,0 +1,50 @@ +; RUN: opt %loadNPMPolly '-passes=polly-custom<prepare;scops>' -polly-print-scops -tailcallopt -disable-output < %s 2>&1 | FileCheck %s --check-prefix=LICM + +;    void foo(int n, float A[static const restrict n], float x) { +;      //      (0) +;      for (int i = 0; i < 5; i += 1) { +;        for (int j = 0; j < n; j += 1) { +;          x = 7; // (1) +;        } +;        A[0] = x; // (3) +;      } +;      // (4) +;    } + +; LICM:   Statements + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @foo(i32 %n, ptr noalias nonnull %A, float %x) { +entry: +  %smax = call i32 @llvm.smax.i32(i32 %n, i32 0) +  br label %for.cond.1.preheader + +for.cond.1.preheader:                             ; preds = %for.end, %entry +  %i.05 = phi i32 [ 0, %entry ], [ %add5, %for.end ] +  %x.addr.04 = phi float [ %x, %entry ], [ %x.addr.1.lcssa, %for.end ] +  br label %for.cond.1 + +for.cond.1:                                       ; preds = %for.cond.1, %for.cond.1.preheader +  %x.addr.1 = phi float [ 7.000000e+00, %for.cond.1 ], [ %x.addr.04, %for.cond.1.preheader ] +  %j.0 = phi i32 [ %add, %for.cond.1 ], [ 0, %for.cond.1.preheader ] +  %add = add nuw i32 %j.0, 1 +  %exitcond.not = icmp eq i32 %j.0, %smax +  br i1 %exitcond.not, label %for.end, label %for.cond.1 + +for.end:                                          ; preds = %for.cond.1 +  %x.addr.1.lcssa = phi float [ %x.addr.1, %for.cond.1 ] +  %add5 = add nuw nsw i32 %i.05, 1 +  %exitcond6.not = icmp eq i32 %add5, 5 +  br i1 %exitcond6.not, label %for.end.6, label %for.cond.1.preheader + +for.end.6:                                        ; preds = %for.end +  %x.addr.1.lcssa.lcssa = phi float [ %x.addr.1.lcssa, %for.end ] +  store float %x.addr.1.lcssa.lcssa, ptr %A, align 4 +  ret void +} + +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) +declare i32 @llvm.smax.i32(i32, i32) #0 + +attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }    diff --git a/polly/test/ScopInfo/licm_reduction_nested.ll b/polly/test/ScopInfo/licm_reduction_nested.ll index c167603..50625b2 100644 --- a/polly/test/ScopInfo/licm_reduction_nested.ll +++ b/polly/test/ScopInfo/licm_reduction_nested.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -loop-rotate -indvars       -passes=polly-prepare '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -loop-rotate -indvars -licm -passes=polly-prepare '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -loop-rotate -indvars       '-passes=polly-custom<prepare;scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -loop-rotate -indvars -licm '-passes=polly-custom<prepare;scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; XFAIL: *  ; diff --git a/polly/test/ScopInfo/long-compile-time-alias-analysis.ll b/polly/test/ScopInfo/long-compile-time-alias-analysis.ll index f102518..8225bd0 100644 --- a/polly/test/ScopInfo/long-compile-time-alias-analysis.ll +++ b/polly/test/ScopInfo/long-compile-time-alias-analysis.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ; Verify that the compilation of this test case does not take infinite time.  ; At some point Polly tried to model this test case and got stuck in diff --git a/polly/test/ScopInfo/long-sequence-of-error-blocks-2.ll b/polly/test/ScopInfo/long-sequence-of-error-blocks-2.ll index e32748a..064a0d3 100644 --- a/polly/test/ScopInfo/long-sequence-of-error-blocks-2.ll +++ b/polly/test/ScopInfo/long-sequence-of-error-blocks-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/ScopInfo/long-sequence-of-error-blocks.ll b/polly/test/ScopInfo/long-sequence-of-error-blocks.ll index b32b87b..edaadd6 100644 --- a/polly/test/ScopInfo/long-sequence-of-error-blocks.ll +++ b/polly/test/ScopInfo/long-sequence-of-error-blocks.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  target triple = "x86_64-unknown-linux-gnu" diff --git a/polly/test/ScopInfo/loop-multiexit-succ-cond.ll b/polly/test/ScopInfo/loop-multiexit-succ-cond.ll index 431c907..391f0ec 100644 --- a/polly/test/ScopInfo/loop-multiexit-succ-cond.ll +++ b/polly/test/ScopInfo/loop-multiexit-succ-cond.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s 2>&1 | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s 2>&1 | FileCheck %s --check-prefix=IR  ;  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/loop_affine_bound_0.ll b/polly/test/ScopInfo/loop_affine_bound_0.ll index 918d409..fcd5661 100644 --- a/polly/test/ScopInfo/loop_affine_bound_0.ll +++ b/polly/test/ScopInfo/loop_affine_bound_0.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(long a[][128], long N, long M) {  ;   long i, j; diff --git a/polly/test/ScopInfo/loop_affine_bound_1.ll b/polly/test/ScopInfo/loop_affine_bound_1.ll index 8f7a87f..3925098 100644 --- a/polly/test/ScopInfo/loop_affine_bound_1.ll +++ b/polly/test/ScopInfo/loop_affine_bound_1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output< %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;void f(long a[][128], long N, long M) {  ;  long i, j; diff --git a/polly/test/ScopInfo/loop_affine_bound_2.ll b/polly/test/ScopInfo/loop_affine_bound_2.ll index 2d9f997..665dc1a 100644 --- a/polly/test/ScopInfo/loop_affine_bound_2.ll +++ b/polly/test/ScopInfo/loop_affine_bound_2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(long a[][128], long N, long M) {  ;   long i, j; diff --git a/polly/test/ScopInfo/loop_carry.ll b/polly/test/ScopInfo/loop_carry.ll index 20ebbfb..579f43d 100644 --- a/polly/test/ScopInfo/loop_carry.ll +++ b/polly/test/ScopInfo/loop_carry.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/many-scalar-dependences.ll b/polly/test/ScopInfo/many-scalar-dependences.ll index 5b00332..ddad360 100644 --- a/polly/test/ScopInfo/many-scalar-dependences.ll +++ b/polly/test/ScopInfo/many-scalar-dependences.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(float a[100][100]) {  ;      float x; diff --git a/polly/test/ScopInfo/max-loop-depth.ll b/polly/test/ScopInfo/max-loop-depth.ll index 71e9c02..f339332 100644 --- a/polly/test/ScopInfo/max-loop-depth.ll +++ b/polly/test/ScopInfo/max-loop-depth.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void bar();  ;    void foo(int *A, int *B, long int N, long int M) { diff --git a/polly/test/ScopInfo/memcpy-raw-source.ll b/polly/test/ScopInfo/memcpy-raw-source.ll index 6c45b0d..149a2fc 100644 --- a/polly/test/ScopInfo/memcpy-raw-source.ll +++ b/polly/test/ScopInfo/memcpy-raw-source.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa,scoped-noalias-aa,tbaa '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa,scoped-noalias-aa,tbaa '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; Ensure that ScopInfo's alias analysis llvm.memcpy for,  ; like the AliasSetTracker, preserves bitcasts. diff --git a/polly/test/ScopInfo/memcpy.ll b/polly/test/ScopInfo/memcpy.ll index 95c455f..6b7a9e2 100644 --- a/polly/test/ScopInfo/memcpy.ll +++ b/polly/test/ScopInfo/memcpy.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-differing-element-types '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -S -aa-pipeline=basic-aa -polly-allow-differing-element-types -passes=polly-codegen < %s 2>&1 | FileCheck --check-prefix=IR %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-differing-element-types '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S -aa-pipeline=basic-aa -polly-allow-differing-element-types '-passes=polly<no-default-opts>' < %s 2>&1 | FileCheck --check-prefix=IR %s  ;  ; CHECK:         Arrays {  ; CHECK-NEXT:        i8 MemRef_A[*]; // Element size 1 diff --git a/polly/test/ScopInfo/memmove.ll b/polly/test/ScopInfo/memmove.ll index 8ff471a..aba886b 100644 --- a/polly/test/ScopInfo/memmove.ll +++ b/polly/test/ScopInfo/memmove.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-differing-element-types '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -S -aa-pipeline=basic-aa -polly-allow-differing-element-types -passes=polly-codegen < %s 2>&1 | FileCheck --check-prefix=IR %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-differing-element-types '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S -aa-pipeline=basic-aa -polly-allow-differing-element-types '-passes=polly<no-default-opts>' < %s 2>&1 | FileCheck --check-prefix=IR %s  ;  ; CHECK:         Arrays {  ; CHECK-NEXT:        i8 MemRef_A[*]; // Element size 1 diff --git a/polly/test/ScopInfo/memset.ll b/polly/test/ScopInfo/memset.ll index 89b0487..7eaec7b 100644 --- a/polly/test/ScopInfo/memset.ll +++ b/polly/test/ScopInfo/memset.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-differing-element-types '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -S -polly-allow-differing-element-types -passes=polly-codegen < %s 2>&1 | FileCheck --check-prefix=IR %s +; RUN: opt %loadNPMPolly -polly-allow-differing-element-types '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -S -polly-allow-differing-element-types '-passes=polly<no-default-opts>' < %s 2>&1 | FileCheck --check-prefix=IR %s  ;  ; CHECK:         Arrays {  ; CHECK-NEXT:        i8 MemRef_A[*]; // Element size 1 diff --git a/polly/test/ScopInfo/memset_null.ll b/polly/test/ScopInfo/memset_null.ll index 9755cf1..7bd3e90 100644 --- a/polly/test/ScopInfo/memset_null.ll +++ b/polly/test/ScopInfo/memset_null.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-modref-calls '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-modref-calls -S -passes=polly-codegen < %s +; RUN: opt %loadNPMPolly -polly-allow-modref-calls '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-modref-calls -S '-passes=polly<no-default-opts>' < %s  ;  ; Verify we can handle a memset to "null" and that we do not model it.  ; TODO: FIXME: We could use the undefined memset to optimize the code further, diff --git a/polly/test/ScopInfo/mismatching-array-dimensions.ll b/polly/test/ScopInfo/mismatching-array-dimensions.ll index f825cbf..cd12421 100644 --- a/polly/test/ScopInfo/mismatching-array-dimensions.ll +++ b/polly/test/ScopInfo/mismatching-array-dimensions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK-NOT: AssumedContext diff --git a/polly/test/ScopInfo/mod_ref_access_pointee_arguments.ll b/polly/test/ScopInfo/mod_ref_access_pointee_arguments.ll index 6bc5f8d..1e289425 100644 --- a/polly/test/ScopInfo/mod_ref_access_pointee_arguments.ll +++ b/polly/test/ScopInfo/mod_ref_access_pointee_arguments.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb -passes=polly-codegen -polly-allow-modref-calls \ -; RUN:     -disable-output < %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly<no-default-opts>' -polly-allow-modref-calls -disable-output < %s  ;  ; Verify that we model the may-write access of the prefetch intrinsic  ; correctly, thus that A is accessed by it but B is not. diff --git a/polly/test/ScopInfo/mod_ref_read_pointee_arguments.ll b/polly/test/ScopInfo/mod_ref_read_pointee_arguments.ll index 21322bc..0b6e64d 100644 --- a/polly/test/ScopInfo/mod_ref_read_pointee_arguments.ll +++ b/polly/test/ScopInfo/mod_ref_read_pointee_arguments.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen -disable-output \ -; RUN:     -polly-allow-modref-calls < %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' -disable-output -polly-allow-modref-calls < %s  ;  ; Verify that we model the read access of the gcread intrinsic  ; correctly, thus that A is read by it but B is not. diff --git a/polly/test/ScopInfo/mod_ref_read_pointer.ll b/polly/test/ScopInfo/mod_ref_read_pointer.ll index 25e56a0..25d59d9 100644 --- a/polly/test/ScopInfo/mod_ref_read_pointer.ll +++ b/polly/test/ScopInfo/mod_ref_read_pointer.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-modref-calls '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-modref-calls -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-modref-calls '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-allow-modref-calls '-passes=polly<no-default-opts>' -disable-output < %s  ;  ; Check that we assume the call to func has a read on the whole A array.  ; diff --git a/polly/test/ScopInfo/mod_ref_read_pointers.ll b/polly/test/ScopInfo/mod_ref_read_pointers.ll index 5cc96cf..f8cbb08 100644 --- a/polly/test/ScopInfo/mod_ref_read_pointers.ll +++ b/polly/test/ScopInfo/mod_ref_read_pointers.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -passes=polly-codegen -disable-output \ -; RUN:     -polly-allow-modref-calls < %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly<no-default-opts>' -disable-output -polly-allow-modref-calls < %s  ;  ; Check that the call to func will "read" not only the A array but also the  ; B array. The reason is the readonly annotation of func. diff --git a/polly/test/ScopInfo/modulo_zext_1.ll b/polly/test/ScopInfo/modulo_zext_1.ll index 0a8957d..a9b53d5 100644 --- a/polly/test/ScopInfo/modulo_zext_1.ll +++ b/polly/test/ScopInfo/modulo_zext_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:         Assumed Context:  ; CHECK-NEXT:    [N] -> {  :  } diff --git a/polly/test/ScopInfo/modulo_zext_2.ll b/polly/test/ScopInfo/modulo_zext_2.ll index 7af2411..f86ddce 100644 --- a/polly/test/ScopInfo/modulo_zext_2.ll +++ b/polly/test/ScopInfo/modulo_zext_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:         Assumed Context:  ; CHECK-NEXT:    [N] -> {  :  } diff --git a/polly/test/ScopInfo/modulo_zext_3.ll b/polly/test/ScopInfo/modulo_zext_3.ll index 1dac723..21596d1 100644 --- a/polly/test/ScopInfo/modulo_zext_3.ll +++ b/polly/test/ScopInfo/modulo_zext_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:         Assumed Context:  ; CHECK-NEXT:    [N] -> {  :  } diff --git a/polly/test/ScopInfo/multi-scop.ll b/polly/test/ScopInfo/multi-scop.ll index c6dc1f2..8647d89 100644 --- a/polly/test/ScopInfo/multi-scop.ll +++ b/polly/test/ScopInfo/multi-scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>'  -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"  ; This test case contains two scops. diff --git a/polly/test/ScopInfo/multidim_2d-diagonal-matrix.ll b/polly/test/ScopInfo/multidim_2d-diagonal-matrix.ll index bd46532..8785458 100644 --- a/polly/test/ScopInfo/multidim_2d-diagonal-matrix.ll +++ b/polly/test/ScopInfo/multidim_2d-diagonal-matrix.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Derived from the following code: diff --git a/polly/test/ScopInfo/multidim_2d_outer_parametric_offset.ll b/polly/test/ScopInfo/multidim_2d_outer_parametric_offset.ll index cdd4630..5de07ba 100644 --- a/polly/test/ScopInfo/multidim_2d_outer_parametric_offset.ll +++ b/polly/test/ScopInfo/multidim_2d_outer_parametric_offset.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Derived from the following code: diff --git a/polly/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll b/polly/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll index 0b735b9..984f41c 100644 --- a/polly/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll +++ b/polly/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Derived from the following code: diff --git a/polly/test/ScopInfo/multidim_2d_with_modref_call.ll b/polly/test/ScopInfo/multidim_2d_with_modref_call.ll index befca87..96b822a 100644 --- a/polly/test/ScopInfo/multidim_2d_with_modref_call.ll +++ b/polly/test/ScopInfo/multidim_2d_with_modref_call.ll @@ -1,9 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-nonaffine \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE  ;  TODO: We should delinearize the accesses despite the use in a call to a  ;        readonly function. For now we verify we do not delinearize them though. diff --git a/polly/test/ScopInfo/multidim_2d_with_modref_call_2.ll b/polly/test/ScopInfo/multidim_2d_with_modref_call_2.ll index cceb535..c04cc20 100644 --- a/polly/test/ScopInfo/multidim_2d_with_modref_call_2.ll +++ b/polly/test/ScopInfo/multidim_2d_with_modref_call_2.ll @@ -1,9 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-nonaffine \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE  ;  TODO: We should delinearize the accesses despite the use in a call to a  ;        readonly function. For now we verify we do not delinearize them though. diff --git a/polly/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll b/polly/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll index c957dd1..2abd37c 100644 --- a/polly/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll +++ b/polly/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, long m, long o, double A[n][m][o]) { diff --git a/polly/test/ScopInfo/multidim_fixedsize_different_dimensionality.ll b/polly/test/ScopInfo/multidim_fixedsize_different_dimensionality.ll index 4a1ee3b..47cbc0b 100644 --- a/polly/test/ScopInfo/multidim_fixedsize_different_dimensionality.ll +++ b/polly/test/ScopInfo/multidim_fixedsize_different_dimensionality.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    #define N 400  ; diff --git a/polly/test/ScopInfo/multidim_fixedsize_multi_offset.ll b/polly/test/ScopInfo/multidim_fixedsize_multi_offset.ll index 9a6d8fb..e828696 100644 --- a/polly/test/ScopInfo/multidim_fixedsize_multi_offset.ll +++ b/polly/test/ScopInfo/multidim_fixedsize_multi_offset.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Context:  ; CHECK-NEXT: {  :  } diff --git a/polly/test/ScopInfo/multidim_fold_constant_dim.ll b/polly/test/ScopInfo/multidim_fold_constant_dim.ll index 9f47694..dde847b 100644 --- a/polly/test/ScopInfo/multidim_fold_constant_dim.ll +++ b/polly/test/ScopInfo/multidim_fold_constant_dim.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    struct com {  ;      double Real; diff --git a/polly/test/ScopInfo/multidim_fold_constant_dim_zero.ll b/polly/test/ScopInfo/multidim_fold_constant_dim_zero.ll index 5778126..84222f7 100644 --- a/polly/test/ScopInfo/multidim_fold_constant_dim_zero.ll +++ b/polly/test/ScopInfo/multidim_fold_constant_dim_zero.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -debug -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -debug -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts diff --git a/polly/test/ScopInfo/multidim_fortran_2d.ll b/polly/test/ScopInfo/multidim_fortran_2d.ll index e5b005f..1031460 100644 --- a/polly/test/ScopInfo/multidim_fortran_2d.ll +++ b/polly/test/ScopInfo/multidim_fortran_2d.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;   subroutine init_array(ni, nj, pi, pj, a)  ;   implicit none diff --git a/polly/test/ScopInfo/multidim_fortran_2d_params.ll b/polly/test/ScopInfo/multidim_fortran_2d_params.ll index a7f7ebc..992df96 100644 --- a/polly/test/ScopInfo/multidim_fortran_2d_params.ll +++ b/polly/test/ScopInfo/multidim_fortran_2d_params.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-precise-fold-accesses \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-precise-fold-accesses -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ;   subroutine init_array(ni, nj, pi, pj, a)  ;   implicit none diff --git a/polly/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll b/polly/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll index 5f3080a..79fd4c2 100644 --- a/polly/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll +++ b/polly/test/ScopInfo/multidim_fortran_2d_with_modref_call.ll @@ -1,9 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-modref-calls \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-allow-nonaffine \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-modref-calls -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -polly-invariant-load-hoisting=true -polly-allow-modref-calls -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE  ;  TODO: We should delinearize the accesses despite the use in a call to a  ;        readonly function. For now we verify we do not delinearize them though. diff --git a/polly/test/ScopInfo/multidim_fortran_srem.ll b/polly/test/ScopInfo/multidim_fortran_srem.ll index 31cc633..62ff184 100644 --- a/polly/test/ScopInfo/multidim_fortran_srem.ll +++ b/polly/test/ScopInfo/multidim_fortran_srem.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  ; CHECK:      Statements { diff --git a/polly/test/ScopInfo/multidim_gep_pointercast.ll b/polly/test/ScopInfo/multidim_gep_pointercast.ll index fd8048b..aa7932f 100644 --- a/polly/test/ScopInfo/multidim_gep_pointercast.ll +++ b/polly/test/ScopInfo/multidim_gep_pointercast.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The load access to A has a pointer-bitcast to another elements size before the  ; GetElementPtr. Verify that we do not the GEP delinearization because it diff --git a/polly/test/ScopInfo/multidim_gep_pointercast2.ll b/polly/test/ScopInfo/multidim_gep_pointercast2.ll index 9daae4b..0475506 100644 --- a/polly/test/ScopInfo/multidim_gep_pointercast2.ll +++ b/polly/test/ScopInfo/multidim_gep_pointercast2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that we do not use the GetElementPtr information to delinearize A  ; because of the cast in-between. Use the single-dimensional modeling instead. diff --git a/polly/test/ScopInfo/multidim_invalid_dimension.ll b/polly/test/ScopInfo/multidim_invalid_dimension.ll index e1ec2e1..1cf79f1 100644 --- a/polly/test/ScopInfo/multidim_invalid_dimension.ll +++ b/polly/test/ScopInfo/multidim_invalid_dimension.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"  target triple = "aarch64-unknown-linux-gnueabi" diff --git a/polly/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll b/polly/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll index 92b42a9..7779748 100644 --- a/polly/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll +++ b/polly/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, long m, long o, double A[n][m][o]) { diff --git a/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll b/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll index 261cba1..49e0a9b 100644 --- a/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll +++ b/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-precise-fold-accesses '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-precise-fold-accesses '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, long m, long o, double A[n][m][o], long p, long q, long r) { diff --git a/polly/test/ScopInfo/multidim_many_references.ll b/polly/test/ScopInfo/multidim_many_references.ll index f0f1c2b..a4edc9e 100644 --- a/polly/test/ScopInfo/multidim_many_references.ll +++ b/polly/test/ScopInfo/multidim_many_references.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-ignore-aliasing -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/multidim_nested_start_integer.ll b/polly/test/ScopInfo/multidim_nested_start_integer.ll index 6ee9798..c98aece 100644 --- a/polly/test/ScopInfo/multidim_nested_start_integer.ll +++ b/polly/test/ScopInfo/multidim_nested_start_integer.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, long m, long o, double A[n][m][o]) { diff --git a/polly/test/ScopInfo/multidim_nested_start_share_parameter.ll b/polly/test/ScopInfo/multidim_nested_start_share_parameter.ll index e238bdd..12c8d97 100644 --- a/polly/test/ScopInfo/multidim_nested_start_share_parameter.ll +++ b/polly/test/ScopInfo/multidim_nested_start_share_parameter.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, long m, long o, double A[n][m][o]) { diff --git a/polly/test/ScopInfo/multidim_only_ivs_2d.ll b/polly/test/ScopInfo/multidim_only_ivs_2d.ll index 33b3217..a9685d1 100644 --- a/polly/test/ScopInfo/multidim_only_ivs_2d.ll +++ b/polly/test/ScopInfo/multidim_only_ivs_2d.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; Derived from the following code: diff --git a/polly/test/ScopInfo/multidim_only_ivs_3d.ll b/polly/test/ScopInfo/multidim_only_ivs_3d.ll index 39ea424..bb9c302 100644 --- a/polly/test/ScopInfo/multidim_only_ivs_3d.ll +++ b/polly/test/ScopInfo/multidim_only_ivs_3d.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long n, long m, long o, double A[n][m][o]) { diff --git a/polly/test/ScopInfo/multidim_only_ivs_3d_cast.ll b/polly/test/ScopInfo/multidim_only_ivs_3d_cast.ll index 7f7f7f9..7f0c8b1 100644 --- a/polly/test/ScopInfo/multidim_only_ivs_3d_cast.ll +++ b/polly/test/ScopInfo/multidim_only_ivs_3d_cast.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void foo(int n, int m, int o, double A[n][m][o]) {  ; diff --git a/polly/test/ScopInfo/multidim_only_ivs_3d_reverse.ll b/polly/test/ScopInfo/multidim_only_ivs_3d_reverse.ll index 1675110..797a037 100644 --- a/polly/test/ScopInfo/multidim_only_ivs_3d_reverse.ll +++ b/polly/test/ScopInfo/multidim_only_ivs_3d_reverse.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; This test case checks for array access functions where the order in which the diff --git a/polly/test/ScopInfo/multidim_param_in_subscript-2.ll b/polly/test/ScopInfo/multidim_param_in_subscript-2.ll index da9827f..3a21702 100644 --- a/polly/test/ScopInfo/multidim_param_in_subscript-2.ll +++ b/polly/test/ScopInfo/multidim_param_in_subscript-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-precise-fold-accesses '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-precise-fold-accesses '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(long n, long m, float A[][n][m]) {  ;      for (long i = 0; i < 100; i++) diff --git a/polly/test/ScopInfo/multidim_param_in_subscript.ll b/polly/test/ScopInfo/multidim_param_in_subscript.ll index c86b5f0..cc3fa87 100644 --- a/polly/test/ScopInfo/multidim_param_in_subscript.ll +++ b/polly/test/ScopInfo/multidim_param_in_subscript.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;  ;    void foo(long n, float A[][n]) { diff --git a/polly/test/ScopInfo/multidim_parameter_addrec_product.ll b/polly/test/ScopInfo/multidim_parameter_addrec_product.ll index da563a0..117671d 100644 --- a/polly/test/ScopInfo/multidim_parameter_addrec_product.ll +++ b/polly/test/ScopInfo/multidim_parameter_addrec_product.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(float *A, long *p) {  ;      for (long i = 0; i < 100; i++) diff --git a/polly/test/ScopInfo/multidim_single_and_multidim_array.ll b/polly/test/ScopInfo/multidim_single_and_multidim_array.ll index 7059e53..5ebe0da 100644 --- a/polly/test/ScopInfo/multidim_single_and_multidim_array.ll +++ b/polly/test/ScopInfo/multidim_single_and_multidim_array.ll @@ -1,11 +1,11 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-delinearize=false -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-delinearize=false -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-delinearize=false -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-delinearize=false -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-delinearize=false -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-delinearize=false -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-delinearize=false -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-delinearize=false -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s --check-prefix=DELIN  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/multidim_srem.ll b/polly/test/ScopInfo/multidim_srem.ll index 88c8c6a..5c1b0ea 100644 --- a/polly/test/ScopInfo/multidim_srem.ll +++ b/polly/test/ScopInfo/multidim_srem.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(long n, float A[][n][n]) {  ;      for (long i = 0; i < 200; i++) diff --git a/polly/test/ScopInfo/multidim_with_bitcast.ll b/polly/test/ScopInfo/multidim_with_bitcast.ll index 0ab9c2d..941ec63 100644 --- a/polly/test/ScopInfo/multidim_with_bitcast.ll +++ b/polly/test/ScopInfo/multidim_with_bitcast.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/multiple-binary-or-conditions.ll b/polly/test/ScopInfo/multiple-binary-or-conditions.ll index 65416e6..ecfc001 100644 --- a/polly/test/ScopInfo/multiple-binary-or-conditions.ll +++ b/polly/test/ScopInfo/multiple-binary-or-conditions.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -disable-output < %s  ;  ; void or(float *A, long n, long m) {  ;   for (long i = 0; i < 100; i++) { diff --git a/polly/test/ScopInfo/multiple-types-access-offset-not-dividable-by-element-size.ll b/polly/test/ScopInfo/multiple-types-access-offset-not-dividable-by-element-size.ll index 910e624..9ae664f 100644 --- a/polly/test/ScopInfo/multiple-types-access-offset-not-dividable-by-element-size.ll +++ b/polly/test/ScopInfo/multiple-types-access-offset-not-dividable-by-element-size.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -pass-remarks-analysis="polly-scops" \ -; RUN:     -polly-allow-differing-element-types \ -; RUN:     -disable-output < %s  2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -pass-remarks-analysis=polly-scops -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s  ;  ;    // For the following accesses the offset expression from the base pointer  ;    // is not always a multiple of the type size. diff --git a/polly/test/ScopInfo/multiple-types-non-affine-2.ll b/polly/test/ScopInfo/multiple-types-non-affine-2.ll index cb0630d..6530dbf 100644 --- a/polly/test/ScopInfo/multiple-types-non-affine-2.ll +++ b/polly/test/ScopInfo/multiple-types-non-affine-2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=print<polly-function-scops>' -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types -passes=polly-codegen -polly-allow-nonaffine -disable-output +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=polly<no-default-opts>' -polly-allow-nonaffine -disable-output  ;  ;    // Check that accessing one array with different types works,  ;    // even though some accesses are non-affine. diff --git a/polly/test/ScopInfo/multiple-types-non-affine.ll b/polly/test/ScopInfo/multiple-types-non-affine.ll index 7349c5a..7f5f995 100644 --- a/polly/test/ScopInfo/multiple-types-non-affine.ll +++ b/polly/test/ScopInfo/multiple-types-non-affine.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=print<polly-function-scops>' -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types -passes=polly-codegen -polly-allow-nonaffine -disable-output +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-differing-element-types '-passes=polly<no-default-opts>' -polly-allow-nonaffine -disable-output  ;  ;    // Check that accessing one array with different types works,  ;    // even though some accesses are non-affine. diff --git a/polly/test/ScopInfo/multiple-types-non-power-of-two-2.ll b/polly/test/ScopInfo/multiple-types-non-power-of-two-2.ll index df280c8..5890a5a 100644 --- a/polly/test/ScopInfo/multiple-types-non-power-of-two-2.ll +++ b/polly/test/ScopInfo/multiple-types-non-power-of-two-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s  ;  ;  void multiple_types(i8 *A) {  ;    for (long i = 0; i < 100; i++) { diff --git a/polly/test/ScopInfo/multiple-types-non-power-of-two.ll b/polly/test/ScopInfo/multiple-types-non-power-of-two.ll index b949418..3e8390a 100644 --- a/polly/test/ScopInfo/multiple-types-non-power-of-two.ll +++ b/polly/test/ScopInfo/multiple-types-non-power-of-two.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s  ;  ;  void multiple_types(i8 *A) {  ;    for (long i = 0; i < 100; i++) { diff --git a/polly/test/ScopInfo/multiple-types-two-dimensional-2.ll b/polly/test/ScopInfo/multiple-types-two-dimensional-2.ll index e971ccc..4e71f9b 100644 --- a/polly/test/ScopInfo/multiple-types-two-dimensional-2.ll +++ b/polly/test/ScopInfo/multiple-types-two-dimensional-2.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -pass-remarks-analysis="polly-scops" \ -; RUN:                -polly-allow-differing-element-types \ -; RUN:                -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -pass-remarks-analysis=polly-scops -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s  ;  ;  ;    void foo(long n, long m, char A[][m]) { diff --git a/polly/test/ScopInfo/multiple-types-two-dimensional.ll b/polly/test/ScopInfo/multiple-types-two-dimensional.ll index 3417950..9899fe4 100644 --- a/polly/test/ScopInfo/multiple-types-two-dimensional.ll +++ b/polly/test/ScopInfo/multiple-types-two-dimensional.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -pass-remarks-analysis="polly-scops" \ -; RUN:     -polly-allow-differing-element-types \ -; RUN:     -disable-output < %s  2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -pass-remarks-analysis=polly-scops -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void foo(long n, long m, char A[][m]) {  ;      for (long i = 0; i < n; i++) diff --git a/polly/test/ScopInfo/multiple-types.ll b/polly/test/ScopInfo/multiple-types.ll index 84d7d33..7533865 100644 --- a/polly/test/ScopInfo/multiple-types.ll +++ b/polly/test/ScopInfo/multiple-types.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' \ -; RUN: -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-differing-element-types -disable-output < %s 2>&1 | FileCheck %s  ;  ;    // Check that accessing one array with different types works.  ;    void multiple_types(char *Short, char *Float, char *Double) { diff --git a/polly/test/ScopInfo/multiple_exiting_blocks.ll b/polly/test/ScopInfo/multiple_exiting_blocks.ll index b0c425e..218e5c4 100644 --- a/polly/test/ScopInfo/multiple_exiting_blocks.ll +++ b/polly/test/ScopInfo/multiple_exiting_blocks.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll b/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll index ff0ec47..d3a70fd 100644 --- a/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll +++ b/polly/test/ScopInfo/multiple_exiting_blocks_two_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/multiple_latch_blocks.ll b/polly/test/ScopInfo/multiple_latch_blocks.ll index e5085da..0aa25f4 100644 --- a/polly/test/ScopInfo/multiple_latch_blocks.ll +++ b/polly/test/ScopInfo/multiple_latch_blocks.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Domain :=  ; CHECK:   [N, P] -> { Stmt_if_end[i0] : 0 <= i0 < N and (i0 > P or i0 < P) }; diff --git a/polly/test/ScopInfo/nested-loops.ll b/polly/test/ScopInfo/nested-loops.ll index 9100297..7998a38 100644 --- a/polly/test/ScopInfo/nested-loops.ll +++ b/polly/test/ScopInfo/nested-loops.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" diff --git a/polly/test/ScopInfo/no-scalar-deps-in-non-affine-subregion.ll b/polly/test/ScopInfo/no-scalar-deps-in-non-affine-subregion.ll index df01084..f1ad40b 100644 --- a/polly/test/ScopInfo/no-scalar-deps-in-non-affine-subregion.ll +++ b/polly/test/ScopInfo/no-scalar-deps-in-non-affine-subregion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do not generate any scalar dependences regarding x. It is  ; defined and used on the non-affine subregion only, thus we do not need diff --git a/polly/test/ScopInfo/non-affine-region-phi.ll b/polly/test/ScopInfo/non-affine-region-phi.ll index 3fb655e..0248004 100644 --- a/polly/test/ScopInfo/non-affine-region-phi.ll +++ b/polly/test/ScopInfo/non-affine-region-phi.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine -S < %s 2>&1 | FileCheck %s --check-prefix=CODE -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -S < %s 2>&1 | FileCheck %s --check-prefix=CODE +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify there is a phi in the non-affine region but it is not represented in  ; the SCoP as all operands as well as the uses are inside the region too. diff --git a/polly/test/ScopInfo/non-affine-region-with-loop-2.ll b/polly/test/ScopInfo/non-affine-region-with-loop-2.ll index 4c3ca4d..158fe77 100644 --- a/polly/test/ScopInfo/non-affine-region-with-loop-2.ll +++ b/polly/test/ScopInfo/non-affine-region-with-loop-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-nonaffine-loops '-passes=print<polly-detect>,print<polly-function-scops>,scop(polly-codegen)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-allow-nonaffine-loops '-passes=polly-custom<detect>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Stmt_loop3  ; CHECK:            Domain := diff --git a/polly/test/ScopInfo/non-affine-region-with-loop.ll b/polly/test/ScopInfo/non-affine-region-with-loop.ll index f4c028a..bcb542f 100644 --- a/polly/test/ScopInfo/non-affine-region-with-loop.ll +++ b/polly/test/ScopInfo/non-affine-region-with-loop.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops -passes=polly-codegen -disable-output +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=polly<no-default-opts>' -disable-output  ;  ; CHECK:      Domain :=  ; CHECK-NEXT:   { Stmt_loop2__TO__loop[] }; diff --git a/polly/test/ScopInfo/non-precise-inv-load-1.ll b/polly/test/ScopInfo/non-precise-inv-load-1.ll index d55344b..d100b51 100644 --- a/polly/test/ScopInfo/non-precise-inv-load-1.ll +++ b/polly/test/ScopInfo/non-precise-inv-load-1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify we do hoist the invariant access to I with a execution context  ; as the address computation might wrap in the original but not in our diff --git a/polly/test/ScopInfo/non-precise-inv-load-2.ll b/polly/test/ScopInfo/non-precise-inv-load-2.ll index 79ef3b8..fad8fcd 100644 --- a/polly/test/ScopInfo/non-precise-inv-load-2.ll +++ b/polly/test/ScopInfo/non-precise-inv-load-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ;  ; CHECK:       Invariant Accesses: { diff --git a/polly/test/ScopInfo/non-precise-inv-load-3.ll b/polly/test/ScopInfo/non-precise-inv-load-3.ll index aa92847..d032644 100644 --- a/polly/test/ScopInfo/non-precise-inv-load-3.ll +++ b/polly/test/ScopInfo/non-precise-inv-load-3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:        Invariant Accesses: {  ; CHECK-NEXT:     ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/non-precise-inv-load-4.ll b/polly/test/ScopInfo/non-precise-inv-load-4.ll index 2a2241c..c1ba7dd 100644 --- a/polly/test/ScopInfo/non-precise-inv-load-4.ll +++ b/polly/test/ScopInfo/non-precise-inv-load-4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify we hoist I[0] without execution context even though it  ; is executed in a statement with an invalid domain. diff --git a/polly/test/ScopInfo/non-precise-inv-load-5.ll b/polly/test/ScopInfo/non-precise-inv-load-5.ll index a414c7c..c188b5f 100644 --- a/polly/test/ScopInfo/non-precise-inv-load-5.ll +++ b/polly/test/ScopInfo/non-precise-inv-load-5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify we do not hoist I[c] without execution context because it  ; is executed in a statement with an invalid domain and it depends diff --git a/polly/test/ScopInfo/non-precise-inv-load-6.ll b/polly/test/ScopInfo/non-precise-inv-load-6.ll index 1300617..b1c1974 100644 --- a/polly/test/ScopInfo/non-precise-inv-load-6.ll +++ b/polly/test/ScopInfo/non-precise-inv-load-6.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we model the execution context correctly.  ; diff --git a/polly/test/ScopInfo/non-pure-function-call.ll b/polly/test/ScopInfo/non-pure-function-call.ll index 81d43db..ad69141 100644 --- a/polly/test/ScopInfo/non-pure-function-call.ll +++ b/polly/test/ScopInfo/non-pure-function-call.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Assumed Context:  ; CHECK-NEXT:   [N] -> {  :  } diff --git a/polly/test/ScopInfo/non-pure-function-calls-causes-dead-blocks.ll b/polly/test/ScopInfo/non-pure-function-calls-causes-dead-blocks.ll index 6cbb410..38e1c03 100644 --- a/polly/test/ScopInfo/non-pure-function-calls-causes-dead-blocks.ll +++ b/polly/test/ScopInfo/non-pure-function-calls-causes-dead-blocks.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Error blocks are skipped during SCoP detection. We skip them during  ; SCoP formation too as they might contain instructions we can not handle. diff --git a/polly/test/ScopInfo/non-pure-function-calls.ll b/polly/test/ScopInfo/non-pure-function-calls.ll index f976440..d45c32e 100644 --- a/polly/test/ScopInfo/non-pure-function-calls.ll +++ b/polly/test/ScopInfo/non-pure-function-calls.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Allow the user to define function names that are treated as  ; error functions and assumed not to be executed. diff --git a/polly/test/ScopInfo/non_affine_access.ll b/polly/test/ScopInfo/non_affine_access.ll index 0338edf..0f5d9e7 100644 --- a/polly/test/ScopInfo/non_affine_access.ll +++ b/polly/test/ScopInfo/non_affine_access.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NONAFFINE +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -polly-allow-nonaffine -disable-output < %s 2>&1 | FileCheck %s -check-prefix=NONAFFINE  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  ; void foo(long *A) { diff --git a/polly/test/ScopInfo/non_affine_region_1.ll b/polly/test/ScopInfo/non_affine_region_1.ll index 8980a71..5934962 100644 --- a/polly/test/ScopInfo/non_affine_region_1.ll +++ b/polly/test/ScopInfo/non_affine_region_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify only the incoming scalar x is modeled as a read in the non-affine  ; region. diff --git a/polly/test/ScopInfo/non_affine_region_2.ll b/polly/test/ScopInfo/non_affine_region_2.ll index b2e072f..aa08361 100644 --- a/polly/test/ScopInfo/non_affine_region_2.ll +++ b/polly/test/ScopInfo/non_affine_region_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify the scalar x defined in a non-affine subregion is written as it  ; escapes the region. In this test the two conditionals inside the region diff --git a/polly/test/ScopInfo/non_affine_region_3.ll b/polly/test/ScopInfo/non_affine_region_3.ll index d850cb5..b7c4c1b 100644 --- a/polly/test/ScopInfo/non_affine_region_3.ll +++ b/polly/test/ScopInfo/non_affine_region_3.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify the scalar x defined in a non-affine subregion is written as it  ; escapes the region. In this test the two conditionals inside the region diff --git a/polly/test/ScopInfo/non_affine_region_4.ll b/polly/test/ScopInfo/non_affine_region_4.ll index c530973..12cda0a 100644 --- a/polly/test/ScopInfo/non_affine_region_4.ll +++ b/polly/test/ScopInfo/non_affine_region_4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify that both scalars (x and y) are properly written in the non-affine  ; region and read afterwards. diff --git a/polly/test/ScopInfo/nonaffine-buildMemoryAccess.ll b/polly/test/ScopInfo/nonaffine-buildMemoryAccess.ll index b1ce00f0..a52aae0 100644 --- a/polly/test/ScopInfo/nonaffine-buildMemoryAccess.ll +++ b/polly/test/ScopInfo/nonaffine-buildMemoryAccess.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine-loops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Domain :=  ; CHECK-NEXT:   { Stmt_while_cond_i__TO__while_end_i[] }; diff --git a/polly/test/ScopInfo/not-a-reduction.ll b/polly/test/ScopInfo/not-a-reduction.ll index 3a961b2..84f6564 100644 --- a/polly/test/ScopInfo/not-a-reduction.ll +++ b/polly/test/ScopInfo/not-a-reduction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | not FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | not FileCheck %s  ;#define TYPE float  ;#define NUM 4 diff --git a/polly/test/ScopInfo/opaque-struct.ll b/polly/test/ScopInfo/opaque-struct.ll index f4f7952..23b9d3c 100644 --- a/polly/test/ScopInfo/opaque-struct.ll +++ b/polly/test/ScopInfo/opaque-struct.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; Check that we do not crash with unsized (opaque) types.  ; diff --git a/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node-nonaffine-subregion.ll b/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node-nonaffine-subregion.ll index eed27b1..e069cca 100644 --- a/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node-nonaffine-subregion.ll +++ b/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node-nonaffine-subregion.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-codegen -S < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s 2>&1 | FileCheck %s  ;  ; Check whether %newval is identified as escaping value, even though it is used  ; in a phi that is in the region. Non-affine subregion case. diff --git a/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node.ll b/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node.ll index 44da399..27ea11a 100644 --- a/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node.ll +++ b/polly/test/ScopInfo/out-of-scop-use-in-region-entry-phi-node.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: MustWriteAccess :=  [Reduction Type: NONE] [Scalar: 1]  ; CHECK-NEXT: [p_0] -> { Stmt_bb3[] -> MemRef_tmp5[] }; diff --git a/polly/test/ScopInfo/parameter-constant-division.ll b/polly/test/ScopInfo/parameter-constant-division.ll index e5dd359..aaad0df 100644 --- a/polly/test/ScopInfo/parameter-constant-division.ll +++ b/polly/test/ScopInfo/parameter-constant-division.ll @@ -1,6 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' \ -; RUN:     -polly-invariant-load-hoisting=true \ -; RUN:     -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:          Invariant Accesses: {  ; CHECK-NEXT:            ReadAccess :=	[Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/parameter_in_dead_statement.ll b/polly/test/ScopInfo/parameter_in_dead_statement.ll index b295f17..444f9a9 100644 --- a/polly/test/ScopInfo/parameter_in_dead_statement.ll +++ b/polly/test/ScopInfo/parameter_in_dead_statement.ll @@ -1,7 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -S \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s --check-prefix=IR  ;  ; Verify we do not create assumptions based on the parameter p_1 which is the  ; load %0 and due to error-assumptions not "part of the SCoP". diff --git a/polly/test/ScopInfo/parameter_product.ll b/polly/test/ScopInfo/parameter_product.ll index 2fe16f9..9e6e3d0 100644 --- a/polly/test/ScopInfo/parameter_product.ll +++ b/polly/test/ScopInfo/parameter_product.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; int n, m;  ; void foo(char* __restrict a) diff --git a/polly/test/ScopInfo/parameter_with_constant_factor_in_add.ll b/polly/test/ScopInfo/parameter_with_constant_factor_in_add.ll index 6544aae..20986d1 100644 --- a/polly/test/ScopInfo/parameter_with_constant_factor_in_add.ll +++ b/polly/test/ScopInfo/parameter_with_constant_factor_in_add.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the access function of the store is simple and concise  ; diff --git a/polly/test/ScopInfo/partially_invariant_load_1.ll b/polly/test/ScopInfo/partially_invariant_load_1.ll index f3923f61..8d62f15 100644 --- a/polly/test/ScopInfo/partially_invariant_load_1.ll +++ b/polly/test/ScopInfo/partially_invariant_load_1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=IR +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -polly-invariant-load-hoisting=true -S < %s 2>&1 | FileCheck %s --check-prefix=IR  ;  ; CHECK:          Invariant Accesses: {  ; CHECK-NEXT:             ReadAccess :=	[Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/partially_invariant_load_2.ll b/polly/test/ScopInfo/partially_invariant_load_2.ll index d0d74ad..4858090 100644 --- a/polly/test/ScopInfo/partially_invariant_load_2.ll +++ b/polly/test/ScopInfo/partially_invariant_load_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do not try to preload *I and assume p != 42.  ; diff --git a/polly/test/ScopInfo/phi-in-non-affine-region.ll b/polly/test/ScopInfo/phi-in-non-affine-region.ll index fbbc158..6d98a68 100644 --- a/polly/test/ScopInfo/phi-in-non-affine-region.ll +++ b/polly/test/ScopInfo/phi-in-non-affine-region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Verify that 'tmp' is stored in bb1 and read by bb3, as it is needed as  ; incoming value for the tmp11 PHI node. diff --git a/polly/test/ScopInfo/phi_after_error_block.ll b/polly/test/ScopInfo/phi_after_error_block.ll index a1eadff..251be09 100644 --- a/polly/test/ScopInfo/phi_after_error_block.ll +++ b/polly/test/ScopInfo/phi_after_error_block.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  declare void @bar() diff --git a/polly/test/ScopInfo/phi_condition_modeling_1.ll b/polly/test/ScopInfo/phi_condition_modeling_1.ll index a889ec9..bd5c51e9 100644 --- a/polly/test/ScopInfo/phi_condition_modeling_1.ll +++ b/polly/test/ScopInfo/phi_condition_modeling_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int c, int N) {  ;      int tmp; diff --git a/polly/test/ScopInfo/phi_condition_modeling_2.ll b/polly/test/ScopInfo/phi_condition_modeling_2.ll index b56b77e..281b8d3 100644 --- a/polly/test/ScopInfo/phi_condition_modeling_2.ll +++ b/polly/test/ScopInfo/phi_condition_modeling_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int c, int N) {  ;      int tmp; diff --git a/polly/test/ScopInfo/phi_conditional_simple_1.ll b/polly/test/ScopInfo/phi_conditional_simple_1.ll index 14fdc38..6d7f0e9 100644 --- a/polly/test/ScopInfo/phi_conditional_simple_1.ll +++ b/polly/test/ScopInfo/phi_conditional_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void jd(int *A, int c) {  ;      for (int i = 0; i < 1024; i++) { diff --git a/polly/test/ScopInfo/phi_loop_carried_float.ll b/polly/test/ScopInfo/phi_loop_carried_float.ll index 76e5507..2e62dcd 100644 --- a/polly/test/ScopInfo/phi_loop_carried_float.ll +++ b/polly/test/ScopInfo/phi_loop_carried_float.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    float f(float *A, int N) {  ;      float tmp = 0; diff --git a/polly/test/ScopInfo/phi_not_grouped_at_top.ll b/polly/test/ScopInfo/phi_not_grouped_at_top.ll index c97d9a27..57d02f2 100644 --- a/polly/test/ScopInfo/phi_not_grouped_at_top.ll +++ b/polly/test/ScopInfo/phi_not_grouped_at_top.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -passes=polly-prepare -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<prepare>' -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  declare i32 @funa() align 2 diff --git a/polly/test/ScopInfo/phi_scalar_simple_1.ll b/polly/test/ScopInfo/phi_scalar_simple_1.ll index ffd1a37..600c94e 100644 --- a/polly/test/ScopInfo/phi_scalar_simple_1.ll +++ b/polly/test/ScopInfo/phi_scalar_simple_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The assumed context should be empty since the <nsw> flags on the IV  ; increments already guarantee that there is no wrap in the loop trip diff --git a/polly/test/ScopInfo/phi_scalar_simple_2.ll b/polly/test/ScopInfo/phi_scalar_simple_2.ll index 0d6d902..d3353dd 100644 --- a/polly/test/ScopInfo/phi_scalar_simple_2.ll +++ b/polly/test/ScopInfo/phi_scalar_simple_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    int jd(int *restrict A, int x, int N, int c) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/phi_with_invoke_edge.ll b/polly/test/ScopInfo/phi_with_invoke_edge.ll index 9c98ec0..1b01a98 100644 --- a/polly/test/ScopInfo/phi_with_invoke_edge.ll +++ b/polly/test/ScopInfo/phi_with_invoke_edge.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  declare i32 @generic_personality_v0(i32, i64, ptr, ptr) diff --git a/polly/test/ScopInfo/pointer-comparison-no-nsw.ll b/polly/test/ScopInfo/pointer-comparison-no-nsw.ll index 18ba18c..1b983ac 100644 --- a/polly/test/ScopInfo/pointer-comparison-no-nsw.ll +++ b/polly/test/ScopInfo/pointer-comparison-no-nsw.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int *B) {  ;      while (A != B) { diff --git a/polly/test/ScopInfo/pointer-comparison.ll b/polly/test/ScopInfo/pointer-comparison.ll index 846640a..f80c497 100644 --- a/polly/test/ScopInfo/pointer-comparison.ll +++ b/polly/test/ScopInfo/pointer-comparison.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; TODO: FIXME: Investigate why we need a InvalidContext here.  ; diff --git a/polly/test/ScopInfo/pointer-type-expressions.ll b/polly/test/ScopInfo/pointer-type-expressions.ll index 89dce65..0fdd0be 100644 --- a/polly/test/ScopInfo/pointer-type-expressions.ll +++ b/polly/test/ScopInfo/pointer-type-expressions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(int a[], int N, float *P) {  ;   int i; diff --git a/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll b/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll index 7b6d0d5..8ad531d 100644 --- a/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll +++ b/polly/test/ScopInfo/pointer-used-as-base-pointer-and-scalar-read.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; In this test case we pass a pointer %A into a PHI node and also use this  ; pointer as base pointer of an array store. As a result, we get both scalar diff --git a/polly/test/ScopInfo/polly-timeout-parameter-bounds.ll b/polly/test/ScopInfo/polly-timeout-parameter-bounds.ll index 13087a5..7dfa1ec 100644 --- a/polly/test/ScopInfo/polly-timeout-parameter-bounds.ll +++ b/polly/test/ScopInfo/polly-timeout-parameter-bounds.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK:      Statements {  ; CHECK-NEXT:  	Stmt_bb9 diff --git a/polly/test/ScopInfo/pr38218.ll b/polly/test/ScopInfo/pr38218.ll index 74103f9..2c22b14 100644 --- a/polly/test/ScopInfo/pr38218.ll +++ b/polly/test/ScopInfo/pr38218.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  ;  ; This code causes the SCoP to be rejected because of an ERRORBLOCK  ; assumption and made Polly crash (llvm.org/PR38219). diff --git a/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll b/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll index 33fa012..800b033 100644 --- a/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll +++ b/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=scalar-indep -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/process_added_dimensions.ll b/polly/test/ScopInfo/process_added_dimensions.ll index 2d06f4b..9cb932e 100644 --- a/polly/test/ScopInfo/process_added_dimensions.ll +++ b/polly/test/ScopInfo/process_added_dimensions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK:      Context:  ; CHECK-NEXT: {  :  } diff --git a/polly/test/ScopInfo/pwaff-complexity-bailout.ll b/polly/test/ScopInfo/pwaff-complexity-bailout.ll index 931e08f..62909f8 100644 --- a/polly/test/ScopInfo/pwaff-complexity-bailout.ll +++ b/polly/test/ScopInfo/pwaff-complexity-bailout.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -pass-remarks-analysis=.* -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops '-pass-remarks-analysis=.*' -disable-output < %s 2>&1 | FileCheck %s  ; Make sure we hit the complexity bailout, and don't crash.  ; CHECK: Low complexity assumption:       {  : false } diff --git a/polly/test/ScopInfo/ranged_parameter.ll b/polly/test/ScopInfo/ranged_parameter.ll index 03562b1..a6e51c7 100644 --- a/polly/test/ScopInfo/ranged_parameter.ll +++ b/polly/test/ScopInfo/ranged_parameter.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the constraints on the parameter derived from the  ; range metadata (see bottom of the file) are present: diff --git a/polly/test/ScopInfo/ranged_parameter_2.ll b/polly/test/ScopInfo/ranged_parameter_2.ll index 18cbbf3..554dd6e 100644 --- a/polly/test/ScopInfo/ranged_parameter_2.ll +++ b/polly/test/ScopInfo/ranged_parameter_2.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -polly-allow-nonaffine -polly-invariant-load-hoisting=true < %s \ -; RUN:  -debug 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-allow-nonaffine -polly-invariant-load-hoisting=true -debug < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts diff --git a/polly/test/ScopInfo/ranged_parameter_wrap.ll b/polly/test/ScopInfo/ranged_parameter_wrap.ll index d236eee..7ae15c3 100644 --- a/polly/test/ScopInfo/ranged_parameter_wrap.ll +++ b/polly/test/ScopInfo/ranged_parameter_wrap.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the constraints on the parameter derived from the  ; __wrapping__ range metadata (see bottom of the file) are present: diff --git a/polly/test/ScopInfo/ranged_parameter_wrap_2.ll b/polly/test/ScopInfo/ranged_parameter_wrap_2.ll index fc0a737..00c3caa 100644 --- a/polly/test/ScopInfo/ranged_parameter_wrap_2.ll +++ b/polly/test/ScopInfo/ranged_parameter_wrap_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that the context is built fast and does not explode due to us  ; combining a large number of non-convex ranges. Instead, after a certain diff --git a/polly/test/ScopInfo/read-only-scalar-used-in-phi-2.ll b/polly/test/ScopInfo/read-only-scalar-used-in-phi-2.ll index 7e6f240..528dbb1 100644 --- a/polly/test/ScopInfo/read-only-scalar-used-in-phi-2.ll +++ b/polly/test/ScopInfo/read-only-scalar-used-in-phi-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    float foo(float sum, float A[]) {  ; diff --git a/polly/test/ScopInfo/read-only-scalar-used-in-phi.ll b/polly/test/ScopInfo/read-only-scalar-used-in-phi.ll index 18e6c1f..6bc1fe7 100644 --- a/polly/test/ScopInfo/read-only-scalar-used-in-phi.ll +++ b/polly/test/ScopInfo/read-only-scalar-used-in-phi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    float foo(float sum, float A[]) {  ; diff --git a/polly/test/ScopInfo/read-only-scalars.ll b/polly/test/ScopInfo/read-only-scalars.ll index f04163e..7c78d62 100644 --- a/polly/test/ScopInfo/read-only-scalars.ll +++ b/polly/test/ScopInfo/read-only-scalars.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-analyze-read-only-scalars=false '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-analyze-read-only-scalars=true  '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCALARS +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-analyze-read-only-scalars=false '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-analyze-read-only-scalars=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=SCALARS  ; CHECK-NOT: Memref_scalar diff --git a/polly/test/ScopInfo/read-only-statements.ll b/polly/test/ScopInfo/read-only-statements.ll index 7bac53a..c1cb618 100644 --- a/polly/test/ScopInfo/read-only-statements.ll +++ b/polly/test/ScopInfo/read-only-statements.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check we remove read only statements.  ; diff --git a/polly/test/ScopInfo/reduction_alternating_base.ll b/polly/test/ScopInfo/reduction_alternating_base.ll index e38ff60..474c6ac 100644 --- a/polly/test/ScopInfo/reduction_alternating_base.ll +++ b/polly/test/ScopInfo/reduction_alternating_base.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;  ;    void f(int *A) { diff --git a/polly/test/ScopInfo/reduction_chain_partially_outside_the_scop.ll b/polly/test/ScopInfo/reduction_chain_partially_outside_the_scop.ll index 17f9dc5..e91eeaf 100644 --- a/polly/test/ScopInfo/reduction_chain_partially_outside_the_scop.ll +++ b/polly/test/ScopInfo/reduction_chain_partially_outside_the_scop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Reduction Type: NONE  ; diff --git a/polly/test/ScopInfo/reduction_different_index.ll b/polly/test/ScopInfo/reduction_different_index.ll index d2786d5..5c169f7 100644 --- a/polly/test/ScopInfo/reduction_different_index.ll +++ b/polly/test/ScopInfo/reduction_different_index.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Verify if the following case is not detected as reduction.  ;  ; void f(int *A,int *sum) { diff --git a/polly/test/ScopInfo/reduction_different_index1.ll b/polly/test/ScopInfo/reduction_different_index1.ll index 710ae3e..93ab77b 100644 --- a/polly/test/ScopInfo/reduction_different_index1.ll +++ b/polly/test/ScopInfo/reduction_different_index1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Verify if the following case is not detected as reduction.  ;  ; void f(int *A, int *sum, int i1, int i2) { diff --git a/polly/test/ScopInfo/reduction_disabled_multiplicative.ll b/polly/test/ScopInfo/reduction_disabled_multiplicative.ll index 61228e0..618e4d3 100644 --- a/polly/test/ScopInfo/reduction_disabled_multiplicative.ll +++ b/polly/test/ScopInfo/reduction_disabled_multiplicative.ll @@ -1,4 +1,4 @@ -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -polly-disable-multiplicative-reductions -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -polly-disable-multiplicative-reductions -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: ReadAccess :=       [Reduction Type: +  ; CHECK:     { Stmt_for_body[i0] -> MemRef_sum[0] }; diff --git a/polly/test/ScopInfo/reduction_double.ll b/polly/test/ScopInfo/reduction_double.ll index d126d3d..a7721d1 100644 --- a/polly/test/ScopInfo/reduction_double.ll +++ b/polly/test/ScopInfo/reduction_double.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -disable-output -polly-allow-nonaffine < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-allow-nonaffine < %s | FileCheck %s  ;  ; Verify if two independent reductions in same loop is detected  ; diff --git a/polly/test/ScopInfo/reduction_escaping_intermediate.ll b/polly/test/ScopInfo/reduction_escaping_intermediate.ll index c66a8be..8692345 100644 --- a/polly/test/ScopInfo/reduction_escaping_intermediate.ll +++ b/polly/test/ScopInfo/reduction_escaping_intermediate.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; void f(int N, int * restrict sums, int * restrict escape) {  ;   int i, j; diff --git a/polly/test/ScopInfo/reduction_escaping_intermediate_2.ll b/polly/test/ScopInfo/reduction_escaping_intermediate_2.ll index c574d31..641d2e7 100644 --- a/polly/test/ScopInfo/reduction_escaping_intermediate_2.ll +++ b/polly/test/ScopInfo/reduction_escaping_intermediate_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; void f(int N, int * restrict sums, int * restrict escape) {  ;   int i, j; diff --git a/polly/test/ScopInfo/reduction_escaping_intermediate_3.ll b/polly/test/ScopInfo/reduction_escaping_intermediate_3.ll index 92a071e..dd2a76e 100644 --- a/polly/test/ScopInfo/reduction_escaping_intermediate_3.ll +++ b/polly/test/ScopInfo/reduction_escaping_intermediate_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  ;  ; void f(int N, int * restrict sums, int * restrict escape) {  ;   int i, j; diff --git a/polly/test/ScopInfo/reduction_if.ll b/polly/test/ScopInfo/reduction_if.ll index 4f7d368..53a62a3 100644 --- a/polly/test/ScopInfo/reduction_if.ll +++ b/polly/test/ScopInfo/reduction_if.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -disable-output -polly-allow-nonaffine < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-allow-nonaffine < %s | FileCheck %s  ;  ; Verify if reduction spread across multiple blocks in a single scop statement are detected  ; diff --git a/polly/test/ScopInfo/reduction_indirect_access.ll b/polly/test/ScopInfo/reduction_indirect_access.ll index 7acac4b..cb54cd9 100644 --- a/polly/test/ScopInfo/reduction_indirect_access.ll +++ b/polly/test/ScopInfo/reduction_indirect_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -polly-allow-nonaffine -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-allow-nonaffine -disable-output < %s | FileCheck %s  ;  ; CHECK: Reduction Type: NONE  ; CHECK: MemRef_INDICES[i0] diff --git a/polly/test/ScopInfo/reduction_indirect_access_2.ll b/polly/test/ScopInfo/reduction_indirect_access_2.ll index 33195399..5642a84 100644 --- a/polly/test/ScopInfo/reduction_indirect_access_2.ll +++ b/polly/test/ScopInfo/reduction_indirect_access_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -disable-output -polly-allow-nonaffine < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-allow-nonaffine < %s | FileCheck %s  ;  ; Validate that the accesses to INDICES[i] is not part of a reduction.  ; diff --git a/polly/test/ScopInfo/reduction_invalid_different_operators.ll b/polly/test/ScopInfo/reduction_invalid_different_operators.ll index 9846f10..9e6b3cd 100644 --- a/polly/test/ScopInfo/reduction_invalid_different_operators.ll +++ b/polly/test/ScopInfo/reduction_invalid_different_operators.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; int f() {  ;   int i, sum = 0, sth = 0; diff --git a/polly/test/ScopInfo/reduction_invalid_overlapping_accesses.ll b/polly/test/ScopInfo/reduction_invalid_overlapping_accesses.ll index 4d70e53..7ae7d8e 100644 --- a/polly/test/ScopInfo/reduction_invalid_overlapping_accesses.ll +++ b/polly/test/ScopInfo/reduction_invalid_overlapping_accesses.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; void f(int *sums) {  ;   int i, j; diff --git a/polly/test/ScopInfo/reduction_long_reduction_chain.ll b/polly/test/ScopInfo/reduction_long_reduction_chain.ll index 62ae1fe..6f2f480 100644 --- a/polly/test/ScopInfo/reduction_long_reduction_chain.ll +++ b/polly/test/ScopInfo/reduction_long_reduction_chain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  ;  ; CHECK: Reduction Type: +  ; CHECK: MemRef_sum diff --git a/polly/test/ScopInfo/reduction_long_reduction_chain_double_use.ll b/polly/test/ScopInfo/reduction_long_reduction_chain_double_use.ll index 7ca46fa9..2fd71c2 100644 --- a/polly/test/ScopInfo/reduction_long_reduction_chain_double_use.ll +++ b/polly/test/ScopInfo/reduction_long_reduction_chain_double_use.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -basic-aa -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  ;  ; Sum is added twice in the statement. Hence no reduction.  ; CHECK: Reduction Type: NONE diff --git a/polly/test/ScopInfo/reduction_multiple_different_operators.ll b/polly/test/ScopInfo/reduction_multiple_different_operators.ll index b77c72a..4f049a3 100644 --- a/polly/test/ScopInfo/reduction_multiple_different_operators.ll +++ b/polly/test/ScopInfo/reduction_multiple_different_operators.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-print-scops -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s | FileCheck %s  ;  ; Should not be identified as reduction as there are different operations  ; involved on sum (multiplication followed by addition) diff --git a/polly/test/ScopInfo/reduction_multiple_loops_array_sum.ll b/polly/test/ScopInfo/reduction_multiple_loops_array_sum.ll index 800eb20..0d01667 100644 --- a/polly/test/ScopInfo/reduction_multiple_loops_array_sum.ll +++ b/polly/test/ScopInfo/reduction_multiple_loops_array_sum.ll @@ -1,4 +1,4 @@ -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Stmt_for_body  ; CHECK: Reduction Type: * diff --git a/polly/test/ScopInfo/reduction_multiple_loops_array_sum_1.ll b/polly/test/ScopInfo/reduction_multiple_loops_array_sum_1.ll index 49ebdcb..568513a 100644 --- a/polly/test/ScopInfo/reduction_multiple_loops_array_sum_1.ll +++ b/polly/test/ScopInfo/reduction_multiple_loops_array_sum_1.ll @@ -1,4 +1,4 @@ -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Stmt_for_body  ; CHECK: Reduction Type: NONE diff --git a/polly/test/ScopInfo/reduction_multiple_simple_binary.ll b/polly/test/ScopInfo/reduction_multiple_simple_binary.ll index 77b71f4..0ac50b3b 100644 --- a/polly/test/ScopInfo/reduction_multiple_simple_binary.ll +++ b/polly/test/ScopInfo/reduction_multiple_simple_binary.ll @@ -1,4 +1,4 @@ -; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: ReadAccess :=       [Reduction Type: NONE  ; CHECK:     { Stmt_for_body[i0] -> MemRef_A[1 + i0] }; diff --git a/polly/test/ScopInfo/reduction_non_overlapping_chains.ll b/polly/test/ScopInfo/reduction_non_overlapping_chains.ll index 61aaa05..f01b641 100644 --- a/polly/test/ScopInfo/reduction_non_overlapping_chains.ll +++ b/polly/test/ScopInfo/reduction_non_overlapping_chains.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Reduction Type: +  ; CHECK: Reduction Type: + diff --git a/polly/test/ScopInfo/reduction_only_reduction_like_access.ll b/polly/test/ScopInfo/reduction_only_reduction_like_access.ll index fb6d236..51685dc 100644 --- a/polly/test/ScopInfo/reduction_only_reduction_like_access.ll +++ b/polly/test/ScopInfo/reduction_only_reduction_like_access.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Reduction Type: +  ; diff --git a/polly/test/ScopInfo/reduction_simple_fp.ll b/polly/test/ScopInfo/reduction_simple_fp.ll index aa4cd00..67139bb 100644 --- a/polly/test/ScopInfo/reduction_simple_fp.ll +++ b/polly/test/ScopInfo/reduction_simple_fp.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Function: f_no_fast_math  ; CHECK: Reduction Type: NONE diff --git a/polly/test/ScopInfo/reduction_simple_w_constant.ll b/polly/test/ScopInfo/reduction_simple_w_constant.ll index e385b66..c171846 100644 --- a/polly/test/ScopInfo/reduction_simple_w_constant.ll +++ b/polly/test/ScopInfo/reduction_simple_w_constant.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Reduction Type: +  ; diff --git a/polly/test/ScopInfo/reduction_simple_w_iv.ll b/polly/test/ScopInfo/reduction_simple_w_iv.ll index e22eccb..7cc50bf 100644 --- a/polly/test/ScopInfo/reduction_simple_w_iv.ll +++ b/polly/test/ScopInfo/reduction_simple_w_iv.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Reduction Type: +  ; diff --git a/polly/test/ScopInfo/reduction_two_identical_reads.ll b/polly/test/ScopInfo/reduction_two_identical_reads.ll index 8f00954..35cb9df 100644 --- a/polly/test/ScopInfo/reduction_two_identical_reads.ll +++ b/polly/test/ScopInfo/reduction_two_identical_reads.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Reduction Type: NONE  ; diff --git a/polly/test/ScopInfo/redundant_parameter_constraint.ll b/polly/test/ScopInfo/redundant_parameter_constraint.ll index ad71f1f..7512da4 100644 --- a/polly/test/ScopInfo/redundant_parameter_constraint.ll +++ b/polly/test/ScopInfo/redundant_parameter_constraint.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; The constraint that r2 has to be bigger than r1 is implicitly contained in  ; the domain, hence we do not want to see it explicitly. diff --git a/polly/test/ScopInfo/region-with-instructions.ll b/polly/test/ScopInfo/region-with-instructions.ll index d472051..38d58c9 100644 --- a/polly/test/ScopInfo/region-with-instructions.ll +++ b/polly/test/ScopInfo/region-with-instructions.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -polly-print-instructions -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -polly-print-instructions -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Statements {  ; CHECK: 	Stmt_bb46 diff --git a/polly/test/ScopInfo/remarks.ll b/polly/test/ScopInfo/remarks.ll index 10cc57a..2d6ace9 100644 --- a/polly/test/ScopInfo/remarks.ll +++ b/polly/test/ScopInfo/remarks.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN: -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: remark: test/ScopInfo/remarks.c:4:7: SCoP begins here.  ; CHECK: remark: test/ScopInfo/remarks.c:9:15: Inbounds assumption:    [N, M, Debug] -> {  : M <= 100 } diff --git a/polly/test/ScopInfo/required-invariant-loop-bounds.ll b/polly/test/ScopInfo/required-invariant-loop-bounds.ll index abf0b0e..3bb5bfb 100644 --- a/polly/test/ScopInfo/required-invariant-loop-bounds.ll +++ b/polly/test/ScopInfo/required-invariant-loop-bounds.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output \ -; RUN: -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-invariant-load-hoisting=true < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Invariant Accesses: {  ; CHECK-NEXT:       ReadAccess := [Reduction Type: NONE] [Scalar: 0] diff --git a/polly/test/ScopInfo/restriction_in_dead_block.ll b/polly/test/ScopInfo/restriction_in_dead_block.ll index 487c585..dd6115c 100644 --- a/polly/test/ScopInfo/restriction_in_dead_block.ll +++ b/polly/test/ScopInfo/restriction_in_dead_block.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify we do not generate an empty invalid context only because the wrap  ; in the second conditional will always happen if the block is executed. diff --git a/polly/test/ScopInfo/run-time-check-many-array-disjuncts.ll b/polly/test/ScopInfo/run-time-check-many-array-disjuncts.ll index 702b7dc..e8df1ec 100644 --- a/polly/test/ScopInfo/run-time-check-many-array-disjuncts.ll +++ b/polly/test/ScopInfo/run-time-check-many-array-disjuncts.ll @@ -1,6 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s -check-prefix=DETECT -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DETECT +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; DETECT: Valid Region for Scop: bb124 => bb176  ; diff --git a/polly/test/ScopInfo/run-time-check-many-parameters.ll b/polly/test/ScopInfo/run-time-check-many-parameters.ll index 559c38d..2a88533 100644 --- a/polly/test/ScopInfo/run-time-check-many-parameters.ll +++ b/polly/test/ScopInfo/run-time-check-many-parameters.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; A valid Scop would print the list of it's statements, we check that we do not  ; see that list. diff --git a/polly/test/ScopInfo/run-time-check-many-piecewise-aliasing.ll b/polly/test/ScopInfo/run-time-check-many-piecewise-aliasing.ll index 3cf4c40..5e71e7a 100644 --- a/polly/test/ScopInfo/run-time-check-many-piecewise-aliasing.ll +++ b/polly/test/ScopInfo/run-time-check-many-piecewise-aliasing.ll @@ -1,6 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 \ -; RUN: | FileCheck %s -check-prefix=DETECT -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s -check-prefix=DETECT +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; DETECT: Valid Region for Scop: for => return  ; diff --git a/polly/test/ScopInfo/run-time-check-read-only-arrays.ll b/polly/test/ScopInfo/run-time-check-read-only-arrays.ll index 51ab814..286f878 100644 --- a/polly/test/ScopInfo/run-time-check-read-only-arrays.ll +++ b/polly/test/ScopInfo/run-time-check-read-only-arrays.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; void foo(float *A, float *B, float *C, long N) {  ; 	for (long i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/same-base-address-scalar-and-array.ll b/polly/test/ScopInfo/same-base-address-scalar-and-array.ll index dd809ba..9f4d6f5 100644 --- a/polly/test/ScopInfo/same-base-address-scalar-and-array.ll +++ b/polly/test/ScopInfo/same-base-address-scalar-and-array.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify we introduce two ScopArrayInfo objects (or virtual arrays) for the %out variable  ; as it is used as a memory base pointer (%0) but also as a scalar (%out.addr.0.lcssa). diff --git a/polly/test/ScopInfo/scalar.ll b/polly/test/ScopInfo/scalar.ll index 812d2fd..db8371d 100644 --- a/polly/test/ScopInfo/scalar.ll +++ b/polly/test/ScopInfo/scalar.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" diff --git a/polly/test/ScopInfo/scalar_dependence_cond_br.ll b/polly/test/ScopInfo/scalar_dependence_cond_br.ll index 59549f3..a09bdaf 100644 --- a/polly/test/ScopInfo/scalar_dependence_cond_br.ll +++ b/polly/test/ScopInfo/scalar_dependence_cond_br.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output< %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int c, int d) {  ;      for (int i = 0; i < 1024; i++) diff --git a/polly/test/ScopInfo/scalar_to_array.ll b/polly/test/ScopInfo/scalar_to_array.ll index 3f61d0d..e71c515 100644 --- a/polly/test/ScopInfo/scalar_to_array.ll +++ b/polly/test/ScopInfo/scalar_to_array.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; ModuleID = 'scalar_to_array.ll'  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" diff --git a/polly/test/ScopInfo/scev-div-with-evaluatable-divisor.ll b/polly/test/ScopInfo/scev-div-with-evaluatable-divisor.ll index fa0c81f..66c50dc 100644 --- a/polly/test/ScopInfo/scev-div-with-evaluatable-divisor.ll +++ b/polly/test/ScopInfo/scev-div-with-evaluatable-divisor.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; Derived from test-suite/SingleSource/UnitTests/Vector/SSE/sse.stepfft.c diff --git a/polly/test/ScopInfo/scev-invalidated.ll b/polly/test/ScopInfo/scev-invalidated.ll index 6b9efd4..e0956df 100644 --- a/polly/test/ScopInfo/scev-invalidated.ll +++ b/polly/test/ScopInfo/scev-invalidated.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Region: %if.then6---%return  ; diff --git a/polly/test/ScopInfo/schedule-const-post-dominator-walk-2.ll b/polly/test/ScopInfo/schedule-const-post-dominator-walk-2.ll index 6e2ed12..4a280cc 100644 --- a/polly/test/ScopInfo/schedule-const-post-dominator-walk-2.ll +++ b/polly/test/ScopInfo/schedule-const-post-dominator-walk-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/schedule-const-post-dominator-walk.ll b/polly/test/ScopInfo/schedule-const-post-dominator-walk.ll index d0e8a2a..777c008 100644 --- a/polly/test/ScopInfo/schedule-const-post-dominator-walk.ll +++ b/polly/test/ScopInfo/schedule-const-post-dominator-walk.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/schedule-constuction-endless-loop1.ll b/polly/test/ScopInfo/schedule-constuction-endless-loop1.ll index 9ffc30f..15dea5a 100644 --- a/polly/test/ScopInfo/schedule-constuction-endless-loop1.ll +++ b/polly/test/ScopInfo/schedule-constuction-endless-loop1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do not build a SCoP and do not crash.  ; diff --git a/polly/test/ScopInfo/schedule-constuction-endless-loop2.ll b/polly/test/ScopInfo/schedule-constuction-endless-loop2.ll index 65f2f99..9ac6643 100644 --- a/polly/test/ScopInfo/schedule-constuction-endless-loop2.ll +++ b/polly/test/ScopInfo/schedule-constuction-endless-loop2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Check that we do not build a SCoP and do not crash.  ; diff --git a/polly/test/ScopInfo/schedule-incorrectly-contructed-in-case-of-infinite-loop.ll b/polly/test/ScopInfo/schedule-incorrectly-contructed-in-case-of-infinite-loop.ll index 7c36f8d..1657d2f 100644 --- a/polly/test/ScopInfo/schedule-incorrectly-contructed-in-case-of-infinite-loop.ll +++ b/polly/test/ScopInfo/schedule-incorrectly-contructed-in-case-of-infinite-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=print<polly-function-scops>' -disable-output < %s +; RUN: opt %loadNPMPolly -polly-process-unprofitable '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s  ;  ; This test contains a infinite loop (bb13) and crashed the domain generation  ; at some point. Just verify it does not anymore. diff --git a/polly/test/ScopInfo/scop-affine-parameter-ordering.ll b/polly/test/ScopInfo/scop-affine-parameter-ordering.ll index c8a234e..76bb438 100644 --- a/polly/test/ScopInfo/scop-affine-parameter-ordering.ll +++ b/polly/test/ScopInfo/scop-affine-parameter-ordering.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-m:e-i64:64-i128:128-n8:16:32:64-S128"  target triple = "aarch64--linux-android" diff --git a/polly/test/ScopInfo/sign_wrapped_set.ll b/polly/test/ScopInfo/sign_wrapped_set.ll index 93b63df..135976e 100644 --- a/polly/test/ScopInfo/sign_wrapped_set.ll +++ b/polly/test/ScopInfo/sign_wrapped_set.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-process-unprofitable '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-process-unprofitable '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:        Domain :=  ; CHECK-NEXT:       [srcHeight] -> { Stmt_for_cond6_preheader_us[i0] : 0 <= i0 <= -3 + srcHeight }; diff --git a/polly/test/ScopInfo/simple_loop_1.ll b/polly/test/ScopInfo/simple_loop_1.ll index e736f33..1d9f5c2 100644 --- a/polly/test/ScopInfo/simple_loop_1.ll +++ b/polly/test/ScopInfo/simple_loop_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(int a[], int N) {  ;   int i; diff --git a/polly/test/ScopInfo/simple_loop_2.ll b/polly/test/ScopInfo/simple_loop_2.ll index ae83dd6..877f860 100644 --- a/polly/test/ScopInfo/simple_loop_2.ll +++ b/polly/test/ScopInfo/simple_loop_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(int a[], int N) {  ;   int i; diff --git a/polly/test/ScopInfo/simple_loop_unsigned.ll b/polly/test/ScopInfo/simple_loop_unsigned.ll index c4a96e4..d383429 100644 --- a/polly/test/ScopInfo/simple_loop_unsigned.ll +++ b/polly/test/ScopInfo/simple_loop_unsigned.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(int a[], unsigned N) {  ;   unsigned i; diff --git a/polly/test/ScopInfo/simple_loop_unsigned_2.ll b/polly/test/ScopInfo/simple_loop_unsigned_2.ll index 37e907d..1da6053 100644 --- a/polly/test/ScopInfo/simple_loop_unsigned_2.ll +++ b/polly/test/ScopInfo/simple_loop_unsigned_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK:      Assumed Context:  ; CHECK-NEXT: [N] -> {  :  } diff --git a/polly/test/ScopInfo/simple_loop_unsigned_3.ll b/polly/test/ScopInfo/simple_loop_unsigned_3.ll index 7f2cf5c..0d44bf6 100644 --- a/polly/test/ScopInfo/simple_loop_unsigned_3.ll +++ b/polly/test/ScopInfo/simple_loop_unsigned_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK:      Assumed Context:  ; CHECK-NEXT: [N] -> { : } diff --git a/polly/test/ScopInfo/simple_nonaffine_loop_not.ll b/polly/test/ScopInfo/simple_nonaffine_loop_not.ll index 4df0d34..f70b3fa 100644 --- a/polly/test/ScopInfo/simple_nonaffine_loop_not.ll +++ b/polly/test/ScopInfo/simple_nonaffine_loop_not.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | not FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | not FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"  @.str = private unnamed_addr constant [17 x i8] c"Random Value: %d\00", align 1 diff --git a/polly/test/ScopInfo/smax.ll b/polly/test/ScopInfo/smax.ll index 8968e13..3ba2b35 100644 --- a/polly/test/ScopInfo/smax.ll +++ b/polly/test/ScopInfo/smax.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:32-n32-S64"  define void @foo(ptr noalias %data, ptr noalias %ptr, i32 %x_pos, i32 %w) { diff --git a/polly/test/ScopInfo/statistics.ll b/polly/test/ScopInfo/statistics.ll index 0a294f2..aa72db3 100644 --- a/polly/test/ScopInfo/statistics.ll +++ b/polly/test/ScopInfo/statistics.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -stats -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -stats -disable-output < %s 2>&1 | FileCheck %s  ; REQUIRES: asserts  ; CHECK-DAG:  4 polly-scops      - Maximal number of loops in scops diff --git a/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll b/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll index a46acb0..5483260 100644 --- a/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll +++ b/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT:   Stmt_Region__TO__Stmt diff --git a/polly/test/ScopInfo/stmt_split_no_after_split.ll b/polly/test/ScopInfo/stmt_split_no_after_split.ll index 3a5ebf0..0a4284b 100644 --- a/polly/test/ScopInfo/stmt_split_no_after_split.ll +++ b/polly/test/ScopInfo/stmt_split_no_after_split.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT: 	Stmt_Stmt diff --git a/polly/test/ScopInfo/stmt_split_no_dependence.ll b/polly/test/ScopInfo/stmt_split_no_dependence.ll index 9edd0f0..ed21804 100644 --- a/polly/test/ScopInfo/stmt_split_no_dependence.ll +++ b/polly/test/ScopInfo/stmt_split_no_dependence.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;      void func(int *A, int *B){  ;        for (int i = 0; i < 1024; i+=1) { diff --git a/polly/test/ScopInfo/stmt_split_on_store.ll b/polly/test/ScopInfo/stmt_split_on_store.ll index d645bec..f35a07c 100644 --- a/polly/test/ScopInfo/stmt_split_on_store.ll +++ b/polly/test/ScopInfo/stmt_split_on_store.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=store -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=store -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;      void func(int *A, int *B){  ;        for (int i = 0; i < 1024; i+=1) { diff --git a/polly/test/ScopInfo/stmt_split_on_synthesizable.ll b/polly/test/ScopInfo/stmt_split_on_synthesizable.ll index 1a1ccff..4172186 100644 --- a/polly/test/ScopInfo/stmt_split_on_synthesizable.ll +++ b/polly/test/ScopInfo/stmt_split_on_synthesizable.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT:   Stmt_Stmt diff --git a/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll b/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll index 594b362..0521525 100644 --- a/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll +++ b/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT:  	Stmt_Stmt diff --git a/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll b/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll index 6c9f1c2..82a85aa 100644 --- a/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll +++ b/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT:  	Stmt_Stmt diff --git a/polly/test/ScopInfo/stmt_split_scalar_dependence.ll b/polly/test/ScopInfo/stmt_split_scalar_dependence.ll index 07abe46..1f21c0c 100644 --- a/polly/test/ScopInfo/stmt_split_scalar_dependence.ll +++ b/polly/test/ScopInfo/stmt_split_scalar_dependence.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT:  	Stmt_Stmt diff --git a/polly/test/ScopInfo/stmt_split_within_loop.ll b/polly/test/ScopInfo/stmt_split_within_loop.ll index 9a42ae3..580ffab 100644 --- a/polly/test/ScopInfo/stmt_split_within_loop.ll +++ b/polly/test/ScopInfo/stmt_split_within_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-instructions '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-print-instructions '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Statements {  ; CHECK-NEXT:  	Stmt_Stmt diff --git a/polly/test/ScopInfo/stmt_with_read_but_without_sideffect.ll b/polly/test/ScopInfo/stmt_with_read_but_without_sideffect.ll index ba4801d..67e8f63 100644 --- a/polly/test/ScopInfo/stmt_with_read_but_without_sideffect.ll +++ b/polly/test/ScopInfo/stmt_with_read_but_without_sideffect.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-delicm>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<delicm>' -polly-print-delicm -disable-output < %s 2>&1 | FileCheck %s  ;  ; The statement Stmt_for_if_else_1 should be removed because it has no  ; sideeffects.  But it has a use of MemRef_tmp21 that must also be diff --git a/polly/test/ScopInfo/switch-1.ll b/polly/test/ScopInfo/switch-1.ll index 0c36101..0f9e8321 100644 --- a/polly/test/ScopInfo/switch-1.ll +++ b/polly/test/ScopInfo/switch-1.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/switch-2.ll b/polly/test/ScopInfo/switch-2.ll index f0056da..9defd41 100644 --- a/polly/test/ScopInfo/switch-2.ll +++ b/polly/test/ScopInfo/switch-2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/switch-3.ll b/polly/test/ScopInfo/switch-3.ll index a1810bf..faaa4d0 100644 --- a/polly/test/ScopInfo/switch-3.ll +++ b/polly/test/ScopInfo/switch-3.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/switch-4.ll b/polly/test/ScopInfo/switch-4.ll index 00665fd..c82e703 100644 --- a/polly/test/ScopInfo/switch-4.ll +++ b/polly/test/ScopInfo/switch-4.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/switch-5.ll b/polly/test/ScopInfo/switch-5.ll index 2de3695..5a49be8 100644 --- a/polly/test/ScopInfo/switch-5.ll +++ b/polly/test/ScopInfo/switch-5.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ; The SCoP contains a loop with multiple exit blocks (BBs after leaving  ; the loop). The current implementation of deriving their domain derives diff --git a/polly/test/ScopInfo/switch-6.ll b/polly/test/ScopInfo/switch-6.ll index b859840..379981b 100644 --- a/polly/test/ScopInfo/switch-6.ll +++ b/polly/test/ScopInfo/switch-6.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ;    void f(int *A, int N) {  ;      for (int i = 0; i < N; i++) { diff --git a/polly/test/ScopInfo/switch-7.ll b/polly/test/ScopInfo/switch-7.ll index f73d97f..0c8efc5 100644 --- a/polly/test/ScopInfo/switch-7.ll +++ b/polly/test/ScopInfo/switch-7.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-ast>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<ast>' -polly-print-ast -disable-output < %s 2>&1 | FileCheck %s --check-prefix=AST  ;  ;    void f(int *A, int c, int N) {  ;      switch (c) { diff --git a/polly/test/ScopInfo/tempscop-printing.ll b/polly/test/ScopInfo/tempscop-printing.ll index 4f02176..09cc95e 100644 --- a/polly/test/ScopInfo/tempscop-printing.ll +++ b/polly/test/ScopInfo/tempscop-printing.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -aa-pipeline=basic-aa -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(long A[], int N, int *init_ptr) {  ;   long i, j; diff --git a/polly/test/ScopInfo/test-wrapping-in-condition.ll b/polly/test/ScopInfo/test-wrapping-in-condition.ll index 7463504..d64bdf9 100644 --- a/polly/test/ScopInfo/test-wrapping-in-condition.ll +++ b/polly/test/ScopInfo/test-wrapping-in-condition.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Invalid Context:  ; CHECK:        [N] -> {  : N >= 129 } diff --git a/polly/test/ScopInfo/truncate-1.ll b/polly/test/ScopInfo/truncate-1.ll index 44222c8..d531dd8 100644 --- a/polly/test/ScopInfo/truncate-1.ll +++ b/polly/test/ScopInfo/truncate-1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(char *A, short N) {  ;      for (char i = 0; i < (char)N; i++) diff --git a/polly/test/ScopInfo/truncate-2.ll b/polly/test/ScopInfo/truncate-2.ll index c78a533..3f5d1fa 100644 --- a/polly/test/ScopInfo/truncate-2.ll +++ b/polly/test/ScopInfo/truncate-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(char *A, short N) {  ;      for (short i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/truncate-3.ll b/polly/test/ScopInfo/truncate-3.ll index 5a80a87..d20f375 100644 --- a/polly/test/ScopInfo/truncate-3.ll +++ b/polly/test/ScopInfo/truncate-3.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -pass-remarks-analysis="polly-scops" \ -; RUN:                -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -pass-remarks-analysis=polly-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK: Signed-unsigned restriction: [p] -> {  : p <= -129 or p >= 128 } diff --git a/polly/test/ScopInfo/two-loops-one-infinite.ll b/polly/test/ScopInfo/two-loops-one-infinite.ll index e2723a8..aa2be10 100644 --- a/polly/test/ScopInfo/two-loops-one-infinite.ll +++ b/polly/test/ScopInfo/two-loops-one-infinite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Verify we do not create a SCoP in the presence of infinite loops.  ; diff --git a/polly/test/ScopInfo/two-loops-right-after-each-other.ll b/polly/test/ScopInfo/two-loops-right-after-each-other.ll index 51f3c2d..163642d 100644 --- a/polly/test/ScopInfo/two-loops-right-after-each-other.ll +++ b/polly/test/ScopInfo/two-loops-right-after-each-other.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; CHECK:      Statements {  ; CHECK-NEXT:     Stmt_loop_1 diff --git a/polly/test/ScopInfo/undef_in_cond.ll b/polly/test/ScopInfo/undef_in_cond.ll index ef11761..5fb08f8 100644 --- a/polly/test/ScopInfo/undef_in_cond.ll +++ b/polly/test/ScopInfo/undef_in_cond.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define fastcc void @fix_operands() nounwind { diff --git a/polly/test/ScopInfo/unnamed_nonaffine.ll b/polly/test/ScopInfo/unnamed_nonaffine.ll index 5b9f980..1141849 100644 --- a/polly/test/ScopInfo/unnamed_nonaffine.ll +++ b/polly/test/ScopInfo/unnamed_nonaffine.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-use-llvm-names=true  '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-use-llvm-names=false '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -check-prefix=UNNAMED +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-use-llvm-names=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-allow-nonaffine -polly-use-llvm-names=false '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -check-prefix=UNNAMED  ;  ;    void f(int *A, int b) {  ;      int x; diff --git a/polly/test/ScopInfo/unnamed_stmts.ll b/polly/test/ScopInfo/unnamed_stmts.ll index 163170c..e23b3ae 100644 --- a/polly/test/ScopInfo/unnamed_stmts.ll +++ b/polly/test/ScopInfo/unnamed_stmts.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; This test case verifies that we generate numbered statement names in case  ; no LLVM-IR names are used in the test case. We also verify, that we diff --git a/polly/test/ScopInfo/unpredictable_nonscop_loop.ll b/polly/test/ScopInfo/unpredictable_nonscop_loop.ll index daa1f8c..5bc1366 100644 --- a/polly/test/ScopInfo/unpredictable_nonscop_loop.ll +++ b/polly/test/ScopInfo/unpredictable_nonscop_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s -match-full-lines  ; Derived from test-suite/MultiSource/Applications/sgefa/blas.c  ;  ; The exit value of %i.0320 in land.rhs is not computable. diff --git a/polly/test/ScopInfo/unprofitable_scalar-accs.ll b/polly/test/ScopInfo/unprofitable_scalar-accs.ll index ca8daa4..3f6bb93 100644 --- a/polly/test/ScopInfo/unprofitable_scalar-accs.ll +++ b/polly/test/ScopInfo/unprofitable_scalar-accs.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-process-unprofitable=false -polly-unprofitable-scalar-accs=false '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-process-unprofitable=false -polly-unprofitable-scalar-accs=true  '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=HEURISTIC +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-process-unprofitable=false -polly-unprofitable-scalar-accs=false '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb -polly-process-unprofitable=false -polly-unprofitable-scalar-accs=true '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=HEURISTIC  ; Check the effect of -polly-unprofitable-scalar-accs diff --git a/polly/test/ScopInfo/unsigned-condition.ll b/polly/test/ScopInfo/unsigned-condition.ll index 0529ded..608b6d6 100644 --- a/polly/test/ScopInfo/unsigned-condition.ll +++ b/polly/test/ScopInfo/unsigned-condition.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(int a[], int N, unsigned P) {  ;   int i; diff --git a/polly/test/ScopInfo/unsigned-division-1.ll b/polly/test/ScopInfo/unsigned-division-1.ll index 1c06b55..58d39dc 100644 --- a/polly/test/ScopInfo/unsigned-division-1.ll +++ b/polly/test/ScopInfo/unsigned-division-1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, unsigned N) {  ;      for (unsigned i = 0; i < N / 2; i++) diff --git a/polly/test/ScopInfo/unsigned-division-2.ll b/polly/test/ScopInfo/unsigned-division-2.ll index 153639c..cda666d 100644 --- a/polly/test/ScopInfo/unsigned-division-2.ll +++ b/polly/test/ScopInfo/unsigned-division-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, unsigned N) {  ;      for (unsigned i = 0; i < N / 2 + 3; i++) diff --git a/polly/test/ScopInfo/unsigned-division-3.ll b/polly/test/ScopInfo/unsigned-division-3.ll index 34561fc..50de3c5 100644 --- a/polly/test/ScopInfo/unsigned-division-3.ll +++ b/polly/test/ScopInfo/unsigned-division-3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, unsigned char N) {  ;      for (unsigned i = 0; i <= N / -128; i++) diff --git a/polly/test/ScopInfo/unsigned-division-4.ll b/polly/test/ScopInfo/unsigned-division-4.ll index be539b4..4dd75e5 100644 --- a/polly/test/ScopInfo/unsigned-division-4.ll +++ b/polly/test/ScopInfo/unsigned-division-4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, unsigned char N) {  ;      for (unsigned i = 0; i < (N / -128) + 3; i++) diff --git a/polly/test/ScopInfo/unsigned-division-5.ll b/polly/test/ScopInfo/unsigned-division-5.ll index 61716ec..fff1312 100644 --- a/polly/test/ScopInfo/unsigned-division-5.ll +++ b/polly/test/ScopInfo/unsigned-division-5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, unsigned N) {  ;      for (unsigned i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/unsigned_wrap_uge.ll b/polly/test/ScopInfo/unsigned_wrap_uge.ll index d25a957..f54b9be 100644 --- a/polly/test/ScopInfo/unsigned_wrap_uge.ll +++ b/polly/test/ScopInfo/unsigned_wrap_uge.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Unsigned wrap-around check.  ; diff --git a/polly/test/ScopInfo/unsigned_wrap_ugt.ll b/polly/test/ScopInfo/unsigned_wrap_ugt.ll index 0310fdd..20afd17 100644 --- a/polly/test/ScopInfo/unsigned_wrap_ugt.ll +++ b/polly/test/ScopInfo/unsigned_wrap_ugt.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Unsigned wrap-around check.  ; diff --git a/polly/test/ScopInfo/unsigned_wrap_ule.ll b/polly/test/ScopInfo/unsigned_wrap_ule.ll index 47bfc60..6fa6cc1 100644 --- a/polly/test/ScopInfo/unsigned_wrap_ule.ll +++ b/polly/test/ScopInfo/unsigned_wrap_ule.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Unsigned wrap-around check.  ; diff --git a/polly/test/ScopInfo/unsigned_wrap_ult.ll b/polly/test/ScopInfo/unsigned_wrap_ult.ll index 1b73c0d..4a3b604 100644 --- a/polly/test/ScopInfo/unsigned_wrap_ult.ll +++ b/polly/test/ScopInfo/unsigned_wrap_ult.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; Unsigned wrap-around check.  ; diff --git a/polly/test/ScopInfo/user_context.ll b/polly/test/ScopInfo/user_context.ll index 7408812..ce8dd92 100644 --- a/polly/test/ScopInfo/user_context.ll +++ b/polly/test/ScopInfo/user_context.ll @@ -1,7 +1,7 @@ -; RUN: opt %loadNPMPolly                                      '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-context='[N] -> {: N = 1024}' '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=CTX -; RUN: opt %loadNPMPolly -polly-context='[N,M] -> {: 1 = 0}'  '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-context='[] -> {: 1 = 0}'     '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-polly-context=[N] -> {: N = 1024}' '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=CTX +; RUN: opt %loadNPMPolly '-polly-context=[N,M] -> {: 1 = 0}' '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-polly-context=[] -> {: 1 = 0}' '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ; void f(int a[], int N) {  ;   int i; diff --git a/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed-conditional.ll b/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed-conditional.ll index bd13ba8..c35ed90 100644 --- a/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed-conditional.ll +++ b/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed-conditional.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REMARK -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REMARK +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; REMARK: remark: <unknown>:0:0: Use user assumption: [n, b] -> {  : n <= 100 or (b = 0 and n >= 101) }  ; diff --git a/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed.ll b/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed.ll index 45f5917..2afe99f 100644 --- a/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed.ll +++ b/polly/test/ScopInfo/user_provided_assumptions-in-bb-signed.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK: Context:  ; CHECK-NEXT: [n] -> {  : -9223372036854775808 <= n <= 100 } diff --git a/polly/test/ScopInfo/user_provided_assumptions-in-bb-unsigned.ll b/polly/test/ScopInfo/user_provided_assumptions-in-bb-unsigned.ll index fb71c75..3479558 100644 --- a/polly/test/ScopInfo/user_provided_assumptions-in-bb-unsigned.ll +++ b/polly/test/ScopInfo/user_provided_assumptions-in-bb-unsigned.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REMARK -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=REMARK +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; REMARK:      remark: <unknown>:0:0: SCoP begins here.  ; REMARK-NEXT: remark: <unknown>:0:0: Use user assumption: [n] -> {  : n <= 100 } diff --git a/polly/test/ScopInfo/user_provided_assumptions.ll b/polly/test/ScopInfo/user_provided_assumptions.ll index 49b23b1..0bd99ea 100644 --- a/polly/test/ScopInfo/user_provided_assumptions.ll +++ b/polly/test/ScopInfo/user_provided_assumptions.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP  ;  ; CHECK:      remark: <unknown>:0:0: SCoP begins here.  ; CHECK-NEXT: remark: <unknown>:0:0: Use user assumption: [M, N] -> {  : N <= 2147483647 - M } diff --git a/polly/test/ScopInfo/user_provided_assumptions_2.ll b/polly/test/ScopInfo/user_provided_assumptions_2.ll index f8643b6..1499ab9 100644 --- a/polly/test/ScopInfo/user_provided_assumptions_2.ll +++ b/polly/test/ScopInfo/user_provided_assumptions_2.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP  ;  ; CHECK:      remark: <unknown>:0:0: SCoP begins here.  ; CHECK-NEXT: remark: <unknown>:0:0: Use user assumption: { : } diff --git a/polly/test/ScopInfo/user_provided_assumptions_3.ll b/polly/test/ScopInfo/user_provided_assumptions_3.ll index 70f8f359..aa1f72d 100644 --- a/polly/test/ScopInfo/user_provided_assumptions_3.ll +++ b/polly/test/ScopInfo/user_provided_assumptions_3.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s --check-prefix=SCOP  ;  ; CHECK:      remark: <unknown>:0:0: SCoP begins here.  ; CHECK-NEXT: remark: <unknown>:0:0: Use user assumption: [N] -> { : N >= 2 } diff --git a/polly/test/ScopInfo/user_provided_non_dominating_assumptions.ll b/polly/test/ScopInfo/user_provided_non_dominating_assumptions.ll index 3e7883d..a6eed5d 100644 --- a/polly/test/ScopInfo/user_provided_non_dominating_assumptions.ll +++ b/polly/test/ScopInfo/user_provided_non_dominating_assumptions.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:    -polly-precise-inbounds -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-precise-inbounds -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      remark: <unknown>:0:0: SCoP begins here.  ; CHECK-NEXT: remark: <unknown>:0:0: Use user assumption: [i, N, M] -> {  : N <= i or (N > i and N >= 0) } @@ -18,8 +17,7 @@  ; -; RUN: opt %loadNPMPolly -pass-remarks-analysis="polly-scops" '-passes=print<polly-function-scops>' \ -; RUN:    -polly-precise-inbounds -disable-output < %s 2>&1 -pass-remarks-output=%t.yaml +; RUN: opt %loadNPMPolly -pass-remarks-analysis=polly-scops '-passes=polly-custom<scops>' -polly-print-scops -polly-precise-inbounds -disable-output -pass-remarks-output=%t.yaml < %s 2>&1  ; RUN: cat %t.yaml | FileCheck -check-prefix=YAML %s  ; YAML: --- !Analysis  ; YAML: Pass:            polly-scops diff --git a/polly/test/ScopInfo/variant_base_pointer.ll b/polly/test/ScopInfo/variant_base_pointer.ll index 32cb114..36beaf5 100644 --- a/polly/test/ScopInfo/variant_base_pointer.ll +++ b/polly/test/ScopInfo/variant_base_pointer.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly -polly-ignore-aliasing -polly-invariant-load-hoisting=true '-passes=print<polly-detect>,print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s -; RUN: opt %loadNPMPolly -polly-ignore-aliasing -polly-invariant-load-hoisting=true -passes=polly-codegen -disable-output < %s +; RUN: opt %loadNPMPolly -polly-ignore-aliasing -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-detect -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-ignore-aliasing -polly-invariant-load-hoisting=true '-passes=polly<no-default-opts>' -disable-output < %s  ;  ; %tmp is added to the list of required hoists by -polly-scops and just  ; assumed to be hoisted. Only -polly-scops recognizes it to be unhoistable diff --git a/polly/test/ScopInfo/variant_load_empty_domain.ll b/polly/test/ScopInfo/variant_load_empty_domain.ll index 6a28bd0..5602c44 100644 --- a/polly/test/ScopInfo/variant_load_empty_domain.ll +++ b/polly/test/ScopInfo/variant_load_empty_domain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:      Invariant Accesses: {  ; CHECK-NEXT: } diff --git a/polly/test/ScopInfo/wraping_signed_expr_0.ll b/polly/test/ScopInfo/wraping_signed_expr_0.ll index f5f06bf..3a663f5 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_0.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_0.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, char N, char p) {  ;      for (char i = 0; i < N; i++) { diff --git a/polly/test/ScopInfo/wraping_signed_expr_1.ll b/polly/test/ScopInfo/wraping_signed_expr_1.ll index e04257a..8963e86 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_1.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(long *A, long N, long p) {  ;      for (long i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/wraping_signed_expr_2.ll b/polly/test/ScopInfo/wraping_signed_expr_2.ll index 2511c0d..97cb2c0 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_2.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int N, int p) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/wraping_signed_expr_3.ll b/polly/test/ScopInfo/wraping_signed_expr_3.ll index 2106bdf..50e2eda 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_3.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_3.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(int *A, int N, int p) {  ;      for (int i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/wraping_signed_expr_4.ll b/polly/test/ScopInfo/wraping_signed_expr_4.ll index 3ea17f6..4ddb43a 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_4.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_4.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(char *A, char N, char p) {  ;      for (char i = 0; i < N; i++) diff --git a/polly/test/ScopInfo/wraping_signed_expr_5.ll b/polly/test/ScopInfo/wraping_signed_expr_5.ll index 90706a3..440d32b 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_5.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_5.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; We should not generate runtime check for ((int)r1 + (int)r2) as it is known not  ; to overflow. However (p + q) can, thus checks are needed. diff --git a/polly/test/ScopInfo/wraping_signed_expr_6.ll b/polly/test/ScopInfo/wraping_signed_expr_6.ll index 9cf67fc..7bec953 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_6.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_6.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Invalid Context:  ; CHECK:        [N] -> {  : N >= 129 } diff --git a/polly/test/ScopInfo/wraping_signed_expr_7.ll b/polly/test/ScopInfo/wraping_signed_expr_7.ll index d18d2b2..2d836e1 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_7.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_7.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:    Invalid Context:  ; CHECK:        [N] -> {  : N >= 129 } diff --git a/polly/test/ScopInfo/wraping_signed_expr_slow_1.ll b/polly/test/ScopInfo/wraping_signed_expr_slow_1.ll index 8462686..4964a12 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_slow_1.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_slow_1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; This checks that the no-wraps checks will be computed fast as some example  ; already showed huge slowdowns even though the inbounds and nsw flags were diff --git a/polly/test/ScopInfo/wraping_signed_expr_slow_2.ll b/polly/test/ScopInfo/wraping_signed_expr_slow_2.ll index b4dd567..a6db7c0 100644 --- a/polly/test/ScopInfo/wraping_signed_expr_slow_2.ll +++ b/polly/test/ScopInfo/wraping_signed_expr_slow_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; This checks that the no-wraps checks will be computed fast as some example  ; already showed huge slowdowns even though the inbounds and nsw flags were diff --git a/polly/test/ScopInfo/zero_ext_of_truncate.ll b/polly/test/ScopInfo/zero_ext_of_truncate.ll index cbe4af0..b509951 100644 --- a/polly/test/ScopInfo/zero_ext_of_truncate.ll +++ b/polly/test/ScopInfo/zero_ext_of_truncate.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(unsigned *restrict I, unsigned *restrict A, unsigned N, unsigned M) {  ;      for (unsigned i = 0; i < N; i++) { diff --git a/polly/test/ScopInfo/zero_ext_of_truncate_2.ll b/polly/test/ScopInfo/zero_ext_of_truncate_2.ll index b306045..ea3356e 100644 --- a/polly/test/ScopInfo/zero_ext_of_truncate_2.ll +++ b/polly/test/ScopInfo/zero_ext_of_truncate_2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-invariant-load-hoisting=true '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ;    void f(unsigned long *restrict I, unsigned *restrict A, unsigned N) {  ;      for (unsigned i = 0; i < N; i++) { diff --git a/polly/test/ScopInfo/zero_ext_space_mismatch.ll b/polly/test/ScopInfo/zero_ext_space_mismatch.ll index 3c02ae2..9fd1afa 100644 --- a/polly/test/ScopInfo/zero_ext_space_mismatch.ll +++ b/polly/test/ScopInfo/zero_ext_space_mismatch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output < %s 2>&1 | FileCheck %s  ;  ; CHECK:         Assumed Context:  ; CHECK-NEXT:    [dim] -> {  : dim > 0 } diff --git a/polly/test/ScopInliner/ignore-declares.ll b/polly/test/ScopInliner/ignore-declares.ll index 5c0cfa1..85198b7 100644 --- a/polly/test/ScopInliner/ignore-declares.ll +++ b/polly/test/ScopInliner/ignore-declares.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-detect-full-functions '-passes=cgscc(polly-inline),function(print<polly-function-scops>)' -disable-output < %s +; RUN: opt %loadNPMPolly -polly-detect-full-functions '-passes=cgscc(polly-inline),polly-custom<print-scops>' -disable-output < %s  ; Check that we do not crash if there are declares. We should skip function  ; declarations and not try to query for domtree. diff --git a/polly/test/ScopInliner/invariant-load-func.ll b/polly/test/ScopInliner/invariant-load-func.ll index 58c556a..6046fc0 100644 --- a/polly/test/ScopInliner/invariant-load-func.ll +++ b/polly/test/ScopInliner/invariant-load-func.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-detect-full-functions -polly-invariant-load-hoisting '-passes=cgscc(polly-inline),function(print<polly-function-scops>)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-detect-full-functions -polly-invariant-load-hoisting '-passes=cgscc(polly-inline),polly-custom<print-scops>' -disable-output < %s 2>&1 | FileCheck %s  ; Check that we inline a function that requires invariant load hoisting  ; correctly. diff --git a/polly/test/ScopInliner/simple-inline-loop.ll b/polly/test/ScopInliner/simple-inline-loop.ll index f12798a..77a5ddd 100644 --- a/polly/test/ScopInliner/simple-inline-loop.ll +++ b/polly/test/ScopInliner/simple-inline-loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-detect-full-functions '-passes=cgscc(polly-inline),function(print<polly-function-scops>)' -disable-output < %s  2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-detect-full-functions '-passes=cgscc(polly-inline),polly-custom<print-scops>' -disable-output < %s | FileCheck %s  ; Check that we get the 2 nested loops by inlining `to_be_inlined` into  ; `inline_site`. diff --git a/polly/test/Simplify/coalesce_3partials.ll b/polly/test/Simplify/coalesce_3partials.ll index 4112787..5411b6e 100644 --- a/polly/test/Simplify/coalesce_3partials.ll +++ b/polly/test/Simplify/coalesce_3partials.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Combine 3 partial accesses into one.  ; diff --git a/polly/test/Simplify/coalesce_disjointelements.ll b/polly/test/Simplify/coalesce_disjointelements.ll index b140f28..888daef 100644 --- a/polly/test/Simplify/coalesce_disjointelements.ll +++ b/polly/test/Simplify/coalesce_disjointelements.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Combine four partial stores into two.  ; The stores write to the same array, but never the same element. diff --git a/polly/test/Simplify/coalesce_overlapping.ll b/polly/test/Simplify/coalesce_overlapping.ll index ee716fc..f492222 100644 --- a/polly/test/Simplify/coalesce_overlapping.ll +++ b/polly/test/Simplify/coalesce_overlapping.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Combine two partial stores (with overlapping domains) into one.  ; diff --git a/polly/test/Simplify/coalesce_partial.ll b/polly/test/Simplify/coalesce_partial.ll index aea691f..4df91d4 100644 --- a/polly/test/Simplify/coalesce_partial.ll +++ b/polly/test/Simplify/coalesce_partial.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Combine two partial stores (with disjoint domains) into one.  ; diff --git a/polly/test/Simplify/dead_access_load.ll b/polly/test/Simplify/dead_access_load.ll index 66f9479..399c023 100644 --- a/polly/test/Simplify/dead_access_load.ll +++ b/polly/test/Simplify/dead_access_load.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Remove a dead load-instruction  ; (an load whose result is not used anywhere) diff --git a/polly/test/Simplify/dead_access_phi.ll b/polly/test/Simplify/dead_access_phi.ll index fb40e4c..9344a28 100644 --- a/polly/test/Simplify/dead_access_phi.ll +++ b/polly/test/Simplify/dead_access_phi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Remove a dead PHI write/read pair  ; (accesses that are effectively not used) diff --git a/polly/test/Simplify/dead_access_value.ll b/polly/test/Simplify/dead_access_value.ll index a8ff7f2..6db242c 100644 --- a/polly/test/Simplify/dead_access_value.ll +++ b/polly/test/Simplify/dead_access_value.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Remove a dead value write/read pair  ; (accesses that are effectively not used) diff --git a/polly/test/Simplify/dead_instruction.ll b/polly/test/Simplify/dead_instruction.ll index 81e55e1..785b5ba 100644 --- a/polly/test/Simplify/dead_instruction.ll +++ b/polly/test/Simplify/dead_instruction.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Remove a dead instruction  ; (an instruction whose result is not used anywhere) diff --git a/polly/test/Simplify/emptyaccessdomain.ll b/polly/test/Simplify/emptyaccessdomain.ll index 9b06cec..917ae7f 100644 --- a/polly/test/Simplify/emptyaccessdomain.ll +++ b/polly/test/Simplify/emptyaccessdomain.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines  ;  ; for (int j = 0; j < n; j += 1) {  ;   A[0] = 42.0; diff --git a/polly/test/Simplify/exit_phi_accesses-2.ll b/polly/test/Simplify/exit_phi_accesses-2.ll index 379c7e0..d56fed4 100644 --- a/polly/test/Simplify/exit_phi_accesses-2.ll +++ b/polly/test/Simplify/exit_phi_accesses-2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>,scop(print<polly-simplify>)' -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-scops -polly-print-simplify -disable-output < %s | FileCheck %s  ;  ; The use of %sum.next by %phi counts as an escaping use.  ; Don't remove the scalar write of %sum.next. diff --git a/polly/test/Simplify/func-b320a7.ll b/polly/test/Simplify/func-b320a7.ll index 5aa2cab..65aa9cd 100644 --- a/polly/test/Simplify/func-b320a7.ll +++ b/polly/test/Simplify/func-b320a7.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-simplify>,polly-optree' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<optree;simplify>' -polly-print-simplify -disable-output < %s | FileCheck %s -match-full-lines  ; llvm.org/PR47098  ; Use-after-free by reference to Stmt remaining in InstStmtMap after removing it has been removed by Scop::simplifyScop. diff --git a/polly/test/Simplify/gemm.ll b/polly/test/Simplify/gemm.ll index 5120de2..6e3a43e 100644 --- a/polly/test/Simplify/gemm.ll +++ b/polly/test/Simplify/gemm.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s  ;  ;    void gemm(float A[][1024], float B[][1024], float C[][1024]) {  ;      for (long i = 0; i < 1024; i++) diff --git a/polly/test/Simplify/nocoalesce_differentvalues.ll b/polly/test/Simplify/nocoalesce_differentvalues.ll index 33d04b2..cba6254 100644 --- a/polly/test/Simplify/nocoalesce_differentvalues.ll +++ b/polly/test/Simplify/nocoalesce_differentvalues.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Do not combine stores that write different values.  ; diff --git a/polly/test/Simplify/nocoalesce_elementmismatch.ll b/polly/test/Simplify/nocoalesce_elementmismatch.ll index 608b055..b589d13 100644 --- a/polly/test/Simplify/nocoalesce_elementmismatch.ll +++ b/polly/test/Simplify/nocoalesce_elementmismatch.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Do not combine stores that do not write to different elements in the  ; same instance. diff --git a/polly/test/Simplify/nocoalesce_readbetween.ll b/polly/test/Simplify/nocoalesce_readbetween.ll index e112b03..b61ad9d 100644 --- a/polly/test/Simplify/nocoalesce_readbetween.ll +++ b/polly/test/Simplify/nocoalesce_readbetween.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Do not combine stores if there is a read between them.  ; Note: The read between is unused, so will be removed by markAndSweep. diff --git a/polly/test/Simplify/nocoalesce_writebetween.ll b/polly/test/Simplify/nocoalesce_writebetween.ll index fd5eee5..be7d159 100644 --- a/polly/test/Simplify/nocoalesce_writebetween.ll +++ b/polly/test/Simplify/nocoalesce_writebetween.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Do not combine stores if there is a write between them.  ; diff --git a/polly/test/Simplify/notdead_region_exitphi.ll b/polly/test/Simplify/notdead_region_exitphi.ll index 42fafb4..1bd9bfe 100644 --- a/polly/test/Simplify/notdead_region_exitphi.ll +++ b/polly/test/Simplify/notdead_region_exitphi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Do not remove dependencies of a phi node in a region's exit block.  ; diff --git a/polly/test/Simplify/notdead_region_innerphi.ll b/polly/test/Simplify/notdead_region_innerphi.ll index 966448c..b59d6dc 100644 --- a/polly/test/Simplify/notdead_region_innerphi.ll +++ b/polly/test/Simplify/notdead_region_innerphi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Do not remove dependencies of a phi node within a region statement (%phi).  ; diff --git a/polly/test/Simplify/notredundant_region_loop.ll b/polly/test/Simplify/notredundant_region_loop.ll index 88f6c41..859bd45 100644 --- a/polly/test/Simplify/notredundant_region_loop.ll +++ b/polly/test/Simplify/notredundant_region_loop.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -polly-allow-nonaffine-loops -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -polly-allow-nonaffine-loops -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Do not remove the store in region_entry. It can be executed multiple times  ; due to being part of a non-affine loop. diff --git a/polly/test/Simplify/notredundant_region_middle.ll b/polly/test/Simplify/notredundant_region_middle.ll index 43c0543..a742ea88 100644 --- a/polly/test/Simplify/notredundant_region_middle.ll +++ b/polly/test/Simplify/notredundant_region_middle.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Do not remove redundant stores in the middle of region statements.  ; The store in region_true could be removed, but in practice we do try to diff --git a/polly/test/Simplify/notredundant_synthesizable_unknownit.ll b/polly/test/Simplify/notredundant_synthesizable_unknownit.ll index 8a9aec8..8542b79 100644 --- a/polly/test/Simplify/notredundant_synthesizable_unknownit.ll +++ b/polly/test/Simplify/notredundant_synthesizable_unknownit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Do not remove the scalar value write of %i.trunc in inner.for.  ; It is used by body. diff --git a/polly/test/Simplify/out-of-scop-use-in-region-entry-phi-node.ll b/polly/test/Simplify/out-of-scop-use-in-region-entry-phi-node.ll index 7218f32..06b082c 100644 --- a/polly/test/Simplify/out-of-scop-use-in-region-entry-phi-node.ll +++ b/polly/test/Simplify/out-of-scop-use-in-region-entry-phi-node.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=print<polly-function-scops>,scop(print<polly-simplify>)' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-scops -polly-print-simplify -disable-output < %s 2>&1 | FileCheck %s  ;  ; %tmp5 must keep the Value WRITE MemoryAccess, because as an incoming value of  ; %tmp4, it is an "external use". diff --git a/polly/test/Simplify/overwritten.ll b/polly/test/Simplify/overwritten.ll index eccdd80..bc5b2df 100644 --- a/polly/test/Simplify/overwritten.ll +++ b/polly/test/Simplify/overwritten.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck -match-full-lines %s  ;  ; Remove a store that is overwritten by another store in the same statement.  ; diff --git a/polly/test/Simplify/overwritten_3phi.ll b/polly/test/Simplify/overwritten_3phi.ll index 4cee4f1..861c9acd 100644 --- a/polly/test/Simplify/overwritten_3phi.ll +++ b/polly/test/Simplify/overwritten_3phi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Remove identical writes  ; (two stores in the same statement that write the same value to the same diff --git a/polly/test/Simplify/overwritten_3store.ll b/polly/test/Simplify/overwritten_3store.ll index c9f06c8..cfd5a08 100644 --- a/polly/test/Simplify/overwritten_3store.ll +++ b/polly/test/Simplify/overwritten_3store.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly -polly-stmt-granularity=bb '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck -match-full-lines %s  ;  ; Remove a store that is overwritten by another store in the same statement.  ; Check that even multiple stores are removed. diff --git a/polly/test/Simplify/overwritten_implicit_and_explicit.ll b/polly/test/Simplify/overwritten_implicit_and_explicit.ll index b1b7635..306e726 100644 --- a/polly/test/Simplify/overwritten_implicit_and_explicit.ll +++ b/polly/test/Simplify/overwritten_implicit_and_explicit.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Remove a store that is overwritten by another store in the same statement.  ; Check that this works even if one of the writes is a scalar MemoryKind. diff --git a/polly/test/Simplify/overwritten_loadbetween.ll b/polly/test/Simplify/overwritten_loadbetween.ll index cdca2f1..170838ddb 100644 --- a/polly/test/Simplify/overwritten_loadbetween.ll +++ b/polly/test/Simplify/overwritten_loadbetween.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck -match-full-lines %s  ;  ; Do not remove overwrites when the value is read before.  ; diff --git a/polly/test/Simplify/overwritten_scalar.ll b/polly/test/Simplify/overwritten_scalar.ll index 700adb6..a1e7da4 100644 --- a/polly/test/Simplify/overwritten_scalar.ll +++ b/polly/test/Simplify/overwritten_scalar.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck -match-full-lines %s  ;  ; Remove identical writes  ; (two stores in the same statement that write the same value to the same diff --git a/polly/test/Simplify/pass_existence.ll b/polly/test/Simplify/pass_existence.ll index 4d1d800..6d9c99f 100644 --- a/polly/test/Simplify/pass_existence.ll +++ b/polly/test/Simplify/pass_existence.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -disable-output "-passes=scop(print<polly-simplify>)" < %s -aa-pipeline=basic-aa < %s | FileCheck %s +; RUN: opt %loadNPMPolly -disable-output '-passes=polly-custom<simplify>' -polly-print-simplify -aa-pipeline=basic-aa < %s < %s | FileCheck %s  ;  ; Simple test for the existence of the Simplify pass.  ; diff --git a/polly/test/Simplify/phi_in_regionstmt.ll b/polly/test/Simplify/phi_in_regionstmt.ll index 2bb0573..ba1cffe 100644 --- a/polly/test/Simplify/phi_in_regionstmt.ll +++ b/polly/test/Simplify/phi_in_regionstmt.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; The PHINode %cond91.sink.sink.us.sink.6 is in the middle of a region  ; statement. diff --git a/polly/test/Simplify/pr33323.ll b/polly/test/Simplify/pr33323.ll index 22921d5..5130eb8 100644 --- a/polly/test/Simplify/pr33323.ll +++ b/polly/test/Simplify/pr33323.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s  ;  ; llvm.org/PR33323  ; diff --git a/polly/test/Simplify/redundant.ll b/polly/test/Simplify/redundant.ll index 540e537..f2489a7 100644 --- a/polly/test/Simplify/redundant.ll +++ b/polly/test/Simplify/redundant.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Remove redundant store (a store that writes the same value already  ; at the destination) diff --git a/polly/test/Simplify/redundant_differentindex.ll b/polly/test/Simplify/redundant_differentindex.ll index 5ce2583..efd20e9 100644 --- a/polly/test/Simplify/redundant_differentindex.ll +++ b/polly/test/Simplify/redundant_differentindex.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; A store that has a different index than the load it is storing is  ; not redundant. diff --git a/polly/test/Simplify/redundant_partialwrite.ll b/polly/test/Simplify/redundant_partialwrite.ll index ac5ca90..357b632 100644 --- a/polly/test/Simplify/redundant_partialwrite.ll +++ b/polly/test/Simplify/redundant_partialwrite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadPolly -polly-import-jscop-postfix=transformed -polly-print-import-jscop -polly-print-simplify -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-import-jscop-postfix=transformed '-passes=polly-custom<import-jscop;simplify>' -polly-print-import-jscop -polly-print-simplify -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Remove a redundant store, if its partial domain is a subset of the  ; read's domain. diff --git a/polly/test/Simplify/redundant_region.ll b/polly/test/Simplify/redundant_region.ll index 927aac6..c60d28b 100644 --- a/polly/test/Simplify/redundant_region.ll +++ b/polly/test/Simplify/redundant_region.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Remove redundant store (a store that writes the same value already  ; at the destination) in a region. diff --git a/polly/test/Simplify/redundant_region_scalar.ll b/polly/test/Simplify/redundant_region_scalar.ll index 72d570d..3de50c0 100644 --- a/polly/test/Simplify/redundant_region_scalar.ll +++ b/polly/test/Simplify/redundant_region_scalar.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Remove redundant store (a store that writes the same value already  ; at the destination) in a region. diff --git a/polly/test/Simplify/redundant_scalarwrite.ll b/polly/test/Simplify/redundant_scalarwrite.ll index 84cb971..13ca40f 100644 --- a/polly/test/Simplify/redundant_scalarwrite.ll +++ b/polly/test/Simplify/redundant_scalarwrite.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Remove redundant scalar stores.  ; diff --git a/polly/test/Simplify/redundant_storebetween.ll b/polly/test/Simplify/redundant_storebetween.ll index 6540d77..47d9cfd 100644 --- a/polly/test/Simplify/redundant_storebetween.ll +++ b/polly/test/Simplify/redundant_storebetween.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly "-passes=scop(print<polly-simplify>)" -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output -aa-pipeline=basic-aa < %s | FileCheck %s -match-full-lines  ;  ; Don't remove store where there is another store to the same target  ; in-between them. diff --git a/polly/test/Simplify/scalability1.ll b/polly/test/Simplify/scalability1.ll index c6e36f9..969aade 100644 --- a/polly/test/Simplify/scalability1.ll +++ b/polly/test/Simplify/scalability1.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-ignore-inbounds '-passes=print<polly-simplify>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-ignore-inbounds '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Test scalability.  ; diff --git a/polly/test/Simplify/scalability2.ll b/polly/test/Simplify/scalability2.ll index adcf9ee..7951094 100644 --- a/polly/test/Simplify/scalability2.ll +++ b/polly/test/Simplify/scalability2.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly -polly-ignore-inbounds '-passes=print<polly-simplify>' -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly -polly-ignore-inbounds '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Test scalability.  ; diff --git a/polly/test/Simplify/sweep_mapped_phi.ll b/polly/test/Simplify/sweep_mapped_phi.ll index 495d77a..ad41f25 100644 --- a/polly/test/Simplify/sweep_mapped_phi.ll +++ b/polly/test/Simplify/sweep_mapped_phi.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Map %phi to A[j], so the scalar write in Stmt_for_bodyA can be removed.  ; diff --git a/polly/test/Simplify/sweep_mapped_value.ll b/polly/test/Simplify/sweep_mapped_value.ll index c83941a8..a50c013 100644 --- a/polly/test/Simplify/sweep_mapped_value.ll +++ b/polly/test/Simplify/sweep_mapped_value.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-import-jscop,print<polly-simplify>' -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly-custom<import-jscop;simplify-0>' -polly-print-simplify -polly-import-jscop-postfix=transformed -disable-output < %s | FileCheck %s -match-full-lines  ;  ; Map %val to A[j], so the scalar write on Stmt_for_bodyB can be removed.  ; diff --git a/polly/test/Simplify/ununsed_read_in_region_entry.ll b/polly/test/Simplify/ununsed_read_in_region_entry.ll index f2436c2..4c05de9 100644 --- a/polly/test/Simplify/ununsed_read_in_region_entry.ll +++ b/polly/test/Simplify/ununsed_read_in_region_entry.ll @@ -1,5 +1,5 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-simplify>' -disable-output< %s | FileCheck %s -match-full-lines -; RUN: opt %loadNPMPolly '-passes=polly-simplify,polly-codegen' -S < %s | FileCheck %s -check-prefix=CODEGEN +; RUN: opt %loadNPMPolly '-passes=polly-custom<simplify>' -polly-print-simplify -disable-output < %s | FileCheck %s -match-full-lines +; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts;simplify>' -S < %s | FileCheck %s -check-prefix=CODEGEN  ;  ; for (int i = 0; i < n; i+=1) {  ;    (void)A[0]; diff --git a/polly/test/Support/Plugins.ll b/polly/test/Support/Plugins.ll index 872a32f..b75dd872 100644 --- a/polly/test/Support/Plugins.ll +++ b/polly/test/Support/Plugins.ll @@ -1,5 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=polly-prepare,scop(print<polly-ast>)' -S < %s \ -; RUN: | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<prepare;ast>' -polly-print-ast -S < %s | FileCheck %s  ; This testcase tests plugin registration. Check-lines below serve to verify  ; that the passes actually ran. diff --git a/polly/test/Support/exportjson.ll b/polly/test/Support/exportjson.ll index 22cfea2..6bdf5a4 100644 --- a/polly/test/Support/exportjson.ll +++ b/polly/test/Support/exportjson.ll @@ -1,6 +1,6 @@  ; RUN: rm -rf %t  ; RUN: mkdir -p %t -; RUN: opt %loadNPMPolly -polly-import-jscop-dir=%t -polly -O2 -polly-export -S < %s +; RUN: opt %loadNPMPolly -polly-import-jscop-dir=%t '-passes=polly-custom<export-jscop>' -disable-output < %s  ; RUN: FileCheck %s -input-file %t/exportjson___%entry.split---%return.jscop  ;  ; for (int j = 0; j < n; j += 1) { @@ -9,28 +9,22 @@  ;  define void @exportjson(i32 %n, ptr noalias nonnull %A) {  entry: -  br label %for +  br label %entry.split -for: -  %j = phi i32 [0, %entry], [%j.inc, %inc] -  %j.cmp = icmp slt i32 %j, %n -  br i1 %j.cmp, label %body, label %exit +entry.split: +  %j.cmp1 = icmp sgt i32 %n, 0 +  br i1 %j.cmp1, label %body.lr.ph, label %return -    body: -      store double 42.0, ptr %A -      br label %inc - -inc: -  %j.inc = add nuw nsw i32 %j, 1 -  br label %for - -exit: +body.lr.ph: +  store double 4.200000e+01, ptr %A, align 8    br label %return  return:    ret void  } +attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +  ; CHECK:      {  ; CHECK-NEXT:    "arrays": [ diff --git a/polly/test/Support/isl-args.ll b/polly/test/Support/isl-args.ll index 206cb73..6c8b2e9 100644 --- a/polly/test/Support/isl-args.ll +++ b/polly/test/Support/isl-args.ll @@ -1,7 +1,7 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -polly-isl-arg=-V < %s | FileCheck %s -match-full-lines --check-prefix=VERSION -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -polly-isl-arg=-h < %s | FileCheck %s -match-full-lines --check-prefix=HELP -; RUN: not opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -polly-isl-arg=-asdf < %s 2>&1| FileCheck %s -match-full-lines --check-prefix=UNKNOWN -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -disable-output -polly-isl-arg=--schedule-algorithm=feautrier < %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-isl-arg=-V < %s | FileCheck %s -match-full-lines --check-prefix=VERSION +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-isl-arg=-h < %s | FileCheck %s -match-full-lines --check-prefix=HELP +; RUN: not opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-isl-arg=-asdf < %s 2>&1 | FileCheck %s -match-full-lines --check-prefix=UNKNOWN +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -disable-output -polly-isl-arg=--schedule-algorithm=feautrier < %s  ; VERSION: isl-{{.*}}-IMath-32  ; HELP: Usage: -polly-isl-arg [OPTION...] diff --git a/polly/test/Support/pipelineposition.ll b/polly/test/Support/pipelineposition.ll index a4506ba..1ddfb58 100644 --- a/polly/test/Support/pipelineposition.ll +++ b/polly/test/Support/pipelineposition.ll @@ -1,8 +1,6 @@ -; RUN: opt %loadNPMPolly -O3 -polly -polly-position=early                    -disable-output -debug-only=polly-scops < %s 2>&1 | FileCheck %s --check-prefix=NOINLINE -; RUN: opt %loadNPMPolly -O3 -polly -polly-position=early -polly-run-inliner -disable-output -debug-only=polly-scops < %s 2>&1 | FileCheck %s --check-prefix=INLINED1 -; RUN: opt %loadNPMPolly -O3 -polly -polly-position=before-vectorizer        -disable-output -debug-only=polly-scops < %s 2>&1 | FileCheck %s --check-prefix=INLINED3 -; -; REQUIRES: asserts +; RUN: opt %loadNPMPolly -O3 -polly -polly-position=early                    -disable-output -polly-print-scops < %s 2>&1 | FileCheck %s --check-prefix=NOINLINE +; RUN: opt %loadNPMPolly -O3 -polly -polly-position=early -polly-run-inliner -disable-output -polly-print-scops < %s 2>&1 | FileCheck %s --check-prefix=INLINED1 +; RUN: opt %loadNPMPolly -O3 -polly -polly-position=before-vectorizer        -disable-output -polly-print-scops < %s 2>&1 | FileCheck %s --check-prefix=INLINED3  ;  ; void callee(int n, double A[], int i) {  ;   for (int j = 0; j < n; j += 1) diff --git a/polly/test/lit.site.cfg.in b/polly/test/lit.site.cfg.in index f22063e..ca901b8 100644 --- a/polly/test/lit.site.cfg.in +++ b/polly/test/lit.site.cfg.in @@ -38,14 +38,10 @@ if config.llvm_polly_link_into_tools == '' or \     config.llvm_polly_link_into_tools.lower() == 'false' or \     config.llvm_polly_link_into_tools.lower() == 'notfound' or \     config.llvm_polly_link_into_tools.lower() == 'llvm_polly_link_into_tools-notfound': -    config.substitutions.append(('%loadPolly', '-load ' -                                 + config.polly_lib_dir + '/LLVMPolly@LLVM_SHLIBEXT@' -                                 + commonOpts ))      config.substitutions.append(('%loadNPMPolly', '-load-pass-plugin '                                   + config.polly_lib_dir + '/LLVMPolly@LLVM_SHLIBEXT@'                                   + commonOpts ))  else: -    config.substitutions.append(('%loadPolly', commonOpts ))      config.substitutions.append(('%loadNPMPolly', commonOpts ))  import lit.llvm diff --git a/polly/test/polly.ll b/polly/test/polly.ll index 2e455b3..0f5467b 100644 --- a/polly/test/polly.ll +++ b/polly/test/polly.ll @@ -1,4 +1,4 @@ -; RUN: opt %loadNPMPolly '-passes=print<polly-function-scops>' -S < %s 2>&1 | FileCheck %s +; RUN: opt %loadNPMPolly '-passes=polly-custom<scops>' -polly-print-scops -S < %s 2>&1 | FileCheck %s  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"  define void @foo() nounwind {  start: diff --git a/runtimes/cmake/Modules/HandleLibC.cmake b/runtimes/cmake/Modules/HandleLibC.cmake index 01da5b2..f886951 100644 --- a/runtimes/cmake/Modules/HandleLibC.cmake +++ b/runtimes/cmake/Modules/HandleLibC.cmake @@ -30,7 +30,9 @@ elseif (RUNTIMES_USE_LIBC STREQUAL "llvm-libc")    check_cxx_compiler_flag(-nostdlibinc CXX_SUPPORTS_NOSTDLIBINC_FLAG)    if(CXX_SUPPORTS_NOSTDLIBINC_FLAG)      target_compile_options(runtimes-libc-headers INTERFACE "-nostdlibinc") -    target_compile_options(runtimes-libc-headers INTERFACE "-idirafter${LIBC_KERNEL_HEADERS}") +    if(LIBC_KERNEL_HEADERS) +      target_compile_options(runtimes-libc-headers INTERFACE "-idirafter${LIBC_KERNEL_HEADERS}") +    endif()    endif()    add_library(runtimes-libc-static INTERFACE) diff --git a/third-party/benchmark/include/benchmark/benchmark.h b/third-party/benchmark/include/benchmark/benchmark.h index 08cfe29..c2debb2 100644 --- a/third-party/benchmark/include/benchmark/benchmark.h +++ b/third-party/benchmark/include/benchmark/benchmark.h @@ -250,6 +250,10 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);    _Pragma("GCC diagnostic push")             \    _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")  #define BENCHMARK_RESTORE_DEPRECATED_WARNING _Pragma("GCC diagnostic pop") +#define BENCHMARK_DISABLE_PEDANTIC_WARNING \ +  _Pragma("GCC diagnostic push")             \ +  _Pragma("GCC diagnostic ignored \"-Wpedantic\"") +#define BENCHMARK_RESTORE_PEDANTIC_WARNING _Pragma("GCC diagnostic pop")  #elif defined(__NVCOMPILER)  #define BENCHMARK_BUILTIN_EXPECT(x, y) __builtin_expect(x, y)  #define BENCHMARK_DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) @@ -257,6 +261,8 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);    _Pragma("diagnostic push") \    _Pragma("diag_suppress deprecated_entity_with_custom_message")  #define BENCHMARK_RESTORE_DEPRECATED_WARNING _Pragma("diagnostic pop") +#define BENCHMARK_DISABLE_PEDANTIC_WARNING +#define BENCHMARK_RESTORE_PEDANTIC_WARNING  #else  #define BENCHMARK_BUILTIN_EXPECT(x, y) x  #define BENCHMARK_DEPRECATED_MSG(msg) @@ -265,6 +271,8 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);        __LINE__) ") : warning note: " msg))  #define BENCHMARK_DISABLE_DEPRECATED_WARNING  #define BENCHMARK_RESTORE_DEPRECATED_WARNING +#define BENCHMARK_DISABLE_PEDANTIC_WARNING +#define BENCHMARK_RESTORE_PEDANTIC_WARNING  #endif  // clang-format on @@ -1462,11 +1470,13 @@ class Fixture : public internal::Benchmark {  // Check that __COUNTER__ is defined and that __COUNTER__ increases by 1  // every time it is expanded. X + 1 == X + 0 is used in case X is defined to be  // empty. If X is empty the expression becomes (+1 == +0). +BENCHMARK_DISABLE_PEDANTIC_WARNING  #if defined(__COUNTER__) && (__COUNTER__ + 1 == __COUNTER__ + 0)  #define BENCHMARK_PRIVATE_UNIQUE_ID __COUNTER__  #else  #define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__  #endif +BENCHMARK_RESTORE_PEDANTIC_WARNING  // Helpers for generating unique variable names  #ifdef BENCHMARK_HAS_CXX11 diff --git a/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel b/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel index 7d62afc..7e5cc2e 100644 --- a/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/lldb/BUILD.bazel @@ -1051,7 +1051,7 @@ gentbl_cc_library(      strip_include_prefix = "tools/lldb-dap",      tbl_outs = {"tools/lldb-dap/Options.inc": ["-gen-opt-parser-defs"]},      tblgen = "//llvm:llvm-tblgen", -    td_file = "tools/lldb-dap/Options.td", +    td_file = "tools/lldb-dap/tool/Options.td",      deps = ["//llvm:OptParserTdFiles"],  )  | 
