Author: Derek Schuff Date: 2025-12-04T16:54:47-08:00 New Revision: 3bea66b89bf7212bad6699beb49d1d1bd5a8c23a
URL: https://github.com/llvm/llvm-project/commit/3bea66b89bf7212bad6699beb49d1d1bd5a8c23a DIFF: https://github.com/llvm/llvm-project/commit/3bea66b89bf7212bad6699beb49d1d1bd5a8c23a.diff LOG: Revert "[WebAssembly] Implement addrspacecast to funcref (#166820)" This reverts commit d3b9fd0f86d2936b7ed8446f6d54817772753f52. Added: Modified: llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td Removed: llvm/test/CodeGen/WebAssembly/addrspacecast-funcref.ll ################################################################################ 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 -} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
