LLVM  4.0.0
WebAssemblyISelDAGToDAG.cpp
Go to the documentation of this file.
1 //- WebAssemblyISelDAGToDAG.cpp - A dag to dag inst selector for WebAssembly -//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file defines an instruction selector for the WebAssembly target.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #include "WebAssembly.h"
19 #include "llvm/IR/Function.h" // To access function attributes.
20 #include "llvm/Support/Debug.h"
23 using namespace llvm;
24 
25 #define DEBUG_TYPE "wasm-isel"
26 
27 //===--------------------------------------------------------------------===//
28 /// WebAssembly-specific code to select WebAssembly machine instructions for
29 /// SelectionDAG operations.
30 ///
31 namespace {
32 class WebAssemblyDAGToDAGISel final : public SelectionDAGISel {
33  /// Keep a pointer to the WebAssemblySubtarget around so that we can make the
34  /// right decision when generating code for different targets.
35  const WebAssemblySubtarget *Subtarget;
36 
37  bool ForCodeSize;
38 
39 public:
40  WebAssemblyDAGToDAGISel(WebAssemblyTargetMachine &tm,
41  CodeGenOpt::Level OptLevel)
42  : SelectionDAGISel(tm, OptLevel), Subtarget(nullptr), ForCodeSize(false) {
43  }
44 
45  StringRef getPassName() const override {
46  return "WebAssembly Instruction Selection";
47  }
48 
49  bool runOnMachineFunction(MachineFunction &MF) override {
50  ForCodeSize =
51  MF.getFunction()->hasFnAttribute(Attribute::OptimizeForSize) ||
52  MF.getFunction()->hasFnAttribute(Attribute::MinSize);
53  Subtarget = &MF.getSubtarget<WebAssemblySubtarget>();
55  }
56 
57  void Select(SDNode *Node) override;
58 
59  bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
60  std::vector<SDValue> &OutOps) override;
61 
62 // Include the pieces autogenerated from the target description.
63 #include "WebAssemblyGenDAGISel.inc"
64 
65 private:
66  // add select functions here...
67 };
68 } // end anonymous namespace
69 
71  // Dump information about the Node being selected.
72  DEBUG(errs() << "Selecting: ");
73  DEBUG(Node->dump(CurDAG));
74  DEBUG(errs() << "\n");
75 
76  // If we have a custom node, we already have selected!
77  if (Node->isMachineOpcode()) {
78  DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
79  Node->setNodeId(-1);
80  return;
81  }
82 
83  // Few custom selection stuff.
84  EVT VT = Node->getValueType(0);
85 
86  switch (Node->getOpcode()) {
87  default:
88  break;
89  // If we need WebAssembly-specific selection, it would go here.
90  (void)VT;
91  }
92 
93  // Select the default instruction.
94  SelectCode(Node);
95 }
96 
97 bool WebAssemblyDAGToDAGISel::SelectInlineAsmMemoryOperand(
98  const SDValue &Op, unsigned ConstraintID, std::vector<SDValue> &OutOps) {
99  switch (ConstraintID) {
102  // We just support simple memory operands that just have a single address
103  // operand and need no special handling.
104  OutOps.push_back(Op);
105  return false;
106  default:
107  break;
108  }
109 
110  return true;
111 }
112 
113 /// This pass converts a legalized DAG into a WebAssembly-specific DAG, ready
114 /// for instruction scheduling.
116  CodeGenOpt::Level OptLevel) {
117  return new WebAssemblyDAGToDAGISel(TM, OptLevel);
118 }
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
const Function * getFunction() const
getFunction - Return the LLVM function that this machine code represents
void setNodeId(int Id)
Set unique node id.
This file contains the entry points for global functions defined in the LLVM WebAssembly back-end...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
This file declares the WebAssembly-specific subclass of TargetMachine.
FunctionPass * createWebAssemblyISelDag(WebAssemblyTargetMachine &TM, CodeGenOpt::Level OptLevel)
This pass converts a legalized DAG into a WebAssembly-specific DAG, ready for instruction scheduling...
This file provides WebAssembly-specific target descriptions.
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:298
EVT - Extended Value Type.
Definition: ValueTypes.h:31
void dump() const
Dump this node, for debugging.
Represents one node in the SelectionDAG.
SelectionDAGISel - This is the common base class used for SelectionDAG-based pattern-matching instruc...
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.h:226
#define DEBUG(X)
Definition: Debug.h:100
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:47
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
bool isMachineOpcode() const
Test if this node has a post-isel opcode, directly corresponding to a MachineInstr opcode...