llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-webassembly Author: Lucile Rose Nihlen (lnihlen) <details> <summary>Changes</summary> This is a re-application of #<!-- -->71540, with the hopes I can get some help from @<!-- -->pmatos and others to finish it. Right now the '../clang/test/CodeGen/WebAssembly/wasm-funcref.c' test fails with an assertion trying to cast the target("wasm.funcref") instruction to a pointer. Looking in to that further but wanted to checkpoint the code here from the first patch. --- Patch is 40.56 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/93428.diff 40 Files Affected: - (modified) clang/test/CodeGen/WebAssembly/builtins-table.c (+8-8) - (modified) clang/test/CodeGen/WebAssembly/wasm-externref.c (+5-4) - (modified) clang/test/CodeGen/WebAssembly/wasm-funcref.c (+20-20) - (modified) clang/test/CodeGen/builtins-wasm.c (+1-1) - (modified) llvm/include/llvm/IR/Intrinsics.h (+2) - (modified) llvm/include/llvm/IR/IntrinsicsWebAssembly.td (+7) - (modified) llvm/lib/CodeGen/ValueTypes.cpp (+4) - (modified) llvm/lib/IR/Function.cpp (+12-2) - (modified) llvm/lib/IR/Type.cpp (+6-4) - (modified) llvm/lib/Target/WebAssembly/CMakeLists.txt (-1) - (modified) llvm/lib/Target/WebAssembly/Utils/WasmAddressSpaces.h (-4) - (modified) llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h (+4-6) - (modified) llvm/lib/Target/WebAssembly/WebAssembly.h (-2) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyISD.def (+3) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (+1-21) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h (-3) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td (+8) - (removed) llvm/lib/Target/WebAssembly/WebAssemblyLowerRefTypesIntPtrConv.cpp (-86) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp (-2) - (modified) llvm/test/CodeGen/WebAssembly/externref-globalget.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/externref-globalset.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/externref-inttoptr.ll (+3-9) - (modified) llvm/test/CodeGen/WebAssembly/externref-ptrtoint.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/externref-tableget.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/externref-tableset.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/externref-unsized-load.ll (+2-2) - (modified) llvm/test/CodeGen/WebAssembly/externref-unsized-store.ll (+2-2) - (modified) llvm/test/CodeGen/WebAssembly/funcref-call.ll (+7-3) - (modified) llvm/test/CodeGen/WebAssembly/funcref-globalget.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/funcref-globalset.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/funcref-table_call.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/funcref-tableget.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/funcref-tableset.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/ref-null.ll (+2-2) - (modified) llvm/test/CodeGen/WebAssembly/table-copy.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/table-fill.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/table-grow.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/table-size.ll (+1-1) - (modified) llvm/test/CodeGen/WebAssembly/table-types.ll (+2-2) - (modified) llvm/utils/gn/secondary/llvm/lib/Target/WebAssembly/BUILD.gn (-1) ``````````diff diff --git a/clang/test/CodeGen/WebAssembly/builtins-table.c b/clang/test/CodeGen/WebAssembly/builtins-table.c index 74bb2442fe552..eeed335855e40 100644 --- a/clang/test/CodeGen/WebAssembly/builtins-table.c +++ b/clang/test/CodeGen/WebAssembly/builtins-table.c @@ -7,17 +7,17 @@ static __externref_t table[0]; // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_get // CHECK-SAME: (i32 noundef [[INDEX:%.*]]) #[[ATTR0:[0-9]+]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = call ptr addrspace(10) @llvm.wasm.table.get.externref(ptr addrspace(1) @table, i32 [[INDEX]]) -// CHECK-NEXT: ret ptr addrspace(10) [[TMP0]] +// CHECK-NEXT: [[TMP0:%.*]] = call target("wasm.externref") @llvm.wasm.table.get.externref(ptr addrspace(1) @table, i32 [[INDEX]]) +// CHECK-NEXT: ret target("wasm.externref") [[TMP0]] // __externref_t test_builtin_wasm_table_get(int index) { return __builtin_wasm_table_get(table, index); } // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_set -// CHECK-SAME: (i32 noundef [[INDEX:%.*]], ptr addrspace(10) [[REF:%.*]]) #[[ATTR0]] { +// CHECK-SAME: (i32 noundef [[INDEX:%.*]], target("wasm.externref") [[REF:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: call void @llvm.wasm.table.set.externref(ptr addrspace(1) @table, i32 [[INDEX]], ptr addrspace(10) [[REF]]) +// CHECK-NEXT: call void @llvm.wasm.table.set.externref(ptr addrspace(1) @table, i32 [[INDEX]], target("wasm.externref") [[REF]]) // CHECK-NEXT: ret void // void test_builtin_wasm_table_set(int index, __externref_t ref) { @@ -35,9 +35,9 @@ int test_builtin_wasm_table_size() { } // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_grow -// CHECK-SAME: (ptr addrspace(10) [[REF:%.*]], i32 noundef [[NELEM:%.*]]) #[[ATTR0]] { +// CHECK-SAME: (target("wasm.externref") [[REF:%.*]], i32 noundef [[NELEM:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.wasm.table.grow.externref(ptr addrspace(1) @table, ptr addrspace(10) [[REF]], i32 [[NELEM]]) +// CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.wasm.table.grow.externref(ptr addrspace(1) @table, target("wasm.externref") [[REF]], i32 [[NELEM]]) // CHECK-NEXT: ret i32 [[TMP0]] // int test_builtin_wasm_table_grow(__externref_t ref, int nelem) { @@ -45,9 +45,9 @@ int test_builtin_wasm_table_grow(__externref_t ref, int nelem) { } // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_fill -// CHECK-SAME: (i32 noundef [[INDEX:%.*]], ptr addrspace(10) [[REF:%.*]], i32 noundef [[NELEM:%.*]]) #[[ATTR0]] { +// CHECK-SAME: (i32 noundef [[INDEX:%.*]], target("wasm.externref") [[REF:%.*]], i32 noundef [[NELEM:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: call void @llvm.wasm.table.fill.externref(ptr addrspace(1) @table, i32 [[INDEX]], ptr addrspace(10) [[REF]], i32 [[NELEM]]) +// CHECK-NEXT: call void @llvm.wasm.table.fill.externref(ptr addrspace(1) @table, i32 [[INDEX]], target("wasm.externref") [[REF]], i32 [[NELEM]]) // CHECK-NEXT: ret void // void test_builtin_wasm_table_fill(int index, __externref_t ref, int nelem) { diff --git a/clang/test/CodeGen/WebAssembly/wasm-externref.c b/clang/test/CodeGen/WebAssembly/wasm-externref.c index 788438bb4a86a..38f3d7289c8d4 100644 --- a/clang/test/CodeGen/WebAssembly/wasm-externref.c +++ b/clang/test/CodeGen/WebAssembly/wasm-externref.c @@ -7,12 +7,13 @@ void helper(externref_t); // CHECK-LABEL: @handle( // CHECK-NEXT: entry: -// CHECK-NEXT: [[OBJ_ADDR:%.*]] = alloca ptr addrspace(10), align 1 -// CHECK-NEXT: store ptr addrspace(10) [[OBJ:%.*]], ptr [[OBJ_ADDR]], align 1 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(10), ptr [[OBJ_ADDR]], align 1 -// CHECK-NEXT: call void @helper(ptr addrspace(10) [[TMP0]]) +// CHECK-NEXT: [[OBJ_ADDR:%.*]] = alloca target("wasm.externref"), align 1 +// CHECK-NEXT: store target("wasm.externref") [[OBJ:%.*]], ptr [[OBJ_ADDR]], align 1 +// CHECK-NEXT: [[TMP0:%.*]] = load target("wasm.externref"), ptr [[OBJ_ADDR]], align 1 +// CHECK-NEXT: call void @helper(target("wasm.externref") [[TMP0]]) // CHECK-NEXT: ret void // void handle(externref_t obj) { helper(obj); } + diff --git a/clang/test/CodeGen/WebAssembly/wasm-funcref.c b/clang/test/CodeGen/WebAssembly/wasm-funcref.c index f01af0db321dd..fa45d87cda74c 100644 --- a/clang/test/CodeGen/WebAssembly/wasm-funcref.c +++ b/clang/test/CodeGen/WebAssembly/wasm-funcref.c @@ -8,8 +8,8 @@ typedef int (*fn_t)(int); // Null funcref builtin call // CHECK-LABEL: @get_null( // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = call ptr addrspace(20) @llvm.wasm.ref.null.func() -// CHECK-NEXT: ret ptr addrspace(20) [[TMP0]] +// CHECK-NEXT: [[TMP0:%.*]] = call target("wasm.funcref") @llvm.wasm.ref.null.func() +// CHECK-NEXT: ret target("wasm.funcref") [[TMP0]] // funcref_t get_null() { return __builtin_wasm_ref_null_func(); @@ -19,8 +19,8 @@ funcref_t get_null() { // default return value for builtin is a funcref with function type () -> (). // CHECK-LABEL: @get_null_ii( // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = call ptr addrspace(20) @llvm.wasm.ref.null.func() -// CHECK-NEXT: ret ptr addrspace(20) [[TMP0]] +// CHECK-NEXT: [[TMP0:%.*]] = call target("wasm.funcref") @llvm.wasm.ref.null.func() +// CHECK-NEXT: ret target("wasm.funcref") [[TMP0]] // fn_funcref_t get_null_ii() { return (fn_funcref_t) __builtin_wasm_ref_null_func(); @@ -29,10 +29,10 @@ fn_funcref_t get_null_ii() { // Identity function for funcref. // CHECK-LABEL: @identity( // CHECK-NEXT: entry: -// CHECK-NEXT: [[FN_ADDR:%.*]] = alloca ptr addrspace(20), align 4 -// CHECK-NEXT: store ptr addrspace(20) [[FN:%.*]], ptr [[FN_ADDR]], align 4 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(20), ptr [[FN_ADDR]], align 4 -// CHECK-NEXT: ret ptr addrspace(20) [[TMP0]] +// CHECK-NEXT: [[FN_ADDR:%.*]] = alloca target("wasm.funcref"), align 4 +// CHECK-NEXT: store target("wasm.funcref") [[FN:%.*]], ptr [[FN_ADDR]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load target("wasm.funcref"), ptr [[FN_ADDR]], align 4 +// CHECK-NEXT: ret target("wasm.funcref") [[TMP0]] // funcref_t identity(funcref_t fn) { return fn; @@ -43,10 +43,10 @@ void helper(funcref_t); // Pass funcref ref as an argument to a helper function. // CHECK-LABEL: @handle( // CHECK-NEXT: entry: -// CHECK-NEXT: [[FN_ADDR:%.*]] = alloca ptr addrspace(20), align 4 -// CHECK-NEXT: store ptr addrspace(20) [[FN:%.*]], ptr [[FN_ADDR]], align 4 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(20), ptr [[FN_ADDR]], align 4 -// CHECK-NEXT: call void @helper(ptr addrspace(20) noundef [[TMP0]]) +// CHECK-NEXT: [[FN_ADDR:%.*]] = alloca target("wasm.funcref"), align 4 +// CHECK-NEXT: store target("wasm.funcref") [[FN:%.*]], ptr [[FN_ADDR]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load target("wasm.funcref"), ptr [[FN_ADDR]], align 4 +// CHECK-NEXT: call void @helper(target("wasm.funcref") noundef [[TMP0]]) // CHECK-NEXT: ret i32 0 // int handle(funcref_t fn) { @@ -60,8 +60,8 @@ int handle(funcref_t fn) { // CHECK-NEXT: [[FNPTR_ADDR:%.*]] = alloca ptr, align 4 // CHECK-NEXT: store ptr [[FNPTR:%.*]], ptr [[FNPTR_ADDR]], align 4 // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[FNPTR_ADDR]], align 4 -// CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to ptr addrspace(20) -// CHECK-NEXT: ret ptr addrspace(20) [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to target("wasm.funcref") +// CHECK-NEXT: ret target("wasm.funcref") [[TMP1]] // fn_funcref_t get_ref(fn_t fnptr) { return (fn_funcref_t) fnptr; @@ -70,13 +70,13 @@ fn_funcref_t get_ref(fn_t fnptr) { // Call funcref // CHECK-LABEL: @call_fn( // CHECK-NEXT: entry: -// CHECK-NEXT: [[REF_ADDR:%.*]] = alloca ptr addrspace(20), align 4 +// CHECK-NEXT: [[REF_ADDR:%.*]] = alloca target("wasm.funcref"), align 4 // CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 -// CHECK-NEXT: store ptr addrspace(20) [[REF:%.*]], ptr [[REF_ADDR]], align 4 +// CHECK-NEXT: store target("wasm.funcref") [[REF:%.*]], ptr [[REF_ADDR]], align 4 // CHECK-NEXT: store i32 [[X:%.*]], ptr [[X_ADDR]], align 4 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(20), ptr [[REF_ADDR]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load target("wasm.funcref"), ptr [[REF_ADDR]], align 4 // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X_ADDR]], align 4 -// CHECK-NEXT: [[CALL:%.*]] = call addrspace(20) i32 [[TMP0]](i32 noundef [[TMP1]]) +// CHECK-NEXT: [[CALL:%.*]] = call i32 [[TMP0]](i32 noundef [[TMP1]]) // CHECK-NEXT: ret i32 [[CALL]] // int call_fn(fn_funcref_t ref, int x) { @@ -91,8 +91,8 @@ typedef fn_funcref_t (*builtin_refnull_t)(); // CHECK-NEXT: [[REFNULL_ADDR:%.*]] = alloca ptr, align 4 // CHECK-NEXT: store ptr [[REFNULL:%.*]], ptr [[REFNULL_ADDR]], align 4 // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[REFNULL_ADDR]], align 4 -// CHECK-NEXT: [[CALL:%.*]] = call ptr addrspace(20) [[TMP0]]() -// CHECK-NEXT: ret ptr addrspace(20) [[CALL]] +// CHECK-NEXT: [[CALL:%.*]] = call target("wasm.funcref") [[TMP0]]() +// CHECK-NEXT: ret target("wasm.funcref") [[CALL]] // fn_funcref_t get_null_fptr(builtin_refnull_t refnull) { return refnull(); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index 93a6ab06081c9..4c6fc1e6b6bb3 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -827,6 +827,6 @@ float extract_lane_f16x8(f16x8 a, int i) { } __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); - // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() + // WEBASSEMBLY: tail call target("wasm.externref") @llvm.wasm.ref.null.extern() // WEBASSEMBLY-NEXT: ret } diff --git a/llvm/include/llvm/IR/Intrinsics.h b/llvm/include/llvm/IR/Intrinsics.h index f79df522dc805..88b28eb362087 100644 --- a/llvm/include/llvm/IR/Intrinsics.h +++ b/llvm/include/llvm/IR/Intrinsics.h @@ -144,6 +144,8 @@ namespace Intrinsic { AMX, PPCQuad, AArch64Svcount, + WasmExternref, + WasmFuncref, } Kind; union { diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index 237f268784bb0..7384a0d8c726e 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -38,6 +38,13 @@ def int_wasm_ref_is_null_func : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_funcref_ty], [IntrNoMem], "llvm.wasm.ref.is_null.func">; +//===----------------------------------------------------------------------===// +// funcref target ext type -> pointer intrinsic +//===----------------------------------------------------------------------===// +def int_wasm_funcref_to_ptr: + DefaultAttrsIntrinsic<[llvm_ptr_ty], [llvm_funcref_ty], + [IntrNoMem], "llvm.wasm.funcref.to_ptr">; + //===----------------------------------------------------------------------===// // Table intrinsics //===----------------------------------------------------------------------===// diff --git a/llvm/lib/CodeGen/ValueTypes.cpp b/llvm/lib/CodeGen/ValueTypes.cpp index 3d5c58d282da5..d2d6696f03dbb 100644 --- a/llvm/lib/CodeGen/ValueTypes.cpp +++ b/llvm/lib/CodeGen/ValueTypes.cpp @@ -604,6 +604,10 @@ MVT MVT::getVT(Type *Ty, bool HandleUnknown){ TargetExtType *TargetExtTy = cast<TargetExtType>(Ty); if (TargetExtTy->getName() == "aarch64.svcount") return MVT(MVT::aarch64svcount); + else if (TargetExtTy->getName() == "wasm.externref") + return MVT(MVT::externref); + else if (TargetExtTy->getName() == "wasm.funcref") + return MVT(MVT::funcref); else if (TargetExtTy->getName().starts_with("spirv.")) return MVT(MVT::spirvbuiltin); if (HandleUnknown) diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index bd06ff82a15a5..40964c7a33eaa 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -1209,10 +1209,10 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, DecodeIITType(NextElt, Infos, Info, OutputTable); return; case IIT_EXTERNREF: - OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 10)); + OutputTable.push_back(IITDescriptor::get(IITDescriptor::WasmExternref, 0)); return; case IIT_FUNCREF: - OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 20)); + OutputTable.push_back(IITDescriptor::get(IITDescriptor::WasmFuncref, 0)); return; case IIT_PTR: OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 0)); @@ -1365,6 +1365,10 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, case IITDescriptor::PPCQuad: return Type::getPPC_FP128Ty(Context); case IITDescriptor::AArch64Svcount: return TargetExtType::get(Context, "aarch64.svcount"); + case IITDescriptor::WasmExternref: + return TargetExtType::get(Context, "wasm.externref"); + case IITDescriptor::WasmFuncref: + return TargetExtType::get(Context, "wasm.funcref"); case IITDescriptor::Integer: return IntegerType::get(Context, D.Integer_Width); @@ -1550,6 +1554,12 @@ static bool matchIntrinsicType( case IITDescriptor::AArch64Svcount: return !isa<TargetExtType>(Ty) || cast<TargetExtType>(Ty)->getName() != "aarch64.svcount"; + case IITDescriptor::WasmExternref: + return !isa<TargetExtType>(Ty) || + cast<TargetExtType>(Ty)->getName() != "wasm.externref"; + case IITDescriptor::WasmFuncref: + return !isa<TargetExtType>(Ty) || + cast<TargetExtType>(Ty)->getName() != "wasm.funcref"; case IITDescriptor::Vector: { VectorType *VT = dyn_cast<VectorType>(Ty); return !VT || VT->getElementCount() != D.Vector_Width || diff --git a/llvm/lib/IR/Type.cpp b/llvm/lib/IR/Type.cpp index 5c61ad9f000b0..3fdc4310a89fd 100644 --- a/llvm/lib/IR/Type.cpp +++ b/llvm/lib/IR/Type.cpp @@ -260,14 +260,12 @@ IntegerType *Type::getIntNTy(LLVMContext &C, unsigned N) { } Type *Type::getWasm_ExternrefTy(LLVMContext &C) { - // opaque pointer in addrspace(10) - static PointerType *Ty = PointerType::get(C, 10); + static TargetExtType *Ty = TargetExtType::get(C, "wasm.externref", {}, {}); return Ty; } Type *Type::getWasm_FuncrefTy(LLVMContext &C) { - // opaque pointer in addrspace(20) - static PointerType *Ty = PointerType::get(C, 20); + static TargetExtType *Ty = TargetExtType::get(C, "wasm.funcref", {}, {}); return Ty; } @@ -845,6 +843,10 @@ static TargetTypeInfo getTargetTypeInfo(const TargetExtType *Ty) { return TargetTypeInfo(ScalableVectorType::get(Type::getInt1Ty(C), 16), TargetExtType::HasZeroInit); + // Opaque types in the WebAssembly name space. + if (Name.starts_with("wasm.")) + return TargetTypeInfo(PointerType::getUnqual(C), TargetExtType::HasZeroInit, TargetExtType::CanBeGlobal); + return TargetTypeInfo(Type::getVoidTy(C)); } diff --git a/llvm/lib/Target/WebAssembly/CMakeLists.txt b/llvm/lib/Target/WebAssembly/CMakeLists.txt index 1e83cbeac50d6..b5f9aeb8aa0ba 100644 --- a/llvm/lib/Target/WebAssembly/CMakeLists.txt +++ b/llvm/lib/Target/WebAssembly/CMakeLists.txt @@ -36,7 +36,6 @@ add_llvm_target(WebAssemblyCodeGen WebAssemblyInstrInfo.cpp WebAssemblyLowerBrUnless.cpp WebAssemblyLowerEmscriptenEHSjLj.cpp - WebAssemblyLowerRefTypesIntPtrConv.cpp WebAssemblyMachineFunctionInfo.cpp WebAssemblyMCInstLower.cpp WebAssemblyMCLowerPrePass.cpp diff --git a/llvm/lib/Target/WebAssembly/Utils/WasmAddressSpaces.h b/llvm/lib/Target/WebAssembly/Utils/WasmAddressSpaces.h index 2239badca69c3..72853d479ed26 100644 --- a/llvm/lib/Target/WebAssembly/Utils/WasmAddressSpaces.h +++ b/llvm/lib/Target/WebAssembly/Utils/WasmAddressSpaces.h @@ -25,10 +25,6 @@ enum WasmAddressSpace : unsigned { // to these pointers are lowered to global.get / global.set or local.get / // local.set, as appropriate. WASM_ADDRESS_SPACE_VAR = 1, - // A non-integral address space for externref values - WASM_ADDRESS_SPACE_EXTERNREF = 10, - // A non-integral address space for funcref values - WASM_ADDRESS_SPACE_FUNCREF = 20, }; inline bool isDefaultAddressSpace(unsigned AS) { diff --git a/llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h b/llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h index 87660947e7de1..8e7ef92e8c677 100644 --- a/llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h +++ b/llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h @@ -28,16 +28,14 @@ namespace WebAssembly { /// Return true if this is a WebAssembly Externref Type. inline bool isWebAssemblyExternrefType(const Type *Ty) { - return Ty->isPointerTy() && - Ty->getPointerAddressSpace() == - WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_EXTERNREF; + const TargetExtType *TargetTy = dyn_cast<TargetExtType>(Ty); + return TargetTy && TargetTy->getName() == "wasm.externref"; } /// Return true if this is a WebAssembly Funcref Type. inline bool isWebAssemblyFuncrefType(const Type *Ty) { - return Ty->isPointerTy() && - Ty->getPointerAddressSpace() == - WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_FUNCREF; + const TargetExtType *TargetTy = dyn_cast<TargetExtType>(Ty); + return TargetTy && TargetTy->getName() == "wasm.funcref"; } /// Return true if this is a WebAssembly Reference Type. diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.h b/llvm/lib/Target/WebAssembly/WebAssembly.h index 7fc8546248f16..6c84bc979ae4e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.h +++ b/llvm/lib/Target/WebAssembly/WebAssembly.h @@ -29,7 +29,6 @@ ModulePass *createWebAssemblyLowerEmscriptenEHSjLj(); ModulePass *createWebAssemblyAddMissingPrototypes(); ModulePass *createWebAssemblyFixFunctionBitcasts(); FunctionPass *createWebAssemblyOptimizeReturned(); -FunctionPass *createWebAssemblyLowerRefTypesIntPtrConv(); FunctionPass *createWebAssemblyRefTypeMem2Local(); // ISel and immediate followup passes. @@ -76,7 +75,6 @@ void initializeWebAssemblyFixIrreducibleControlFlowPass(PassRegistry &); void initializeWebAssemblyLateEHPreparePass(PassRegistry &); void initializeWebAssemblyLowerBrUnlessPass(PassRegistry &); void initializeWebAssemblyLowerEmscriptenEHSjLjPass(PassRegistry &); -void initializeWebAssemblyLowerRefTypesIntPtrConvPass(PassRegistry &); void initializeWebAssemblyMCLowerPrePassPass(PassRegistry &); void initializeWebAssemblyMemIntrinsicResultsPass(PassRegistry &); void initializeWebAssemblyNullifyDebugValueListsPass(PassRegistry &); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISD.def b/llvm/lib/Target/WebAssembly/WebAssemblyISD.def index b8954f4693f0a..fb37b79781715 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISD.def +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISD.def @@ -45,6 +45,9 @@ HANDLE_NODETYPE(DEMOTE_ZERO) HANDLE_NODETYPE(MEMORY_COPY) HANDLE_NODETYPE(MEMORY_FILL) +// Pointer conversion intrinsic for funcref +HANDLE_NODETYPE(FUNCREF_TO_PTR) + // Memory intrinsics HANDLE_MEM_NODETYPE(GLOBAL_GET) HANDLE_MEM_NODETYPE(GLOBAL_SET) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 518b6932a0c87..b640467cbc6f2 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -365,24 +365,6 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering( setMinimumJumpTableEntries(2); } -MVT WebAssemblyTargetLowering::getPointerTy(const DataLayout &DL, - uint32_t AS) const { - if (AS == WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_EXTERNREF) - return MVT::externref; - if (AS == WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_FUNCREF) - return MVT::funcref; - return TargetLowering::getPointerTy(DL, AS); -} - -MVT WebAssemblyTargetLowering::getPointerMemTy(const DataLayout &DL, - uint32_t AS) const { - if (AS == WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_EXTERNREF) - return MVT::externref; - if (AS == WebAssembly::WasmAddressSpace::WASM_ADDRESS_SPACE_FUNCREF) - return MVT::funcref; - return TargetLowering::getPoin... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/93428 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits