[clang] [lld] [llvm] [WebAssembly] Define a new "Trail1" CPU (PR #112035)
Dan Gohman via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 25 15:58:27 PDT 2024
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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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"
More information about the cfe-commits
mailing list