LLVM 23.0.0git
WebAssemblyISelLowering.h
Go to the documentation of this file.
1//- WebAssemblyISelLowering.h - WebAssembly DAG Lowering Interface -*- C++ -*-//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file defines the interfaces that WebAssembly uses to lower LLVM
11/// code into a selection DAG.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
16#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
17
19
20namespace llvm {
21
23
25public:
27 const WebAssemblySubtarget &STI);
28
29 MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const override;
30 MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const override;
31
32private:
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
38 shouldExpandAtomicRMWInIR(const AtomicRMWInst *) const override;
39 bool shouldScalarizeBinop(SDValue VecOp) const override;
40 FastISel *
41 createFastISel(FunctionLoweringInfo &FuncInfo,
42 const TargetLibraryInfo *LibInfo,
43 const LibcallLoweringInfo *LibcallLowering) const override;
44 MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override;
46 EmitInstrWithCustomInserter(MachineInstr &MI,
47 MachineBasicBlock *MBB) const override;
48 std::pair<unsigned, const TargetRegisterClass *>
49 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
50 StringRef Constraint, MVT VT) const override;
51 bool isCheapToSpeculateCttz(Type *Ty) const override;
52 bool isCheapToSpeculateCtlz(Type *Ty) const override;
53 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
54 unsigned AS,
55 Instruction *I = nullptr) const override;
56 bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace, Align Alignment,
58 unsigned *Fast) const override;
59 bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
60 bool isVectorLoadExtDesirable(SDValue ExtVal) const override;
61 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
62 EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
63 EVT VT) const override;
64 void getTgtMemIntrinsic(SmallVectorImpl<IntrinsicInfo> &Infos,
65 const CallBase &I, MachineFunction &MF,
66 unsigned Intrinsic) const override;
67
68 void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known,
69 const APInt &DemandedElts,
70 const SelectionDAG &DAG,
71 unsigned Depth) const override;
72
74 getPreferredVectorAction(MVT VT) const override;
75 bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
76 EVT VT) const override;
77
78 bool isProfitableToCombineMinNumMaxNum(EVT VT) const override {
79 // Prefer leaving cmp + select alone to form pmin/pmax,
80 // or relaxed_fmin/relaxed_fmax with appropriate FMF.
81 return false;
82 }
83
84 SDValue LowerCall(CallLoweringInfo &CLI,
85 SmallVectorImpl<SDValue> &InVals) const override;
86 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
87 bool isVarArg,
89 LLVMContext &Context, const Type *RetTy) const override;
90 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
92 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
93 SelectionDAG &DAG) const override;
94 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
95 bool IsVarArg,
97 const SDLoc &DL, SelectionDAG &DAG,
98 SmallVectorImpl<SDValue> &InVals) const override;
99
100 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
101 SelectionDAG &DAG) const override;
102
103 bool
104 shouldSimplifyDemandedVectorElts(SDValue Op,
105 const TargetLoweringOpt &TLO) const override;
106
107 // Custom lowering hooks.
108 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
109 SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
110 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
111 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
112 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
113 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
114 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
115 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
116 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
117 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
118 SDValue LowerCopyToReg(SDValue Op, SelectionDAG &DAG) const;
119 SDValue LowerIntrinsic(SDValue Op, SelectionDAG &DAG) const;
120 SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
121 SDValue LowerEXTEND_VECTOR_INREG(SDValue Op, SelectionDAG &DAG) const;
122 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
123 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
124 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
125 SDValue LowerAccessVectorElement(SDValue Op, SelectionDAG &DAG) const;
126 SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
127 SDValue LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const;
128 SDValue LowerFMIN(SDValue Op, SelectionDAG &DAG) const;
129 SDValue LowerFMAX(SDValue Op, SelectionDAG &DAG) const;
130 SDValue LowerLoad(SDValue Op, SelectionDAG &DAG) const;
131 SDValue LowerStore(SDValue Op, SelectionDAG &DAG) const;
132 SDValue LowerMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
133 SDValue Replace128Op(SDNode *N, SelectionDAG &DAG) const;
134 SDValue LowerUADDO(SDValue Op, SelectionDAG &DAG) const;
135
136 // Custom DAG combine hooks
137 SDValue
138 PerformDAGCombine(SDNode *N,
139 TargetLowering::DAGCombinerInfo &DCI) const override;
140};
141
142namespace WebAssembly {
144 const TargetLibraryInfo *libInfo,
145 const LibcallLoweringInfo *libcallLowering);
146} // end namespace WebAssembly
147
148} // end namespace llvm
149
150#endif
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
Definition APInt.h:78
an instruction that atomically reads a memory location, combines it with another value,...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:66
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
Machine Value Type.
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Provides information about what library functions are available for the current target.
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
TargetLowering(const TargetLowering &)=delete
Primary interface to the complete machine description for the target machine.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
WebAssemblyTargetLowering(const TargetMachine &TM, const WebAssemblySubtarget &STI)
MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const override
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const override
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
DWARFExpression::Operation Op
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...
This structure contains all information that is necessary for lowering calls.
A convenience struct that encapsulates a DAG, and two SDValues for returning information from TargetL...