Skip to content

Commit 0c73009

Browse files
authored
[WebAssembly] TableGen-erate SDNode descriptions (#166259)
This allows SDNodes to be validated against their expected type profiles and reduces the number of changes required to add a new node. CALL and RET_CALL do not have a description in td files, and it is not currently possible to add one as these nodes have both variable operands and variable results. This also fixes a subtle bug detected by the enabled verification functionality. `LOCAL_GET` is declared with `SDNPHasChain` property, and thus should have both a chain operand and a chain result. The original code created a node without a chain result, which caused a check in `SDNodeInfo::verifyNode()` to fail. Part of #119709. Pull Request: #166259
1 parent 9cd1e40 commit 0c73009

File tree

6 files changed

+34
-105
lines changed

6 files changed

+34
-105
lines changed

llvm/lib/Target/WebAssembly/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ tablegen(LLVM WebAssemblyGenFastISel.inc -gen-fast-isel)
1010
tablegen(LLVM WebAssemblyGenInstrInfo.inc -gen-instr-info)
1111
tablegen(LLVM WebAssemblyGenMCCodeEmitter.inc -gen-emitter)
1212
tablegen(LLVM WebAssemblyGenRegisterInfo.inc -gen-register-info)
13+
tablegen(LLVM WebAssemblyGenSDNodeInfo.inc -gen-sd-node-info)
1314
tablegen(LLVM WebAssemblyGenSubtargetInfo.inc -gen-subtarget)
1415

1516
add_public_tablegen_target(WebAssemblyCommonTableGen)

llvm/lib/Target/WebAssembly/WebAssemblyISD.def

Lines changed: 0 additions & 64 deletions
This file was deleted.

llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -942,20 +942,6 @@ MachineBasicBlock *WebAssemblyTargetLowering::EmitInstrWithCustomInserter(
942942
}
943943
}
944944

945-
const char *
946-
WebAssemblyTargetLowering::getTargetNodeName(unsigned Opcode) const {
947-
switch (static_cast<WebAssemblyISD::NodeType>(Opcode)) {
948-
case WebAssemblyISD::FIRST_NUMBER:
949-
break;
950-
#define HANDLE_NODETYPE(NODE) \
951-
case WebAssemblyISD::NODE: \
952-
return "WebAssemblyISD::" #NODE;
953-
#include "WebAssemblyISD.def"
954-
#undef HANDLE_NODETYPE
955-
}
956-
return nullptr;
957-
}
958-
959945
std::pair<unsigned, const TargetRegisterClass *>
960946
WebAssemblyTargetLowering::getRegForInlineAsmConstraint(
961947
const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const {
@@ -1830,11 +1816,8 @@ SDValue WebAssemblyTargetLowering::LowerLoad(SDValue Op,
18301816

18311817
SDValue Idx = DAG.getTargetConstant(*Local, Base, MVT::i32);
18321818
EVT LocalVT = LN->getValueType(0);
1833-
SDValue LocalGet = DAG.getNode(WebAssemblyISD::LOCAL_GET, DL, LocalVT,
1834-
{LN->getChain(), Idx});
1835-
SDValue Result = DAG.getMergeValues({LocalGet, LN->getChain()}, DL);
1836-
assert(Result->getNumValues() == 2 && "Loads must carry a chain!");
1837-
return Result;
1819+
return DAG.getNode(WebAssemblyISD::LOCAL_GET, DL, {LocalVT, MVT::Other},
1820+
{LN->getChain(), Idx});
18381821
}
18391822

18401823
if (WebAssembly::isWasmVarAddressSpace(LN->getAddressSpace()))

llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,6 @@
1919

2020
namespace llvm {
2121

22-
namespace WebAssemblyISD {
23-
24-
enum NodeType : unsigned {
25-
FIRST_NUMBER = ISD::BUILTIN_OP_END,
26-
#define HANDLE_NODETYPE(NODE) NODE,
27-
#include "WebAssemblyISD.def"
28-
#undef HANDLE_NODETYPE
29-
};
30-
31-
} // end namespace WebAssemblyISD
32-
3322
class WebAssemblySubtarget;
3423

3524
class WebAssemblyTargetLowering final : public TargetLowering {
@@ -53,7 +42,6 @@ class WebAssemblyTargetLowering final : public TargetLowering {
5342
MachineBasicBlock *
5443
EmitInstrWithCustomInserter(MachineInstr &MI,
5544
MachineBasicBlock *MBB) const override;
56-
const char *getTargetNodeName(unsigned Opcode) const override;
5745
std::pair<unsigned, const TargetRegisterClass *>
5846
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
5947
StringRef Constraint, MVT VT) const override;

llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,31 @@
1111
///
1212
//===----------------------------------------------------------------------===//
1313

14+
#include "WebAssemblySelectionDAGInfo.h"
1415
#include "WebAssemblyTargetMachine.h"
16+
17+
#define GET_SDNODE_DESC
18+
#include "WebAssemblyGenSDNodeInfo.inc"
19+
1520
using namespace llvm;
1621

1722
#define DEBUG_TYPE "wasm-selectiondag-info"
1823

24+
WebAssemblySelectionDAGInfo::WebAssemblySelectionDAGInfo()
25+
: SelectionDAGGenTargetInfo(WebAssemblyGenSDNodeInfo) {}
26+
1927
WebAssemblySelectionDAGInfo::~WebAssemblySelectionDAGInfo() = default; // anchor
2028

21-
bool WebAssemblySelectionDAGInfo::isTargetMemoryOpcode(unsigned Opcode) const {
29+
const char *
30+
WebAssemblySelectionDAGInfo::getTargetNodeName(unsigned Opcode) const {
2231
switch (static_cast<WebAssemblyISD::NodeType>(Opcode)) {
23-
default:
24-
return false;
25-
case WebAssemblyISD::GLOBAL_GET:
26-
case WebAssemblyISD::GLOBAL_SET:
27-
case WebAssemblyISD::TABLE_GET:
28-
case WebAssemblyISD::TABLE_SET:
29-
return true;
32+
case WebAssemblyISD::CALL:
33+
return "WebAssemblyISD::CALL";
34+
case WebAssemblyISD::RET_CALL:
35+
return "WebAssemblyISD::RET_CALL";
3036
}
37+
38+
return SelectionDAGGenTargetInfo::getTargetNodeName(Opcode);
3139
}
3240

3341
SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy(

llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,26 @@
1717

1818
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
1919

20+
#define GET_SDNODE_ENUM
21+
#include "WebAssemblyGenSDNodeInfo.inc"
22+
2023
namespace llvm {
24+
namespace WebAssemblyISD {
25+
26+
enum NodeType : unsigned {
27+
CALL = GENERATED_OPCODE_END,
28+
RET_CALL,
29+
};
2130

22-
class WebAssemblySelectionDAGInfo final : public SelectionDAGTargetInfo {
31+
} // namespace WebAssemblyISD
32+
33+
class WebAssemblySelectionDAGInfo final : public SelectionDAGGenTargetInfo {
2334
public:
35+
WebAssemblySelectionDAGInfo();
36+
2437
~WebAssemblySelectionDAGInfo() override;
2538

26-
bool isTargetMemoryOpcode(unsigned Opcode) const override;
39+
const char *getTargetNodeName(unsigned Opcode) const override;
2740

2841
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
2942
SDValue Chain, SDValue Op1, SDValue Op2,

0 commit comments

Comments
 (0)