https://github.com/sunfishcode updated https://github.com/llvm/llvm-project/pull/112035
>From 0c5970fd26c5d36a1eec986396d2a7192d5feb29 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Fri, 11 Oct 2024 04:30:32 -0700 Subject: [PATCH 1/8] [WebAssembly] Define a new "Trail1" CPU First, define some new target features. These are subsets of existing features that reflect implemenetation concerns: - "call-indirect-overlong" - implied by "reference-types"; just the overlong encoding for the `call_indirect` immediate, and not the actual reference types. - "bulk-memory-opt" - implied by "bulk-memory": just `memory.copy` and `memory.fill`, and not the other instructions in the bulk-memory proposal. Next, define a new target CPU, "Trail1", which enables mutable-globals, bulk-memory-opt, multivalue, sign-ext, nontrapping-fptoint, extended-const, and call-indirect-overlong. Unlike the default "generic" CPU, "trail1" is meant to be frozen, and followed up by "trail2" and so on when new features are desired. --- clang/lib/Basic/Targets/WebAssembly.cpp | 45 +++++++++++++++++++ clang/lib/Basic/Targets/WebAssembly.h | 2 + lld/test/wasm/compress-relocs.ll | 2 +- lld/test/wasm/import-table-explicit.s | 2 +- lld/test/wasm/invalid-mvp-table-use.s | 2 +- lld/wasm/InputFiles.cpp | 11 ++--- lld/wasm/SyntheticSections.cpp | 2 +- .../AsmParser/WebAssemblyAsmParser.cpp | 12 ++--- llvm/lib/Target/WebAssembly/WebAssembly.td | 14 ++++++ .../WebAssembly/WebAssemblyFastISel.cpp | 2 +- .../WebAssembly/WebAssemblyISelLowering.cpp | 2 +- .../WebAssembly/WebAssemblyInstrBulkMemory.td | 6 +-- .../WebAssembly/WebAssemblyInstrInfo.td | 8 ++++ .../WebAssemblySelectionDAGInfo.cpp | 4 +- .../Target/WebAssembly/WebAssemblySubtarget.h | 4 ++ .../WebAssembly/WebAssemblyUtilities.cpp | 4 +- llvm/test/CodeGen/WebAssembly/bulk-memory.ll | 6 +-- .../test/CodeGen/WebAssembly/bulk-memory64.ll | 6 +-- 18 files changed, 104 insertions(+), 30 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 0b380bdf835ffb..7c9e0c4699dac2 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -47,6 +47,7 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { return llvm::StringSwitch<bool>(Feature) .Case("atomics", HasAtomics) .Case("bulk-memory", HasBulkMemory) + .Case("bulk-memory-opt", HasBulkMemoryOpt) .Case("exception-handling", HasExceptionHandling) .Case("extended-const", HasExtendedConst) .Case("fp16", HasFP16) @@ -55,6 +56,7 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { .Case("mutable-globals", HasMutableGlobals) .Case("nontrapping-fptoint", HasNontrappingFPToInt) .Case("reference-types", HasReferenceTypes) + .Case("call-indirect-overlong", HasCallIndirectOverlong) .Case("relaxed-simd", SIMDLevel >= RelaxedSIMD) .Case("sign-ext", HasSignExt) .Case("simd128", SIMDLevel >= SIMD128) @@ -79,6 +81,8 @@ void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__wasm_atomics__"); if (HasBulkMemory) Builder.defineMacro("__wasm_bulk_memory__"); + if (HasBulkMemoryOpt) + Builder.defineMacro("__wasm_bulk_memory_opt__"); if (HasExceptionHandling) Builder.defineMacro("__wasm_exception_handling__"); if (HasExtendedConst) @@ -155,12 +159,23 @@ bool WebAssemblyTargetInfo::initFeatureMap( const std::vector<std::string> &FeaturesVec) const { auto addGenericFeatures = [&]() { Features["bulk-memory"] = true; + Features["bulk-memory-opt"] = true; Features["multivalue"] = true; Features["mutable-globals"] = true; Features["nontrapping-fptoint"] = true; Features["reference-types"] = true; + Features["call-indirect-overlong"] = true; Features["sign-ext"] = true; }; + auto addTrail1Features = [&]() { + Features["multivalue"] = true; + Features["mutable-globals"] = true; + Features["call-indirect-overlong"] = true; + Features["sign-ext"] = true; + Features["bulk-memory-opt"] = true; + Features["nontrapping-fptoint"] = true; + Features["extended-const"] = true; + }; auto addBleedingEdgeFeatures = [&]() { addGenericFeatures(); Features["atomics"] = true; @@ -174,6 +189,8 @@ bool WebAssemblyTargetInfo::initFeatureMap( }; if (CPU == "generic") { addGenericFeatures(); + } else if (CPU == "trail1") { + addTrail1Features(); } else if (CPU == "bleeding-edge") { addBleedingEdgeFeatures(); } @@ -200,6 +217,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasBulkMemory = false; continue; } + if (Feature == "+bulk-memory-opt") { + HasBulkMemoryOpt = true; + continue; + } + if (Feature == "-bulk-memory-opt") { + HasBulkMemoryOpt = false; + continue; + } if (Feature == "+exception-handling") { HasExceptionHandling = true; continue; @@ -265,6 +290,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasReferenceTypes = false; continue; } + if (Feature == "+call-indirect-overlong") { + HasCallIndirectOverlong = true; + continue; + } + if (Feature == "-call-indirect-overlong") { + HasCallIndirectOverlong = false; + continue; + } if (Feature == "+relaxed-simd") { SIMDLevel = std::max(SIMDLevel, RelaxedSIMD); continue; @@ -310,6 +343,18 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( << Feature << "-target-feature"; return false; } + + // The reference-types feature included the change to `call_indirect` + // encodings to support overlong immediates. + if (HasReferenceTypes) { + HasCallIndirectOverlong = true; + } + + // bulk-memory-opt is a subset of bulk-memory. + if (HasBulkMemory) { + HasBulkMemoryOpt = true; + } + return true; } diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index 6c2fe8049ff47a..09da9d60dc5a34 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -55,6 +55,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool HasAtomics = false; bool HasBulkMemory = false; + bool HasBulkMemoryOpt = false; bool HasExceptionHandling = false; bool HasExtendedConst = false; bool HasFP16 = false; @@ -63,6 +64,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool HasMutableGlobals = false; bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; + bool HasCallIndirectOverlong = false; bool HasSignExt = false; bool HasTailCall = false; bool HasWideArithmetic = false; diff --git a/lld/test/wasm/compress-relocs.ll b/lld/test/wasm/compress-relocs.ll index f1faab754cb765..cea9f3476e996a 100644 --- a/lld/test/wasm/compress-relocs.ll +++ b/lld/test/wasm/compress-relocs.ll @@ -1,5 +1,5 @@ ; RUN: llc -filetype=obj %s -o %t.o -; RUN: llvm-mc -mattr=+reference-types -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/call-indirect.s -o %t2.o +; RUN: llvm-mc -mattr=+call-indirect-overlong -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/call-indirect.s -o %t2.o ; RUN: wasm-ld --export-dynamic -o %t.wasm %t2.o %t.o ; RUN: obj2yaml %t.wasm | FileCheck %s ; RUN: wasm-ld --export-dynamic -O2 -o %t-opt.wasm %t2.o %t.o diff --git a/lld/test/wasm/import-table-explicit.s b/lld/test/wasm/import-table-explicit.s index 1dc21beba06294..701b7a1dc3e165 100644 --- a/lld/test/wasm/import-table-explicit.s +++ b/lld/test/wasm/import-table-explicit.s @@ -1,4 +1,4 @@ -# RUN: llvm-mc -mattr=+reference-types -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o +# RUN: llvm-mc -mattr=+call-indirect-overlong -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o # RUN: wasm-ld --import-table -o %t.wasm %t.o # RUN: obj2yaml %t.wasm | FileCheck %s diff --git a/lld/test/wasm/invalid-mvp-table-use.s b/lld/test/wasm/invalid-mvp-table-use.s index b4f12a7eeb9a48..58c472e29d1ad4 100644 --- a/lld/test/wasm/invalid-mvp-table-use.s +++ b/lld/test/wasm/invalid-mvp-table-use.s @@ -1,7 +1,7 @@ # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s # # If any table is defined or declared besides the __indirect_function_table, -# the compilation unit should be compiled with -mattr=+reference-types, +# the compilation unit should be compiled with -mattr=+call-indirect-overlong, # causing symbol table entries to be emitted for all tables. # RUN: not wasm-ld --no-entry %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-ERR %s diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 420865e2aea8e3..116891daa844bc 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -248,10 +248,11 @@ static void setRelocs(const std::vector<T *> &chunks, } } -// An object file can have two approaches to tables. With the reference-types -// feature enabled, input files that define or use tables declare the tables -// using symbols, and record each use with a relocation. This way when the -// linker combines inputs, it can collate the tables used by the inputs, +// An object file can have two approaches to tables. With the +// call-indirect-overlong feature enabled (explicitly, or implied by the +// reference-types feature), input files that define or use tables declare the +// tables using symbols, and record each use with a relocation. This way when +// the linker combines inputs, it can collate the tables used by the inputs, // assigning them distinct table numbers, and renumber all the uses as // appropriate. At the same time, the linker has special logic to build the // indirect function table if it is needed. @@ -277,7 +278,7 @@ void ObjFile::addLegacyIndirectFunctionTableIfNeeded( return; // It's possible for an input to define tables and also use the indirect - // function table, but forget to compile with -mattr=+reference-types. + // function table, but forget to compile with -mattr=+call-indirect-overlong. // For these newer files, we require symbols for all tables, and // relocations for all of their uses. if (tableSymbolCount != 0) { diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp index a3bc90cfe759ca..74e3efff4cdfb8 100644 --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -326,7 +326,7 @@ void TableSection::addTable(InputTable *table) { // to assign table number 0 to the indirect function table. for (const auto *culprit : out.importSec->importedSymbols) { if (isa<UndefinedTable>(culprit)) { - error("object file not built with 'reference-types' feature " + error("object file not built with 'call-indirect-overlong' feature " "conflicts with import of table " + culprit->getName() + " by file " + toString(culprit->getFile())); diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index ee8686d1166a5b..091b3ffb8b25d2 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -292,7 +292,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { DefaultFunctionTable = getOrCreateFunctionTableSymbol( getContext(), "__indirect_function_table", Is64); - if (!STI->checkFeatures("+reference-types")) + if (!STI->checkFeatures("+call-indirect-overlong")) DefaultFunctionTable->setOmitFromLinkingSection(); } @@ -532,11 +532,11 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { } bool parseFunctionTableOperand(std::unique_ptr<WebAssemblyOperand> *Op) { - if (STI->checkFeatures("+reference-types")) { - // If the reference-types feature is enabled, there is an explicit table - // operand. To allow the same assembly to be compiled with or without - // reference types, we allow the operand to be omitted, in which case we - // default to __indirect_function_table. + if (STI->checkFeatures("+call-indirect-overlong")) { + // If the call-indirect-overlong feature is enabled, there is an explicit + // table operand. To allow the same assembly to be compiled with or + // without call-indirect overlong, we allow the operand to be omitted, in + // which case we default to __indirect_function_table. auto &Tok = Lexer.getTok(); if (Tok.is(AsmToken::Identifier)) { auto *Sym = diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index 88628f2a793545..5673f9c2689aee 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -29,6 +29,10 @@ def FeatureBulkMemory : SubtargetFeature<"bulk-memory", "HasBulkMemory", "true", "Enable bulk memory operations">; +def FeatureBulkMemoryOpt : + SubtargetFeature<"bulk-memory-opt", "HasBulkMemoryOpt", "true", + "Enable bulk memory optimization operations">; + def FeatureExceptionHandling : SubtargetFeature<"exception-handling", "HasExceptionHandling", "true", "Enable Wasm exception handling">; @@ -63,6 +67,10 @@ def FeatureReferenceTypes : SubtargetFeature<"reference-types", "HasReferenceTypes", "true", "Enable reference types">; +def FeatureCallIndirectOverlong : + SubtargetFeature<"call-indirect-overlong", "HasCallIndirectOverlong", "true", + "Enable overlong encoding for call_indirect immediates">; + def FeatureRelaxedSIMD : SubtargetFeature<"relaxed-simd", "SIMDLevel", "RelaxedSIMD", "Enable relaxed-simd instructions">; @@ -118,6 +126,12 @@ def : ProcessorModel<"generic", NoSchedModel, FeatureMutableGlobals, FeatureNontrappingFPToInt, FeatureReferenceTypes, FeatureSignExt]>; +def : ProcessorModel<"trail1", NoSchedModel, + [FeatureMultivalue, FeatureMutableGlobals, + FeatureCallIndirectOverlong, FeatureSignExt, + FeatureBulkMemoryOpt, FeatureNontrappingFPToInt, + FeatureExtendedConst]>; + // Latest and greatest experimental version of WebAssembly. Bugs included! def : ProcessorModel<"bleeding-edge", NoSchedModel, [FeatureAtomics, FeatureBulkMemory, diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp index 7c90fff2a5c1d7..d84d1f4dedec50 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp @@ -899,7 +899,7 @@ bool WebAssemblyFastISel::selectCall(const Instruction *I) { // The table into which this call_indirect indexes. MCSymbolWasm *Table = WebAssembly::getOrCreateFunctionTableSymbol( MF->getContext(), Subtarget); - if (Subtarget->hasReferenceTypes()) { + if (Subtarget->hasCallIndirectOverlong()) { MIB.addSym(Table); } else { // Otherwise for the MVP there is at most one table whose number is 0, but diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 629e033336f9df..1a02b24087306b 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -772,7 +772,7 @@ LowerCallResults(MachineInstr &CallResults, DebugLoc DL, MachineBasicBlock *BB, MF.getContext(), Subtarget) : WebAssembly::getOrCreateFunctionTableSymbol( MF.getContext(), Subtarget); - if (Subtarget->hasReferenceTypes()) { + if (Subtarget->hasCallIndirectOverlong()) { MIB.addSym(Table); } else { // For the MVP there is at most one table whose number is 0, but we can't diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td index 0772afb039f820..ba394dacd7b038 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td @@ -16,8 +16,7 @@ multiclass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s, list<dag> pattern_r, string asmstr_r = "", string asmstr_s = "", bits<32> simdop = -1> { defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s, - !or(0xfc00, !and(0xff, simdop))>, - Requires<[HasBulkMemory]>; + !or(0xfc00, !and(0xff, simdop))>; } // Bespoke types and nodes for bulk memory ops @@ -52,7 +51,8 @@ defm INIT_A#B : (outs), (ins i32imm_op:$seg, i32imm_op:$idx), [], "memory.init\t$seg, $idx, $dest, $offset, $size", - "memory.init\t$seg, $idx", 0x08>; + "memory.init\t$seg, $idx", 0x08>, + Requires<[HasBulkMemory]>; let mayLoad = 1, mayStore = 1 in defm COPY_A#B : diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index b3ea499c4f915e..bd587d8897d86c 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -30,6 +30,10 @@ def HasBulkMemory : Predicate<"Subtarget->hasBulkMemory()">, AssemblerPredicate<(all_of FeatureBulkMemory), "bulk-memory">; +def HasBulkMemoryOpt : + Predicate<"Subtarget->hasBulkMemoryOpt()">, + AssemblerPredicate<(all_of FeatureBulkMemoryOpt), "bulk-memory-opt">; + def HasExceptionHandling : Predicate<"Subtarget->hasExceptionHandling()">, AssemblerPredicate<(all_of FeatureExceptionHandling), "exception-handling">; @@ -68,6 +72,10 @@ def HasReferenceTypes : Predicate<"Subtarget->hasReferenceTypes()">, AssemblerPredicate<(all_of FeatureReferenceTypes), "reference-types">; +def HasCallIndirectOverlong : + Predicate<"Subtarget->hasCallIndirectOverlong()">, + AssemblerPredicate<(all_of FeatureCallIndirectOverlong), "call-indirect-overlong">; + def HasRelaxedSIMD : Predicate<"Subtarget->hasRelaxedSIMD()">, AssemblerPredicate<(all_of FeatureRelaxedSIMD), "relaxed-simd">; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp index d51bfeb6d8592c..6f37dab4095349 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp @@ -23,7 +23,7 @@ SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy( SDValue Size, Align Alignment, bool IsVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const { auto &ST = DAG.getMachineFunction().getSubtarget<WebAssemblySubtarget>(); - if (!ST.hasBulkMemory()) + if (!ST.hasBulkMemoryOpt()) return SDValue(); SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32); @@ -51,7 +51,7 @@ SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemset( SDValue Size, Align Alignment, bool IsVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo) const { auto &ST = DAG.getMachineFunction().getSubtarget<WebAssemblySubtarget>(); - if (!ST.hasBulkMemory()) + if (!ST.hasBulkMemoryOpt()) return SDValue(); SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index f2bf2902f775b6..731919e5edb047 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -41,6 +41,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasAtomics = false; bool HasBulkMemory = false; + bool HasBulkMemoryOpt = false; bool HasExceptionHandling = false; bool HasExtendedConst = false; bool HasFP16 = false; @@ -49,6 +50,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasMutableGlobals = false; bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; + bool HasCallIndirectOverlong = false; bool HasSignExt = false; bool HasTailCall = false; bool HasWideArithmetic = false; @@ -95,6 +97,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasAddr64() const { return TargetTriple.isArch64Bit(); } bool hasAtomics() const { return HasAtomics; } bool hasBulkMemory() const { return HasBulkMemory; } + bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt; } bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasExtendedConst() const { return HasExtendedConst; } bool hasFP16() const { return HasFP16; } @@ -103,6 +106,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasMutableGlobals() const { return HasMutableGlobals; } bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } bool hasReferenceTypes() const { return HasReferenceTypes; } + bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; } bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } bool hasSignExt() const { return HasSignExt; } bool hasSIMD128() const { return SIMDLevel >= SIMD128; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp index ed186e65a80cf9..ea18caea2b7e1a 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp @@ -117,7 +117,7 @@ MCSymbolWasm *WebAssembly::getOrCreateFunctionTableSymbol( Sym->setUndefined(); } // MVP object files can't have symtab entries for tables. - if (!(Subtarget && Subtarget->hasReferenceTypes())) + if (!(Subtarget && Subtarget->hasCallIndirectOverlong())) Sym->setOmitFromLinkingSection(); return Sym; } @@ -142,7 +142,7 @@ MCSymbolWasm *WebAssembly::getOrCreateFuncrefCallTableSymbol( Sym->setTableType(TableType); } // MVP object files can't have symtab entries for tables. - if (!(Subtarget && Subtarget->hasReferenceTypes())) + if (!(Subtarget && Subtarget->hasCallIndirectOverlong())) Sym->setOmitFromLinkingSection(); return Sym; } diff --git a/llvm/test/CodeGen/WebAssembly/bulk-memory.ll b/llvm/test/CodeGen/WebAssembly/bulk-memory.ll index ae170d757a305a..f7c3dfe5ccad7e 100644 --- a/llvm/test/CodeGen/WebAssembly/bulk-memory.ll +++ b/llvm/test/CodeGen/WebAssembly/bulk-memory.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory | FileCheck %s --check-prefixes CHECK,BULK-MEM -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory-opt | FileCheck %s --check-prefixes CHECK,BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory-opt | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM -; Test that basic bulk memory codegen works correctly +; Test that basic bulk-memory-opt codegen works correctly target triple = "wasm32-unknown-unknown" diff --git a/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll b/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll index 0cf8493a995f96..eb39c2634497c0 100644 --- a/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll +++ b/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory | FileCheck %s --check-prefixes CHECK,BULK-MEM -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory-opt | FileCheck %s --check-prefixes CHECK,BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory-opt | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM -; Test that basic bulk memory codegen works correctly +; Test that basic bulk memory opt codegen works correctly target triple = "wasm64-unknown-unknown" >From 0d6cedcccaa1b4630c4df8a99bde7ce75eacb781 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Fri, 11 Oct 2024 17:04:25 -0700 Subject: [PATCH 2/8] Add a target-features-cpus test for trail1. --- .../WebAssembly/target-features-cpus.ll | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll index ba10dd94a9838d..9d99ca29e2f08a 100644 --- a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll +++ b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -mcpu=mvp | FileCheck %s --check-prefixes MVP ; RUN: llc < %s -mcpu=generic | FileCheck %s --check-prefixes GENERIC +; RUN: llc < %s -mcpu=trail1 | FileCheck %s --check-prefixes TRAIL1 ; RUN: llc < %s | FileCheck %s --check-prefixes GENERIC ; RUN: llc < %s -mcpu=bleeding-edge | FileCheck %s --check-prefixes BLEEDING-EDGE @@ -33,6 +34,31 @@ target triple = "wasm32-unknown-unknown" ; GENERIC-NEXT: .int8 8 ; GENERIC-NEXT: .ascii "sign-ext" +; trail1: +bulk-memory-opt, +call-indirect-overlong, +extended-const, +multivalue, +mutable-globals, +nontrapping-fptoint, +sign-ext +; TRAIL1-LABEL: .custom_section.target_features,"",@ +; TRAIL1-NEXT: .int8 6 +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 15 +; TRAIL1-NEXT: .int8 "bulk-memory-opt" +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 22 +; TRAIL1-NEXT: .int8 "call-indirect-overlong" +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 14 +; TRAIL1-NEXT: .ascii "extended-const" +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 10 +; TRAIL1-NEXT: .ascii "multivalue" +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 15 +; TRAIL1-NEXT: .ascii "mutable-globals" +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 19 +; TRAIL1-NEXT: .ascii "nontrapping-fptoint" +; TRAIL1-NEXT: .int8 43 +; TRAIL1-NEXT: .int8 8 +; TRAIL1-NEXT: .ascii "sign-ext" + ; bleeding-edge: +atomics, +bulk-memory, +exception-handling, +extended-const, ; +fp16, +multimemory, +multivalue, +mutable-globals, ; +nontrapping-fptoint, +relaxed-simd, +reference-types, >From 33a6fd397351bfa45f2d54a5075b9390d342e407 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Fri, 11 Oct 2024 09:53:30 -0700 Subject: [PATCH 3/8] call-indirect-overlong is implied by reference-types. --- .../AsmParser/WebAssemblyAsmParser.cpp | 15 +++++++++------ llvm/lib/Target/WebAssembly/WebAssembly.td | 13 +++++++------ .../lib/Target/WebAssembly/WebAssemblySubtarget.h | 4 ++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 091b3ffb8b25d2..197d5723804f21 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -292,7 +292,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { DefaultFunctionTable = getOrCreateFunctionTableSymbol( getContext(), "__indirect_function_table", Is64); - if (!STI->checkFeatures("+call-indirect-overlong")) + if (!STI->checkFeatures("+call-indirect-overlong") && + !STI->checkFeatures("+reference-types")) DefaultFunctionTable->setOmitFromLinkingSection(); } @@ -532,11 +533,13 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { } bool parseFunctionTableOperand(std::unique_ptr<WebAssemblyOperand> *Op) { - if (STI->checkFeatures("+call-indirect-overlong")) { - // If the call-indirect-overlong feature is enabled, there is an explicit - // table operand. To allow the same assembly to be compiled with or - // without call-indirect overlong, we allow the operand to be omitted, in - // which case we default to __indirect_function_table. + if (STI->checkFeatures("+call-indirect-overlong") || + STI->checkFeatures("+reference-types")) { + // If the call-indirect-overlong feature is enabled, or implied by the + // reference-types feature, there is an explicit table operand. To allow + // the same assembly to be compiled with or without + // call-indirect-overlong, we allow the operand to be omitted, in which + // case we default to __indirect_function_table. auto &Tok = Lexer.getTok(); if (Tok.is(AsmToken::Identifier)) { auto *Sym = diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index 5673f9c2689aee..c14d3764de88c7 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -122,9 +122,10 @@ def : ProcessorModel<"mvp", NoSchedModel, []>; // consideration given to available support in relevant engines and tools, and // the importance of the features. def : ProcessorModel<"generic", NoSchedModel, - [FeatureBulkMemory, FeatureMultivalue, - FeatureMutableGlobals, FeatureNontrappingFPToInt, - FeatureReferenceTypes, FeatureSignExt]>; + [FeatureBulkMemory, FeatureBulkMemoryOpt, + FeatureMultivalue, FeatureMutableGlobals, + FeatureNontrappingFPToInt, FeatureReferenceTypes, + FeatureCallIndirectOverlong, FeatureSignExt]>; def : ProcessorModel<"trail1", NoSchedModel, [FeatureMultivalue, FeatureMutableGlobals, @@ -134,13 +135,13 @@ def : ProcessorModel<"trail1", NoSchedModel, // Latest and greatest experimental version of WebAssembly. Bugs included! def : ProcessorModel<"bleeding-edge", NoSchedModel, - [FeatureAtomics, FeatureBulkMemory, + [FeatureAtomics, FeatureBulkMemory, FeatureBulkMemoryOpt, FeatureExceptionHandling, FeatureExtendedConst, FeatureFP16, FeatureMultiMemory, FeatureMultivalue, FeatureMutableGlobals, FeatureNontrappingFPToInt, FeatureRelaxedSIMD, - FeatureReferenceTypes, FeatureSIMD128, FeatureSignExt, - FeatureTailCall]>; + FeatureReferenceTypes, FeatureCallIndirectOverlong, + FeatureSIMD128, FeatureSignExt, FeatureTailCall]>; //===----------------------------------------------------------------------===// // Target Declaration diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index 731919e5edb047..b963173039631a 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -97,7 +97,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasAddr64() const { return TargetTriple.isArch64Bit(); } bool hasAtomics() const { return HasAtomics; } bool hasBulkMemory() const { return HasBulkMemory; } - bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt; } + bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt || HasBulkMemory; } bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasExtendedConst() const { return HasExtendedConst; } bool hasFP16() const { return HasFP16; } @@ -106,7 +106,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasMutableGlobals() const { return HasMutableGlobals; } bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } bool hasReferenceTypes() const { return HasReferenceTypes; } - bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; } + bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong || HasReferenceTypes; } bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } bool hasSignExt() const { return HasSignExt; } bool hasSIMD128() const { return SIMDLevel >= SIMD128; } >From 8d4925879e8607757b054a0d49820a3b58b5214c Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Fri, 11 Oct 2024 21:48:34 -0700 Subject: [PATCH 4/8] Handle features implying other features in the Subtarget constructor. --- llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp | 9 +++++++++ llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp index 912f61765579f8..7df15eb767093e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp @@ -34,6 +34,15 @@ WebAssemblySubtarget::initializeSubtargetDependencies(StringRef CPU, CPU = "generic"; ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS); + + // reference-types implies call-indirect-overlong + if (HasReferenceTypes) + HasCallIndirectOverlong = true; + + // bulk-memory implies bulk-memory-opt + if (HasBulkMemory) + HasBulkMemoryOpt = true; + return *this; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index b963173039631a..731919e5edb047 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -97,7 +97,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasAddr64() const { return TargetTriple.isArch64Bit(); } bool hasAtomics() const { return HasAtomics; } bool hasBulkMemory() const { return HasBulkMemory; } - bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt || HasBulkMemory; } + bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt; } bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasExtendedConst() const { return HasExtendedConst; } bool hasFP16() const { return HasFP16; } @@ -106,7 +106,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasMutableGlobals() const { return HasMutableGlobals; } bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } bool hasReferenceTypes() const { return HasReferenceTypes; } - bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong || HasReferenceTypes; } + bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; } bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } bool hasSignExt() const { return HasSignExt; } bool hasSIMD128() const { return SIMDLevel >= SIMD128; } >From 31606442df5b9f25f2fb85ee5a5956ef901cf00d Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Mon, 14 Oct 2024 08:02:39 -0700 Subject: [PATCH 5/8] More fixes. --- clang/lib/Basic/Targets/WebAssembly.cpp | 3 ++- .../AsmParser/WebAssemblyAsmParser.cpp | 13 +++++++++++- .../test/CodeGen/WebAssembly/call-indirect.ll | 4 ++-- .../CodeGen/WebAssembly/function-pointer64.ll | 4 ++-- .../WebAssembly/target-features-cpus.ll | 20 ++++++++++++++----- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 7c9e0c4699dac2..9b6a0c4a6492fe 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -48,6 +48,7 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { .Case("atomics", HasAtomics) .Case("bulk-memory", HasBulkMemory) .Case("bulk-memory-opt", HasBulkMemoryOpt) + .Case("call-indirect-overlong", HasCallIndirectOverlong) .Case("exception-handling", HasExceptionHandling) .Case("extended-const", HasExtendedConst) .Case("fp16", HasFP16) @@ -56,7 +57,6 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { .Case("mutable-globals", HasMutableGlobals) .Case("nontrapping-fptoint", HasNontrappingFPToInt) .Case("reference-types", HasReferenceTypes) - .Case("call-indirect-overlong", HasCallIndirectOverlong) .Case("relaxed-simd", SIMDLevel >= RelaxedSIMD) .Case("sign-ext", HasSignExt) .Case("simd128", SIMDLevel >= SIMD128) @@ -160,6 +160,7 @@ bool WebAssemblyTargetInfo::initFeatureMap( auto addGenericFeatures = [&]() { Features["bulk-memory"] = true; Features["bulk-memory-opt"] = true; + Features["call-indirect-overlong"] = true; Features["multivalue"] = true; Features["mutable-globals"] = true; Features["nontrapping-fptoint"] = true; diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 197d5723804f21..57609947c52c84 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -277,7 +277,18 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { : MCTargetAsmParser(Options, STI, MII), Parser(Parser), Lexer(Parser.getLexer()), Is64(STI.getTargetTriple().isArch64Bit()), TC(Parser, MII, Is64), SkipTypeCheck(Options.MCNoTypeCheck) { - setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); + FeatureBitset FBS = ComputeAvailableFeatures(STI.getFeatureBits()); + + // bulk-memory implies bulk-memory-opt + if (FBS.test(WebAssembly::FeatureBulkMemory)) { + FBS.set(WebAssembly::FeatureBulkMemoryOpt); + } + // reference-types implies call-indirect-overlong + if (FBS.test(WebAssembly::FeatureReferenceTypes)) { + FBS.set(WebAssembly::FeatureCallIndirectOverlong); + } + + setAvailableFeatures(FBS); // Don't type check if this is inline asm, since that is a naked sequence of // instructions without a function/locals decl. auto &SM = Parser.getSourceManager(); diff --git a/llvm/test/CodeGen/WebAssembly/call-indirect.ll b/llvm/test/CodeGen/WebAssembly/call-indirect.ll index 55a654f358490b..3196b4ffdd4455 100644 --- a/llvm/test/CodeGen/WebAssembly/call-indirect.ll +++ b/llvm/test/CodeGen/WebAssembly/call-indirect.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types -O2 | FileCheck --check-prefixes=CHECK,NOREF %s -; RUN: llc < %s -asm-verbose=false -mattr=+reference-types -O2 | FileCheck --check-prefixes=CHECK,REF %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,NOREF %s +; RUN: llc < %s -asm-verbose=false -mattr=+call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,REF %s ; RUN: llc < %s -asm-verbose=false -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=OBJ %s ; Test that compilation units with call_indirect but without any diff --git a/llvm/test/CodeGen/WebAssembly/function-pointer64.ll b/llvm/test/CodeGen/WebAssembly/function-pointer64.ll index d5d10b00824fe0..2accd4151767f0 100644 --- a/llvm/test/CodeGen/WebAssembly/function-pointer64.ll +++ b/llvm/test/CodeGen/WebAssembly/function-pointer64.ll @@ -1,6 +1,6 @@ -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types -O2 | FileCheck %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,-call-indirect-overlong -O2 | FileCheck %s ; RUN: llc < %s -asm-verbose=false -mattr=+reference-types -O2 | FileCheck --check-prefix=REF %s -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=YAML %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,-call-indirect-overlong -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=YAML %s ; This tests pointer features that may codegen differently in wasm64. diff --git a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll index 9d99ca29e2f08a..d1475cdb42c1b8 100644 --- a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll +++ b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll @@ -12,13 +12,16 @@ target triple = "wasm32-unknown-unknown" ; mvp: should not contain the target features section ; MVP-NOT: .custom_section.target_features,"",@ -; generic: +multivalue, +mutable-globals, +reference-types, +sign-ext +; generic: +call-indirect-overlong, +multivalue, +mutable-globals, +reference-types, +sign-ext ; GENERIC-LABEL: .custom_section.target_features,"",@ ; GENERIC-NEXT: .int8 6 ; GENERIC-NEXT: .int8 43 ; GENERIC-NEXT: .int8 11 ; GENERIC-NEXT: .ascii "bulk-memory" ; GENERIC-NEXT: .int8 43 +; GENERIC-NEXT: .int8 22 +; GENERIC-NEXT: .ascii "call-indirect-overlong" +; GENERIC-NEXT: .int8 43 ; GENERIC-NEXT: .int8 10 ; GENERIC-NEXT: .ascii "multivalue" ; GENERIC-NEXT: .int8 43 @@ -59,10 +62,11 @@ target triple = "wasm32-unknown-unknown" ; TRAIL1-NEXT: .int8 8 ; TRAIL1-NEXT: .ascii "sign-ext" -; bleeding-edge: +atomics, +bulk-memory, +exception-handling, +extended-const, -; +fp16, +multimemory, +multivalue, +mutable-globals, -; +nontrapping-fptoint, +relaxed-simd, +reference-types, -; +simd128, +sign-ext, +tail-call +; bleeding-edge: +atomics, +bulk-memory, +bulk-memory-opt, +; +call-indirect-overlong, +exception-handling, +; +extended-const, +fp16, +multimemory, +multivalue, +; +mutable-globals, +nontrapping-fptoint, +relaxed-simd, +; +reference-types, +simd128, +sign-ext, +tail-call ; BLEEDING-EDGE-LABEL: .section .custom_section.target_features,"",@ ; BLEEDING-EDGE-NEXT: .int8 14 ; BLEEDING-EDGE-NEXT: .int8 43 @@ -72,6 +76,12 @@ target triple = "wasm32-unknown-unknown" ; BLEEDING-EDGE-NEXT: .int8 11 ; BLEEDING-EDGE-NEXT: .ascii "bulk-memory" ; BLEEDING-EDGE-NEXT: .int8 43 +; BLEEDING-EDGE-NEXT: .int8 15 +; BLEEDING-EDGE-NEXT: .ascii "bulk-memory-opt" +; BLEEDING-EDGE-NEXT: .int8 43 +; BLEEDING-EDGE-NEXT: .int8 22 +; BLEEDING-EDGE-NEXT: .ascii "call-indirect-overlong" +; BLEEDING-EDGE-NEXT: .int8 43 ; BLEEDING-EDGE-NEXT: .int8 18 ; BLEEDING-EDGE-NEXT: .ascii "exception-handling" ; BLEEDING-EDGE-NEXT: .int8 43 >From b907c9542d45dd8029fe914c2c582841678adfda Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Mon, 14 Oct 2024 08:07:40 -0700 Subject: [PATCH 6/8] Fix formatting. --- .../lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 57609947c52c84..b22f3c5a1ab479 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -281,11 +281,11 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { // bulk-memory implies bulk-memory-opt if (FBS.test(WebAssembly::FeatureBulkMemory)) { - FBS.set(WebAssembly::FeatureBulkMemoryOpt); + FBS.set(WebAssembly::FeatureBulkMemoryOpt); } // reference-types implies call-indirect-overlong if (FBS.test(WebAssembly::FeatureReferenceTypes)) { - FBS.set(WebAssembly::FeatureCallIndirectOverlong); + FBS.set(WebAssembly::FeatureCallIndirectOverlong); } setAvailableFeatures(FBS); >From 2e061f9b8194c03bdcca8296372e9ba166d2bc05 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Tue, 22 Oct 2024 16:45:16 -0700 Subject: [PATCH 7/8] Rename "trail" to "lime". --- clang/lib/Basic/Targets/WebAssembly.cpp | 6 +-- llvm/lib/Target/WebAssembly/WebAssembly.td | 2 +- .../WebAssembly/target-features-cpus.ll | 50 +++++++++---------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 9b6a0c4a6492fe..710849472c534d 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -168,7 +168,7 @@ bool WebAssemblyTargetInfo::initFeatureMap( Features["call-indirect-overlong"] = true; Features["sign-ext"] = true; }; - auto addTrail1Features = [&]() { + auto addLime1Features = [&]() { Features["multivalue"] = true; Features["mutable-globals"] = true; Features["call-indirect-overlong"] = true; @@ -190,8 +190,8 @@ bool WebAssemblyTargetInfo::initFeatureMap( }; if (CPU == "generic") { addGenericFeatures(); - } else if (CPU == "trail1") { - addTrail1Features(); + } else if (CPU == "lime1") { + addLime1Features(); } else if (CPU == "bleeding-edge") { addBleedingEdgeFeatures(); } diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index c14d3764de88c7..dbf39225844d10 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -127,7 +127,7 @@ def : ProcessorModel<"generic", NoSchedModel, FeatureNontrappingFPToInt, FeatureReferenceTypes, FeatureCallIndirectOverlong, FeatureSignExt]>; -def : ProcessorModel<"trail1", NoSchedModel, +def : ProcessorModel<"lime1", NoSchedModel, [FeatureMultivalue, FeatureMutableGlobals, FeatureCallIndirectOverlong, FeatureSignExt, FeatureBulkMemoryOpt, FeatureNontrappingFPToInt, diff --git a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll index d1475cdb42c1b8..9a517f105beb1f 100644 --- a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll +++ b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll @@ -1,6 +1,6 @@ ; RUN: llc < %s -mcpu=mvp | FileCheck %s --check-prefixes MVP ; RUN: llc < %s -mcpu=generic | FileCheck %s --check-prefixes GENERIC -; RUN: llc < %s -mcpu=trail1 | FileCheck %s --check-prefixes TRAIL1 +; RUN: llc < %s -mcpu=lime1 | FileCheck %s --check-prefixes LIME1 ; RUN: llc < %s | FileCheck %s --check-prefixes GENERIC ; RUN: llc < %s -mcpu=bleeding-edge | FileCheck %s --check-prefixes BLEEDING-EDGE @@ -37,30 +37,30 @@ target triple = "wasm32-unknown-unknown" ; GENERIC-NEXT: .int8 8 ; GENERIC-NEXT: .ascii "sign-ext" -; trail1: +bulk-memory-opt, +call-indirect-overlong, +extended-const, +multivalue, +mutable-globals, +nontrapping-fptoint, +sign-ext -; TRAIL1-LABEL: .custom_section.target_features,"",@ -; TRAIL1-NEXT: .int8 6 -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 15 -; TRAIL1-NEXT: .int8 "bulk-memory-opt" -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 22 -; TRAIL1-NEXT: .int8 "call-indirect-overlong" -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 14 -; TRAIL1-NEXT: .ascii "extended-const" -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 10 -; TRAIL1-NEXT: .ascii "multivalue" -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 15 -; TRAIL1-NEXT: .ascii "mutable-globals" -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 19 -; TRAIL1-NEXT: .ascii "nontrapping-fptoint" -; TRAIL1-NEXT: .int8 43 -; TRAIL1-NEXT: .int8 8 -; TRAIL1-NEXT: .ascii "sign-ext" +; lime1: +bulk-memory-opt, +call-indirect-overlong, +extended-const, +multivalue, +mutable-globals, +nontrapping-fptoint, +sign-ext +; LIME1-LABEL: .custom_section.target_features,"",@ +; LIME1-NEXT: .int8 6 +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 15 +; LIME1-NEXT: .int8 "bulk-memory-opt" +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 22 +; LIME1-NEXT: .int8 "call-indirect-overlong" +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 14 +; LIME1-NEXT: .ascii "extended-const" +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 10 +; LIME1-NEXT: .ascii "multivalue" +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 15 +; LIME1-NEXT: .ascii "mutable-globals" +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 19 +; LIME1-NEXT: .ascii "nontrapping-fptoint" +; LIME1-NEXT: .int8 43 +; LIME1-NEXT: .int8 8 +; LIME1-NEXT: .ascii "sign-ext" ; bleeding-edge: +atomics, +bulk-memory, +bulk-memory-opt, ; +call-indirect-overlong, +exception-handling, >From 4dedd251c1008712f6ceb44ac6c2fc8fd38d55d8 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Fri, 25 Oct 2024 15:57:39 -0700 Subject: [PATCH 8/8] Test updates. --- clang/lib/Basic/Targets/WebAssembly.cpp | 1 - lld/test/wasm/lto/Inputs/libcall-archive.ll | 2 +- lld/test/wasm/lto/libcall-archive.ll | 2 +- lld/test/wasm/lto/stub-library-libcall.s | 4 ++-- lld/test/wasm/multi-table.s | 2 +- .../WebAssembly/WebAssemblyInstrBulkMemory.td | 12 ++++++------ llvm/test/CodeGen/WebAssembly/call-indirect.ll | 2 +- llvm/test/CodeGen/WebAssembly/disable-feature.ll | 4 ++-- .../CodeGen/WebAssembly/target-features-cpus.ll | 16 ++++++++++------ 9 files changed, 24 insertions(+), 21 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 710849472c534d..4f7cad4398e6e0 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -165,7 +165,6 @@ bool WebAssemblyTargetInfo::initFeatureMap( Features["mutable-globals"] = true; Features["nontrapping-fptoint"] = true; Features["reference-types"] = true; - Features["call-indirect-overlong"] = true; Features["sign-ext"] = true; }; auto addLime1Features = [&]() { diff --git a/lld/test/wasm/lto/Inputs/libcall-archive.ll b/lld/test/wasm/lto/Inputs/libcall-archive.ll index 7d8c34196dfe49..30764af83e6739 100644 --- a/lld/test/wasm/lto/Inputs/libcall-archive.ll +++ b/lld/test/wasm/lto/Inputs/libcall-archive.ll @@ -5,4 +5,4 @@ define void @memcpy() #0 { ret void } -attributes #0 = { "target-features"="-bulk-memory" } +attributes #0 = { "target-features"="-bulk-memory,-bulk-memory-opt" } diff --git a/lld/test/wasm/lto/libcall-archive.ll b/lld/test/wasm/lto/libcall-archive.ll index 5c46d2f7ed7838..0cee9a5de29f61 100644 --- a/lld/test/wasm/lto/libcall-archive.ll +++ b/lld/test/wasm/lto/libcall-archive.ll @@ -16,7 +16,7 @@ entry: declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) -attributes #0 = { "target-features"="-bulk-memory" } +attributes #0 = { "target-features"="-bulk-memory,-bulk-memory-opt" } ; CHECK: - Type: CUSTOM ; CHECK-NEXT: Name: name diff --git a/lld/test/wasm/lto/stub-library-libcall.s b/lld/test/wasm/lto/stub-library-libcall.s index d65983c0cf5bf5..40e15933f7bc39 100644 --- a/lld/test/wasm/lto/stub-library-libcall.s +++ b/lld/test/wasm/lto/stub-library-libcall.s @@ -2,7 +2,7 @@ # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t_main.o %t/main.s # RUN: llvm-as %S/Inputs/foo.ll -o %t_foo.o # RUN: llvm-as %S/Inputs/libcall.ll -o %t_libcall.o -# RUN: wasm-ld -mllvm -mattr=-bulk-memory %t_main.o %t_libcall.o %t_foo.o %p/Inputs/stub.so -o %t.wasm +# RUN: wasm-ld -mllvm -mattr=-bulk-memory,-bulk-memory-opt %t_main.o %t_libcall.o %t_foo.o %p/Inputs/stub.so -o %t.wasm # RUN: obj2yaml %t.wasm | FileCheck %s # The function `func_with_libcall` will generate an undefined reference to @@ -12,7 +12,7 @@ # If %t_foo.o is not included in the link we get an undefined symbol reported # to the dependency of memcpy on the foo export: -# RUN: not wasm-ld -mllvm -mattr=-bulk-memory %t_main.o %t_libcall.o %p/Inputs/stub.so -o %t.wasm 2>&1 | FileCheck --check-prefix=MISSING %s +# RUN: not wasm-ld -mllvm -mattr=-bulk-memory,-bulk-memory-opt %t_main.o %t_libcall.o %p/Inputs/stub.so -o %t.wasm 2>&1 | FileCheck --check-prefix=MISSING %s # MISSING: stub.so: undefined symbol: foo. Required by memcpy #--- main.s diff --git a/lld/test/wasm/multi-table.s b/lld/test/wasm/multi-table.s index bf905ac748f9fb..3129093a25c7fb 100644 --- a/lld/test/wasm/multi-table.s +++ b/lld/test/wasm/multi-table.s @@ -26,7 +26,7 @@ call_indirect_explicit_tables: call_indirect table_b, () -> () end_function -# RT-MVP: wasm-ld: error: object file not built with 'reference-types' feature conflicts with import of table table_a by file +# RT-MVP: wasm-ld: error: object file not built with 'call-indirect-overlong' feature conflicts with import of table table_a by file # CHECK: --- !WASM # CHECK-NEXT: FileHeader: diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td index ba394dacd7b038..79d6f21517e5d4 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td @@ -11,12 +11,13 @@ /// //===----------------------------------------------------------------------===// -// Instruction requiring HasBulkMemory and the bulk memory prefix byte +// Instruction requiring HasBulkMemoryOpt and the bulk memory prefix byte multiclass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s, list<dag> pattern_r, string asmstr_r = "", string asmstr_s = "", bits<32> simdop = -1> { defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s, - !or(0xfc00, !and(0xff, simdop))>; + !or(0xfc00, !and(0xff, simdop))>, + Requires<[HasBulkMemoryOpt]>; } // Bespoke types and nodes for bulk memory ops @@ -51,8 +52,7 @@ defm INIT_A#B : (outs), (ins i32imm_op:$seg, i32imm_op:$idx), [], "memory.init\t$seg, $idx, $dest, $offset, $size", - "memory.init\t$seg, $idx", 0x08>, - Requires<[HasBulkMemory]>; + "memory.init\t$seg, $idx", 0x08>; let mayLoad = 1, mayStore = 1 in defm COPY_A#B : @@ -89,14 +89,14 @@ defm CPY_A#B : I<(outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx, rc:$dst, rc:$src, rc:$len )], "", "", 0>, - Requires<[HasBulkMemory]>; + Requires<[HasBulkMemoryOpt]>; let usesCustomInserter = 1, isCodeGenOnly = 1, mayStore = 1 in defm SET_A#B : I<(outs), (ins i32imm_op:$idx, rc:$dst, I32:$value, rc:$size), (outs), (ins i32imm_op:$idx), [(wasm_memset (i32 imm:$idx), rc:$dst, I32:$value, rc:$size)], "", "", 0>, - Requires<[HasBulkMemory]>; + Requires<[HasBulkMemoryOpt]>; } diff --git a/llvm/test/CodeGen/WebAssembly/call-indirect.ll b/llvm/test/CodeGen/WebAssembly/call-indirect.ll index 3196b4ffdd4455..e0a0d14deacba0 100644 --- a/llvm/test/CodeGen/WebAssembly/call-indirect.ll +++ b/llvm/test/CodeGen/WebAssembly/call-indirect.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,NOREF %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,-call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,NOREF %s ; RUN: llc < %s -asm-verbose=false -mattr=+call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,REF %s ; RUN: llc < %s -asm-verbose=false -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=OBJ %s diff --git a/llvm/test/CodeGen/WebAssembly/disable-feature.ll b/llvm/test/CodeGen/WebAssembly/disable-feature.ll index 0684432a114dfc..5f7275f3699ede 100644 --- a/llvm/test/CodeGen/WebAssembly/disable-feature.ll +++ b/llvm/test/CodeGen/WebAssembly/disable-feature.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mattr=-sign-ext,-bulk-memory | FileCheck %s +; RUN: llc < %s -mattr=-sign-ext,-bulk-memory,-bulk-memory-opt | FileCheck %s target triple = "wasm32-unknown-unknown" @@ -21,7 +21,7 @@ define i8 @not_use_extend8_s(i8 %v, i8 %x) { ret i8 %a } -attributes #0 = { "target-features"="+bulk-memory," } +attributes #0 = { "target-features"="+bulk-memory-opt" } declare void @llvm.memset.p0.i32(ptr, i8, i32, i1) diff --git a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll index 9a517f105beb1f..1c77ad5c049a59 100644 --- a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll +++ b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll @@ -14,11 +14,14 @@ target triple = "wasm32-unknown-unknown" ; generic: +call-indirect-overlong, +multivalue, +mutable-globals, +reference-types, +sign-ext ; GENERIC-LABEL: .custom_section.target_features,"",@ -; GENERIC-NEXT: .int8 6 +; GENERIC-NEXT: .int8 8 ; GENERIC-NEXT: .int8 43 ; GENERIC-NEXT: .int8 11 ; GENERIC-NEXT: .ascii "bulk-memory" ; GENERIC-NEXT: .int8 43 +; GENERIC-NEXT: .int8 15 +; GENERIC-NEXT: .ascii "bulk-memory-opt" +; GENERIC-NEXT: .int8 43 ; GENERIC-NEXT: .int8 22 ; GENERIC-NEXT: .ascii "call-indirect-overlong" ; GENERIC-NEXT: .int8 43 @@ -37,15 +40,16 @@ target triple = "wasm32-unknown-unknown" ; GENERIC-NEXT: .int8 8 ; GENERIC-NEXT: .ascii "sign-ext" -; lime1: +bulk-memory-opt, +call-indirect-overlong, +extended-const, +multivalue, +mutable-globals, +nontrapping-fptoint, +sign-ext +; lime1: +bulk-memory-opt, +call-indirect-overlong, +extended-const, +multivalue, +; +mutable-globals, +nontrapping-fptoint, +sign-ext ; LIME1-LABEL: .custom_section.target_features,"",@ -; LIME1-NEXT: .int8 6 +; LIME1-NEXT: .int8 7 ; LIME1-NEXT: .int8 43 ; LIME1-NEXT: .int8 15 -; LIME1-NEXT: .int8 "bulk-memory-opt" +; LIME1-NEXT: .ascii "bulk-memory-opt" ; LIME1-NEXT: .int8 43 ; LIME1-NEXT: .int8 22 -; LIME1-NEXT: .int8 "call-indirect-overlong" +; LIME1-NEXT: .ascii "call-indirect-overlong" ; LIME1-NEXT: .int8 43 ; LIME1-NEXT: .int8 14 ; LIME1-NEXT: .ascii "extended-const" @@ -68,7 +72,7 @@ target triple = "wasm32-unknown-unknown" ; +mutable-globals, +nontrapping-fptoint, +relaxed-simd, ; +reference-types, +simd128, +sign-ext, +tail-call ; BLEEDING-EDGE-LABEL: .section .custom_section.target_features,"",@ -; BLEEDING-EDGE-NEXT: .int8 14 +; BLEEDING-EDGE-NEXT: .int8 16 ; BLEEDING-EDGE-NEXT: .int8 43 ; BLEEDING-EDGE-NEXT: .int8 7 ; BLEEDING-EDGE-NEXT: .ascii "atomics" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits