Skip to content

Conversation

@dschuff
Copy link
Member

@dschuff dschuff commented Dec 5, 2025

Reverts #166820
There was a failure in the ENABLE_EXPENSIVE_CHECKS configuration.

@dschuff dschuff enabled auto-merge (squash) December 5, 2025 00:55
@llvmbot
Copy link
Member

llvmbot commented Dec 5, 2025

@llvm/pr-subscribers-backend-webassembly

Author: Derek Schuff (dschuff)

Changes

Reverts llvm/llvm-project#166820
There was a failure in the ENABLE_EXPENSIVE_CHECKS configuration.


Full diff: https://github.com/llvm/llvm-project/pull/170785.diff

4 Files Affected:

  • (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (-58)
  • (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h (-1)
  • (modified) llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td (+1-6)
  • (removed) llvm/test/CodeGen/WebAssembly/addrspacecast-funcref.ll (-55)
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index 06176f84106a8..e0c527b9b2581 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -411,10 +411,6 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
   setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::Other, Custom);
   setOperationAction(ISD::INTRINSIC_VOID, MVT::Other, Custom);
 
-  // Allow converting function ptrs in address space 0 to Wasm funcref (address
-  // space 20)
-  setOperationAction(ISD::ADDRSPACECAST, MVT::funcref, Custom);
-
   setMaxAtomicSizeInBitsSupported(64);
 
   // Always convert switches to br_tables unless there is only one case, which
@@ -1760,8 +1756,6 @@ SDValue WebAssemblyTargetLowering::LowerOperation(SDValue Op,
     return LowerMUL_LOHI(Op, DAG);
   case ISD::UADDO:
     return LowerUADDO(Op, DAG);
-  case ISD::ADDRSPACECAST:
-    return LowerADDRSPACECAST(Op, DAG);
   }
 }
 
@@ -1905,58 +1899,6 @@ SDValue WebAssemblyTargetLowering::LowerUADDO(SDValue Op,
   return DAG.getMergeValues(Ops, DL);
 }
 
-SDValue WebAssemblyTargetLowering::LowerADDRSPACECAST(SDValue Op,
-                                                      SelectionDAG &DAG) const {
-  SDLoc DL(Op);
-
-  AddrSpaceCastSDNode *ACN = cast<AddrSpaceCastSDNode>(Op.getNode());
-
-  if (ACN->getSrcAddressSpace() !=
-          WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_DEFAULT ||
-      ACN->getDestAddressSpace() !=
-          WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_FUNCREF)
-    return SDValue();
-
-  if (ACN->getValueType(0) != MVT::funcref) {
-    reportFatalInternalError("Cannot addrspacecast to funcref addrspace with "
-                             "results other than MVT::funcref");
-  }
-
-  SDValue Src = ACN->getOperand(0);
-
-  // Lower addrspacecasts of direct/constant function ptrs to ref.func
-  if (auto *GA = dyn_cast<GlobalAddressSDNode>(
-          Src->getOpcode() == WebAssemblyISD::Wrapper ? Src->getOperand(0)
-                                                      : Src)) {
-    auto *GV = GA->getGlobal();
-
-    if (const Function *F = dyn_cast<Function>(GV)) {
-      SDValue FnAddress = DAG.getTargetGlobalAddress(F, DL, MVT::i32);
-
-      SDValue RefFuncNode =
-          DAG.getNode(WebAssemblyISD::REF_FUNC, DL, MVT::funcref, FnAddress);
-      return RefFuncNode;
-    }
-  }
-
-  // Lower everything else to a table.get from the indirect function table
-  const MachineFunction &MF = DAG.getMachineFunction();
-
-  MVT PtrVT = getPointerTy(MF.getDataLayout());
-
-  MCSymbolWasm *Table =
-      WebAssembly::getOrCreateFunctionTableSymbol(MF.getContext(), Subtarget);
-  SDValue TableSym = DAG.getMCSymbol(Table, PtrVT);
-
-  SDValue TableSlot = Op.getOperand(0);
-
-  SDValue Result(DAG.getMachineNode(WebAssembly::TABLE_GET_FUNCREF, DL,
-                                    MVT::funcref, TableSym, TableSlot),
-                 0);
-
-  return Result;
-}
-
 SDValue WebAssemblyTargetLowering::Replace128Op(SDNode *N,
                                                 SelectionDAG &DAG) const {
   assert(Subtarget->hasWideArithmetic());
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
index 11ff6a9a12e45..c37970f458e36 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
@@ -121,7 +121,6 @@ class WebAssemblyTargetLowering final : public TargetLowering {
   SDValue LowerMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
   SDValue Replace128Op(SDNode *N, SelectionDAG &DAG) const;
   SDValue LowerUADDO(SDValue Op, SelectionDAG &DAG) const;
-  SDValue LowerADDRSPACECAST(SDValue Op, SelectionDAG &DAG) const;
 
   // Custom DAG combine hooks
   SDValue
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
index 2589ab758638c..304c4f3fcb028 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td
@@ -11,11 +11,6 @@
 ///
 //===----------------------------------------------------------------------===//
 
-def WebAssemblyRefFunc_t : SDTypeProfile<1, 1, [SDTCisVT<0, funcref>, SDTCisPtrTy<1>]>;
-def WebAssemblyRefFunc :
-    SDNode<"WebAssemblyISD::REF_FUNC", WebAssemblyRefFunc_t,
-           []>;
-
 multiclass REF_I<WebAssemblyRegClass rc, ValueType vt, string ht> {
   defm REF_NULL_#rc : I<(outs rc:$dst), (ins),
                         (outs), (ins),
@@ -47,7 +42,7 @@ defm REF_TEST_FUNCREF : I<(outs I32:$res), (ins TypeIndex:$type, FUNCREF:$ref),
                         Requires<[HasGC]>;
 
 defm REF_FUNC : I<(outs FUNCREF:$res), (ins function32_op:$func),
-                    (outs), (ins function32_op:$func), [(set FUNCREF:$res, (WebAssemblyRefFunc tglobaladdr:$func))],
+                    (outs), (ins function32_op:$func), [],
                     "ref.func\t$func", "ref.func $func", 0xd2>,
                 Requires<[HasReferenceTypes]>;
 
diff --git a/llvm/test/CodeGen/WebAssembly/addrspacecast-funcref.ll b/llvm/test/CodeGen/WebAssembly/addrspacecast-funcref.ll
deleted file mode 100644
index f0a5989a4c811..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/addrspacecast-funcref.ll
+++ /dev/null
@@ -1,55 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
-; RUN: llc -mtriple=wasm32-unknown-unknown -mattr=+reference-types < %s | FileCheck -check-prefixes=CHECK,WASM32 %s
-; RUN: llc -mtriple=wasm64-unknown-unknown -mattr=+reference-types < %s | FileCheck -check-prefixes=CHECK,WASM64 %s
-
-%funcref = type ptr addrspace(20) ;; addrspace 20 is nonintegral
-
-declare void @foo();
-
-@global_var = local_unnamed_addr global i32 0
-
-define %funcref @cast_const_funcptr() {
-; CHECK-LABEL: cast_const_funcptr:
-; CHECK:         .functype cast_const_funcptr () -> (funcref)
-; CHECK-NEXT:  # %bb.0:
-; CHECK-NEXT:    ref.func foo
-; CHECK-NEXT:    # fallthrough-return
-  %result = addrspacecast ptr @foo to %funcref
-  ret %funcref %result
-}
-
-define %funcref @cast_const_not_funcptr() {
-; WASM32-LABEL: cast_const_not_funcptr:
-; WASM32:         .functype cast_const_not_funcptr () -> (funcref)
-; WASM32-NEXT:  # %bb.0:
-; WASM32-NEXT:    i32.const global_var
-; WASM32-NEXT:    table.get __indirect_function_table
-; WASM32-NEXT:    # fallthrough-return
-;
-; WASM64-LABEL: cast_const_not_funcptr:
-; WASM64:         .functype cast_const_not_funcptr () -> (funcref)
-; WASM64-NEXT:  # %bb.0:
-; WASM64-NEXT:    i64.const global_var
-; WASM64-NEXT:    table.get __indirect_function_table
-; WASM64-NEXT:    # fallthrough-return
-  %result = addrspacecast ptr @global_var to %funcref
-  ret %funcref %result
-}
-
-define %funcref @cast_param_funcptr(ptr %funcptr) {
-; WASM32-LABEL: cast_param_funcptr:
-; WASM32:         .functype cast_param_funcptr (i32) -> (funcref)
-; WASM32-NEXT:  # %bb.0:
-; WASM32-NEXT:    local.get 0
-; WASM32-NEXT:    table.get __indirect_function_table
-; WASM32-NEXT:    # fallthrough-return
-;
-; WASM64-LABEL: cast_param_funcptr:
-; WASM64:         .functype cast_param_funcptr (i64) -> (funcref)
-; WASM64-NEXT:  # %bb.0:
-; WASM64-NEXT:    local.get 0
-; WASM64-NEXT:    table.get __indirect_function_table
-; WASM64-NEXT:    # fallthrough-return
-  %result = addrspacecast ptr %funcptr to %funcref
-  ret %funcref %result
-}

@dschuff dschuff disabled auto-merge December 5, 2025 01:24
@dschuff dschuff merged commit 6d60d3d into main Dec 5, 2025
8 of 11 checks passed
@dschuff dschuff deleted the revert-166820-wasm-ref-func-addrspace-lowering branch December 5, 2025 01:24
@llvm-ci
Copy link
Collaborator

llvm-ci commented Dec 5, 2025

LLVM Buildbot has detected a new failure on builder mlir-nvidia-gcc7 running on mlir-nvidia while building llvm at step 7 "test-build-check-mlir-build-only-check-mlir".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/116/builds/21828

Here is the relevant piece of the build log for the reference
Step 7 (test-build-check-mlir-build-only-check-mlir) failure: test (failure)
******************** TEST 'MLIR :: Integration/GPU/CUDA/async.mlir' FAILED ********************
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.src/mlir/test/Integration/GPU/CUDA/async.mlir  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -gpu-kernel-outlining  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -pass-pipeline='builtin.module(gpu.module(strip-debuginfo,convert-gpu-to-nvvm),nvvm-attach-target)'  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -gpu-async-region -gpu-to-llvm -reconcile-unrealized-casts -gpu-module-to-binary="format=fatbin"  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -async-to-async-runtime -async-runtime-ref-counting  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -convert-async-to-llvm -convert-func-to-llvm -convert-arith-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-runner    --shared-libs=/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/lib/libmlir_cuda_runtime.so    --shared-libs=/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/lib/libmlir_async_runtime.so    --shared-libs=/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/lib/libmlir_runner_utils.so    --entry-point-result=void -O0  | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/FileCheck /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.src/mlir/test/Integration/GPU/CUDA/async.mlir
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.src/mlir/test/Integration/GPU/CUDA/async.mlir
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -gpu-kernel-outlining
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt '-pass-pipeline=builtin.module(gpu.module(strip-debuginfo,convert-gpu-to-nvvm),nvvm-attach-target)'
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -gpu-async-region -gpu-to-llvm -reconcile-unrealized-casts -gpu-module-to-binary=format=fatbin
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -async-to-async-runtime -async-runtime-ref-counting
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-opt -convert-async-to-llvm -convert-func-to-llvm -convert-arith-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/mlir-runner --shared-libs=/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/lib/libmlir_cuda_runtime.so --shared-libs=/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/lib/libmlir_async_runtime.so --shared-libs=/vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/lib/libmlir_runner_utils.so --entry-point-result=void -O0
# .---command stderr------------
# | 'cuStreamWaitEvent(stream, event, 0)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuEventDestroy(event)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuStreamWaitEvent(stream, event, 0)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuEventDestroy(event)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuStreamWaitEvent(stream, event, 0)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuStreamWaitEvent(stream, event, 0)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuEventDestroy(event)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuEventDestroy(event)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuEventSynchronize(event)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# | 'cuEventDestroy(event)' failed with 'CUDA_ERROR_CONTEXT_IS_DESTROYED'
# `-----------------------------
# executed command: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.obj/bin/FileCheck /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.src/mlir/test/Integration/GPU/CUDA/async.mlir
# .---command stderr------------
# | /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.src/mlir/test/Integration/GPU/CUDA/async.mlir:68:12: error: CHECK: expected string not found in input
# |  // CHECK: [84, 84]
# |            ^
# | <stdin>:1:1: note: scanning from here
# | Unranked Memref base@ = 0x59a72f896610 rank = 1 offset = 0 sizes = [2] strides = [1] data = 
# | ^
# | <stdin>:2:1: note: possible intended match here
# | [42, 42]
# | ^
# | 
# | Input file: <stdin>
# | Check file: /vol/worker/mlir-nvidia/mlir-nvidia-gcc7/llvm.src/mlir/test/Integration/GPU/CUDA/async.mlir
# | 
# | -dump-input=help explains the following input dump.
# | 
# | Input was:
# | <<<<<<
# |             1: Unranked Memref base@ = 0x59a72f896610 rank = 1 offset = 0 sizes = [2] strides = [1] data =  
# | check:68'0     X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found
# |             2: [42, 42] 
# | check:68'0     ~~~~~~~~~
# | check:68'1     ?         possible intended match
...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants