[llvm] Revert "[WebAssembly] Constant fold wasm.dot" (PR #152382)

Andrew Lazarev via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 6 13:59:23 PDT 2025


https://github.com/alazarev created https://github.com/llvm/llvm-project/pull/152382

Reverts llvm/llvm-project#149619

It breaks ubsan bot:
https://lab.llvm.org/buildbot/#/builders/25/builds/10523

Earlier today the failure was hidden by another breakage that is fixed now.

>From 57406ff21e4192e3185fac776c94ef9a87ebcfe8 Mon Sep 17 00:00:00 2001
From: Andrew Lazarev <alazarev at google.com>
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<FixedVectorType>(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<ConstantInt>(Operands[0]->getAggregateElement(I));
-      ConstantInt *Elt1 =
-          cast<ConstantInt>(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> <i32 5, i32 25, i32 61, i32 113>
-;
-  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>, <8 x i16> <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>)
-  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> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
-  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> <i32 2147352578, i32 0, i32 0, i32 0>
-;
-  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 32767, i16 32767, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> <i16 32767, i16 32767, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>)
-  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> <i32 -2147483648, i32 0, i32 0, i32 0>
-;
-  %res = tail call <4 x i32> @llvm.wasm.dot(<8 x i16> <i16 -32768, i16 -32768, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, <8 x i16> <i16 -32768, i16 -32768, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>)
-  ret <4 x i32> %res
-}
-



More information about the llvm-commits mailing list