From 7c6b61a9db32fdf8abe19b10067eb224d21736a2 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Apr 2026 12:42:58 -0700 Subject: [PATCH 1/4] start --- .github/workflows/ci.yml | 7 +- .github/workflows/create_release.yml | 6 +- .../merge-similar-functions_recursion.wast | 951 ++++++++++++++++++ 3 files changed, 961 insertions(+), 3 deletions(-) create mode 100644 test/lit/passes/merge-similar-functions_recursion.wast diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 600768b9cdb..75ddc691741 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -221,7 +221,7 @@ jobs: # Run tests on Alpine Linux, which we use to make our release builds. # Note: Alpine uses musl libc. - # Keep in sync with build_release.yml. The only difference is that here we + # Keep in sync with create_release.yml. The only difference is that here we # do not have the "archive" and "upload tarball" jobs. build-alpine: name: alpine @@ -259,8 +259,11 @@ jobs: run: ./alpine.sh pip3 install --break-system-packages -r requirements-dev.txt - name: cmake + # Build with an 8MB stack size, as otherwise Alpine/musl's default stack + # size for pthreads is tiny, + # https://github.com/WebAssembly/binaryen/issues/8594 run: | - ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install + ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_EXE_LINKER_FLAGS="-Wl,-z,stack-size=8388608" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install - name: build run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index ed8bb2fb6c4..07cbdc8fef5 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -108,6 +108,7 @@ jobs: ${{ steps.archive-arm64.outputs.SHASUM }} # Build with gcc 6.3 and run tests on Alpine Linux (inside chroot). + # Keep in sync with ci.yml. # Note: Alpine uses musl libc. build-alpine: name: alpine @@ -145,8 +146,11 @@ jobs: run: ./alpine.sh pip3 install --break-system-packages -r requirements-dev.txt - name: cmake + # Build with an 8MB stack size, as otherwise Alpine/musl's default stack + # size for pthreads is tiny, + # https://github.com/WebAssembly/binaryen/issues/8594 run: | - ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install + ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_EXE_LINKER_FLAGS="-Wl,-z,stack-size=8388608" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install - name: build run: | diff --git a/test/lit/passes/merge-similar-functions_recursion.wast b/test/lit/passes/merge-similar-functions_recursion.wast new file mode 100644 index 00000000000..f6a9d21ad08 --- /dev/null +++ b/test/lit/passes/merge-similar-functions_recursion.wast @@ -0,0 +1,951 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; RUN: foreach %s %t wasm-opt -all --merge-similar-functions -S -o - | filecheck %s + +;; This has very deep recursion of calls, which end up processed recursively in +;; the pass. This should still work even on Alpine/musl which has very small +;; default stack sizes. +(module + (rec + (type $0 (sub (struct))) + (type $2 (sub $0 (struct))) + (type $1 (sub $0 (struct))) + (type $4 (sub final $0 (struct))) + (type $5 (sub final $2 (struct))) + (type $6 (sub final $0 (struct))) + (type $7 (sub final $1 (struct))) + (type $8 (sub final $1 (struct))) + (type $11 (sub final $0 (struct (field (ref null $0)) (field (ref null $8)) (field (ref null $7)) (field (ref null $6)) (field (ref null $6)) (field (ref null $12)) (field (ref null $6)) (field (ref null $0)) (field (ref null $6)) (field (ref null $7)) (field (ref null $5)) (field (ref null $12)) (field (ref null $6)) (field (ref null $4)) (field (ref null $7)) (field (ref null $12)) (field (ref null $12)) (field (ref null $12)) (field (ref null $12))))) + (type $12 (sub final $0 (struct))) + (type $13 (func (param (ref null $0)) (result (ref null $12)))) + (type $17 (func (param (ref null $12) (ref null $0)) (result (ref (exact $12))))) + ) + (func $0 (type $17) (param $0 (ref null $12)) (param $1 (ref null $0)) (result (ref (exact $12))) + (unreachable) + ) + (func $3 (type $13) (param $0 (ref null $0)) (result (ref null $12)) + (local $1 (ref (exact $12))) + (local $2 (ref null (exact $12))) + (local $3 (ref null $11)) + (drop + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (call $0 + (local.tee $1 + (ref.as_non_null + (local.get $2) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 0 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 1 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 2 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 3 + (local.get $3) + ) + ) + (local.get $1) + ) + (local.get $1) + ) + (struct.get $11 4 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (local.get $1) + ) + (struct.get $11 5 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 6 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 7 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 8 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 9 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 10 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 11 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 12 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (struct.get $11 13 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 14 + (local.get $3) + ) + ) + (local.get $1) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (struct.get $11 15 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 16 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 17 + (local.get $3) + ) + ) + (local.get $1) + ) + (struct.get $11 18 + (local.get $3) + ) + ) + (local.get $1) + ) + (ref.as_non_null + (local.get $2) + ) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (local.get $1) + ) + (ref.null none) + ) + (local.get $1) + ) + (ref.null none) + ) + ) + (local.get $1) + ) +) From 6dd42b61fb0cdb471cb5ce21536892047a48ccef Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Apr 2026 12:44:15 -0700 Subject: [PATCH 2/4] test --- .../merge-similar-functions_recursion.wast | 942 ++++++++++++++++++ 1 file changed, 942 insertions(+) diff --git a/test/lit/passes/merge-similar-functions_recursion.wast b/test/lit/passes/merge-similar-functions_recursion.wast index f6a9d21ad08..459ae7f3a89 100644 --- a/test/lit/passes/merge-similar-functions_recursion.wast +++ b/test/lit/passes/merge-similar-functions_recursion.wast @@ -6,22 +6,964 @@ ;; default stack sizes. (module (rec + ;; CHECK: (rec + ;; CHECK-NEXT: (type $0 (sub (struct))) (type $0 (sub (struct))) + ;; CHECK: (type $2 (sub $0 (struct))) (type $2 (sub $0 (struct))) + ;; CHECK: (type $1 (sub $0 (struct))) (type $1 (sub $0 (struct))) + ;; CHECK: (type $4 (sub final $0 (struct))) (type $4 (sub final $0 (struct))) + ;; CHECK: (type $5 (sub final $2 (struct))) (type $5 (sub final $2 (struct))) + ;; CHECK: (type $6 (sub final $0 (struct))) (type $6 (sub final $0 (struct))) + ;; CHECK: (type $7 (sub final $1 (struct))) (type $7 (sub final $1 (struct))) + ;; CHECK: (type $8 (sub final $1 (struct))) (type $8 (sub final $1 (struct))) + ;; CHECK: (type $11 (sub final $0 (struct (field (ref null $0)) (field (ref null $8)) (field (ref null $7)) (field (ref null $6)) (field (ref null $6)) (field (ref null $12)) (field (ref null $6)) (field (ref null $0)) (field (ref null $6)) (field (ref null $7)) (field (ref null $5)) (field (ref null $12)) (field (ref null $6)) (field (ref null $4)) (field (ref null $7)) (field (ref null $12)) (field (ref null $12)) (field (ref null $12)) (field (ref null $12))))) (type $11 (sub final $0 (struct (field (ref null $0)) (field (ref null $8)) (field (ref null $7)) (field (ref null $6)) (field (ref null $6)) (field (ref null $12)) (field (ref null $6)) (field (ref null $0)) (field (ref null $6)) (field (ref null $7)) (field (ref null $5)) (field (ref null $12)) (field (ref null $6)) (field (ref null $4)) (field (ref null $7)) (field (ref null $12)) (field (ref null $12)) (field (ref null $12)) (field (ref null $12))))) + ;; CHECK: (type $12 (sub final $0 (struct))) (type $12 (sub final $0 (struct))) + ;; CHECK: (type $13 (func (param (ref null $0)) (result (ref null $12)))) (type $13 (func (param (ref null $0)) (result (ref null $12)))) + ;; CHECK: (type $17 (func (param (ref null $12) (ref null $0)) (result (ref (exact $12))))) (type $17 (func (param (ref null $12) (ref null $0)) (result (ref (exact $12))))) ) + ;; CHECK: (func $0 (type $17) (param $0 (ref null $12)) (param $1 (ref null $0)) (result (ref (exact $12))) + ;; CHECK-NEXT: (unreachable) + ;; CHECK-NEXT: ) (func $0 (type $17) (param $0 (ref null $12)) (param $1 (ref null $0)) (result (ref (exact $12))) (unreachable) ) + ;; CHECK: (func $3 (type $13) (param $0 (ref null $0)) (result (ref null $12)) + ;; CHECK-NEXT: (local $1 (ref (exact $12))) + ;; CHECK-NEXT: (local $2 (ref null (exact $12))) + ;; CHECK-NEXT: (local $3 (ref null $11)) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (call $0 + ;; CHECK-NEXT: (local.tee $1 + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 0 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 1 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 2 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 3 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 4 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 5 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 6 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 7 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 8 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 9 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 10 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 11 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 12 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 13 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 14 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 15 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 16 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 17 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get $11 18 + ;; CHECK-NEXT: (local.get $3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (local.get $2) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null none) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $1) + ;; CHECK-NEXT: ) (func $3 (type $13) (param $0 (ref null $0)) (result (ref null $12)) (local $1 (ref (exact $12))) (local $2 (ref null (exact $12))) From 0386aa3f2aa3a259128a67bca476c073f37d76b0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Apr 2026 12:47:08 -0700 Subject: [PATCH 3/4] undo the fix to confirm crash on ci --- .github/workflows/ci.yml | 7 ++----- .github/workflows/create_release.yml | 6 +----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 75ddc691741..600768b9cdb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -221,7 +221,7 @@ jobs: # Run tests on Alpine Linux, which we use to make our release builds. # Note: Alpine uses musl libc. - # Keep in sync with create_release.yml. The only difference is that here we + # Keep in sync with build_release.yml. The only difference is that here we # do not have the "archive" and "upload tarball" jobs. build-alpine: name: alpine @@ -259,11 +259,8 @@ jobs: run: ./alpine.sh pip3 install --break-system-packages -r requirements-dev.txt - name: cmake - # Build with an 8MB stack size, as otherwise Alpine/musl's default stack - # size for pthreads is tiny, - # https://github.com/WebAssembly/binaryen/issues/8594 run: | - ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_EXE_LINKER_FLAGS="-Wl,-z,stack-size=8388608" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install + ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install - name: build run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 07cbdc8fef5..ed8bb2fb6c4 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -108,7 +108,6 @@ jobs: ${{ steps.archive-arm64.outputs.SHASUM }} # Build with gcc 6.3 and run tests on Alpine Linux (inside chroot). - # Keep in sync with ci.yml. # Note: Alpine uses musl libc. build-alpine: name: alpine @@ -146,11 +145,8 @@ jobs: run: ./alpine.sh pip3 install --break-system-packages -r requirements-dev.txt - name: cmake - # Build with an 8MB stack size, as otherwise Alpine/musl's default stack - # size for pthreads is tiny, - # https://github.com/WebAssembly/binaryen/issues/8594 run: | - ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_EXE_LINKER_FLAGS="-Wl,-z,stack-size=8388608" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install + ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install - name: build run: | From 374abcf77fde7c93d96b6bf09f40d8e12f96eb8b Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 13 Apr 2026 13:01:45 -0700 Subject: [PATCH 4/4] Revert "undo the fix to confirm crash on ci" This reverts commit 0386aa3f2aa3a259128a67bca476c073f37d76b0. --- .github/workflows/ci.yml | 7 +++++-- .github/workflows/create_release.yml | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 600768b9cdb..75ddc691741 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -221,7 +221,7 @@ jobs: # Run tests on Alpine Linux, which we use to make our release builds. # Note: Alpine uses musl libc. - # Keep in sync with build_release.yml. The only difference is that here we + # Keep in sync with create_release.yml. The only difference is that here we # do not have the "archive" and "upload tarball" jobs. build-alpine: name: alpine @@ -259,8 +259,11 @@ jobs: run: ./alpine.sh pip3 install --break-system-packages -r requirements-dev.txt - name: cmake + # Build with an 8MB stack size, as otherwise Alpine/musl's default stack + # size for pthreads is tiny, + # https://github.com/WebAssembly/binaryen/issues/8594 run: | - ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install + ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_EXE_LINKER_FLAGS="-Wl,-z,stack-size=8388608" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install - name: build run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index ed8bb2fb6c4..07cbdc8fef5 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -108,6 +108,7 @@ jobs: ${{ steps.archive-arm64.outputs.SHASUM }} # Build with gcc 6.3 and run tests on Alpine Linux (inside chroot). + # Keep in sync with ci.yml. # Note: Alpine uses musl libc. build-alpine: name: alpine @@ -145,8 +146,11 @@ jobs: run: ./alpine.sh pip3 install --break-system-packages -r requirements-dev.txt - name: cmake + # Build with an 8MB stack size, as otherwise Alpine/musl's default stack + # size for pthreads is tiny, + # https://github.com/WebAssembly/binaryen/issues/8594 run: | - ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install + ./alpine.sh cmake . -G Ninja -DCMAKE_CXX_FLAGS="-static" -DCMAKE_C_FLAGS="-static" -DCMAKE_EXE_LINKER_FLAGS="-Wl,-z,stack-size=8388608" -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC_LIB=ON -DBUILD_MIMALLOC=ON -DCMAKE_INSTALL_PREFIX=install - name: build run: |