From d2e664022c5b21e9f531c6a93dc67241890b2d6f Mon Sep 17 00:00:00 2001 From: Steven Johnson Date: Tue, 23 Mar 2021 11:36:51 -0700 Subject: [PATCH 1/3] Upgrade WABT to 1.0.22 and do some minimal update to codegen and simd_op_check for LLVM13. --- dependencies/wasm/CMakeLists.txt | 2 +- src/CodeGen_WebAssembly.cpp | 7 +++++ test/correctness/simd_op_check.cpp | 50 +++++++++++++++++------------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/dependencies/wasm/CMakeLists.txt b/dependencies/wasm/CMakeLists.txt index 1d85abbc5fe0..a959fc17fff5 100644 --- a/dependencies/wasm/CMakeLists.txt +++ b/dependencies/wasm/CMakeLists.txt @@ -17,7 +17,7 @@ if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") endif () if (WITH_WABT) - set(WABT_VER 1.0.21) + set(WABT_VER 1.0.22) message(STATUS "Fetching WABT ${WABT_VER}...") FetchContent_Declare(wabt diff --git a/src/CodeGen_WebAssembly.cpp b/src/CodeGen_WebAssembly.cpp index 93183780ccf8..a94e7c78b988 100644 --- a/src/CodeGen_WebAssembly.cpp +++ b/src/CodeGen_WebAssembly.cpp @@ -51,10 +51,17 @@ const WasmIntrinsic intrinsic_defs[] = { {"llvm.uadd.sat.v16i8", UInt(8, 16), "saturating_add", {UInt(8, 16), UInt(8, 16)}, Target::WasmSimd128}, // TODO: Are these really different than the standard llvm.*sub.sat.*? +#if LLVM_VERSION >= 130 + {"llvm.wasm.sub.sat.signed.v16i8", Int(8, 16), "saturating_sub", {Int(8, 16), Int(8, 16)}, Target::WasmSimd128}, + {"llvm.wasm.sub.sat.unsigned.v16i8", UInt(8, 16), "saturating_sub", {UInt(8, 16), UInt(8, 16)}, Target::WasmSimd128}, + {"llvm.wasm.sub.sat.signed.v8i16", Int(16, 8), "saturating_sub", {Int(16, 8), Int(16, 8)}, Target::WasmSimd128}, + {"llvm.wasm.sub.sat.unsigned.v8i16", UInt(16, 8), "saturating_sub", {UInt(16, 8), UInt(16, 8)}, Target::WasmSimd128}, +#else {"llvm.wasm.sub.saturate.signed.v16i8", Int(8, 16), "saturating_sub", {Int(8, 16), Int(8, 16)}, Target::WasmSimd128}, {"llvm.wasm.sub.saturate.unsigned.v16i8", UInt(8, 16), "saturating_sub", {UInt(8, 16), UInt(8, 16)}, Target::WasmSimd128}, {"llvm.wasm.sub.saturate.signed.v8i16", Int(16, 8), "saturating_sub", {Int(16, 8), Int(16, 8)}, Target::WasmSimd128}, {"llvm.wasm.sub.saturate.unsigned.v8i16", UInt(16, 8), "saturating_sub", {UInt(16, 8), UInt(16, 8)}, Target::WasmSimd128}, +#endif {"llvm.wasm.avgr.unsigned.v16i8", UInt(8, 16), "rounding_halving_add", {UInt(8, 16), UInt(8, 16)}, Target::WasmSimd128}, {"llvm.wasm.avgr.unsigned.v8i16", UInt(16, 8), "rounding_halving_add", {UInt(16, 8), UInt(16, 8)}, Target::WasmSimd128}, diff --git a/test/correctness/simd_op_check.cpp b/test/correctness/simd_op_check.cpp index 60a968e6ee0e..0a8b5c739600 100644 --- a/test/correctness/simd_op_check.cpp +++ b/test/correctness/simd_op_check.cpp @@ -1664,25 +1664,32 @@ class SimdOpCheck : public SimdOpCheckTest { if (use_wasm_simd128) { for (int w = 1; w <= 4; w <<= 1) { // create arbitrary 16-byte constant - // TODO(https://github.com/halide/Halide/issues/5130): NOT BEING GENERATED AT TRUNK - // (But will be soon in LLVM13, revisit soon) - // if (Halide::Internal::get_llvm_version() >= 130) { - // check("v128.constant", 16 * w, u8_1 * u8(42 + x)); - // } + if (Halide::Internal::get_llvm_version() >= 130) { + check("v128.const", 16 * w, u8_1 * u8(42 + x)); + } // Create vector with identical lanes // (Note that later LLVMs will use 64-bit constants for some smaller splats) check("i8x16.splat", 16 * w, u8_1 * u8(42)); - if (Halide::Internal::get_llvm_version() >= 120) { - check("i64x2.splat", 8 * w, u16_1 * u16(42)); - check("i64x2.splat", 4 * w, u32_1 * u32(42)); + if (Halide::Internal::get_llvm_version() >= 130) { + // LLVM13 likes to emit all of these as v128.const + check("v128.const", 8 * w, u16_1 * u16(42)); + check("v128.const", 4 * w, u32_1 * u32(42)); + check("v128.const", 2 * w, u64_1 * u64(42)); + check("v128.const", 8 * w, f32_1 * f32(42)); + check("v128.const", 4 * w, f64_1 * f64(42)); } else { - check("i16x8.splat", 8 * w, u16_1 * u16(42)); - check("i32x4.splat", 4 * w, u32_1 * u32(42)); + if (Halide::Internal::get_llvm_version() == 120) { + check("i64x2.splat", 8 * w, u16_1 * u16(42)); + check("i64x2.splat", 4 * w, u32_1 * u32(42)); + } else { + check("i16x8.splat", 8 * w, u16_1 * u16(42)); + check("i32x4.splat", 4 * w, u32_1 * u32(42)); + } + check("i64x2.splat", 2 * w, u64_1 * u64(42)); + check("f32x4.splat", 8 * w, f32_1 * f32(42)); + check("f64x2.splat", 4 * w, f64_1 * f64(42)); } - check("i64x2.splat", 2 * w, u64_1 * u64(42)); - check("f32x4.splat", 8 * w, f32_1 * f32(42)); - check("f64x2.splat", 4 * w, f64_1 * f64(42)); // Extract lane as a scalar (extract_lane) // Replace lane value (replace_lane) @@ -1762,17 +1769,18 @@ class SimdOpCheck : public SimdOpCheckTest { // check("i32x4.extadd_pairwise_i16x8_u", ???, ???); // Saturating integer addition - check("i8x16.add_saturate_s", 16 * w, i8_sat(i16(i8_1) + i16(i8_2))); - check("i8x16.add_saturate_u", 16 * w, u8_sat(u16(u8_1) + u16(u8_2))); - check("i16x8.add_saturate_s", 8 * w, i16_sat(i32(i16_1) + i32(i16_2))); - check("i16x8.add_saturate_u", 8 * w, u16_sat(u32(u16_1) + u32(u16_2))); + std::string sat = Halide::Internal::get_llvm_version() >= 130 ? "sat" : "saturate"; + check("i8x16.add_" + sat + "_s", 16 * w, i8_sat(i16(i8_1) + i16(i8_2))); + check("i8x16.add_" + sat + "_u", 16 * w, u8_sat(u16(u8_1) + u16(u8_2))); + check("i16x8.add_" + sat + "_s", 8 * w, i16_sat(i32(i16_1) + i32(i16_2))); + check("i16x8.add_" + sat + "_u", 8 * w, u16_sat(u32(u16_1) + u32(u16_2))); // Saturating integer subtraction - check("i8x16.sub_saturate_s", 16 * w, i8_sat(i16(i8_1) - i16(i8_2))); - check("i16x8.sub_saturate_s", 8 * w, i16_sat(i32(i16_1) - i32(i16_2))); + check("i8x16.sub_" + sat + "_s", 16 * w, i8_sat(i16(i8_1) - i16(i8_2))); + check("i16x8.sub_" + sat + "_s", 8 * w, i16_sat(i32(i16_1) - i32(i16_2))); // N.B. Saturating subtracts are expressed by widening to a *signed* type - check("i8x16.sub_saturate_u", 16 * w, u8_sat(i16(u8_1) - i16(u8_2))); - check("i16x8.sub_saturate_u", 8 * w, u16_sat(i32(u16_1) - i32(u16_2))); + check("i8x16.sub_" + sat + "_u", 16 * w, u8_sat(i16(u8_1) - i16(u8_2))); + check("i16x8.sub_" + sat + "_u", 8 * w, u16_sat(i32(u16_1) - i32(u16_2))); // Saturating integer Q-format rounding multiplication // TODO: see arm's qrdmulh, probably From 8f79d2b1d1b3847da12891f6b4133da7556376d4 Mon Sep 17 00:00:00 2001 From: Steven Johnson Date: Tue, 23 Mar 2021 15:36:55 -0700 Subject: [PATCH 2/3] tickle From 6bc591c56a4fcb3079b9f90270c47f7c83aae82d Mon Sep 17 00:00:00 2001 From: Steven Johnson Date: Tue, 23 Mar 2021 16:33:53 -0700 Subject: [PATCH 3/3] trigger buildbots