| # Copyright 2022 The IREE Authors | 
 | # | 
 | # Licensed 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 | 
 |  | 
 | name: CI | 
 |  | 
 | # A few notes: | 
 | # | 
 | # Variables: | 
 | # GitHub actions don't have variables or even support normal yaml anchors (they | 
 | # are specially disabled because...reasons?): | 
 | # See https://github.com/github-community/community/discussions/4501 | 
 | # https://github.community/t/support-for-yaml-anchors/16128/92 | 
 | # https://github.com/actions/runner/issues/1182 | 
 | # Neither does it have any contexts that are available everywhere. The | 
 | # top-level `env` field is available in many places, but not all. We already | 
 | # have a "should-run" job that every other job depends on, so we leverage that | 
 | # for variables that every other job can use, since that *is* available in all | 
 | # sub-fields of the job. | 
 | # See https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability | 
 | # and https://github.com/community/community/discussions/27370 | 
 | # | 
 | # Runner label ordering: | 
 | # - self-hosted always has to be listed first in a runs-on block: | 
 | # https://docs.github.com/en/actions/hosting-your-own-runners/using-self-hosted-runners-in-a-workflow | 
 | # | 
 | # Pseudo-ternary hack: | 
 | # - We have to do a weird hack to get a pseudo-ternary operator. See | 
 | # https://github.com/actions/runner/issues/409, hence patterns like: | 
 | # `github.event_name == 'pull_request' && 'presubmit' || 'postsubmit'` | 
 | # to mean `'presubmit' if github.event_name == 'pull_request' else 'postsubmit'` | 
 | # Note that this only works if the true branch value is truthy. If it is falsey | 
 | # then we would always get the false branch condition (`p && false` is always | 
 | # false). | 
 |  | 
 | on: | 
 |   workflow_dispatch: | 
 |   pull_request: | 
 |   push: | 
 |     branches: | 
 |       - main | 
 |  | 
 | concurrency: | 
 |   # A PR number if a pull request and otherwise the commit hash. This cancels | 
 |   # queued and in-progress runs for the same PR (presubmit) or commit | 
 |   # (postsubmit). The workflow name is prepended to avoid conflicts between | 
 |   # different workflows. | 
 |   group: ${{ github.workflow }}-${{ github.event.number || github.sha }} | 
 |   cancel-in-progress: true | 
 |  | 
 | env: | 
 |   # This needs to be in env instead of the outputs of setup because it contains | 
 |   # the run attempt and we want that to be the current attempt, not whatever | 
 |   # attempt the setup step last ran in. | 
 |   GCS_DIR: gs://iree-github-actions-${{ github.event_name == 'pull_request' && 'presubmit' || 'postsubmit' }}-artifacts/${{ github.run_id }}/${{ github.run_attempt }} | 
 |  | 
 | # Jobs are organized into groups and topologically sorted by dependencies | 
 | jobs: | 
 |   setup: | 
 |     uses: ./.github/workflows/setup.yml | 
 |  | 
 |   ################################### Basic #################################### | 
 |   # Jobs that build all of IREE "normally" | 
 |   ############################################################################## | 
 |   build_all: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_all') | 
 |     uses: ./.github/workflows/build_all.yml | 
 |     with: | 
 |       runner-group: ${{ needs.setup.outputs.runner-group }} | 
 |       runner-env: ${{ needs.setup.outputs.runner-env }} | 
 |       write-caches: ${{ needs.setup.outputs.write-caches }} | 
 |  | 
 |   build_test_all_windows: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_test_all_windows') | 
 |     runs-on: windows-2022-64core | 
 |     defaults: | 
 |       run: | 
 |         shell: bash | 
 |     env: | 
 |       BUILD_DIR: build-windows | 
 |       IREE_VULKAN_DISABLE: 1 | 
 |     steps: | 
 |       # actions/checkout is for some reason unusably slow on the large managed | 
 |       # Windows GitHub runners so we roll our own. See | 
 |       # https://github.com/actions/checkout/issues/1186 | 
 |       # TODO(gcmn): Factor this out into something reusable across jobs. Can't | 
 |       # be a script because we haven't done the checkout yet :-) | 
 |       - name: "Checking out repository" | 
 |         env: | 
 |           REMOTE_URL: ${{ github.server_url }}/${{ github.repository }} | 
 |         run: | | 
 |           mkdir -p ${GITHUB_WORKSPACE} | 
 |           cd ${GITHUB_WORKSPACE} | 
 |           git init | 
 |           git fetch --depth 1 "${REMOTE_URL}" "${GITHUB_SHA}" | 
 |           git checkout "${GITHUB_SHA}" | 
 |           git submodule update --init --jobs 8 --depth 1 | 
 |       - id: "gcp-auth" | 
 |         name: "Authenticating to Google Cloud" | 
 |         if: needs.setup.outputs.write-caches == 1 | 
 |         uses: "google-github-actions/auth@v1" | 
 |         with: | 
 |           token_format: "access_token" | 
 |           credentials_json: "${{ secrets.IREE_OSS_GITHUB_RUNNER_BASIC_TRUST_SERVICE_ACCOUNT_KEY }}" | 
 |           create_credentials_file: false | 
 |       - name: "Setting up Python" | 
 |         uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4.5.0 | 
 |         with: | 
 |           python-version: "3.10" # Needs pybind >= 2.10.1 for Python >= 3.11 | 
 |       - name: "Installing Python packages" | 
 |         run: | | 
 |           python3 -m venv .venv | 
 |           .venv/Scripts/activate.bat | 
 |           python3 -m pip install -r runtime/bindings/python/iree/runtime/build_requirements.txt | 
 |       - name: "Installing requirements" | 
 |         run: choco install ccache --yes | 
 |       - name: "Configuring MSVC" | 
 |         uses: ilammy/msvc-dev-cmd@7315a94840631165970262a99c72cfb48a65d25d # v1.12.0 | 
 |       # Finally: build and run tests. | 
 |       - name: "Building IREE" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |           IREE_CCACHE_GCP_TOKEN: ${{ steps.gcp-auth.outputs.access_token }} | 
 |           CCACHE_NAMESPACE: github-windows-2022-64core | 
 |         run: | | 
 |           ./build_tools/cmake/build_all.sh "${BUILD_DIR}" | 
 |       - name: "Testing IREE" | 
 |         run: ./build_tools/cmake/ctest_all.sh "${BUILD_DIR}" | 
 |  | 
 |   build_test_all_macos_arm64: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_test_all_macos_arm64') | 
 |     runs-on: | 
 |       - ${{ github.repository == 'openxla/iree' && 'self-hosted' || 'macos-11' }} # must come first | 
 |       - runner-group=postsubmit | 
 |       - os-family=macOS | 
 |     env: | 
 |       BUILD_DIR: build-macos | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: "Updating git submodules" | 
 |         run: git submodule update --init --jobs 8 --depth 1 | 
 |       - name: "Installing Python packages" | 
 |         run: | | 
 |           python3 -m venv .venv | 
 |           source .venv/bin/activate | 
 |           python3 -m pip install -r runtime/bindings/python/iree/runtime/build_requirements.txt | 
 |       - name: "Building IREE" | 
 |         env: | 
 |           IREE_READ_REMOTE_CCACHE: 0 | 
 |           IREE_WRITE_REMOTE_CCACHE: 0 | 
 |           IREE_READ_LOCAL_CCACHE: 1 | 
 |           IREE_WRITE_LOCAL_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |           # We'll remove the GITHUB_WORKSPACE directory after the job. | 
 |           # Persist the cache by storing in the parent directory. | 
 |           CCACHE_DIR: ${{ github.workspace }}/../.ccache | 
 |           CCACHE_MAXSIZE: 30G | 
 |         run: | | 
 |           source .venv/bin/activate | 
 |           bash ./build_tools/cmake/build_all.sh "${BUILD_DIR}" | 
 |       - name: "Testing IREE" | 
 |         run: | | 
 |           source .venv/bin/activate | 
 |           IREE_METAL_DISABLE=0 bash ./build_tools/cmake/ctest_all.sh "${BUILD_DIR}" | 
 |  | 
 |   build_test_all_macos_x86_64: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_test_all_macos_x86_64') | 
 |     runs-on: macos-13-xl | 
 |     env: | 
 |       BUILD_DIR: build-macos | 
 |     defaults: | 
 |       run: | 
 |         shell: bash | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - id: "gcp-auth" | 
 |         name: "Authenticating to Google Cloud" | 
 |         if: needs.setup.outputs.write-caches == 1 | 
 |         uses: "google-github-actions/auth@v1" | 
 |         with: | 
 |           token_format: "access_token" | 
 |           credentials_json: "${{ secrets.IREE_OSS_GITHUB_RUNNER_BASIC_TRUST_SERVICE_ACCOUNT_KEY }}" | 
 |           create_credentials_file: false | 
 |       - name: "Updating git submodules" | 
 |         run: git submodule update --init --jobs 8 --depth 1 | 
 |       # There are multiple versions of Xcode and SDKs installed on the macOS runner. | 
 |       # Select the latest Xcode app to enable using Metal offline toolchain. | 
 |       - name: "Update Xcode command line tools path" | 
 |         run: | | 
 |           sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer | 
 |           xcrun metal --version | 
 |           xcrun metallib --version | 
 |       - name: "Setting up Python" | 
 |         uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4.5.0 | 
 |         with: | 
 |           python-version: "3.10" | 
 |           cache: "pip" | 
 |       - name: "Installing Python packages" | 
 |         run: pip install -r runtime/bindings/python/iree/runtime/build_requirements.txt | 
 |       - name: "Installing requirements" | 
 |         # We need coreutils for `realpath` used in scripts. | 
 |         # We need bash because the default one on macOS is fairly old and lacks | 
 |         # features we use in scripts. | 
 |         run: brew install ninja ccache coreutils bash | 
 |       # Finally: build and run tests. | 
 |       - name: "Building IREE" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |           IREE_CCACHE_GCP_TOKEN: ${{ steps.gcp-auth.outputs.access_token }} | 
 |           CCACHE_NAMESPACE: github-macos-12-xl | 
 |         run: bash ./build_tools/cmake/build_all.sh "${BUILD_DIR}" | 
 |       - name: "Testing IREE" | 
 |         run: bash ./build_tools/cmake/ctest_all.sh "${BUILD_DIR}" | 
 |  | 
 |   build_test_all_bazel: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_test_all_bazel') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building with Bazel" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_BAZEL_CACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_WRITE_REMOTE_BAZEL_CACHE=${IREE_WRITE_REMOTE_BAZEL_CACHE}" \ | 
 |             gcr.io/iree-oss/swiftshader-bleeding-edge@sha256:89656f131eb6efc97585f6b71b2cedbaa9ae79b539362d2545b19a9bbaf7501c \ | 
 |             ./build_tools/bazel/build_core.sh | 
 |  | 
 |   test_all: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'test_all') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${BUILD_DIR_GCS_ARTIFACT}" "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Testing all" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env IREE_CUDA_DISABLE=1 \ | 
 |             gcr.io/iree-oss/swiftshader@sha256:066672cc54693e3ab7d557521cf1dcb4fab8ea839262470650b85bf27696de4b \ | 
 |             ./build_tools/cmake/ctest_all.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   test_gpu: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'test_gpu') | 
 |     env: | 
 |       BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - gpu | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: Querying GPU information | 
 |         run: | | 
 |           ./build_tools/scripts/check_cuda.sh | 
 |           ./build_tools/scripts/check_vulkan.sh | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${BUILD_DIR_GCS_ARTIFACT}" "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Testing all" | 
 |         env: | 
 |           IREE_NVIDIA_SM80_TESTS_DISABLE: 1 | 
 |           IREE_MULTI_DEVICE_TESTS_DISABLE: 1 | 
 |           IREE_CTEST_LABEL_REGEX: ^requires-gpu|^driver=vulkan$|^driver=cuda$ | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |               --env IREE_NVIDIA_SM80_TESTS_DISABLE \ | 
 |               --env IREE_MULTI_DEVICE_TESTS_DISABLE \ | 
 |               --env IREE_CTEST_LABEL_REGEX \ | 
 |               --env IREE_VULKAN_F16_DISABLE=0 \ | 
 |               --env IREE_CUDA_DISABLE=0 \ | 
 |               --env IREE_NVIDIA_GPU_TESTS_DISABLE=0 \ | 
 |               --env CTEST_PARALLEL_LEVEL=2 \ | 
 |               --env NVIDIA_DRIVER_CAPABILITIES=all \ | 
 |               --gpus all \ | 
 |               gcr.io/iree-oss/nvidia@sha256:67fdc8ce6b3042b75b7f3b48ba4b1639ded49961a32e7eab88324d558ca34df4 \ | 
 |               bash -euo pipefail -c \ | 
 |                 "./build_tools/scripts/check_cuda.sh | 
 |                 ./build_tools/scripts/check_vulkan.sh | 
 |                 ./build_tools/cmake/ctest_all.sh ${BUILD_DIR}" | 
 |  | 
 |   test_a100: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'test_a100') | 
 |     env: | 
 |       BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - a100 | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: Querying GPU information | 
 |         run: | | 
 |           ./build_tools/scripts/check_cuda.sh | 
 |           ./build_tools/scripts/check_vulkan.sh | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${BUILD_DIR_GCS_ARTIFACT}" "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Testing all" | 
 |         env: | 
 |           IREE_NVIDIA_SM80_TESTS_DISABLE: 0 | 
 |           IREE_MULTI_DEVICE_TESTS_DISABLE: 1 | 
 |           IREE_CTEST_LABEL_REGEX: ^requires-gpu-sm80|^requires-gpu|^driver=vulkan$|^driver=cuda$ | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |               --env IREE_NVIDIA_SM80_TESTS_DISABLE \ | 
 |               --env IREE_MULTI_DEVICE_TESTS_DISABLE \ | 
 |               --env IREE_CTEST_LABEL_REGEX \ | 
 |               --env IREE_VULKAN_F16_DISABLE=0 \ | 
 |               --env IREE_CUDA_DISABLE=0 \ | 
 |               --env IREE_NVIDIA_GPU_TESTS_DISABLE=0 \ | 
 |               --env CTEST_PARALLEL_LEVEL=4 \ | 
 |               --env NVIDIA_DRIVER_CAPABILITIES=all \ | 
 |               --gpus all \ | 
 |               gcr.io/iree-oss/nvidia@sha256:67fdc8ce6b3042b75b7f3b48ba4b1639ded49961a32e7eab88324d558ca34df4 \ | 
 |               bash -euo pipefail -c \ | 
 |                 "./build_tools/scripts/check_cuda.sh | 
 |                 ./build_tools/scripts/check_vulkan.sh | 
 |                 ./build_tools/cmake/ctest_all.sh ${BUILD_DIR}" | 
 |  | 
 |   ################################## Subsets ################################### | 
 |   # Jobs that build some subset of IREE | 
 |   ############################################################################## | 
 |   build_test_runtime: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_test_runtime') | 
 |     runs-on: ubuntu-20.04-64core | 
 |     env: | 
 |       BUILD_DIR: build-runtime | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: "Checking out runtime submodules" | 
 |         run: ./build_tools/scripts/git/update_runtime_submodules.sh | 
 |       - name: "Building runtime" | 
 |         # Note ccache is read-only here since this job runs on a GitHub-hosted runner | 
 |         # and GitHub runners don't have write access to GCS | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "BUILD_PRESET=test" \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_runtime.sh \ | 
 |             "${BUILD_DIR}" | 
 |       - name: "Testing runtime" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env IREE_VULKAN_DISABLE=1 \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/ctest_all.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   build_test_runtime_windows: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_test_runtime_windows') | 
 |     runs-on: windows-2022-64core | 
 |     defaults: | 
 |       run: | 
 |         shell: bash | 
 |     env: | 
 |       BUILD_DIR: build-runtime-windows | 
 |       IREE_VULKAN_DISABLE: 1 | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: "Checking out runtime submodules" | 
 |         run: ./build_tools/scripts/git/update_runtime_submodules.sh | 
 |       - name: "Configuring MSVC" | 
 |         uses: ilammy/msvc-dev-cmd@7315a94840631165970262a99c72cfb48a65d25d # v1.12.0 | 
 |       - name: "Installing Python requirements" | 
 |         run: pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt | 
 |       - name: "Building runtime" | 
 |         env: | 
 |           BUILD_PRESET: "test" | 
 |         run: ./build_tools/cmake/build_runtime.sh "${BUILD_DIR}" | 
 |       - name: "Testing runtime" | 
 |         run: ./build_tools/cmake/ctest_all.sh "${BUILD_DIR}" | 
 |  | 
 |   ################################# Tensorflow ################################# | 
 |   # Jobs that test the IREE-Tensorflow integrations | 
 |   ############################################################################## | 
 |   test_tf_integrations: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'test_tf_integrations') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${BUILD_DIR_GCS_ARTIFACT}" "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Running TF integrations tests" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env IREE_VMVX_DISABLE=0 \ | 
 |             gcr.io/iree-oss/frontends-swiftshader@sha256:cd09b2cea81b5eb8e64ad99a7279ae9799721a4c2bc2def41982fc9e1d528fd6 \ | 
 |             build_tools/cmake/run_tf_tests.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   test_tf_integrations_gpu: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'test_tf_integrations_gpu') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - gpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${BUILD_DIR_GCS_ARTIFACT}" "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${BUILD_DIR_ARCHIVE}" | 
 |       - name: "Running TF integrations tests" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env IREE_LLVM_CPU_DISABLE=1 \ | 
 |             --env IREE_NVIDIA_GPU_TESTS_DISABLE=0 \ | 
 |             --gpus all \ | 
 |             --env NVIDIA_DRIVER_CAPABILITIES=all \ | 
 |             gcr.io/iree-oss/frontends-nvidia@sha256:5b75943978a095ffebfb1b70b06dc4b48dffe13fcc0eedd5f8c82c5215358943 \ | 
 |             bash -euo pipefail -c \ | 
 |               "./build_tools/scripts/check_cuda.sh | 
 |               ./build_tools/scripts/check_vulkan.sh | 
 |               build_tools/cmake/run_tf_tests.sh ${BUILD_DIR}" | 
 |  | 
 |   ############################### Configurations ############################### | 
 |   # Jobs that build IREE in some non-default configuration | 
 |   ############################################################################## | 
 |   python_release_packages: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'python_release_packages') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: Build runtime wheels (Linux) | 
 |         shell: bash | 
 |         env: | 
 |           packages: "iree-runtime" | 
 |           output_dir: "${{ github.workspace }}/bindist" | 
 |           # Note when upgrading: Build just one Python version synced to our | 
 |           # minimum. | 
 |           override_python_versions: cp38-cp38 | 
 |         run: | | 
 |           ./build_tools/python_deploy/build_linux_packages.sh | 
 |       # Note that it is just a trade-off decision to have this serialized | 
 |       # as a separate step vs parallelized as a separate job. The runtime | 
 |       # build is fast, pays the clone/docker overhead and provides early | 
 |       # signal (since it runs in just a couple of minutes). | 
 |       - name: Build compiler wheels (Linux) | 
 |         shell: bash | 
 |         env: | 
 |           packages: "iree-compiler" | 
 |           output_dir: "${{ github.workspace }}/bindist" | 
 |           # Note when upgrading: Build just one Python version synced to our | 
 |           # minimum. | 
 |           override_python_versions: cp38-cp38 | 
 |         run: | | 
 |           ./build_tools/python_deploy/build_linux_packages.sh | 
 |  | 
 |   asan: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'asan') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building and testing with AddressSanitizer" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           # Note that this uses the latest version of the clang compiler, etc. | 
 |           # This gives us access to the latest features and validates that IREE | 
 |           # builds using the latest versions. | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CCACHE_NAMESPACE=swiftshader-bleeding-edge@sha256:c22afc61198e14a98e06e5261149de74c629acd2bc61b82e57ec90e5461b69be" \ | 
 |             gcr.io/iree-oss/swiftshader-bleeding-edge@sha256:89656f131eb6efc97585f6b71b2cedbaa9ae79b539362d2545b19a9bbaf7501c \ | 
 |             ./build_tools/cmake/build_and_test_asan.sh | 
 |  | 
 |   tsan: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'tsan') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building and testing with ThreadSanitizer" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CCACHE_NAMESPACE=gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c" \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_and_test_tsan.sh | 
 |  | 
 |   small_runtime: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'small_runtime') | 
 |     runs-on: ubuntu-20.04-64core | 
 |     env: | 
 |       BUILD_DIR: build-runtime | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: "Checking out runtime submodules" | 
 |         run: ./build_tools/scripts/git/update_runtime_submodules.sh | 
 |       - name: "Building size-optimized runtime" | 
 |         # Note ccache is read-only here since this job runs on a GitHub-hosted runner | 
 |         # and GitHub runners don't have write access to GCS | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_runtime_small.sh \ | 
 |             "${BUILD_DIR}" | 
 |       - name: "Testing runtime" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env IREE_VULKAN_DISABLE=1 \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/ctest_all.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   gcc: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'gcc') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       BUILD_DIR: build-gcc | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building IREE with gcc" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env CC=/usr/bin/gcc-9 \ | 
 |             --env CXX=/usr/bin/g++-9 \ | 
 |             --env CMAKE_BUILD_TYPE=Release \ | 
 |             --env "IREE_TARGET_BACKEND_WEBGPU=OFF" \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CCACHE_NAMESPACE=gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c" \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_all.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   tracing: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'tracing') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       BUILD_DIR: build-tracing | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building IREE with tracing enabled" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           # TODO(#11394): Enable Web GPU | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CCACHE_NAMESPACE=gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c" \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_tracing.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   debug: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'debug') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       BUILD_DIR: build-debug | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building IREE in Debug configuration" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CMAKE_BUILD_TYPE=Debug" \ | 
 |             --env "CCACHE_NAMESPACE=gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c" \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_all.sh \ | 
 |             "${BUILD_DIR}" | 
 |  | 
 |   byo_llvm: | 
 |     needs: setup | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'byo_llvm') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           submodules: true | 
 |       - name: "Building and testing with bring-your-own-LLVM" | 
 |         env: | 
 |           IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CCACHE_NAMESPACE=gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c" \ | 
 |             gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c \ | 
 |             ./build_tools/cmake/build_and_test_byo_llvm.sh | 
 |  | 
 |   ############################### Configurations ############################### | 
 |   # Jobs that build and run IREE e2e tests/benchmarks                          # | 
 |   ############################################################################## | 
 |  | 
 |   build_benchmark_tools: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_benchmark_tools') | 
 |     uses: ./.github/workflows/build_benchmark_tools.yml | 
 |     with: | 
 |       runner-group: ${{ needs.setup.outputs.runner-group }} | 
 |       runner-env: ${{ needs.setup.outputs.runner-env }} | 
 |       build-dir: ${{ needs.build_all.outputs.build-dir }} | 
 |       build-dir-archive: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       build-dir-gcs-artifact: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |  | 
 |   build_e2e_test_artifacts: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_e2e_test_artifacts') | 
 |     uses: ./.github/workflows/build_e2e_test_artifacts.yml | 
 |     with: | 
 |       runner-group: ${{ needs.setup.outputs.runner-group }} | 
 |       runner-env: ${{ needs.setup.outputs.runner-env }} | 
 |       build-dir: ${{ needs.build_all.outputs.build-dir }} | 
 |       build-dir-archive: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       build-dir-gcs-artifact: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |       benchmark-presets: ${{ needs.setup.outputs.benchmark-presets }} | 
 |  | 
 |   compilation_benchmarks: | 
 |     needs: [setup, build_e2e_test_artifacts] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'compilation_benchmarks') && needs.setup.outputs.benchmark-presets != '' | 
 |     uses: ./.github/workflows/benchmark_compilation.yml | 
 |     with: | 
 |       runner-group: ${{ needs.setup.outputs.runner-group }} | 
 |       runner-env: ${{ needs.setup.outputs.runner-env }} | 
 |       e2e-test-artifacts-dir: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-dir }} | 
 |       e2e-test-artifacts-gcs-artifact-dir: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-gcs-artifact-dir }} | 
 |       e2e-test-artifacts-build-log: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-build-log }} | 
 |       e2e-test-artifacts-build-log-gcs-artifact: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-build-log-gcs-artifact }} | 
 |  | 
 |   execution_benchmarks: | 
 |     needs: [setup, build_benchmark_tools, build_e2e_test_artifacts] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'execution_benchmarks') && needs.setup.outputs.benchmark-presets != '' | 
 |     uses: ./.github/workflows/benchmark_execution.yml | 
 |     with: | 
 |       # env.GCS_DIR is also duplicated in this workflow. See the note there on | 
 |       # why this is. | 
 |       runner-group: ${{ needs.setup.outputs.runner-group }} | 
 |       runner-env: ${{ needs.setup.outputs.runner-env }} | 
 |       e2e-test-artifacts-dir: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-dir }} | 
 |       e2e-test-artifacts-gcs-artifact-dir: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-gcs-artifact-dir }} | 
 |       benchmark-tools-gcs-artifact-dir: ${{ needs.build_benchmark_tools.outputs.benchmark-tools-gcs-artifact-dir }} | 
 |  | 
 |   process_benchmark_results: | 
 |     needs: [setup, compilation_benchmarks, execution_benchmarks] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'process_benchmark_results') && needs.setup.outputs.benchmark-presets != '' | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     env: | 
 |       COMPILE_STATS_RESULTS: ${{ needs.compilation_benchmarks.outputs.compile-stats-results }} | 
 |       COMPILE_STATS_RESULTS_GCS_ARTIFACT: ${{ needs.compilation_benchmarks.outputs.compile-stats-results-gcs-artifact }} | 
 |       # Empty if no execution benchmark runs. | 
 |       EXECUTION_BENCHMARK_RESULTS_DIR: ${{ needs.execution_benchmarks.outputs.benchmark-results-dir }} | 
 |       # Empty if no execution benchmark runs. | 
 |       EXECUTION_BENCHMARK_RESULTS_GCS_ARTIFACT_DIR: ${{ needs.execution_benchmarks.outputs.benchmark-results-gcs-artifact-dir }} | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |         with: | 
 |           # We need the full history (and main branch) to generate the report. | 
 |           fetch-depth: 0 | 
 |       - name: Downloading compilation benchmark results | 
 |         run: | | 
 |           gcloud storage cp \ | 
 |             "${COMPILE_STATS_RESULTS_GCS_ARTIFACT}" \ | 
 |             "${COMPILE_STATS_RESULTS}" | 
 |       - name: Downloading execution benchmark results | 
 |         id: download-execution-results | 
 |         # Skip the download if there is no execution benchmark results (e.g. no | 
 |         # benchmark matches the preset/filter). In such case, no benchmark job | 
 |         # is run in benchmark_execution.yml and the output variables are empty. | 
 |         if: env.EXECUTION_BENCHMARK_RESULTS_GCS_ARTIFACT_DIR != '' | 
 |         run: | | 
 |           gcloud storage cp -r \ | 
 |             "${EXECUTION_BENCHMARK_RESULTS_GCS_ARTIFACT_DIR}/benchmark-results-*.json" \ | 
 |             "${EXECUTION_BENCHMARK_RESULTS_DIR}" | 
 |           echo "execution-benchmark-results-pattern=${EXECUTION_BENCHMARK_RESULTS_DIR}/benchmark-results-*.json" >> "${GITHUB_OUTPUT}" | 
 |       - name: Generating comment | 
 |         if: fromJson(needs.setup.outputs.is-pr) | 
 |         id: generate-comment | 
 |         env: | 
 |           # Wildcard pattern to match all execution benchmark results. Empty if | 
 |           # execution_benchmarks is skipped, which results in no match. | 
 |           EXECUTION_BENCHMARK_RESULTS_PATTERN: ${{ steps.download-execution-results.outputs.execution-benchmark-results-pattern }} | 
 |           IREE_BUILD_URL: https://github.com/openxla/iree/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }} | 
 |           PR_NUMBER: ${{ github.event.pull_request.number }} | 
 |           BENCHMARK_COMMENT_ARTIFACT: benchmark-comment.json | 
 |         run: | | 
 |           build_tools/github_actions/docker_run.sh \ | 
 |             gcr.io/iree-oss/benchmark-report@sha256:7498c6f32f63f13faf085463cc38656d4297519c824e63e1c99c8c258147f6ff \ | 
 |             ./build_tools/benchmarks/generate_benchmark_comment.py \ | 
 |               --verbose \ | 
 |               --pr_number="${PR_NUMBER}" \ | 
 |               --pr_committish="${GITHUB_SHA}" \ | 
 |               --pr_base_branch="origin/${GITHUB_BASE_REF}" \ | 
 |               --comment_type="benchmark-summary" \ | 
 |               --build_url="${IREE_BUILD_URL}" \ | 
 |               --benchmark_files="${EXECUTION_BENCHMARK_RESULTS_PATTERN}" \ | 
 |               --compile_stats_files="${COMPILE_STATS_RESULTS}" \ | 
 |               --output="${BENCHMARK_COMMENT_ARTIFACT}" | 
 |           echo "benchmark-comment-artifact=${BENCHMARK_COMMENT_ARTIFACT}" >> "${GITHUB_OUTPUT}" | 
 |       - name: Uploading comment artifact | 
 |         # Due to security reasons, instead of posting the comment to PR, we only | 
 |         # upload the comment data in presubmit workflow and trigger the posting | 
 |         # workflow on the main branch. See post_benchmark_comment.yaml | 
 |         if: fromJson(needs.setup.outputs.is-pr) | 
 |         env: | 
 |           BENCHMARK_COMMENT_ARTIFACT: ${{ steps.generate-comment.outputs.benchmark-comment-artifact }} | 
 |           BENCHMARK_COMMENT_GCS_ARTIFACT: ${{ env.GCS_DIR }}/${{ steps.generate-comment.outputs.benchmark-comment-artifact }} | 
 |         run: | | 
 |           gcloud storage cp \ | 
 |             "${BENCHMARK_COMMENT_ARTIFACT}" \ | 
 |             "${BENCHMARK_COMMENT_GCS_ARTIFACT}" | 
 |       - name: Uploading results to dashboard | 
 |         if: github.ref_name == 'main' | 
 |         env: | 
 |           EXECUTION_BENCHMARK_RESULTS_PATTERN: ${{ steps.download-execution-results.outputs.execution-benchmark-results-pattern }} | 
 |           IREE_DASHBOARD_API_TOKEN: ${{ secrets.IREE_DASHBOARD_API_TOKEN }} | 
 |         run: | | 
 |           build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_DASHBOARD_API_TOKEN=${IREE_DASHBOARD_API_TOKEN}" \ | 
 |             gcr.io/iree-oss/benchmark-report@sha256:7498c6f32f63f13faf085463cc38656d4297519c824e63e1c99c8c258147f6ff \ | 
 |             ./build_tools/benchmarks/upload_benchmarks_to_dashboard.py \ | 
 |               --verbose \ | 
 |               --benchmark_files="${EXECUTION_BENCHMARK_RESULTS_PATTERN}" \ | 
 |               --compile_stats_files="${COMPILE_STATS_RESULTS}" | 
 |  | 
 |   ############################## Crosscompilation ############################## | 
 |   # Jobs that cross-compile IREE for other platforms | 
 |   ############################################################################## | 
 |  | 
 |   cross_compile_and_test: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'cross_compile_and_test') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     strategy: | 
 |       matrix: | 
 |         target: | 
 |           - platform: linux | 
 |             arch: riscv_64 | 
 |             abi: lp64d | 
 |             docker_image: "gcr.io/iree-oss/riscv@sha256:564c8b9c11fb6917df61643b04644a5503ba33b5747d6277ba6b1c8b932cf99a" | 
 |             build_script: "./build_tools/cmake/build_riscv.sh" | 
 |             test_script: "./build_tools/cmake/test_riscv.sh" | 
 |           - platform: linux | 
 |             arch: riscv_32 | 
 |             abi: ilp32d | 
 |             docker_image: "gcr.io/iree-oss/riscv@sha256:564c8b9c11fb6917df61643b04644a5503ba33b5747d6277ba6b1c8b932cf99a" | 
 |             build_script: "./build_tools/cmake/build_riscv.sh" | 
 |             test_script: "./build_tools/cmake/test_riscv.sh" | 
 |           - platform: generic | 
 |             arch: riscv_32 | 
 |             abi: ilp32 | 
 |             docker_image: "gcr.io/iree-oss/riscv@sha256:564c8b9c11fb6917df61643b04644a5503ba33b5747d6277ba6b1c8b932cf99a" | 
 |             build_script: "./build_tools/cmake/build_riscv.sh" | 
 |             test_script: "./tests/riscv32/smoke.sh" | 
 |           - platform: emscripten | 
 |             arch: wasm32 | 
 |             abi: wasm32 | 
 |             docker_image: "gcr.io/iree-oss/emscripten@sha256:bab9c2fe2821a195c82dab1ad0e3231d55a3151833ef413eba43735689a1f750" | 
 |             build_script: "./build_tools/cmake/build_runtime_emscripten.sh" | 
 |             # No test script | 
 |  | 
 |     env: | 
 |       PLATFORM: ${{ matrix.target.platform }} | 
 |       ARCH: ${{ matrix.target.arch }} | 
 |       ABI: ${{ matrix.target.abi }} | 
 |       DOCKER_IMAGE: ${{ matrix.target.docker_image }} | 
 |       BUILD_SCRIPT: ${{ matrix.target.build_script }} | 
 |       TEST_SCRIPT: ${{ matrix.target.test_script }} | 
 |       HOST_BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       HOST_BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       HOST_BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |       TARGET_BUILD_DIR: build-${{ matrix.target.platform }}-${{ matrix.target.arch }} | 
 |       IREE_WRITE_REMOTE_CCACHE: ${{ needs.setup.outputs.write-caches }} | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: "Checking out runtime submodules" | 
 |         run: ./build_tools/scripts/git/update_runtime_submodules.sh | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${HOST_BUILD_DIR_GCS_ARTIFACT}" "${HOST_BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${HOST_BUILD_DIR_ARCHIVE}" "${HOST_BUILD_DIR}/install" | 
 |       - name: "Build cross-compiling target" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_CCACHE_GCP_TOKEN=$(gcloud auth application-default print-access-token)" \ | 
 |             --env "IREE_WRITE_REMOTE_CCACHE=${IREE_WRITE_REMOTE_CCACHE}" \ | 
 |             --env "CCACHE_NAMESPACE=${DOCKER_IMAGE}" \ | 
 |             --env "IREE_TARGET_PLATFORM=${PLATFORM}" \ | 
 |             --env "IREE_TARGET_ARCH=${ARCH}" \ | 
 |             --env "IREE_TARGET_ABI=${ABI}" \ | 
 |             --env "IREE_TARGET_BUILD_DIR=${TARGET_BUILD_DIR}" \ | 
 |             --env "BUILD_PRESET=test" \ | 
 |             --env "IREE_HOST_BIN_DIR=${HOST_BUILD_DIR}/install/bin" \ | 
 |             "${DOCKER_IMAGE}" \ | 
 |             "${BUILD_SCRIPT}" | 
 |       - name: "Test cross-compiling target" | 
 |         if: matrix.target.test_script | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_TARGET_PLATFORM=${PLATFORM}" \ | 
 |             --env "IREE_TARGET_ARCH=${ARCH}" \ | 
 |             --env "IREE_TARGET_BUILD_DIR=${TARGET_BUILD_DIR}" \ | 
 |             --env "BUILD_PRESET=test" \ | 
 |             "${DOCKER_IMAGE}" \ | 
 |             "${TEST_SCRIPT}" | 
 |  | 
 |   # Android cross-compilation and test is separated from cross_compile_and_test | 
 |   # because some tests need to run on physical devices instead of emulators. And | 
 |   # we need a fine-control on which tests only run on postsubmit as some devices | 
 |   # are not scalable (while we want to test with Android emulator on ARM VMs on | 
 |   # presubmit), which requires dynamic matrix generation (because "if" condition | 
 |   # can't access matrix variable to skip certain matrix jobs for presubmit). | 
 |   build_and_test_android: | 
 |     needs: [setup, build_all] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'build_and_test_android') | 
 |     uses: ./.github/workflows/build_and_test_android.yml | 
 |     with: | 
 |       runner-group: ${{ needs.setup.outputs.runner-group }} | 
 |       runner-env: ${{ needs.setup.outputs.runner-env }} | 
 |       write-caches: ${{ needs.setup.outputs.write-caches }} | 
 |       is-pr: ${{ fromJson(needs.setup.outputs.is-pr) }} | 
 |       build-dir: ${{ needs.build_all.outputs.build-dir }} | 
 |       build-dir-archive: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       build-dir-gcs-artifact: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |  | 
 |   test_benchmark_suites: | 
 |     needs: [setup, build_all, build_e2e_test_artifacts] | 
 |     if: contains(fromJson(needs.setup.outputs.enabled-jobs), 'test_benchmark_suites') | 
 |     runs-on: | 
 |       - self-hosted # must come first | 
 |       - runner-group=${{ needs.setup.outputs.runner-group }} | 
 |       - environment=${{ needs.setup.outputs.runner-env }} | 
 |       - cpu | 
 |       - os-family=Linux | 
 |     strategy: | 
 |       matrix: | 
 |         target: | 
 |           - platform: linux | 
 |             arch: riscv_64 | 
 |             docker_image: "gcr.io/iree-oss/riscv@sha256:564c8b9c11fb6917df61643b04644a5503ba33b5747d6277ba6b1c8b932cf99a" | 
 |             run_scripts: "./build_tools/cmake/build_riscv.sh && ./build_tools/cmake/test_riscv.sh" | 
 |           - platform: linux | 
 |             arch: riscv_32 | 
 |             docker_image: "gcr.io/iree-oss/riscv@sha256:564c8b9c11fb6917df61643b04644a5503ba33b5747d6277ba6b1c8b932cf99a" | 
 |             run_scripts: "./build_tools/cmake/build_riscv.sh && ./build_tools/cmake/test_riscv.sh" | 
 |           - platform: linux | 
 |             arch: x86_64 | 
 |             docker_image: "gcr.io/iree-oss/base@sha256:ec7faf4d80655fd436b324716bea4504ed47375dbf018e36b835f1d8ed10991c" | 
 |             run_scripts: "./build_tools/cmake/test_benchmark_suites_on_linux.sh" | 
 |     env: | 
 |       PLATFORM: ${{ matrix.target.platform }} | 
 |       ARCH: ${{ matrix.target.arch }} | 
 |       DOCKER_IMAGE: ${{ matrix.target.docker_image }} | 
 |       RUN_SCRIPTS: ${{ matrix.target.run_scripts }} | 
 |       HOST_BUILD_DIR: ${{ needs.build_all.outputs.build-dir }} | 
 |       HOST_BUILD_DIR_ARCHIVE: ${{ needs.build_all.outputs.build-dir-archive }} | 
 |       HOST_BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact }} | 
 |       TARGET_BUILD_DIR: build-${{ matrix.target.platform }}-${{ matrix.target.arch }} | 
 |       E2E_TEST_ARTIFACTS_DIR: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-dir }} | 
 |       E2E_TEST_ARTIFACTS_GCS_ARTIFACT_DIR: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-gcs-artifact-dir }} | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: "Checking out runtime submodules" | 
 |         run: ./build_tools/scripts/git/update_runtime_submodules.sh | 
 |       - name: "Downloading build dir archive" | 
 |         run: gcloud storage cp "${HOST_BUILD_DIR_GCS_ARTIFACT}" "${HOST_BUILD_DIR_ARCHIVE}" | 
 |       - name: "Extracting build dir archive" | 
 |         run: tar -xf "${HOST_BUILD_DIR_ARCHIVE}" "${HOST_BUILD_DIR}/install" | 
 |       # TODO(#11136): Only download the needed artifacts instead of everything. | 
 |       - name: "Downloading e2e test artifacts" | 
 |         run: | | 
 |           mkdir -p ${E2E_TEST_ARTIFACTS_DIR} | 
 |           gcloud storage cp -r "${E2E_TEST_ARTIFACTS_GCS_ARTIFACT_DIR}/*" "${E2E_TEST_ARTIFACTS_DIR}" | 
 |       - name: "Download benchmark expected output" | 
 |         env: | 
 |           EXPECTED_OUTPUT_GSC_ARTIFACT: gs://iree-model-artifacts/deeplab_v3_fp32_input_0_expected_output.npy | 
 |           EXPECTED_OUTPUT_FILE: deeplab_v3_fp32_input_0_expected_output.npy | 
 |         run: | | 
 |           gcloud storage cp "${EXPECTED_OUTPUT_GSC_ARTIFACT}" "${E2E_TEST_ARTIFACTS_DIR}/${EXPECTED_OUTPUT_FILE}" | 
 |       - name: "Build iree-run-module and test benchmark suite modules" | 
 |         run: | | 
 |           ./build_tools/github_actions/docker_run.sh \ | 
 |             --env "IREE_TARGET_PLATFORM=${PLATFORM}" \ | 
 |             --env "IREE_TARGET_ARCH=${ARCH}" \ | 
 |             --env "IREE_TARGET_BUILD_DIR=${TARGET_BUILD_DIR}" \ | 
 |             --env "BUILD_PRESET=benchmark-suite-test" \ | 
 |             --env "IREE_HOST_BIN_DIR=${HOST_BUILD_DIR}/install/bin" \ | 
 |             --env "E2E_TEST_ARTIFACTS_DIR=${E2E_TEST_ARTIFACTS_DIR}" \ | 
 |             "${DOCKER_IMAGE}" \ | 
 |             bash -euo pipefail -c \ | 
 |               "${RUN_SCRIPTS}" | 
 |  | 
 |   ############################################################################## | 
 |  | 
 |   # Depends on all the other jobs to provide a single anchor that indicates the | 
 |   # final status. Status reporting will become more sophisticated in the future | 
 |   # and we can hopefully avoid the need to explicitly list every single job... | 
 |   summary: | 
 |     # Even if you have an explicit if condition, you still need to override | 
 |     # GitHub's default behavior of not running if any dependencies failed. | 
 |     if: always() | 
 |     runs-on: ubuntu-20.04 | 
 |     needs: | 
 |       - setup | 
 |  | 
 |       # Basic | 
 |       - build_all | 
 |       - test_all | 
 |       - build_test_all_bazel | 
 |  | 
 |       # Platforms | 
 |       - build_test_all_windows | 
 |       - build_test_all_macos_arm64 | 
 |       - build_test_all_macos_x86_64 | 
 |  | 
 |       # Accelerators | 
 |       - test_gpu | 
 |       - test_a100 | 
 |  | 
 |       # Subsets | 
 |       - build_test_runtime | 
 |       - build_test_runtime_windows | 
 |  | 
 |       # Tensorflow | 
 |       - test_tf_integrations | 
 |       - test_tf_integrations_gpu | 
 |  | 
 |       # Configurations | 
 |       - python_release_packages | 
 |       - asan | 
 |       - tsan | 
 |       - small_runtime | 
 |       - gcc | 
 |       - tracing | 
 |       - debug | 
 |       - byo_llvm | 
 |  | 
 |       # Crosscompilation | 
 |       - cross_compile_and_test | 
 |       - build_and_test_android | 
 |  | 
 |       # Artifacts for e2e testing and benchmarking | 
 |       - build_benchmark_tools | 
 |       - build_e2e_test_artifacts | 
 |  | 
 |       # Test modules from benchmark pipeline | 
 |       - test_benchmark_suites | 
 |  | 
 |       # Benchmark pipeline | 
 |       - compilation_benchmarks | 
 |       - execution_benchmarks | 
 |       - process_benchmark_results | 
 |     steps: | 
 |       - name: "Checking out repository" | 
 |         uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 | 
 |       - name: Getting failed jobs | 
 |         id: failed_jobs | 
 |         run: | | 
 |           echo '${{ toJson(needs) }}' | 
 |           FAILED_JOBS="$(echo '${{ toJson(needs) }}' \ | 
 |             | jq --raw-output \ | 
 |             'map_values(select(.result!="success" and .result!="skipped")) | keys | join(",")' \ | 
 |           )" | 
 |           echo "failed-jobs=${FAILED_JOBS}" >> $GITHUB_OUTPUT | 
 |           if [[ "${FAILED_JOBS}" != "" ]]; then | 
 |             echo "The following jobs failed: ${FAILED_JOBS}" | 
 |             exit 1 | 
 |           fi | 
 |       - name: Show useful artifact links | 
 |         if: always() | 
 |         env: | 
 |           # If the job of an artifact is skipped or failed, we show "NOT_PRESENT". | 
 |           BUILD_DIR_GCS_ARTIFACT: ${{ needs.build_all.outputs.build-dir-gcs-artifact || 'NOT_PRESENT' }} | 
 |           E2E_TEST_ARTIFACTS_GCS_ARTIFACT_DIR: ${{ needs.build_e2e_test_artifacts.outputs.e2e-test-artifacts-gcs-artifact-dir || 'NOT_PRESENT' }} | 
 |           BENCHMARK_TOOLS_GCS_ARTIFACT_DIR: ${{ needs.build_benchmark_tools.outputs.benchmark-tools-gcs-artifact-dir || 'NOT_PRESENT' }} | 
 |           EXECUTION_BENCHMARK_RESULTS_GCS_ARTIFACT_DIR: ${{ needs.execution_benchmarks.outputs.benchmark-results-gcs-artifact-dir || 'NOT_PRESENT' }} | 
 |           COMPILATION_BENCHMARK_RESULTS_GCS_ARTIFACT: ${{ needs.compilation_benchmarks.outputs.compile-stats-results-gcs-artifact || 'NOT_PRESENT' }} | 
 |         run: | | 
 |           envsubst < ./.github/workflows/ARTIFACT_SUMMARY_TEMPLATE.md >> "${GITHUB_STEP_SUMMARY}" | 
 |       - name: Posting to Discord | 
 |         uses: sarisia/actions-status-discord@61114b793b460ee85fe38ad3fccc78c7ead38d55 # v1.11.1 | 
 |         if: failure() && github.ref_name == 'main' | 
 |         with: | 
 |           webhook: ${{ secrets.DISCORD_WEBHOOK }} | 
 |           description: "The following jobs failed: ${{ steps.failed_jobs.outputs.failed-jobs }}" | 
 |           url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}" |