From 57406ff21e4192e3185fac776c94ef9a87ebcfe8 Mon Sep 17 00:00:00 2001 From: Andrew Lazarev Date: Wed, 6 Aug 2025 13:58:55 -0700 Subject: [PATCH] Revert "[WebAssembly] Constant fold wasm.dot (#149619)" This reverts commit 9c6bb180407a7db004624d13d9de108d7cebc73c. --- llvm/lib/Analysis/ConstantFolding.cpp | 25 --------- .../InstSimplify/ConstProp/WebAssembly/dot.ll | 56 ------------------- 2 files changed, 81 deletions(-) delete mode 100644 llvm/test/Transforms/InstSimplify/ConstProp/WebAssembly/dot.ll diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 4969528a1b29b..dd98b62baca33 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1659,7 +1659,6 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) { case Intrinsic::aarch64_sve_convert_from_svbool: case Intrinsic::wasm_alltrue: case Intrinsic::wasm_anytrue: - case Intrinsic::wasm_dot: // WebAssembly float semantics are always known case Intrinsic::wasm_trunc_signed: case Intrinsic::wasm_trunc_unsigned: @@ -3990,30 +3989,6 @@ static Constant *ConstantFoldFixedVectorCall( } return ConstantVector::get(Result); } - case Intrinsic::wasm_dot: { - unsigned NumElements = - cast(Operands[0]->getType())->getNumElements(); - - assert(NumElements == 8 && Result.size() == 4 && - "wasm dot takes i16x8 and produces i32x4"); - assert(Ty->isIntegerTy()); - int32_t MulVector[8]; - - for (unsigned I = 0; I < NumElements; ++I) { - ConstantInt *Elt0 = - cast(Operands[0]->getAggregateElement(I)); - ConstantInt *Elt1 = - cast(Operands[1]->getAggregateElement(I)); - - MulVector[I] = Elt0->getSExtValue() * Elt1->getSExtValue(); - } - for (unsigned I = 0; I < Result.size(); I++) { - int32_t IAdd = MulVector[I * 2] + MulVector[I * 2 + 1]; - Result[I] = ConstantInt::get(Ty, IAdd); - } - - return ConstantVector::get(Result); - } default: break; } diff --git a/llvm/test/Transforms/InstSimplify/ConstProp/WebAssembly/dot.ll b/llvm/test/Transforms/InstSimplify/ConstProp/WebAssembly/dot.ll deleted file mode 100644 index b537b7bccf861..0000000000000 --- a/llvm/test/Transforms/InstSimplify/ConstProp/WebAssembly/dot.ll +++ /dev/null @@ -1,56 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 - -; RUN: opt -passes=instsimplify -S < %s | FileCheck %s - -; Test that intrinsics wasm dot call are constant folded - -target triple = "wasm32-unknown-unknown" - - -define <4 x i32> @dot_zero() { -; CHECK-LABEL: define <4 x i32> @dot_zero() { -; CHECK-NEXT: ret <4 x i32> zeroinitializer -; - %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> zeroinitializer, <8 x i16> zeroinitializer) - ret <4 x i32> %res -} - -; a = 1 2 3 4 5 6 7 8 -; b = 1 2 3 4 5 6 7 8 -; k1|k2 = a * b = 1 4 9 16 25 36 49 64 -; k1 + k2 = (1+4) | (9 + 16) | (25 + 36) | (49 + 64) -; result = 5 | 25 | 61 | 113 -define <4 x i32> @dot_nonzero() { -; CHECK-LABEL: define <4 x i32> @dot_nonzero() { -; CHECK-NEXT: ret <4 x i32> -; - %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> , <8 x i16> ) - ret <4 x i32> %res -} - -define <4 x i32> @dot_doubly_negative() { -; CHECK-LABEL: define <4 x i32> @dot_doubly_negative() { -; CHECK-NEXT: ret <4 x i32> splat (i32 2) -; - %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> , <8 x i16> ) - ret <4 x i32> %res -} - -; Tests that i16 max signed values fit in i32 -define <4 x i32> @dot_follow_modulo_spec_1() { -; CHECK-LABEL: define <4 x i32> @dot_follow_modulo_spec_1() { -; CHECK-NEXT: ret <4 x i32> -; - %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> , <8 x i16> ) - ret <4 x i32> %res -} - -; Tests that i16 min signed values fit in i32 -define <4 x i32> @dot_follow_modulo_spec_2() { -; CHECK-LABEL: define <4 x i32> @dot_follow_modulo_spec_2() { -; CHECK-NEXT: ret <4 x i32> -; - %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> , <8 x i16> ) - ret <4 x i32> %res -} -