[clang] 64de876 - Revert "Implementation of global.get/set for reftypes in LLVM IR"
David Spickett via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 10 03:11:47 PDT 2021
Author: David Spickett
Date: 2021-06-10T10:11:17Z
New Revision: 64de8763aa7cabc5aee4312ae2f9a68d8fd10bfa
URL: https://github.com/llvm/llvm-project/commit/64de8763aa7cabc5aee4312ae2f9a68d8fd10bfa
DIFF: https://github.com/llvm/llvm-project/commit/64de8763aa7cabc5aee4312ae2f9a68d8fd10bfa.diff
LOG: Revert "Implementation of global.get/set for reftypes in LLVM IR"
This reverts commit 31859f896cf90d64904134ce7b31230f374c3fcc.
Causing SVE and RISCV-V test failures on bots.
Added:
Modified:
clang/lib/Basic/Targets/WebAssembly.cpp
llvm/include/llvm/CodeGen/TargetLowering.h
llvm/include/llvm/CodeGen/ValueTypes.h
llvm/include/llvm/Support/MachineValueType.h
llvm/lib/CodeGen/CodeGenPrepare.cpp
llvm/lib/CodeGen/MachineOperand.cpp
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/lib/CodeGen/TargetLoweringBase.cpp
llvm/lib/CodeGen/ValueTypes.cpp
llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.cpp
llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.h
llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
llvm/lib/Target/WebAssembly/WebAssemblyISD.def
llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
Removed:
llvm/test/CodeGen/WebAssembly/externref-globalget.ll
llvm/test/CodeGen/WebAssembly/externref-globalset.ll
llvm/test/CodeGen/WebAssembly/externref-inttoptr.ll
llvm/test/CodeGen/WebAssembly/externref-ptrtoint.ll
llvm/test/CodeGen/WebAssembly/externref-undef.ll
llvm/test/CodeGen/WebAssembly/externref-unsized-load.ll
llvm/test/CodeGen/WebAssembly/externref-unsized-store.ll
llvm/test/CodeGen/WebAssembly/funcref-call.ll
llvm/test/CodeGen/WebAssembly/funcref-globalget.ll
llvm/test/CodeGen/WebAssembly/funcref-globalset.ll
################################################################################
diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp
index eade8e8d0346d..2a5055c3d534b 100644
--- a/clang/lib/Basic/Targets/WebAssembly.cpp
+++ b/clang/lib/Basic/Targets/WebAssembly.cpp
@@ -214,8 +214,6 @@ bool WebAssemblyTargetInfo::handleTargetFeatures(
continue;
}
if (Feature == "+reference-types") {
- // FIXME: Ensure address spaces 10 and 20 are marked as non-integral in
- // the datalayout string.
HasReferenceTypes = true;
continue;
}
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index d61dd77c878d1..c1b199f4ed58e 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -350,7 +350,7 @@ class TargetLoweringBase {
/// Return the in-memory pointer type for the given address space, defaults to
/// the pointer type from the data layout. FIXME: The default needs to be
/// removed once all the code is updated.
- virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const {
+ MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const {
return MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
}
diff --git a/llvm/include/llvm/CodeGen/ValueTypes.h b/llvm/include/llvm/CodeGen/ValueTypes.h
index 4001b39dae279..e7346f7a75abc 100644
--- a/llvm/include/llvm/CodeGen/ValueTypes.h
+++ b/llvm/include/llvm/CodeGen/ValueTypes.h
@@ -120,9 +120,6 @@ namespace llvm {
return changeExtendedTypeToInteger();
}
- /// Test if the given EVT has zero size
- bool isZeroSized() const { return getSizeInBits() == 0; }
-
/// Test if the given EVT is simple (as opposed to being extended).
bool isSimple() const {
return V.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE;
@@ -210,9 +207,7 @@ namespace llvm {
}
/// Return true if the bit size is a multiple of 8.
- bool isByteSized() const {
- return !isZeroSized() && getSizeInBits().isKnownMultipleOf(8);
- }
+ bool isByteSized() const { return getSizeInBits().isKnownMultipleOf(8); }
/// Return true if the size is a power-of-two number of bytes.
bool isRound() const {
diff --git a/llvm/include/llvm/Support/MachineValueType.h b/llvm/include/llvm/Support/MachineValueType.h
index 9b95943e484a7..88ae8f8e6fc4d 100644
--- a/llvm/include/llvm/Support/MachineValueType.h
+++ b/llvm/include/llvm/Support/MachineValueType.h
@@ -1026,11 +1026,6 @@ namespace llvm {
}
}
- /// Test if the given MVT has zero size
- bool isZeroSized() const {
- return !getSizeInBits().isScalable() && getFixedSizeInBits() == 0;
- }
-
/// Return the size of the specified fixed width value type in bits. The
/// function will assert if the type is scalable.
uint64_t getFixedSizeInBits() const {
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 4570072ac15ea..0bdaaa6b14cfb 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -6451,10 +6451,6 @@ bool CodeGenPrepare::optimizeLoadExt(LoadInst *Load) {
EVT LoadResultVT = TLI->getValueType(*DL, Load->getType());
unsigned BitWidth = LoadResultVT.getSizeInBits();
- // If the BitWidth is 0, do not try to optimize the type
- if (BitWidth == 0)
- return false;
-
APInt DemandBits(BitWidth, 0);
APInt WidestAndBits(BitWidth, 0);
diff --git a/llvm/lib/CodeGen/MachineOperand.cpp b/llvm/lib/CodeGen/MachineOperand.cpp
index a0e8236f65fe4..766915cd0871a 100644
--- a/llvm/lib/CodeGen/MachineOperand.cpp
+++ b/llvm/lib/CodeGen/MachineOperand.cpp
@@ -1163,8 +1163,8 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
<< "unknown-address";
}
MachineOperand::printOperandOffset(OS, getOffset());
- if (getSize() > 0 && getAlign() != getSize())
- OS << ", align " << getAlign().value();
+ if (getAlign() != getSize())
+ OS << ", align " << getAlign().value();
if (getAlign() != getBaseAlign())
OS << ", basealign " << getBaseAlign().value();
auto AAInfo = getAAInfo();
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 05c3bf2f70020..f6f0549b1462c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -23090,10 +23090,6 @@ bool DAGCombiner::parallelizeChainedStores(StoreSDNode *St) {
if (BasePtr.getBase().isUndef())
return false;
- // Do not handle stores to opaque types
- if (St->getMemoryVT().isZeroSized())
- return false;
-
// BaseIndexOffset assumes that offsets are fixed-size, which
// is not valid for scalable vectors where the offsets are
// scaled by `vscale`, so bail out early.
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index cb27e096bbfa2..d2c291f2ae72b 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -1706,7 +1706,7 @@ bool TargetLoweringBase::allowsMemoryAccessForAlignment(
// For example, the ABI alignment may change based on software platform while
// this function should only be affected by hardware implementation.
Type *Ty = VT.getTypeForEVT(Context);
- if (VT.isZeroSized() || Alignment >= DL.getABITypeAlign(Ty)) {
+ if (Alignment >= DL.getABITypeAlign(Ty)) {
// Assume that an access that meets the ABI-specified alignment is fast.
if (Fast != nullptr)
*Fast = true;
diff --git a/llvm/lib/CodeGen/ValueTypes.cpp b/llvm/lib/CodeGen/ValueTypes.cpp
index 8486c32b7d336..28826bc48e429 100644
--- a/llvm/lib/CodeGen/ValueTypes.cpp
+++ b/llvm/lib/CodeGen/ValueTypes.cpp
@@ -198,10 +198,6 @@ Type *EVT::getTypeForEVT(LLVMContext &Context) const {
case MVT::ppcf128: return Type::getPPC_FP128Ty(Context);
case MVT::x86mmx: return Type::getX86_MMXTy(Context);
case MVT::x86amx: return Type::getX86_AMXTy(Context);
- case MVT::externref:
- return PointerType::get(StructType::create(Context), 10);
- case MVT::funcref:
- return PointerType::get(StructType::create(Context), 20);
case MVT::v1i1:
return FixedVectorType::get(Type::getInt1Ty(Context), 1);
case MVT::v2i1:
diff --git a/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.cpp b/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.cpp
index 3da80f4fc8752..824d336651360 100644
--- a/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.cpp
+++ b/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.cpp
@@ -116,31 +116,6 @@ MCSymbolWasm *WebAssembly::getOrCreateFunctionTableSymbol(
return Sym;
}
-MCSymbolWasm *WebAssembly::getOrCreateFuncrefCallTableSymbol(
- MCContext &Ctx, const WebAssemblySubtarget *Subtarget) {
- StringRef Name = "__funcref_call_table";
- MCSymbolWasm *Sym = cast_or_null<MCSymbolWasm>(Ctx.lookupSymbol(Name));
- if (Sym) {
- if (!Sym->isFunctionTable())
- Ctx.reportError(SMLoc(), "symbol is not a wasm funcref table");
- } else {
- Sym = cast<MCSymbolWasm>(Ctx.getOrCreateSymbol(Name));
-
- // Setting Weak ensure only one table is left after linking when multiple
- // modules define the table.
- Sym->setWeak(true);
-
- wasm::WasmLimits Limits = {0, 1, 1};
- wasm::WasmTableType TableType = {wasm::WASM_TYPE_FUNCREF, Limits};
- Sym->setType(wasm::WASM_SYMBOL_TYPE_TABLE);
- Sym->setTableType(TableType);
- }
- // MVP object files can't have symtab entries for tables.
- if (!(Subtarget && Subtarget->hasReferenceTypes()))
- Sym->setOmitFromLinkingSection();
- return Sym;
-}
-
// Find a catch instruction from an EH pad.
MachineInstr *WebAssembly::findCatch(MachineBasicBlock *EHPad) {
assert(EHPad->isEHPad());
diff --git a/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.h b/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.h
index 673dc9521ced7..1ec1df5d0c3d1 100644
--- a/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.h
+++ b/llvm/lib/Target/WebAssembly/Utils/WebAssemblyUtilities.h
@@ -68,12 +68,6 @@ MCSymbolWasm *
getOrCreateFunctionTableSymbol(MCContext &Ctx,
const WebAssemblySubtarget *Subtarget);
-/// Returns the __funcref_call_table, for use in funcref calls when lowered to
-/// table.set + call_indirect.
-MCSymbolWasm *
-getOrCreateFuncrefCallTableSymbol(MCContext &Ctx,
- const WebAssemblySubtarget *Subtarget);
-
/// Find a catch instruction from an EH pad. Returns null if no catch
/// instruction found or the catch is in an invalid location.
MachineInstr *findCatch(MachineBasicBlock *EHPad);
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
index 171d59ae4c6b8..cb0cdf1d8f985 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
@@ -130,12 +130,9 @@ class WebAssemblyFastISel final : public FastISel {
case MVT::i64:
case MVT::f32:
case MVT::f64:
- return VT;
case MVT::funcref:
case MVT::externref:
- if (Subtarget->hasReferenceTypes())
- return VT;
- break;
+ return VT;
case MVT::f16:
return MVT::f32;
case MVT::v16i8:
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISD.def b/llvm/lib/Target/WebAssembly/WebAssemblyISD.def
index 200df9d4d9ffe..9e229450222ff 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISD.def
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISD.def
@@ -48,4 +48,3 @@ HANDLE_NODETYPE(MEMORY_FILL)
HANDLE_MEM_NODETYPE(LOAD_SPLAT)
HANDLE_MEM_NODETYPE(GLOBAL_GET)
HANDLE_MEM_NODETYPE(GLOBAL_SET)
-HANDLE_MEM_NODETYPE(TABLE_SET)
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
index 396f2487e3cda..c3230cb9ca029 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
@@ -63,7 +63,6 @@ class WebAssemblyDAGToDAGISel final : public SelectionDAGISel {
bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
std::vector<SDValue> &OutOps) override;
- bool SelectExternRefAddr(const SDValue &Addr, const SDValue &Base);
// Include the pieces autogenerated from the target description.
#include "WebAssemblyGenDAGISel.inc"
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index f152693f6bca0..76427653770f3 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -13,7 +13,6 @@
#include "WebAssemblyISelLowering.h"
#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
-#include "Utils/WebAssemblyTypeUtilities.h"
#include "Utils/WebAssemblyUtilities.h"
#include "WebAssemblyMachineFunctionInfo.h"
#include "WebAssemblySubtarget.h"
@@ -67,10 +66,6 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
addRegisterClass(MVT::v2i64, &WebAssembly::V128RegClass);
addRegisterClass(MVT::v2f64, &WebAssembly::V128RegClass);
}
- if (Subtarget->hasReferenceTypes()) {
- addRegisterClass(MVT::externref, &WebAssembly::EXTERNREFRegClass);
- addRegisterClass(MVT::funcref, &WebAssembly::FUNCREFRegClass);
- }
// Compute derived properties from the register classes.
computeRegisterProperties(Subtarget->getRegisterInfo());
@@ -87,12 +82,6 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
setOperationAction(ISD::STORE, T, Custom);
}
}
- if (Subtarget->hasReferenceTypes()) {
- for (auto T : {MVT::externref, MVT::funcref}) {
- setOperationAction(ISD::LOAD, T, Custom);
- setOperationAction(ISD::STORE, T, Custom);
- }
- }
setOperationAction(ISD::GlobalAddress, MVTPtr, Custom);
setOperationAction(ISD::GlobalTLSAddress, MVTPtr, Custom);
@@ -479,16 +468,6 @@ LowerCallResults(MachineInstr &CallResults, DebugLoc DL, MachineBasicBlock *BB,
bool IsIndirect = CallParams.getOperand(0).isReg();
bool IsRetCall = CallResults.getOpcode() == WebAssembly::RET_CALL_RESULTS;
- bool IsFuncrefCall = false;
- if (IsIndirect) {
- Register Reg = CallParams.getOperand(0).getReg();
- const MachineFunction *MF = BB->getParent();
- const MachineRegisterInfo &MRI = MF->getRegInfo();
- const TargetRegisterClass *TRC = MRI.getRegClass(Reg);
- IsFuncrefCall = (TRC == &WebAssembly::FUNCREFRegClass);
- assert(!IsFuncrefCall || Subtarget->hasReferenceTypes());
- }
-
unsigned CallOp;
if (IsIndirect && IsRetCall) {
CallOp = WebAssembly::RET_CALL_INDIRECT;
@@ -532,11 +511,8 @@ LowerCallResults(MachineInstr &CallResults, DebugLoc DL, MachineBasicBlock *BB,
// Placeholder for the type index.
MIB.addImm(0);
// The table into which this call_indirect indexes.
- MCSymbolWasm *Table = IsFuncrefCall
- ? WebAssembly::getOrCreateFuncrefCallTableSymbol(
- MF.getContext(), Subtarget)
- : WebAssembly::getOrCreateFunctionTableSymbol(
- MF.getContext(), Subtarget);
+ MCSymbolWasm *Table =
+ WebAssembly::getOrCreateFunctionTableSymbol(MF.getContext(), Subtarget);
if (Subtarget->hasReferenceTypes()) {
MIB.addSym(Table);
} else {
@@ -555,39 +531,6 @@ LowerCallResults(MachineInstr &CallResults, DebugLoc DL, MachineBasicBlock *BB,
CallParams.eraseFromParent();
CallResults.eraseFromParent();
- // If this is a funcref call, to avoid hidden GC roots, we need to clear the
- // table slot with ref.null upon call_indirect return.
- //
- // This generates the following code, which comes right after a call_indirect
- // of a funcref:
- //
- // i32.const 0
- // ref.null func
- // table.set __funcref_call_table
- if (IsIndirect && IsFuncrefCall) {
- MCSymbolWasm *Table = WebAssembly::getOrCreateFuncrefCallTableSymbol(
- MF.getContext(), Subtarget);
- Register RegZero =
- MF.getRegInfo().createVirtualRegister(&WebAssembly::I32RegClass);
- MachineInstr *Const0 =
- BuildMI(MF, DL, TII.get(WebAssembly::CONST_I32), RegZero).addImm(0);
- BB->insertAfter(MIB.getInstr()->getIterator(), Const0);
-
- Register RegFuncref =
- MF.getRegInfo().createVirtualRegister(&WebAssembly::FUNCREFRegClass);
- MachineInstr *RefNull =
- BuildMI(MF, DL, TII.get(WebAssembly::REF_NULL_FUNCREF), RegFuncref)
- .addImm(static_cast<int32_t>(WebAssembly::HeapType::Funcref));
- BB->insertAfter(Const0->getIterator(), RefNull);
-
- MachineInstr *TableSet =
- BuildMI(MF, DL, TII.get(WebAssembly::TABLE_SET_FUNCREF))
- .addSym(Table)
- .addReg(RegZero)
- .addReg(RegFuncref);
- BB->insertAfter(RefNull->getIterator(), TableSet);
- }
-
return BB;
}
@@ -1111,33 +1054,6 @@ WebAssemblyTargetLowering::LowerCall(CallLoweringInfo &CLI,
InTys.push_back(In.VT);
}
- // Lastly, if this is a call to a funcref we need to add an instruction
- // table.set to the chain and transform the call.
- if (CLI.CB && isFuncref(CLI.CB->getCalledOperand())) {
- // In the absence of function references proposal where a funcref call is
- // lowered to call_ref, using reference types we generate a table.set to set
- // the funcref to a special table used solely for this purpose, followed by
- // a call_indirect. Here we just generate the table set, and return the
- // SDValue of the table.set so that LowerCall can finalize the lowering by
- // generating the call_indirect.
- SDValue Chain = Ops[0];
-
- MCSymbolWasm *Table = WebAssembly::getOrCreateFuncrefCallTableSymbol(
- MF.getContext(), Subtarget);
- SDValue Sym = DAG.getMCSymbol(Table, PtrVT);
- SDValue TableSlot = DAG.getConstant(0, DL, MVT::i32);
- SDValue TableSetOps[] = {Chain, Sym, TableSlot, Callee};
- SDValue TableSet = DAG.getMemIntrinsicNode(
- WebAssemblyISD::TABLE_SET, DL, DAG.getVTList(MVT::Other), TableSetOps,
- MVT::funcref,
- // Machine Mem Operand args
- MachinePointerInfo(WasmAddressSpace::FUNCREF),
- CLI.CB->getCalledOperand()->getPointerAlignment(DAG.getDataLayout()),
- MachineMemOperand::MOStore);
-
- Ops[0] = TableSet; // The new chain is the TableSet itself
- }
-
if (CLI.IsTailCall) {
// ret_calls do not return values to the current frame
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
@@ -1369,13 +1285,6 @@ static Optional<unsigned> IsWebAssemblyLocal(SDValue Op, SelectionDAG &DAG) {
return WebAssemblyFrameLowering::getLocalForStackObject(MF, FI->getIndex());
}
-bool WebAssemblyTargetLowering::isFuncref(const Value *Op) const {
- const Type *Ty = Op->getType();
-
- return isa<PointerType>(Ty) &&
- Ty->getPointerAddressSpace() == WasmAddressSpace::FUNCREF;
-}
-
SDValue WebAssemblyTargetLowering::LowerStore(SDValue Op,
SelectionDAG &DAG) const {
SDLoc DL(Op);
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
index 3c61f2e49ee8f..632c039deac09 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h
@@ -45,33 +45,6 @@ class WebAssemblyTargetLowering final : public TargetLowering {
WebAssemblyTargetLowering(const TargetMachine &TM,
const WebAssemblySubtarget &STI);
- enum WasmAddressSpace : unsigned {
- // WebAssembly uses the following address spaces:
- // AS 0 : is the default address space for values in linear memory
- DEFAULT = 0,
- // AS 1 : is a non-integral address space for global variables
- GLOBAL = 1,
- // AS 10 : is a non-integral address space for externref values
- EXTERNREF = 10,
- // AS 20 : is a non-integral address space for funcref values
- FUNCREF = 20,
- };
-
- MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const override {
- if (AS == WasmAddressSpace::EXTERNREF)
- return MVT::externref;
- else if (AS == WasmAddressSpace::FUNCREF)
- return MVT::funcref;
- return TargetLowering::getPointerTy(DL, AS);
- }
- MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const override {
- if (AS == WasmAddressSpace::EXTERNREF)
- return MVT::externref;
- else if (AS == WasmAddressSpace::FUNCREF)
- return MVT::funcref;
- return TargetLowering::getPointerMemTy(DL, AS);
- }
-
private:
/// Keep a pointer to the WebAssemblySubtarget around so that we can make the
/// right decision when generating code for
diff erent targets.
@@ -93,7 +66,6 @@ class WebAssemblyTargetLowering final : public TargetLowering {
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
unsigned AS,
Instruction *I = nullptr) const override;
- bool isFuncref(const Value *Op) const;
bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace, Align Alignment,
MachineMemOperand::Flags Flags,
bool *Fast) const override;
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
index 2348bb165daf0..8fa80ad40995f 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrTable.td
@@ -11,16 +11,15 @@
/// Instructions that handle tables
//===----------------------------------------------------------------------===//
+
multiclass TABLE<WebAssemblyRegClass rt> {
- let mayLoad = 1 in
- defm TABLE_GET_#rt : I<(outs rt:$res), (ins table32_op:$table, I32:$i),
+ defm TABLE_GET_#rt : I<(outs rt:$res), (ins table32_op:$table),
(outs), (ins table32_op:$table),
[],
- "table.get\t$res, $table, $i",
+ "table.get\t$res, $table",
"table.get\t$table",
0x25>;
- let mayStore = 1 in
defm TABLE_SET_#rt : I<(outs), (ins table32_op:$table, I32:$i, rt:$val),
(outs), (ins table32_op:$table),
[],
@@ -47,17 +46,6 @@ multiclass TABLE<WebAssemblyRegClass rt> {
defm "" : TABLE<FUNCREF>, Requires<[HasReferenceTypes]>;
defm "" : TABLE<EXTERNREF>, Requires<[HasReferenceTypes]>;
-def wasm_table_set_t : SDTypeProfile<0, 3, []>;
-def wasm_table_set : SDNode<"WebAssemblyISD::TABLE_SET", wasm_table_set_t,
- [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
-
-def : Pat<(wasm_table_set i32:$table, i32:$idx, funcref:$r),
- (TABLE_SET_FUNCREF i32:$table, i32:$idx, funcref:$r)>,
- Requires<[HasReferenceTypes]>;
-def : Pat<(wasm_table_set i32:$table, i32:$idx, externref:$r),
- (TABLE_SET_EXTERNREF i32:$table, i32:$idx, externref:$r)>,
- Requires<[HasReferenceTypes]>;
-
defm TABLE_SIZE : I<(outs I32:$sz), (ins table32_op:$table),
(outs), (ins table32_op:$table),
[],
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
index a5aca470c13e4..2468df9ab4001 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp
@@ -218,10 +218,6 @@ static wasm::ValType getType(const TargetRegisterClass *RC) {
return wasm::ValType::F64;
if (RC == &WebAssembly::V128RegClass)
return wasm::ValType::V128;
- if (RC == &WebAssembly::EXTERNREFRegClass)
- return wasm::ValType::EXTERNREF;
- if (RC == &WebAssembly::FUNCREFRegClass)
- return wasm::ValType::FUNCREF;
llvm_unreachable("Unexpected register class");
}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 85625e1524e8b..c305da514ef39 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -113,12 +113,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM,
return *RM;
}
-// Check for reference types in Feature String, in order to extend target
-// description string
-static bool hasReferenceTypes(const StringRef &FS) {
- return FS.find("+reference-types") != StringRef::npos;
-}
-
/// Create an WebAssembly architecture model.
///
WebAssemblyTargetMachine::WebAssemblyTargetMachine(
@@ -127,12 +121,8 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine(
Optional<CodeModel::Model> CM, CodeGenOpt::Level OL, bool JIT)
: LLVMTargetMachine(T,
TT.isArch64Bit()
- ? (hasReferenceTypes(FS)
- ? "e-m:e-p:64:64-i64:64-n32:64-S128-ni:1:10:20"
- : "e-m:e-p:64:64-i64:64-n32:64-S128-ni:1")
- : (hasReferenceTypes(FS)
- ? "e-m:e-p:32:32-i64:64-n32:64-S128-ni:1:10:20"
- : "e-m:e-p:32:32-i64:64-n32:64-S128-ni:1"),
+ ? "e-m:e-p:64:64-i64:64-n32:64-S128-ni:1"
+ : "e-m:e-p:32:32-i64:64-n32:64-S128-ni:1",
TT, CPU, FS, Options, getEffectiveRelocModel(RM, TT),
getEffectiveCodeModel(CM, CodeModel::Large), OL),
TLOF(new WebAssemblyTargetObjectFile()) {
diff --git a/llvm/test/CodeGen/WebAssembly/externref-globalget.ll b/llvm/test/CodeGen/WebAssembly/externref-globalget.ll
deleted file mode 100644
index b8303704227c1..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-globalget.ll
+++ /dev/null
@@ -1,19 +0,0 @@
-; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s
-
-%extern = type opaque
-%externref = type %extern addrspace(10)* ;; addrspace 10 is nonintegral
-
- at externref_global = local_unnamed_addr addrspace(1) global %externref undef
-
-define %externref @return_externref_global() {
- ;; this generates a global.get of @externref_global
- %ref = load %externref, %externref addrspace(1)* @externref_global
- ret %externref %ref
-}
-
-; CHECK-LABEL: return_externref_global:
-; CHECK-NEXT: functype return_externref_global () -> (externref)
-; CHECK-NEXT: global.get externref_global
-; CHECK-NEXT: end_function
-
-; CHECK: .globl externref_global
diff --git a/llvm/test/CodeGen/WebAssembly/externref-globalset.ll b/llvm/test/CodeGen/WebAssembly/externref-globalset.ll
deleted file mode 100644
index 749c7daaf4abd..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-globalset.ll
+++ /dev/null
@@ -1,20 +0,0 @@
-; RUN: llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s | FileCheck %s
-
-%extern = type opaque
-%externref = type %extern addrspace(10)* ;; addrspace 10 is nonintegral
-
- at externref_global = local_unnamed_addr addrspace(1) global %externref undef
-
-define void @set_externref_global(%externref %g) {
- ;; this generates a global.set of @externref.global
- store %externref %g, %externref addrspace(1)* @externref_global
- ret void
-}
-
-; CHECK-LABEL: set_externref_global:
-; CHECK-NEXT: functype set_externref_global (externref) -> ()
-; CHECK-NEXT: local.get 0
-; CHECK-NEXT: global.set externref_global
-; CHECK-NEXT: end_function
-
-; CHECK: .globl externref_global
diff --git a/llvm/test/CodeGen/WebAssembly/externref-inttoptr.ll b/llvm/test/CodeGen/WebAssembly/externref-inttoptr.ll
deleted file mode 100644
index cdba7ce2b6c12..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-inttoptr.ll
+++ /dev/null
@@ -1,11 +0,0 @@
-; RUN: not llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
-
-%extern = type opaque
-%externref = type %extern addrspace(10)*
-
-define %externref @int_to_externref(i32 %i) {
- %ref = inttoptr i32 %i to %externref
- ret %externref %ref
-}
-
-; CHECK-ERROR: inttoptr not supported for non-integral pointers
diff --git a/llvm/test/CodeGen/WebAssembly/externref-ptrtoint.ll b/llvm/test/CodeGen/WebAssembly/externref-ptrtoint.ll
deleted file mode 100644
index 63d9d33095056..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-ptrtoint.ll
+++ /dev/null
@@ -1,11 +0,0 @@
-; RUN: not llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
-
-%extern = type opaque
-%externref = type %extern addrspace(10)*
-
-define i32 @externref_to_int(%externref %ref) {
- %i = ptrtoint %externref %ref to i32
- ret i32 %i
-}
-
-; CHECK-ERROR: ptrtoint not supported for non-integral pointers
diff --git a/llvm/test/CodeGen/WebAssembly/externref-undef.ll b/llvm/test/CodeGen/WebAssembly/externref-undef.ll
deleted file mode 100644
index e5453420e825d..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-undef.ll
+++ /dev/null
@@ -1,21 +0,0 @@
-; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s
-
-%extern = type opaque
-%externref = type %extern addrspace(10)* ;; addrspace 10 is nonintegral
-
- at externref_global = local_unnamed_addr addrspace(1) global %externref undef
-
-define %extern @return_extern_undef() {
- ; Returning a ref.null or an uninitialized externref would make
- ; more sense if the return type would be %externref. However, in
- ; this case this is an %extern value, which really is an opaque
- ; type and should never really happen.
- ret %extern undef
-}
-
-; CHECK-LABEL: return_extern_undef:
-; CHECK-NEXT: functype return_extern_undef () -> ()
-; CHECK-NEXT: end_function
-
-; CHECK: .globl externref_global
-
diff --git a/llvm/test/CodeGen/WebAssembly/externref-unsized-load.ll b/llvm/test/CodeGen/WebAssembly/externref-unsized-load.ll
deleted file mode 100644
index 69aa53a9732c7..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-unsized-load.ll
+++ /dev/null
@@ -1,11 +0,0 @@
-; RUN: not llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
-
-%extern = type opaque
-%externref = type %extern addrspace(10)*
-
-define void @load_extern(%externref %ref) {
- %e = load %extern, %externref %ref
- ret void
-}
-
-; CHECK-ERROR: error: loading unsized types is not allowed
diff --git a/llvm/test/CodeGen/WebAssembly/externref-unsized-store.ll b/llvm/test/CodeGen/WebAssembly/externref-unsized-store.ll
deleted file mode 100644
index 9608873a78b95..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/externref-unsized-store.ll
+++ /dev/null
@@ -1,11 +0,0 @@
-; RUN: not llc --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types < %s 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
-
-%extern = type opaque
-%externref = type %extern addrspace(10)*
-
-define void @store_extern(%externref %ref) {
- store %extern undef, %externref %ref
- ret void
-}
-
-; CHECK-ERROR: error: storing unsized types is not allowed
diff --git a/llvm/test/CodeGen/WebAssembly/funcref-call.ll b/llvm/test/CodeGen/WebAssembly/funcref-call.ll
deleted file mode 100644
index 05fd7ad99fa05..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/funcref-call.ll
+++ /dev/null
@@ -1,23 +0,0 @@
-; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s
-
-%func = type void ()
-%funcref = type %func addrspace(20)* ;; addrspace 20 is nonintegral
-
-define void @call_funcref(%funcref %ref) {
- call addrspace(20) void %ref()
- ret void
-}
-
-; CHECK-LABEL: call_funcref:
-; CHECK-NEXT: functype call_funcref (funcref) -> ()
-; CHECK-NEXT: i32.const 0
-; CHECK-NEXT: local.get 0
-; CHECK-NEXT: table.set __funcref_call_table
-; CHECK-NEXT: local.get 0
-; CHECK-NEXT: call_indirect __funcref_call_table, () -> ()
-; CHECK-NEXT: i32.const 0
-; CHECK-NEXT: ref.null func
-; CHECK-NEXT: table.set __funcref_call_table
-; CHECK-NEXT: end_function
-
-; CHECK: .tabletype __funcref_call_table, funcref
diff --git a/llvm/test/CodeGen/WebAssembly/funcref-globalget.ll b/llvm/test/CodeGen/WebAssembly/funcref-globalget.ll
deleted file mode 100644
index 901404aafd717..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/funcref-globalget.ll
+++ /dev/null
@@ -1,19 +0,0 @@
-; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s
-
-%func = type opaque
-%funcref = type %func addrspace(20)* ;; addrspace 20 is nonintegral
-
- at funcref_global = local_unnamed_addr addrspace(1) global %funcref undef
-
-define %funcref @return_funcref_global() {
- ;; this generates a global.get of @funcref_global
- %ref = load %funcref, %funcref addrspace(1)* @funcref_global
- ret %funcref %ref
-}
-
-; CHECK-LABEL: return_funcref_global:
-; CHECK-NEXT: .functype return_funcref_global () -> (funcref)
-; CHECK-NEXT: global.get funcref_global
-; CHECK-NEXT: end_function
-
-; CHECK: .globl funcref_global
diff --git a/llvm/test/CodeGen/WebAssembly/funcref-globalset.ll b/llvm/test/CodeGen/WebAssembly/funcref-globalset.ll
deleted file mode 100644
index 18b0e02cf7390..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/funcref-globalset.ll
+++ /dev/null
@@ -1,20 +0,0 @@
-; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -mattr=+reference-types | FileCheck %s
-
-%func = type opaque
-%funcref = type %func addrspace(20)* ;; addrspace 20 is nonintegral
-
- at funcref_global = local_unnamed_addr addrspace(1) global %funcref undef
-
-define void @set_funcref_global(%funcref %g) {
- ;; this generates a global.set of @funcref_global
- store %funcref %g, %funcref addrspace(1)* @funcref_global
- ret void
-}
-
-; CHECK-LABEL: set_funcref_global:
-; CHECK-NEXT: functype set_funcref_global (funcref) -> ()
-; CHECK-NEXT: local.get 0
-; CHECK-NEXT: global.set funcref_global
-; CHECK-NEXT: end_function
-
-; CHECK: .globl funcref_global
More information about the cfe-commits
mailing list