[llvm] [WebAssembly] Combine i128 to v16i8 for setcc & expand memcmp for 16 byte loads with simd128 (PR #149461)

Jasmine Tang via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 13 16:30:22 PDT 2025


badumbatish wrote:

i tried adding some simple print debugging to this, and found sth a bit weird: if i print the memcmp result before the assertion, then i dont get the assertion error.

For example, modify the test loop in the first test to be this and it doesn't crash anymore
```cpp
        for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
                int32x4_t a = vld1q_s32(test_vec[i].a);
                int32x4_t b = vld1q_s32(test_vec[i].b);
                int32x4_t r = vaddq_s32(a, b);
                int32_t r_[4];
                vst1q_s32(r_, r);
                printf("At %zu\n", i);
                printf("Byte of r_  : %02X %02X %02X %02X\n", r_[0], r_[1], r_[2], r_[3]);
                printf("Byte of test: %02X %02X %02X %02X\n", test_vec[i].r[0], test_vec[i].r[1], test_vec[i].r[2], test_vec[i].r[3]);
                // comment or uncomment the following line
                printf("Memcmp result: %d\n\n", memcmp(r_, test_vec[i].r, sizeof(int32_t) * 4));
                assert(memcmp(r_, test_vec[i].r, sizeof(int32_t) * 4) == 0);
        }
```

If i comment out the memcmp result, then i get the following error
```
Testing NEON Wasm SIMD
At 0
Byte of r_  : 8A64C799 484D47E1 9BBF3942 B38F111F
Byte of test: 8A64C799 484D47E1 9BBF3942 B38F111F
Aborted(Assertion failed: memcmp(r_, test_vec[i].r, sizeof(int32_t) * 4) == 0, at: test/neon/test_neon_wasm_simd.cpp,58,test_simde_vaddq_s32)
```

Compiler exits successfully (no assertion error) in the case of printing out the memcmp result, with the following log
```
 em++ test/neon/test_neon_wasm_simd.cpp -O2 -mfpu=neon -msimd128 -o temp.js -v  && node temp.js
 "/Users/jjasmine/Developer/igalia/llvm-project/build.wasm/bin/clang++" -target wasm32-unknown-emscripten -fignore-exceptions -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=/Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot -DEMSCRIPTEN -D__SSE__=1 -D__ARM_NEON__=1 -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -O2 -msimd128 -v -c test/neon/test_neon_wasm_simd.cpp -o /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/test_neon_wasm_simd_0.o
clang version 22.0.0git (git at github.com:badumbatish/llvm-project.git 9d2b041c6d4d41d18f89f19f54c6fcef68c5e106)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/bin
Build config: +assertions
 (in-process)
 "/Users/jjasmine/Developer/igalia/llvm-project/build.wasm/bin/clang-22" -cc1 -triple wasm32-unknown-emscripten -O2 -emit-obj -disable-free -clear-ast-before-backend -main-file-name test_neon_wasm_simd.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -target-feature +simd128 -fvisibility=hidden -debugger-tuning=gdb -fdebug-compilation-dir=/Users/jjasmine/Developer/igalia/emscripten -target-linker-version 1167.4.1 -v -fcoverage-compilation-dir=/Users/jjasmine/Developer/igalia/emscripten -resource-dir /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/lib/clang/22 -D EMSCRIPTEN -D __SSE__=1 -D __ARM_NEON__=1 -isysroot /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/lib/clang/22/include -internal-isystem /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include -fdeprecated-macro -ferror-limit 19 -fmessage-length=154 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fignore-exceptions -fexceptions -fcolor-diagnostics -vectorize-loops -vectorize-slp -iwithsysroot/include/fakesdl -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/test_neon_wasm_simd_0.o -x c++ test/neon/test_neon_wasm_simd.cpp
clang -cc1 version 22.0.0git based upon LLVM 22.0.0git default target arm64-apple-darwin24.5.0
ignoring nonexistent directory "/Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
 /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
 /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/compat
 /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
 /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/lib/clang/22/include
 /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
 /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/bin/clang --version
 /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/bin/wasm-ld -o temp.wasm /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/test_neon_wasm_simd_0.o -L/Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -L/Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/src/lib -lGL-getprocaddr -lal -lhtml5 -lstubs -lnoexit -lc -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/tmphto8ux8elibemscripten_js_symbols.so --strip-debug --export=_emscripten_stack_alloc --export=__wasm_call_ctors --export=emscripten_stack_get_current --export=_emscripten_stack_restore --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=main --export-if-defined=__main_argc_argv --export-table -z stack-size=65536 --no-growable-memory --initial-heap=16777216 --no-entry --table-base=1 --global-base=1024
 /Users/jjasmine/Developer/igalia/llvm-project/build.wasm/bin/llvm-objcopy temp.wasm temp.wasm '--remove-section=.debug*' --remove-section=producers --remove-section=name
 /Users/jjasmine/Developer/igalia/emsdk/node/22.16.0_64bit/bin/node /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/tools/compiler.mjs -
 /Users/jjasmine/Developer/igalia/emsdk/upstream/bin/wasm-opt --strip-target-features --post-emscripten -O2 --low-memory-unused --zero-filled-memory --pass-arg=directize-initial-contents-immutable temp.wasm -o temp.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext --enable-simd
 /Users/jjasmine/Developer/igalia/emsdk/upstream/bin/wasm-opt --strip-target-features --post-emscripten -O2 --low-memory-unused --zero-filled-memory --pass-arg=directize-initial-contents-immutable temp.wasm -o temp.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext --enable-simd
 /Users/jjasmine/Developer/igalia/emsdk/node/22.16.0_64bit/bin/node /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/temp.js JSDCE --minify-whitespace -o /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/temp.jso1.js
 /Users/jjasmine/Developer/igalia/emsdk/node/22.16.0_64bit/bin/node /Users/jjasmine/Developer/igalia/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/temp.js JSDCE --minify-whitespace -o /var/folders/c0/kq37c8513t97ry4__zw2x5f40000gn/T/emscripten_temp_fwfndkwi/temp.jso1.js
Testing NEON Wasm SIMD
At 0
Byte of r_  : 8A64C799 484D47E1 9BBF3942 B38F111F
Byte of test: 8A64C799 484D47E1 9BBF3942 B38F111F
Memcmp result: 0

At 1
Byte of r_  : DA07F2F6 7D20533A AC17DF8C 945FA5F0
Byte of test: DA07F2F6 7D20533A AC17DF8C 945FA5F0
Memcmp result: 0

At 2
Byte of r_  : E6FA39AC 1A631C8C EBC479FA 277E2320
Byte of test: E6FA39AC 1A631C8C EBC479FA 277E2320
Memcmp result: 0

At 3
Byte of r_  : 3A5C20AD 3452BE3A 591F1838 187E9D39
Byte of test: 3A5C20AD 3452BE3A 591F1838 187E9D39
Memcmp result: 0

At 4
Byte of r_  : 49985D0F 567EEA1C 3BAD9E00 F9542D3A
Byte of test: 49985D0F 567EEA1C 3BAD9E00 F9542D3A
Memcmp result: 0

At 5
Byte of r_  : AD084A90 36028635 5E70B023 1556C5DC
Byte of test: AD084A90 36028635 5E70B023 1556C5DC
Memcmp result: 0

At 6
Byte of r_  : 570C5B21 48E0DE0 9961FDBD AEAEB8C2
Byte of test: 570C5B21 48E0DE0 9961FDBD AEAEB8C2
Memcmp result: 0

At 7
Byte of r_  : 2BE4B64B 812F71C3 331A906F C0E1C947
Byte of test: 2BE4B64B 812F71C3 331A906F C0E1C947
Memcmp result: 0

Success!
```

https://github.com/llvm/llvm-project/pull/149461


More information about the llvm-commits mailing list