Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===- llvm/CodeGen/TargetLowering.h - Target Lowering Info -----*- 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 describes how to lower LLVM code to machine code. This has two |
||
| 11 | /// main components: |
||
| 12 | /// |
||
| 13 | /// 1. Which ValueTypes are natively supported by the target. |
||
| 14 | /// 2. Which operations are supported for supported ValueTypes. |
||
| 15 | /// 3. Cost thresholds for alternative implementations of certain operations. |
||
| 16 | /// |
||
| 17 | /// In addition it has a few other components, like information about FP |
||
| 18 | /// immediates. |
||
| 19 | /// |
||
| 20 | //===----------------------------------------------------------------------===// |
||
| 21 | |||
| 22 | #ifndef LLVM_CODEGEN_TARGETLOWERING_H |
||
| 23 | #define LLVM_CODEGEN_TARGETLOWERING_H |
||
| 24 | |||
| 25 | #include "llvm/ADT/APInt.h" |
||
| 26 | #include "llvm/ADT/ArrayRef.h" |
||
| 27 | #include "llvm/ADT/DenseMap.h" |
||
| 28 | #include "llvm/ADT/SmallVector.h" |
||
| 29 | #include "llvm/ADT/StringRef.h" |
||
| 30 | #include "llvm/CodeGen/ComplexDeinterleavingPass.h" |
||
| 31 | #include "llvm/CodeGen/DAGCombine.h" |
||
| 32 | #include "llvm/CodeGen/ISDOpcodes.h" |
||
| 33 | #include "llvm/CodeGen/LowLevelType.h" |
||
| 34 | #include "llvm/CodeGen/RuntimeLibcalls.h" |
||
| 35 | #include "llvm/CodeGen/SelectionDAG.h" |
||
| 36 | #include "llvm/CodeGen/SelectionDAGNodes.h" |
||
| 37 | #include "llvm/CodeGen/TargetCallingConv.h" |
||
| 38 | #include "llvm/CodeGen/ValueTypes.h" |
||
| 39 | #include "llvm/IR/Attributes.h" |
||
| 40 | #include "llvm/IR/CallingConv.h" |
||
| 41 | #include "llvm/IR/DataLayout.h" |
||
| 42 | #include "llvm/IR/DerivedTypes.h" |
||
| 43 | #include "llvm/IR/Function.h" |
||
| 44 | #include "llvm/IR/InlineAsm.h" |
||
| 45 | #include "llvm/IR/Instruction.h" |
||
| 46 | #include "llvm/IR/Instructions.h" |
||
| 47 | #include "llvm/IR/Type.h" |
||
| 48 | #include "llvm/Support/Alignment.h" |
||
| 49 | #include "llvm/Support/AtomicOrdering.h" |
||
| 50 | #include "llvm/Support/Casting.h" |
||
| 51 | #include "llvm/Support/ErrorHandling.h" |
||
| 52 | #include "llvm/Support/MachineValueType.h" |
||
| 53 | #include <algorithm> |
||
| 54 | #include <cassert> |
||
| 55 | #include <climits> |
||
| 56 | #include <cstdint> |
||
| 57 | #include <iterator> |
||
| 58 | #include <map> |
||
| 59 | #include <string> |
||
| 60 | #include <utility> |
||
| 61 | #include <vector> |
||
| 62 | |||
| 63 | namespace llvm { |
||
| 64 | |||
| 65 | class AssumptionCache; |
||
| 66 | class CCState; |
||
| 67 | class CCValAssign; |
||
| 68 | class Constant; |
||
| 69 | class FastISel; |
||
| 70 | class FunctionLoweringInfo; |
||
| 71 | class GlobalValue; |
||
| 72 | class Loop; |
||
| 73 | class GISelKnownBits; |
||
| 74 | class IntrinsicInst; |
||
| 75 | class IRBuilderBase; |
||
| 76 | struct KnownBits; |
||
| 77 | class LegacyDivergenceAnalysis; |
||
| 78 | class LLVMContext; |
||
| 79 | class MachineBasicBlock; |
||
| 80 | class MachineFunction; |
||
| 81 | class MachineInstr; |
||
| 82 | class MachineJumpTableInfo; |
||
| 83 | class MachineLoop; |
||
| 84 | class MachineRegisterInfo; |
||
| 85 | class MCContext; |
||
| 86 | class MCExpr; |
||
| 87 | class Module; |
||
| 88 | class ProfileSummaryInfo; |
||
| 89 | class TargetLibraryInfo; |
||
| 90 | class TargetMachine; |
||
| 91 | class TargetRegisterClass; |
||
| 92 | class TargetRegisterInfo; |
||
| 93 | class TargetTransformInfo; |
||
| 94 | class Value; |
||
| 95 | |||
| 96 | namespace Sched { |
||
| 97 | |||
| 98 | enum Preference { |
||
| 99 | None, // No preference |
||
| 100 | Source, // Follow source order. |
||
| 101 | RegPressure, // Scheduling for lowest register pressure. |
||
| 102 | Hybrid, // Scheduling for both latency and register pressure. |
||
| 103 | ILP, // Scheduling for ILP in low register pressure mode. |
||
| 104 | VLIW, // Scheduling for VLIW targets. |
||
| 105 | Fast, // Fast suboptimal list scheduling |
||
| 106 | Linearize // Linearize DAG, no scheduling |
||
| 107 | }; |
||
| 108 | |||
| 109 | } // end namespace Sched |
||
| 110 | |||
| 111 | // MemOp models a memory operation, either memset or memcpy/memmove. |
||
| 112 | struct MemOp { |
||
| 113 | private: |
||
| 114 | // Shared |
||
| 115 | uint64_t Size; |
||
| 116 | bool DstAlignCanChange; // true if destination alignment can satisfy any |
||
| 117 | // constraint. |
||
| 118 | Align DstAlign; // Specified alignment of the memory operation. |
||
| 119 | |||
| 120 | bool AllowOverlap; |
||
| 121 | // memset only |
||
| 122 | bool IsMemset; // If setthis memory operation is a memset. |
||
| 123 | bool ZeroMemset; // If set clears out memory with zeros. |
||
| 124 | // memcpy only |
||
| 125 | bool MemcpyStrSrc; // Indicates whether the memcpy source is an in-register |
||
| 126 | // constant so it does not need to be loaded. |
||
| 127 | Align SrcAlign; // Inferred alignment of the source or default value if the |
||
| 128 | // memory operation does not need to load the value. |
||
| 129 | public: |
||
| 130 | static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, |
||
| 131 | Align SrcAlign, bool IsVolatile, |
||
| 132 | bool MemcpyStrSrc = false) { |
||
| 133 | MemOp Op; |
||
| 134 | Op.Size = Size; |
||
| 135 | Op.DstAlignCanChange = DstAlignCanChange; |
||
| 136 | Op.DstAlign = DstAlign; |
||
| 137 | Op.AllowOverlap = !IsVolatile; |
||
| 138 | Op.IsMemset = false; |
||
| 139 | Op.ZeroMemset = false; |
||
| 140 | Op.MemcpyStrSrc = MemcpyStrSrc; |
||
| 141 | Op.SrcAlign = SrcAlign; |
||
| 142 | return Op; |
||
| 143 | } |
||
| 144 | |||
| 145 | static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, |
||
| 146 | bool IsZeroMemset, bool IsVolatile) { |
||
| 147 | MemOp Op; |
||
| 148 | Op.Size = Size; |
||
| 149 | Op.DstAlignCanChange = DstAlignCanChange; |
||
| 150 | Op.DstAlign = DstAlign; |
||
| 151 | Op.AllowOverlap = !IsVolatile; |
||
| 152 | Op.IsMemset = true; |
||
| 153 | Op.ZeroMemset = IsZeroMemset; |
||
| 154 | Op.MemcpyStrSrc = false; |
||
| 155 | return Op; |
||
| 156 | } |
||
| 157 | |||
| 158 | uint64_t size() const { return Size; } |
||
| 159 | Align getDstAlign() const { |
||
| 160 | assert(!DstAlignCanChange); |
||
| 161 | return DstAlign; |
||
| 162 | } |
||
| 163 | bool isFixedDstAlign() const { return !DstAlignCanChange; } |
||
| 164 | bool allowOverlap() const { return AllowOverlap; } |
||
| 165 | bool isMemset() const { return IsMemset; } |
||
| 166 | bool isMemcpy() const { return !IsMemset; } |
||
| 167 | bool isMemcpyWithFixedDstAlign() const { |
||
| 168 | return isMemcpy() && !DstAlignCanChange; |
||
| 169 | } |
||
| 170 | bool isZeroMemset() const { return isMemset() && ZeroMemset; } |
||
| 171 | bool isMemcpyStrSrc() const { |
||
| 172 | assert(isMemcpy() && "Must be a memcpy"); |
||
| 173 | return MemcpyStrSrc; |
||
| 174 | } |
||
| 175 | Align getSrcAlign() const { |
||
| 176 | assert(isMemcpy() && "Must be a memcpy"); |
||
| 177 | return SrcAlign; |
||
| 178 | } |
||
| 179 | bool isSrcAligned(Align AlignCheck) const { |
||
| 180 | return isMemset() || llvm::isAligned(AlignCheck, SrcAlign.value()); |
||
| 181 | } |
||
| 182 | bool isDstAligned(Align AlignCheck) const { |
||
| 183 | return DstAlignCanChange || llvm::isAligned(AlignCheck, DstAlign.value()); |
||
| 184 | } |
||
| 185 | bool isAligned(Align AlignCheck) const { |
||
| 186 | return isSrcAligned(AlignCheck) && isDstAligned(AlignCheck); |
||
| 187 | } |
||
| 188 | }; |
||
| 189 | |||
| 190 | /// This base class for TargetLowering contains the SelectionDAG-independent |
||
| 191 | /// parts that can be used from the rest of CodeGen. |
||
| 192 | class TargetLoweringBase { |
||
| 193 | public: |
||
| 194 | /// This enum indicates whether operations are valid for a target, and if not, |
||
| 195 | /// what action should be used to make them valid. |
||
| 196 | enum LegalizeAction : uint8_t { |
||
| 197 | Legal, // The target natively supports this operation. |
||
| 198 | Promote, // This operation should be executed in a larger type. |
||
| 199 | Expand, // Try to expand this to other ops, otherwise use a libcall. |
||
| 200 | LibCall, // Don't try to expand this to other ops, always use a libcall. |
||
| 201 | Custom // Use the LowerOperation hook to implement custom lowering. |
||
| 202 | }; |
||
| 203 | |||
| 204 | /// This enum indicates whether a types are legal for a target, and if not, |
||
| 205 | /// what action should be used to make them valid. |
||
| 206 | enum LegalizeTypeAction : uint8_t { |
||
| 207 | TypeLegal, // The target natively supports this type. |
||
| 208 | TypePromoteInteger, // Replace this integer with a larger one. |
||
| 209 | TypeExpandInteger, // Split this integer into two of half the size. |
||
| 210 | TypeSoftenFloat, // Convert this float to a same size integer type. |
||
| 211 | TypeExpandFloat, // Split this float into two of half the size. |
||
| 212 | TypeScalarizeVector, // Replace this one-element vector with its element. |
||
| 213 | TypeSplitVector, // Split this vector into two of half the size. |
||
| 214 | TypeWidenVector, // This vector should be widened into a larger vector. |
||
| 215 | TypePromoteFloat, // Replace this float with a larger one. |
||
| 216 | TypeSoftPromoteHalf, // Soften half to i16 and use float to do arithmetic. |
||
| 217 | TypeScalarizeScalableVector, // This action is explicitly left unimplemented. |
||
| 218 | // While it is theoretically possible to |
||
| 219 | // legalize operations on scalable types with a |
||
| 220 | // loop that handles the vscale * #lanes of the |
||
| 221 | // vector, this is non-trivial at SelectionDAG |
||
| 222 | // level and these types are better to be |
||
| 223 | // widened or promoted. |
||
| 224 | }; |
||
| 225 | |||
| 226 | /// LegalizeKind holds the legalization kind that needs to happen to EVT |
||
| 227 | /// in order to type-legalize it. |
||
| 228 | using LegalizeKind = std::pair<LegalizeTypeAction, EVT>; |
||
| 229 | |||
| 230 | /// Enum that describes how the target represents true/false values. |
||
| 231 | enum BooleanContent { |
||
| 232 | UndefinedBooleanContent, // Only bit 0 counts, the rest can hold garbage. |
||
| 233 | ZeroOrOneBooleanContent, // All bits zero except for bit 0. |
||
| 234 | ZeroOrNegativeOneBooleanContent // All bits equal to bit 0. |
||
| 235 | }; |
||
| 236 | |||
| 237 | /// Enum that describes what type of support for selects the target has. |
||
| 238 | enum SelectSupportKind { |
||
| 239 | ScalarValSelect, // The target supports scalar selects (ex: cmov). |
||
| 240 | ScalarCondVectorVal, // The target supports selects with a scalar condition |
||
| 241 | // and vector values (ex: cmov). |
||
| 242 | VectorMaskSelect // The target supports vector selects with a vector |
||
| 243 | // mask (ex: x86 blends). |
||
| 244 | }; |
||
| 245 | |||
| 246 | /// Enum that specifies what an atomic load/AtomicRMWInst is expanded |
||
| 247 | /// to, if at all. Exists because different targets have different levels of |
||
| 248 | /// support for these atomic instructions, and also have different options |
||
| 249 | /// w.r.t. what they should expand to. |
||
| 250 | enum class AtomicExpansionKind { |
||
| 251 | None, // Don't expand the instruction. |
||
| 252 | CastToInteger, // Cast the atomic instruction to another type, e.g. from |
||
| 253 | // floating-point to integer type. |
||
| 254 | LLSC, // Expand the instruction into loadlinked/storeconditional; used |
||
| 255 | // by ARM/AArch64. |
||
| 256 | LLOnly, // Expand the (load) instruction into just a load-linked, which has |
||
| 257 | // greater atomic guarantees than a normal load. |
||
| 258 | CmpXChg, // Expand the instruction into cmpxchg; used by at least X86. |
||
| 259 | MaskedIntrinsic, // Use a target-specific intrinsic for the LL/SC loop. |
||
| 260 | BitTestIntrinsic, // Use a target-specific intrinsic for special bit |
||
| 261 | // operations; used by X86. |
||
| 262 | CmpArithIntrinsic,// Use a target-specific intrinsic for special compare |
||
| 263 | // operations; used by X86. |
||
| 264 | Expand, // Generic expansion in terms of other atomic operations. |
||
| 265 | |||
| 266 | // Rewrite to a non-atomic form for use in a known non-preemptible |
||
| 267 | // environment. |
||
| 268 | NotAtomic |
||
| 269 | }; |
||
| 270 | |||
| 271 | /// Enum that specifies when a multiplication should be expanded. |
||
| 272 | enum class MulExpansionKind { |
||
| 273 | Always, // Always expand the instruction. |
||
| 274 | OnlyLegalOrCustom, // Only expand when the resulting instructions are legal |
||
| 275 | // or custom. |
||
| 276 | }; |
||
| 277 | |||
| 278 | /// Enum that specifies when a float negation is beneficial. |
||
| 279 | enum class NegatibleCost { |
||
| 280 | Cheaper = 0, // Negated expression is cheaper. |
||
| 281 | Neutral = 1, // Negated expression has the same cost. |
||
| 282 | Expensive = 2 // Negated expression is more expensive. |
||
| 283 | }; |
||
| 284 | |||
| 285 | class ArgListEntry { |
||
| 286 | public: |
||
| 287 | Value *Val = nullptr; |
||
| 288 | SDValue Node = SDValue(); |
||
| 289 | Type *Ty = nullptr; |
||
| 290 | bool IsSExt : 1; |
||
| 291 | bool IsZExt : 1; |
||
| 292 | bool IsInReg : 1; |
||
| 293 | bool IsSRet : 1; |
||
| 294 | bool IsNest : 1; |
||
| 295 | bool IsByVal : 1; |
||
| 296 | bool IsByRef : 1; |
||
| 297 | bool IsInAlloca : 1; |
||
| 298 | bool IsPreallocated : 1; |
||
| 299 | bool IsReturned : 1; |
||
| 300 | bool IsSwiftSelf : 1; |
||
| 301 | bool IsSwiftAsync : 1; |
||
| 302 | bool IsSwiftError : 1; |
||
| 303 | bool IsCFGuardTarget : 1; |
||
| 304 | MaybeAlign Alignment = std::nullopt; |
||
| 305 | Type *IndirectType = nullptr; |
||
| 306 | |||
| 307 | ArgListEntry() |
||
| 308 | : IsSExt(false), IsZExt(false), IsInReg(false), IsSRet(false), |
||
| 309 | IsNest(false), IsByVal(false), IsByRef(false), IsInAlloca(false), |
||
| 310 | IsPreallocated(false), IsReturned(false), IsSwiftSelf(false), |
||
| 311 | IsSwiftAsync(false), IsSwiftError(false), IsCFGuardTarget(false) {} |
||
| 312 | |||
| 313 | void setAttributes(const CallBase *Call, unsigned ArgIdx); |
||
| 314 | }; |
||
| 315 | using ArgListTy = std::vector<ArgListEntry>; |
||
| 316 | |||
| 317 | virtual void markLibCallAttributes(MachineFunction *MF, unsigned CC, |
||
| 318 | ArgListTy &Args) const {}; |
||
| 319 | |||
| 320 | static ISD::NodeType getExtendForContent(BooleanContent Content) { |
||
| 321 | switch (Content) { |
||
| 322 | case UndefinedBooleanContent: |
||
| 323 | // Extend by adding rubbish bits. |
||
| 324 | return ISD::ANY_EXTEND; |
||
| 325 | case ZeroOrOneBooleanContent: |
||
| 326 | // Extend by adding zero bits. |
||
| 327 | return ISD::ZERO_EXTEND; |
||
| 328 | case ZeroOrNegativeOneBooleanContent: |
||
| 329 | // Extend by copying the sign bit. |
||
| 330 | return ISD::SIGN_EXTEND; |
||
| 331 | } |
||
| 332 | llvm_unreachable("Invalid content kind"); |
||
| 333 | } |
||
| 334 | |||
| 335 | explicit TargetLoweringBase(const TargetMachine &TM); |
||
| 336 | TargetLoweringBase(const TargetLoweringBase &) = delete; |
||
| 337 | TargetLoweringBase &operator=(const TargetLoweringBase &) = delete; |
||
| 338 | virtual ~TargetLoweringBase() = default; |
||
| 339 | |||
| 340 | /// Return true if the target support strict float operation |
||
| 341 | bool isStrictFPEnabled() const { |
||
| 342 | return IsStrictFPEnabled; |
||
| 343 | } |
||
| 344 | |||
| 345 | protected: |
||
| 346 | /// Initialize all of the actions to default values. |
||
| 347 | void initActions(); |
||
| 348 | |||
| 349 | public: |
||
| 350 | const TargetMachine &getTargetMachine() const { return TM; } |
||
| 351 | |||
| 352 | virtual bool useSoftFloat() const { return false; } |
||
| 353 | |||
| 354 | /// Return the pointer type for the given address space, defaults to |
||
| 355 | /// the pointer type from the data layout. |
||
| 356 | /// FIXME: The default needs to be removed once all the code is updated. |
||
| 357 | virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const { |
||
| 358 | return MVT::getIntegerVT(DL.getPointerSizeInBits(AS)); |
||
| 359 | } |
||
| 360 | |||
| 361 | /// Return the in-memory pointer type for the given address space, defaults to |
||
| 362 | /// the pointer type from the data layout. FIXME: The default needs to be |
||
| 363 | /// removed once all the code is updated. |
||
| 364 | virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS = 0) const { |
||
| 365 | return MVT::getIntegerVT(DL.getPointerSizeInBits(AS)); |
||
| 366 | } |
||
| 367 | |||
| 368 | /// Return the type for frame index, which is determined by |
||
| 369 | /// the alloca address space specified through the data layout. |
||
| 370 | MVT getFrameIndexTy(const DataLayout &DL) const { |
||
| 371 | return getPointerTy(DL, DL.getAllocaAddrSpace()); |
||
| 372 | } |
||
| 373 | |||
| 374 | /// Return the type for code pointers, which is determined by the program |
||
| 375 | /// address space specified through the data layout. |
||
| 376 | MVT getProgramPointerTy(const DataLayout &DL) const { |
||
| 377 | return getPointerTy(DL, DL.getProgramAddressSpace()); |
||
| 378 | } |
||
| 379 | |||
| 380 | /// Return the type for operands of fence. |
||
| 381 | /// TODO: Let fence operands be of i32 type and remove this. |
||
| 382 | virtual MVT getFenceOperandTy(const DataLayout &DL) const { |
||
| 383 | return getPointerTy(DL); |
||
| 384 | } |
||
| 385 | |||
| 386 | /// Return the type to use for a scalar shift opcode, given the shifted amount |
||
| 387 | /// type. Targets should return a legal type if the input type is legal. |
||
| 388 | /// Targets can return a type that is too small if the input type is illegal. |
||
| 389 | virtual MVT getScalarShiftAmountTy(const DataLayout &, EVT) const; |
||
| 390 | |||
| 391 | /// Returns the type for the shift amount of a shift opcode. For vectors, |
||
| 392 | /// returns the input type. For scalars, behavior depends on \p LegalTypes. If |
||
| 393 | /// \p LegalTypes is true, calls getScalarShiftAmountTy, otherwise uses |
||
| 394 | /// pointer type. If getScalarShiftAmountTy or pointer type cannot represent |
||
| 395 | /// all possible shift amounts, returns MVT::i32. In general, \p LegalTypes |
||
| 396 | /// should be set to true for calls during type legalization and after type |
||
| 397 | /// legalization has been completed. |
||
| 398 | EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL, |
||
| 399 | bool LegalTypes = true) const; |
||
| 400 | |||
| 401 | /// Return the preferred type to use for a shift opcode, given the shifted |
||
| 402 | /// amount type is \p ShiftValueTy. |
||
| 403 | LLVM_READONLY |
||
| 404 | virtual LLT getPreferredShiftAmountTy(LLT ShiftValueTy) const { |
||
| 405 | return ShiftValueTy; |
||
| 406 | } |
||
| 407 | |||
| 408 | /// Returns the type to be used for the index operand of: |
||
| 409 | /// ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT, |
||
| 410 | /// ISD::INSERT_SUBVECTOR, and ISD::EXTRACT_SUBVECTOR |
||
| 411 | virtual MVT getVectorIdxTy(const DataLayout &DL) const { |
||
| 412 | return getPointerTy(DL); |
||
| 413 | } |
||
| 414 | |||
| 415 | /// Returns the type to be used for the EVL/AVL operand of VP nodes: |
||
| 416 | /// ISD::VP_ADD, ISD::VP_SUB, etc. It must be a legal scalar integer type, |
||
| 417 | /// and must be at least as large as i32. The EVL is implicitly zero-extended |
||
| 418 | /// to any larger type. |
||
| 419 | virtual MVT getVPExplicitVectorLengthTy() const { return MVT::i32; } |
||
| 420 | |||
| 421 | /// This callback is used to inspect load/store instructions and add |
||
| 422 | /// target-specific MachineMemOperand flags to them. The default |
||
| 423 | /// implementation does nothing. |
||
| 424 | virtual MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const { |
||
| 425 | return MachineMemOperand::MONone; |
||
| 426 | } |
||
| 427 | |||
| 428 | MachineMemOperand::Flags |
||
| 429 | getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, |
||
| 430 | AssumptionCache *AC = nullptr, |
||
| 431 | const TargetLibraryInfo *LibInfo = nullptr) const; |
||
| 432 | MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, |
||
| 433 | const DataLayout &DL) const; |
||
| 434 | MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, |
||
| 435 | const DataLayout &DL) const; |
||
| 436 | |||
| 437 | virtual bool isSelectSupported(SelectSupportKind /*kind*/) const { |
||
| 438 | return true; |
||
| 439 | } |
||
| 440 | |||
| 441 | /// Return true if the @llvm.get.active.lane.mask intrinsic should be expanded |
||
| 442 | /// using generic code in SelectionDAGBuilder. |
||
| 443 | virtual bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const { |
||
| 444 | return true; |
||
| 445 | } |
||
| 446 | |||
| 447 | /// Return true if it is profitable to convert a select of FP constants into |
||
| 448 | /// a constant pool load whose address depends on the select condition. The |
||
| 449 | /// parameter may be used to differentiate a select with FP compare from |
||
| 450 | /// integer compare. |
||
| 451 | virtual bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const { |
||
| 452 | return true; |
||
| 453 | } |
||
| 454 | |||
| 455 | /// Return true if multiple condition registers are available. |
||
| 456 | bool hasMultipleConditionRegisters() const { |
||
| 457 | return HasMultipleConditionRegisters; |
||
| 458 | } |
||
| 459 | |||
| 460 | /// Return true if the target has BitExtract instructions. |
||
| 461 | bool hasExtractBitsInsn() const { return HasExtractBitsInsn; } |
||
| 462 | |||
| 463 | /// Return the preferred vector type legalization action. |
||
| 464 | virtual TargetLoweringBase::LegalizeTypeAction |
||
| 465 | getPreferredVectorAction(MVT VT) const { |
||
| 466 | // The default action for one element vectors is to scalarize |
||
| 467 | if (VT.getVectorElementCount().isScalar()) |
||
| 468 | return TypeScalarizeVector; |
||
| 469 | // The default action for an odd-width vector is to widen. |
||
| 470 | if (!VT.isPow2VectorType()) |
||
| 471 | return TypeWidenVector; |
||
| 472 | // The default action for other vectors is to promote |
||
| 473 | return TypePromoteInteger; |
||
| 474 | } |
||
| 475 | |||
| 476 | // Return true if the half type should be passed around as i16, but promoted |
||
| 477 | // to float around arithmetic. The default behavior is to pass around as |
||
| 478 | // float and convert around loads/stores/bitcasts and other places where |
||
| 479 | // the size matters. |
||
| 480 | virtual bool softPromoteHalfType() const { return false; } |
||
| 481 | |||
| 482 | // There are two general methods for expanding a BUILD_VECTOR node: |
||
| 483 | // 1. Use SCALAR_TO_VECTOR on the defined scalar values and then shuffle |
||
| 484 | // them together. |
||
| 485 | // 2. Build the vector on the stack and then load it. |
||
| 486 | // If this function returns true, then method (1) will be used, subject to |
||
| 487 | // the constraint that all of the necessary shuffles are legal (as determined |
||
| 488 | // by isShuffleMaskLegal). If this function returns false, then method (2) is |
||
| 489 | // always used. The vector type, and the number of defined values, are |
||
| 490 | // provided. |
||
| 491 | virtual bool |
||
| 492 | shouldExpandBuildVectorWithShuffles(EVT /* VT */, |
||
| 493 | unsigned DefinedValues) const { |
||
| 494 | return DefinedValues < 3; |
||
| 495 | } |
||
| 496 | |||
| 497 | /// Return true if integer divide is usually cheaper than a sequence of |
||
| 498 | /// several shifts, adds, and multiplies for this target. |
||
| 499 | /// The definition of "cheaper" may depend on whether we're optimizing |
||
| 500 | /// for speed or for size. |
||
| 501 | virtual bool isIntDivCheap(EVT VT, AttributeList Attr) const { return false; } |
||
| 502 | |||
| 503 | /// Return true if the target can handle a standalone remainder operation. |
||
| 504 | virtual bool hasStandaloneRem(EVT VT) const { |
||
| 505 | return true; |
||
| 506 | } |
||
| 507 | |||
| 508 | /// Return true if SQRT(X) shouldn't be replaced with X*RSQRT(X). |
||
| 509 | virtual bool isFsqrtCheap(SDValue X, SelectionDAG &DAG) const { |
||
| 510 | // Default behavior is to replace SQRT(X) with X*RSQRT(X). |
||
| 511 | return false; |
||
| 512 | } |
||
| 513 | |||
| 514 | /// Reciprocal estimate status values used by the functions below. |
||
| 515 | enum ReciprocalEstimate : int { |
||
| 516 | Unspecified = -1, |
||
| 517 | Disabled = 0, |
||
| 518 | Enabled = 1 |
||
| 519 | }; |
||
| 520 | |||
| 521 | /// Return a ReciprocalEstimate enum value for a square root of the given type |
||
| 522 | /// based on the function's attributes. If the operation is not overridden by |
||
| 523 | /// the function's attributes, "Unspecified" is returned and target defaults |
||
| 524 | /// are expected to be used for instruction selection. |
||
| 525 | int getRecipEstimateSqrtEnabled(EVT VT, MachineFunction &MF) const; |
||
| 526 | |||
| 527 | /// Return a ReciprocalEstimate enum value for a division of the given type |
||
| 528 | /// based on the function's attributes. If the operation is not overridden by |
||
| 529 | /// the function's attributes, "Unspecified" is returned and target defaults |
||
| 530 | /// are expected to be used for instruction selection. |
||
| 531 | int getRecipEstimateDivEnabled(EVT VT, MachineFunction &MF) const; |
||
| 532 | |||
| 533 | /// Return the refinement step count for a square root of the given type based |
||
| 534 | /// on the function's attributes. If the operation is not overridden by |
||
| 535 | /// the function's attributes, "Unspecified" is returned and target defaults |
||
| 536 | /// are expected to be used for instruction selection. |
||
| 537 | int getSqrtRefinementSteps(EVT VT, MachineFunction &MF) const; |
||
| 538 | |||
| 539 | /// Return the refinement step count for a division of the given type based |
||
| 540 | /// on the function's attributes. If the operation is not overridden by |
||
| 541 | /// the function's attributes, "Unspecified" is returned and target defaults |
||
| 542 | /// are expected to be used for instruction selection. |
||
| 543 | int getDivRefinementSteps(EVT VT, MachineFunction &MF) const; |
||
| 544 | |||
| 545 | /// Returns true if target has indicated at least one type should be bypassed. |
||
| 546 | bool isSlowDivBypassed() const { return !BypassSlowDivWidths.empty(); } |
||
| 547 | |||
| 548 | /// Returns map of slow types for division or remainder with corresponding |
||
| 549 | /// fast types |
||
| 550 | const DenseMap<unsigned int, unsigned int> &getBypassSlowDivWidths() const { |
||
| 551 | return BypassSlowDivWidths; |
||
| 552 | } |
||
| 553 | |||
| 554 | /// Return true only if vscale must be a power of two. |
||
| 555 | virtual bool isVScaleKnownToBeAPowerOfTwo() const { return false; } |
||
| 556 | |||
| 557 | /// Return true if Flow Control is an expensive operation that should be |
||
| 558 | /// avoided. |
||
| 559 | bool isJumpExpensive() const { return JumpIsExpensive; } |
||
| 560 | |||
| 561 | /// Return true if selects are only cheaper than branches if the branch is |
||
| 562 | /// unlikely to be predicted right. |
||
| 563 | bool isPredictableSelectExpensive() const { |
||
| 564 | return PredictableSelectIsExpensive; |
||
| 565 | } |
||
| 566 | |||
| 567 | virtual bool fallBackToDAGISel(const Instruction &Inst) const { |
||
| 568 | return false; |
||
| 569 | } |
||
| 570 | |||
| 571 | /// Return true if the following transform is beneficial: |
||
| 572 | /// fold (conv (load x)) -> (load (conv*)x) |
||
| 573 | /// On architectures that don't natively support some vector loads |
||
| 574 | /// efficiently, casting the load to a smaller vector of larger types and |
||
| 575 | /// loading is more efficient, however, this can be undone by optimizations in |
||
| 576 | /// dag combiner. |
||
| 577 | virtual bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT, |
||
| 578 | const SelectionDAG &DAG, |
||
| 579 | const MachineMemOperand &MMO) const; |
||
| 580 | |||
| 581 | /// Return true if the following transform is beneficial: |
||
| 582 | /// (store (y (conv x)), y*)) -> (store x, (x*)) |
||
| 583 | virtual bool isStoreBitCastBeneficial(EVT StoreVT, EVT BitcastVT, |
||
| 584 | const SelectionDAG &DAG, |
||
| 585 | const MachineMemOperand &MMO) const { |
||
| 586 | // Default to the same logic as loads. |
||
| 587 | return isLoadBitCastBeneficial(StoreVT, BitcastVT, DAG, MMO); |
||
| 588 | } |
||
| 589 | |||
| 590 | /// Return true if it is expected to be cheaper to do a store of a non-zero |
||
| 591 | /// vector constant with the given size and type for the address space than to |
||
| 592 | /// store the individual scalar element constants. |
||
| 593 | virtual bool storeOfVectorConstantIsCheap(EVT MemVT, |
||
| 594 | unsigned NumElem, |
||
| 595 | unsigned AddrSpace) const { |
||
| 596 | return false; |
||
| 597 | } |
||
| 598 | |||
| 599 | /// Allow store merging for the specified type after legalization in addition |
||
| 600 | /// to before legalization. This may transform stores that do not exist |
||
| 601 | /// earlier (for example, stores created from intrinsics). |
||
| 602 | virtual bool mergeStoresAfterLegalization(EVT MemVT) const { |
||
| 603 | return true; |
||
| 604 | } |
||
| 605 | |||
| 606 | /// Returns if it's reasonable to merge stores to MemVT size. |
||
| 607 | virtual bool canMergeStoresTo(unsigned AS, EVT MemVT, |
||
| 608 | const MachineFunction &MF) const { |
||
| 609 | return true; |
||
| 610 | } |
||
| 611 | |||
| 612 | /// Return true if it is cheap to speculate a call to intrinsic cttz. |
||
| 613 | virtual bool isCheapToSpeculateCttz(Type *Ty) const { |
||
| 614 | return false; |
||
| 615 | } |
||
| 616 | |||
| 617 | /// Return true if it is cheap to speculate a call to intrinsic ctlz. |
||
| 618 | virtual bool isCheapToSpeculateCtlz(Type *Ty) const { |
||
| 619 | return false; |
||
| 620 | } |
||
| 621 | |||
| 622 | /// Return true if ctlz instruction is fast. |
||
| 623 | virtual bool isCtlzFast() const { |
||
| 624 | return false; |
||
| 625 | } |
||
| 626 | |||
| 627 | /// Return the maximum number of "x & (x - 1)" operations that can be done |
||
| 628 | /// instead of deferring to a custom CTPOP. |
||
| 629 | virtual unsigned getCustomCtpopCost(EVT VT, ISD::CondCode Cond) const { |
||
| 630 | return 1; |
||
| 631 | } |
||
| 632 | |||
| 633 | /// Return true if instruction generated for equality comparison is folded |
||
| 634 | /// with instruction generated for signed comparison. |
||
| 635 | virtual bool isEqualityCmpFoldedWithSignedCmp() const { return true; } |
||
| 636 | |||
| 637 | /// Return true if the heuristic to prefer icmp eq zero should be used in code |
||
| 638 | /// gen prepare. |
||
| 639 | virtual bool preferZeroCompareBranch() const { return false; } |
||
| 640 | |||
| 641 | /// Return true if it is safe to transform an integer-domain bitwise operation |
||
| 642 | /// into the equivalent floating-point operation. This should be set to true |
||
| 643 | /// if the target has IEEE-754-compliant fabs/fneg operations for the input |
||
| 644 | /// type. |
||
| 645 | virtual bool hasBitPreservingFPLogic(EVT VT) const { |
||
| 646 | return false; |
||
| 647 | } |
||
| 648 | |||
| 649 | /// Return true if it is cheaper to split the store of a merged int val |
||
| 650 | /// from a pair of smaller values into multiple stores. |
||
| 651 | virtual bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const { |
||
| 652 | return false; |
||
| 653 | } |
||
| 654 | |||
| 655 | /// Return if the target supports combining a |
||
| 656 | /// chain like: |
||
| 657 | /// \code |
||
| 658 | /// %andResult = and %val1, #mask |
||
| 659 | /// %icmpResult = icmp %andResult, 0 |
||
| 660 | /// \endcode |
||
| 661 | /// into a single machine instruction of a form like: |
||
| 662 | /// \code |
||
| 663 | /// cc = test %register, #mask |
||
| 664 | /// \endcode |
||
| 665 | virtual bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const { |
||
| 666 | return false; |
||
| 667 | } |
||
| 668 | |||
| 669 | /// Use bitwise logic to make pairs of compares more efficient. For example: |
||
| 670 | /// and (seteq A, B), (seteq C, D) --> seteq (or (xor A, B), (xor C, D)), 0 |
||
| 671 | /// This should be true when it takes more than one instruction to lower |
||
| 672 | /// setcc (cmp+set on x86 scalar), when bitwise ops are faster than logic on |
||
| 673 | /// condition bits (crand on PowerPC), and/or when reducing cmp+br is a win. |
||
| 674 | virtual bool convertSetCCLogicToBitwiseLogic(EVT VT) const { |
||
| 675 | return false; |
||
| 676 | } |
||
| 677 | |||
| 678 | /// Return the preferred operand type if the target has a quick way to compare |
||
| 679 | /// integer values of the given size. Assume that any legal integer type can |
||
| 680 | /// be compared efficiently. Targets may override this to allow illegal wide |
||
| 681 | /// types to return a vector type if there is support to compare that type. |
||
| 682 | virtual MVT hasFastEqualityCompare(unsigned NumBits) const { |
||
| 683 | MVT VT = MVT::getIntegerVT(NumBits); |
||
| 684 | return isTypeLegal(VT) ? VT : MVT::INVALID_SIMPLE_VALUE_TYPE; |
||
| 685 | } |
||
| 686 | |||
| 687 | /// Return true if the target should transform: |
||
| 688 | /// (X & Y) == Y ---> (~X & Y) == 0 |
||
| 689 | /// (X & Y) != Y ---> (~X & Y) != 0 |
||
| 690 | /// |
||
| 691 | /// This may be profitable if the target has a bitwise and-not operation that |
||
| 692 | /// sets comparison flags. A target may want to limit the transformation based |
||
| 693 | /// on the type of Y or if Y is a constant. |
||
| 694 | /// |
||
| 695 | /// Note that the transform will not occur if Y is known to be a power-of-2 |
||
| 696 | /// because a mask and compare of a single bit can be handled by inverting the |
||
| 697 | /// predicate, for example: |
||
| 698 | /// (X & 8) == 8 ---> (X & 8) != 0 |
||
| 699 | virtual bool hasAndNotCompare(SDValue Y) const { |
||
| 700 | return false; |
||
| 701 | } |
||
| 702 | |||
| 703 | /// Return true if the target has a bitwise and-not operation: |
||
| 704 | /// X = ~A & B |
||
| 705 | /// This can be used to simplify select or other instructions. |
||
| 706 | virtual bool hasAndNot(SDValue X) const { |
||
| 707 | // If the target has the more complex version of this operation, assume that |
||
| 708 | // it has this operation too. |
||
| 709 | return hasAndNotCompare(X); |
||
| 710 | } |
||
| 711 | |||
| 712 | /// Return true if the target has a bit-test instruction: |
||
| 713 | /// (X & (1 << Y)) ==/!= 0 |
||
| 714 | /// This knowledge can be used to prevent breaking the pattern, |
||
| 715 | /// or creating it if it could be recognized. |
||
| 716 | virtual bool hasBitTest(SDValue X, SDValue Y) const { return false; } |
||
| 717 | |||
| 718 | /// There are two ways to clear extreme bits (either low or high): |
||
| 719 | /// Mask: x & (-1 << y) (the instcombine canonical form) |
||
| 720 | /// Shifts: x >> y << y |
||
| 721 | /// Return true if the variant with 2 variable shifts is preferred. |
||
| 722 | /// Return false if there is no preference. |
||
| 723 | virtual bool shouldFoldMaskToVariableShiftPair(SDValue X) const { |
||
| 724 | // By default, let's assume that no one prefers shifts. |
||
| 725 | return false; |
||
| 726 | } |
||
| 727 | |||
| 728 | /// Return true if it is profitable to fold a pair of shifts into a mask. |
||
| 729 | /// This is usually true on most targets. But some targets, like Thumb1, |
||
| 730 | /// have immediate shift instructions, but no immediate "and" instruction; |
||
| 731 | /// this makes the fold unprofitable. |
||
| 732 | virtual bool shouldFoldConstantShiftPairToMask(const SDNode *N, |
||
| 733 | CombineLevel Level) const { |
||
| 734 | return true; |
||
| 735 | } |
||
| 736 | |||
| 737 | /// Should we tranform the IR-optimal check for whether given truncation |
||
| 738 | /// down into KeptBits would be truncating or not: |
||
| 739 | /// (add %x, (1 << (KeptBits-1))) srccond (1 << KeptBits) |
||
| 740 | /// Into it's more traditional form: |
||
| 741 | /// ((%x << C) a>> C) dstcond %x |
||
| 742 | /// Return true if we should transform. |
||
| 743 | /// Return false if there is no preference. |
||
| 744 | virtual bool shouldTransformSignedTruncationCheck(EVT XVT, |
||
| 745 | unsigned KeptBits) const { |
||
| 746 | // By default, let's assume that no one prefers shifts. |
||
| 747 | return false; |
||
| 748 | } |
||
| 749 | |||
| 750 | /// Given the pattern |
||
| 751 | /// (X & (C l>>/<< Y)) ==/!= 0 |
||
| 752 | /// return true if it should be transformed into: |
||
| 753 | /// ((X <</l>> Y) & C) ==/!= 0 |
||
| 754 | /// WARNING: if 'X' is a constant, the fold may deadlock! |
||
| 755 | /// FIXME: we could avoid passing XC, but we can't use isConstOrConstSplat() |
||
| 756 | /// here because it can end up being not linked in. |
||
| 757 | virtual bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd( |
||
| 758 | SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, |
||
| 759 | unsigned OldShiftOpcode, unsigned NewShiftOpcode, |
||
| 760 | SelectionDAG &DAG) const { |
||
| 761 | if (hasBitTest(X, Y)) { |
||
| 762 | // One interesting pattern that we'd want to form is 'bit test': |
||
| 763 | // ((1 << Y) & C) ==/!= 0 |
||
| 764 | // But we also need to be careful not to try to reverse that fold. |
||
| 765 | |||
| 766 | // Is this '1 << Y' ? |
||
| 767 | if (OldShiftOpcode == ISD::SHL && CC->isOne()) |
||
| 768 | return false; // Keep the 'bit test' pattern. |
||
| 769 | |||
| 770 | // Will it be '1 << Y' after the transform ? |
||
| 771 | if (XC && NewShiftOpcode == ISD::SHL && XC->isOne()) |
||
| 772 | return true; // Do form the 'bit test' pattern. |
||
| 773 | } |
||
| 774 | |||
| 775 | // If 'X' is a constant, and we transform, then we will immediately |
||
| 776 | // try to undo the fold, thus causing endless combine loop. |
||
| 777 | // So by default, let's assume everyone prefers the fold |
||
| 778 | // iff 'X' is not a constant. |
||
| 779 | return !XC; |
||
| 780 | } |
||
| 781 | |||
| 782 | /// These two forms are equivalent: |
||
| 783 | /// sub %y, (xor %x, -1) |
||
| 784 | /// add (add %x, 1), %y |
||
| 785 | /// The variant with two add's is IR-canonical. |
||
| 786 | /// Some targets may prefer one to the other. |
||
| 787 | virtual bool preferIncOfAddToSubOfNot(EVT VT) const { |
||
| 788 | // By default, let's assume that everyone prefers the form with two add's. |
||
| 789 | return true; |
||
| 790 | } |
||
| 791 | |||
| 792 | // Return true if the target wants to transform Op(Splat(X)) -> Splat(Op(X)) |
||
| 793 | virtual bool preferScalarizeSplat(unsigned Opc) const { return true; } |
||
| 794 | |||
| 795 | /// Return true if the target wants to use the optimization that |
||
| 796 | /// turns ext(promotableInst1(...(promotableInstN(load)))) into |
||
| 797 | /// promotedInst1(...(promotedInstN(ext(load)))). |
||
| 798 | bool enableExtLdPromotion() const { return EnableExtLdPromotion; } |
||
| 799 | |||
| 800 | /// Return true if the target can combine store(extractelement VectorTy, |
||
| 801 | /// Idx). |
||
| 802 | /// \p Cost[out] gives the cost of that transformation when this is true. |
||
| 803 | virtual bool canCombineStoreAndExtract(Type *VectorTy, Value *Idx, |
||
| 804 | unsigned &Cost) const { |
||
| 805 | return false; |
||
| 806 | } |
||
| 807 | |||
| 808 | /// Return true if inserting a scalar into a variable element of an undef |
||
| 809 | /// vector is more efficiently handled by splatting the scalar instead. |
||
| 810 | virtual bool shouldSplatInsEltVarIndex(EVT) const { |
||
| 811 | return false; |
||
| 812 | } |
||
| 813 | |||
| 814 | /// Return true if target always benefits from combining into FMA for a |
||
| 815 | /// given value type. This must typically return false on targets where FMA |
||
| 816 | /// takes more cycles to execute than FADD. |
||
| 817 | virtual bool enableAggressiveFMAFusion(EVT VT) const { return false; } |
||
| 818 | |||
| 819 | /// Return true if target always benefits from combining into FMA for a |
||
| 820 | /// given value type. This must typically return false on targets where FMA |
||
| 821 | /// takes more cycles to execute than FADD. |
||
| 822 | virtual bool enableAggressiveFMAFusion(LLT Ty) const { return false; } |
||
| 823 | |||
| 824 | /// Return the ValueType of the result of SETCC operations. |
||
| 825 | virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, |
||
| 826 | EVT VT) const; |
||
| 827 | |||
| 828 | /// Return the ValueType for comparison libcalls. Comparison libcalls include |
||
| 829 | /// floating point comparison calls, and Ordered/Unordered check calls on |
||
| 830 | /// floating point numbers. |
||
| 831 | virtual |
||
| 832 | MVT::SimpleValueType getCmpLibcallReturnType() const; |
||
| 833 | |||
| 834 | /// For targets without i1 registers, this gives the nature of the high-bits |
||
| 835 | /// of boolean values held in types wider than i1. |
||
| 836 | /// |
||
| 837 | /// "Boolean values" are special true/false values produced by nodes like |
||
| 838 | /// SETCC and consumed (as the condition) by nodes like SELECT and BRCOND. |
||
| 839 | /// Not to be confused with general values promoted from i1. Some cpus |
||
| 840 | /// distinguish between vectors of boolean and scalars; the isVec parameter |
||
| 841 | /// selects between the two kinds. For example on X86 a scalar boolean should |
||
| 842 | /// be zero extended from i1, while the elements of a vector of booleans |
||
| 843 | /// should be sign extended from i1. |
||
| 844 | /// |
||
| 845 | /// Some cpus also treat floating point types the same way as they treat |
||
| 846 | /// vectors instead of the way they treat scalars. |
||
| 847 | BooleanContent getBooleanContents(bool isVec, bool isFloat) const { |
||
| 848 | if (isVec) |
||
| 849 | return BooleanVectorContents; |
||
| 850 | return isFloat ? BooleanFloatContents : BooleanContents; |
||
| 851 | } |
||
| 852 | |||
| 853 | BooleanContent getBooleanContents(EVT Type) const { |
||
| 854 | return getBooleanContents(Type.isVector(), Type.isFloatingPoint()); |
||
| 855 | } |
||
| 856 | |||
| 857 | /// Promote the given target boolean to a target boolean of the given type. |
||
| 858 | /// A target boolean is an integer value, not necessarily of type i1, the bits |
||
| 859 | /// of which conform to getBooleanContents. |
||
| 860 | /// |
||
| 861 | /// ValVT is the type of values that produced the boolean. |
||
| 862 | SDValue promoteTargetBoolean(SelectionDAG &DAG, SDValue Bool, |
||
| 863 | EVT ValVT) const { |
||
| 864 | SDLoc dl(Bool); |
||
| 865 | EVT BoolVT = |
||
| 866 | getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ValVT); |
||
| 867 | ISD::NodeType ExtendCode = getExtendForContent(getBooleanContents(ValVT)); |
||
| 868 | return DAG.getNode(ExtendCode, dl, BoolVT, Bool); |
||
| 869 | } |
||
| 870 | |||
| 871 | /// Return target scheduling preference. |
||
| 872 | Sched::Preference getSchedulingPreference() const { |
||
| 873 | return SchedPreferenceInfo; |
||
| 874 | } |
||
| 875 | |||
| 876 | /// Some scheduler, e.g. hybrid, can switch to different scheduling heuristics |
||
| 877 | /// for different nodes. This function returns the preference (or none) for |
||
| 878 | /// the given node. |
||
| 879 | virtual Sched::Preference getSchedulingPreference(SDNode *) const { |
||
| 880 | return Sched::None; |
||
| 881 | } |
||
| 882 | |||
| 883 | /// Return the register class that should be used for the specified value |
||
| 884 | /// type. |
||
| 885 | virtual const TargetRegisterClass *getRegClassFor(MVT VT, bool isDivergent = false) const { |
||
| 886 | (void)isDivergent; |
||
| 887 | const TargetRegisterClass *RC = RegClassForVT[VT.SimpleTy]; |
||
| 888 | assert(RC && "This value type is not natively supported!"); |
||
| 889 | return RC; |
||
| 890 | } |
||
| 891 | |||
| 892 | /// Allows target to decide about the register class of the |
||
| 893 | /// specific value that is live outside the defining block. |
||
| 894 | /// Returns true if the value needs uniform register class. |
||
| 895 | virtual bool requiresUniformRegister(MachineFunction &MF, |
||
| 896 | const Value *) const { |
||
| 897 | return false; |
||
| 898 | } |
||
| 899 | |||
| 900 | /// Return the 'representative' register class for the specified value |
||
| 901 | /// type. |
||
| 902 | /// |
||
| 903 | /// The 'representative' register class is the largest legal super-reg |
||
| 904 | /// register class for the register class of the value type. For example, on |
||
| 905 | /// i386 the rep register class for i8, i16, and i32 are GR32; while the rep |
||
| 906 | /// register class is GR64 on x86_64. |
||
| 907 | virtual const TargetRegisterClass *getRepRegClassFor(MVT VT) const { |
||
| 908 | const TargetRegisterClass *RC = RepRegClassForVT[VT.SimpleTy]; |
||
| 909 | return RC; |
||
| 910 | } |
||
| 911 | |||
| 912 | /// Return the cost of the 'representative' register class for the specified |
||
| 913 | /// value type. |
||
| 914 | virtual uint8_t getRepRegClassCostFor(MVT VT) const { |
||
| 915 | return RepRegClassCostForVT[VT.SimpleTy]; |
||
| 916 | } |
||
| 917 | |||
| 918 | /// Return the preferred strategy to legalize tihs SHIFT instruction, with |
||
| 919 | /// \p ExpansionFactor being the recursion depth - how many expansion needed. |
||
| 920 | enum class ShiftLegalizationStrategy { |
||
| 921 | ExpandToParts, |
||
| 922 | ExpandThroughStack, |
||
| 923 | LowerToLibcall |
||
| 924 | }; |
||
| 925 | virtual ShiftLegalizationStrategy |
||
| 926 | preferredShiftLegalizationStrategy(SelectionDAG &DAG, SDNode *N, |
||
| 927 | unsigned ExpansionFactor) const { |
||
| 928 | if (ExpansionFactor == 1) |
||
| 929 | return ShiftLegalizationStrategy::ExpandToParts; |
||
| 930 | return ShiftLegalizationStrategy::ExpandThroughStack; |
||
| 931 | } |
||
| 932 | |||
| 933 | /// Return true if the target has native support for the specified value type. |
||
| 934 | /// This means that it has a register that directly holds it without |
||
| 935 | /// promotions or expansions. |
||
| 936 | bool isTypeLegal(EVT VT) const { |
||
| 937 | assert(!VT.isSimple() || |
||
| 938 | (unsigned)VT.getSimpleVT().SimpleTy < std::size(RegClassForVT)); |
||
| 939 | return VT.isSimple() && RegClassForVT[VT.getSimpleVT().SimpleTy] != nullptr; |
||
| 940 | } |
||
| 941 | |||
| 942 | class ValueTypeActionImpl { |
||
| 943 | /// ValueTypeActions - For each value type, keep a LegalizeTypeAction enum |
||
| 944 | /// that indicates how instruction selection should deal with the type. |
||
| 945 | LegalizeTypeAction ValueTypeActions[MVT::VALUETYPE_SIZE]; |
||
| 946 | |||
| 947 | public: |
||
| 948 | ValueTypeActionImpl() { |
||
| 949 | std::fill(std::begin(ValueTypeActions), std::end(ValueTypeActions), |
||
| 950 | TypeLegal); |
||
| 951 | } |
||
| 952 | |||
| 953 | LegalizeTypeAction getTypeAction(MVT VT) const { |
||
| 954 | return ValueTypeActions[VT.SimpleTy]; |
||
| 955 | } |
||
| 956 | |||
| 957 | void setTypeAction(MVT VT, LegalizeTypeAction Action) { |
||
| 958 | ValueTypeActions[VT.SimpleTy] = Action; |
||
| 959 | } |
||
| 960 | }; |
||
| 961 | |||
| 962 | const ValueTypeActionImpl &getValueTypeActions() const { |
||
| 963 | return ValueTypeActions; |
||
| 964 | } |
||
| 965 | |||
| 966 | /// Return pair that represents the legalization kind (first) that needs to |
||
| 967 | /// happen to EVT (second) in order to type-legalize it. |
||
| 968 | /// |
||
| 969 | /// First: how we should legalize values of this type, either it is already |
||
| 970 | /// legal (return 'Legal') or we need to promote it to a larger type (return |
||
| 971 | /// 'Promote'), or we need to expand it into multiple registers of smaller |
||
| 972 | /// integer type (return 'Expand'). 'Custom' is not an option. |
||
| 973 | /// |
||
| 974 | /// Second: for types supported by the target, this is an identity function. |
||
| 975 | /// For types that must be promoted to larger types, this returns the larger |
||
| 976 | /// type to promote to. For integer types that are larger than the largest |
||
| 977 | /// integer register, this contains one step in the expansion to get to the |
||
| 978 | /// smaller register. For illegal floating point types, this returns the |
||
| 979 | /// integer type to transform to. |
||
| 980 | LegalizeKind getTypeConversion(LLVMContext &Context, EVT VT) const; |
||
| 981 | |||
| 982 | /// Return how we should legalize values of this type, either it is already |
||
| 983 | /// legal (return 'Legal') or we need to promote it to a larger type (return |
||
| 984 | /// 'Promote'), or we need to expand it into multiple registers of smaller |
||
| 985 | /// integer type (return 'Expand'). 'Custom' is not an option. |
||
| 986 | LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const { |
||
| 987 | return getTypeConversion(Context, VT).first; |
||
| 988 | } |
||
| 989 | LegalizeTypeAction getTypeAction(MVT VT) const { |
||
| 990 | return ValueTypeActions.getTypeAction(VT); |
||
| 991 | } |
||
| 992 | |||
| 993 | /// For types supported by the target, this is an identity function. For |
||
| 994 | /// types that must be promoted to larger types, this returns the larger type |
||
| 995 | /// to promote to. For integer types that are larger than the largest integer |
||
| 996 | /// register, this contains one step in the expansion to get to the smaller |
||
| 997 | /// register. For illegal floating point types, this returns the integer type |
||
| 998 | /// to transform to. |
||
| 999 | virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const { |
||
| 1000 | return getTypeConversion(Context, VT).second; |
||
| 1001 | } |
||
| 1002 | |||
| 1003 | /// For types supported by the target, this is an identity function. For |
||
| 1004 | /// types that must be expanded (i.e. integer types that are larger than the |
||
| 1005 | /// largest integer register or illegal floating point types), this returns |
||
| 1006 | /// the largest legal type it will be expanded to. |
||
| 1007 | EVT getTypeToExpandTo(LLVMContext &Context, EVT VT) const { |
||
| 1008 | assert(!VT.isVector()); |
||
| 1009 | while (true) { |
||
| 1010 | switch (getTypeAction(Context, VT)) { |
||
| 1011 | case TypeLegal: |
||
| 1012 | return VT; |
||
| 1013 | case TypeExpandInteger: |
||
| 1014 | VT = getTypeToTransformTo(Context, VT); |
||
| 1015 | break; |
||
| 1016 | default: |
||
| 1017 | llvm_unreachable("Type is not legal nor is it to be expanded!"); |
||
| 1018 | } |
||
| 1019 | } |
||
| 1020 | } |
||
| 1021 | |||
| 1022 | /// Vector types are broken down into some number of legal first class types. |
||
| 1023 | /// For example, EVT::v8f32 maps to 2 EVT::v4f32 with Altivec or SSE1, or 8 |
||
| 1024 | /// promoted EVT::f64 values with the X86 FP stack. Similarly, EVT::v2i64 |
||
| 1025 | /// turns into 4 EVT::i32 values with both PPC and X86. |
||
| 1026 | /// |
||
| 1027 | /// This method returns the number of registers needed, and the VT for each |
||
| 1028 | /// register. It also returns the VT and quantity of the intermediate values |
||
| 1029 | /// before they are promoted/expanded. |
||
| 1030 | unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, |
||
| 1031 | EVT &IntermediateVT, |
||
| 1032 | unsigned &NumIntermediates, |
||
| 1033 | MVT &RegisterVT) const; |
||
| 1034 | |||
| 1035 | /// Certain targets such as MIPS require that some types such as vectors are |
||
| 1036 | /// always broken down into scalars in some contexts. This occurs even if the |
||
| 1037 | /// vector type is legal. |
||
| 1038 | virtual unsigned getVectorTypeBreakdownForCallingConv( |
||
| 1039 | LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, |
||
| 1040 | unsigned &NumIntermediates, MVT &RegisterVT) const { |
||
| 1041 | return getVectorTypeBreakdown(Context, VT, IntermediateVT, NumIntermediates, |
||
| 1042 | RegisterVT); |
||
| 1043 | } |
||
| 1044 | |||
| 1045 | struct IntrinsicInfo { |
||
| 1046 | unsigned opc = 0; // target opcode |
||
| 1047 | EVT memVT; // memory VT |
||
| 1048 | |||
| 1049 | // value representing memory location |
||
| 1050 | PointerUnion<const Value *, const PseudoSourceValue *> ptrVal; |
||
| 1051 | |||
| 1052 | // Fallback address space for use if ptrVal is nullptr. std::nullopt means |
||
| 1053 | // unknown address space. |
||
| 1054 | std::optional<unsigned> fallbackAddressSpace; |
||
| 1055 | |||
| 1056 | int offset = 0; // offset off of ptrVal |
||
| 1057 | uint64_t size = 0; // the size of the memory location |
||
| 1058 | // (taken from memVT if zero) |
||
| 1059 | MaybeAlign align = Align(1); // alignment |
||
| 1060 | |||
| 1061 | MachineMemOperand::Flags flags = MachineMemOperand::MONone; |
||
| 1062 | IntrinsicInfo() = default; |
||
| 1063 | }; |
||
| 1064 | |||
| 1065 | /// Given an intrinsic, checks if on the target the intrinsic will need to map |
||
| 1066 | /// to a MemIntrinsicNode (touches memory). If this is the case, it returns |
||
| 1067 | /// true and store the intrinsic information into the IntrinsicInfo that was |
||
| 1068 | /// passed to the function. |
||
| 1069 | virtual bool getTgtMemIntrinsic(IntrinsicInfo &, const CallInst &, |
||
| 1070 | MachineFunction &, |
||
| 1071 | unsigned /*Intrinsic*/) const { |
||
| 1072 | return false; |
||
| 1073 | } |
||
| 1074 | |||
| 1075 | /// Returns true if the target can instruction select the specified FP |
||
| 1076 | /// immediate natively. If false, the legalizer will materialize the FP |
||
| 1077 | /// immediate as a load from a constant pool. |
||
| 1078 | virtual bool isFPImmLegal(const APFloat & /*Imm*/, EVT /*VT*/, |
||
| 1079 | bool ForCodeSize = false) const { |
||
| 1080 | return false; |
||
| 1081 | } |
||
| 1082 | |||
| 1083 | /// Targets can use this to indicate that they only support *some* |
||
| 1084 | /// VECTOR_SHUFFLE operations, those with specific masks. By default, if a |
||
| 1085 | /// target supports the VECTOR_SHUFFLE node, all mask values are assumed to be |
||
| 1086 | /// legal. |
||
| 1087 | virtual bool isShuffleMaskLegal(ArrayRef<int> /*Mask*/, EVT /*VT*/) const { |
||
| 1088 | return true; |
||
| 1089 | } |
||
| 1090 | |||
| 1091 | /// Returns true if the operation can trap for the value type. |
||
| 1092 | /// |
||
| 1093 | /// VT must be a legal type. By default, we optimistically assume most |
||
| 1094 | /// operations don't trap except for integer divide and remainder. |
||
| 1095 | virtual bool canOpTrap(unsigned Op, EVT VT) const; |
||
| 1096 | |||
| 1097 | /// Similar to isShuffleMaskLegal. Targets can use this to indicate if there |
||
| 1098 | /// is a suitable VECTOR_SHUFFLE that can be used to replace a VAND with a |
||
| 1099 | /// constant pool entry. |
||
| 1100 | virtual bool isVectorClearMaskLegal(ArrayRef<int> /*Mask*/, |
||
| 1101 | EVT /*VT*/) const { |
||
| 1102 | return false; |
||
| 1103 | } |
||
| 1104 | |||
| 1105 | /// How to legalize this custom operation? |
||
| 1106 | virtual LegalizeAction getCustomOperationAction(SDNode &Op) const { |
||
| 1107 | return Legal; |
||
| 1108 | } |
||
| 1109 | |||
| 1110 | /// Return how this operation should be treated: either it is legal, needs to |
||
| 1111 | /// be promoted to a larger size, needs to be expanded to some other code |
||
| 1112 | /// sequence, or the target has a custom expander for it. |
||
| 1113 | LegalizeAction getOperationAction(unsigned Op, EVT VT) const { |
||
| 1114 | if (VT.isExtended()) return Expand; |
||
| 1115 | // If a target-specific SDNode requires legalization, require the target |
||
| 1116 | // to provide custom legalization for it. |
||
| 1117 | if (Op >= std::size(OpActions[0])) |
||
| 1118 | return Custom; |
||
| 1119 | return OpActions[(unsigned)VT.getSimpleVT().SimpleTy][Op]; |
||
| 1120 | } |
||
| 1121 | |||
| 1122 | /// Custom method defined by each target to indicate if an operation which |
||
| 1123 | /// may require a scale is supported natively by the target. |
||
| 1124 | /// If not, the operation is illegal. |
||
| 1125 | virtual bool isSupportedFixedPointOperation(unsigned Op, EVT VT, |
||
| 1126 | unsigned Scale) const { |
||
| 1127 | return false; |
||
| 1128 | } |
||
| 1129 | |||
| 1130 | /// Some fixed point operations may be natively supported by the target but |
||
| 1131 | /// only for specific scales. This method allows for checking |
||
| 1132 | /// if the width is supported by the target for a given operation that may |
||
| 1133 | /// depend on scale. |
||
| 1134 | LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, |
||
| 1135 | unsigned Scale) const { |
||
| 1136 | auto Action = getOperationAction(Op, VT); |
||
| 1137 | if (Action != Legal) |
||
| 1138 | return Action; |
||
| 1139 | |||
| 1140 | // This operation is supported in this type but may only work on specific |
||
| 1141 | // scales. |
||
| 1142 | bool Supported; |
||
| 1143 | switch (Op) { |
||
| 1144 | default: |
||
| 1145 | llvm_unreachable("Unexpected fixed point operation."); |
||
| 1146 | case ISD::SMULFIX: |
||
| 1147 | case ISD::SMULFIXSAT: |
||
| 1148 | case ISD::UMULFIX: |
||
| 1149 | case ISD::UMULFIXSAT: |
||
| 1150 | case ISD::SDIVFIX: |
||
| 1151 | case ISD::SDIVFIXSAT: |
||
| 1152 | case ISD::UDIVFIX: |
||
| 1153 | case ISD::UDIVFIXSAT: |
||
| 1154 | Supported = isSupportedFixedPointOperation(Op, VT, Scale); |
||
| 1155 | break; |
||
| 1156 | } |
||
| 1157 | |||
| 1158 | return Supported ? Action : Expand; |
||
| 1159 | } |
||
| 1160 | |||
| 1161 | // If Op is a strict floating-point operation, return the result |
||
| 1162 | // of getOperationAction for the equivalent non-strict operation. |
||
| 1163 | LegalizeAction getStrictFPOperationAction(unsigned Op, EVT VT) const { |
||
| 1164 | unsigned EqOpc; |
||
| 1165 | switch (Op) { |
||
| 1166 | default: llvm_unreachable("Unexpected FP pseudo-opcode"); |
||
| 1167 | #define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \ |
||
| 1168 | case ISD::STRICT_##DAGN: EqOpc = ISD::DAGN; break; |
||
| 1169 | #define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \ |
||
| 1170 | case ISD::STRICT_##DAGN: EqOpc = ISD::SETCC; break; |
||
| 1171 | #include "llvm/IR/ConstrainedOps.def" |
||
| 1172 | } |
||
| 1173 | |||
| 1174 | return getOperationAction(EqOpc, VT); |
||
| 1175 | } |
||
| 1176 | |||
| 1177 | /// Return true if the specified operation is legal on this target or can be |
||
| 1178 | /// made legal with custom lowering. This is used to help guide high-level |
||
| 1179 | /// lowering decisions. LegalOnly is an optional convenience for code paths |
||
| 1180 | /// traversed pre and post legalisation. |
||
| 1181 | bool isOperationLegalOrCustom(unsigned Op, EVT VT, |
||
| 1182 | bool LegalOnly = false) const { |
||
| 1183 | if (LegalOnly) |
||
| 1184 | return isOperationLegal(Op, VT); |
||
| 1185 | |||
| 1186 | return (VT == MVT::Other || isTypeLegal(VT)) && |
||
| 1187 | (getOperationAction(Op, VT) == Legal || |
||
| 1188 | getOperationAction(Op, VT) == Custom); |
||
| 1189 | } |
||
| 1190 | |||
| 1191 | /// Return true if the specified operation is legal on this target or can be |
||
| 1192 | /// made legal using promotion. This is used to help guide high-level lowering |
||
| 1193 | /// decisions. LegalOnly is an optional convenience for code paths traversed |
||
| 1194 | /// pre and post legalisation. |
||
| 1195 | bool isOperationLegalOrPromote(unsigned Op, EVT VT, |
||
| 1196 | bool LegalOnly = false) const { |
||
| 1197 | if (LegalOnly) |
||
| 1198 | return isOperationLegal(Op, VT); |
||
| 1199 | |||
| 1200 | return (VT == MVT::Other || isTypeLegal(VT)) && |
||
| 1201 | (getOperationAction(Op, VT) == Legal || |
||
| 1202 | getOperationAction(Op, VT) == Promote); |
||
| 1203 | } |
||
| 1204 | |||
| 1205 | /// Return true if the specified operation is legal on this target or can be |
||
| 1206 | /// made legal with custom lowering or using promotion. This is used to help |
||
| 1207 | /// guide high-level lowering decisions. LegalOnly is an optional convenience |
||
| 1208 | /// for code paths traversed pre and post legalisation. |
||
| 1209 | bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, |
||
| 1210 | bool LegalOnly = false) const { |
||
| 1211 | if (LegalOnly) |
||
| 1212 | return isOperationLegal(Op, VT); |
||
| 1213 | |||
| 1214 | return (VT == MVT::Other || isTypeLegal(VT)) && |
||
| 1215 | (getOperationAction(Op, VT) == Legal || |
||
| 1216 | getOperationAction(Op, VT) == Custom || |
||
| 1217 | getOperationAction(Op, VT) == Promote); |
||
| 1218 | } |
||
| 1219 | |||
| 1220 | /// Return true if the operation uses custom lowering, regardless of whether |
||
| 1221 | /// the type is legal or not. |
||
| 1222 | bool isOperationCustom(unsigned Op, EVT VT) const { |
||
| 1223 | return getOperationAction(Op, VT) == Custom; |
||
| 1224 | } |
||
| 1225 | |||
| 1226 | /// Return true if lowering to a jump table is allowed. |
||
| 1227 | virtual bool areJTsAllowed(const Function *Fn) const { |
||
| 1228 | if (Fn->getFnAttribute("no-jump-tables").getValueAsBool()) |
||
| 1229 | return false; |
||
| 1230 | |||
| 1231 | return isOperationLegalOrCustom(ISD::BR_JT, MVT::Other) || |
||
| 1232 | isOperationLegalOrCustom(ISD::BRIND, MVT::Other); |
||
| 1233 | } |
||
| 1234 | |||
| 1235 | /// Check whether the range [Low,High] fits in a machine word. |
||
| 1236 | bool rangeFitsInWord(const APInt &Low, const APInt &High, |
||
| 1237 | const DataLayout &DL) const { |
||
| 1238 | // FIXME: Using the pointer type doesn't seem ideal. |
||
| 1239 | uint64_t BW = DL.getIndexSizeInBits(0u); |
||
| 1240 | uint64_t Range = (High - Low).getLimitedValue(UINT64_MAX - 1) + 1; |
||
| 1241 | return Range <= BW; |
||
| 1242 | } |
||
| 1243 | |||
| 1244 | /// Return true if lowering to a jump table is suitable for a set of case |
||
| 1245 | /// clusters which may contain \p NumCases cases, \p Range range of values. |
||
| 1246 | virtual bool isSuitableForJumpTable(const SwitchInst *SI, uint64_t NumCases, |
||
| 1247 | uint64_t Range, ProfileSummaryInfo *PSI, |
||
| 1248 | BlockFrequencyInfo *BFI) const; |
||
| 1249 | |||
| 1250 | /// Returns preferred type for switch condition. |
||
| 1251 | virtual MVT getPreferredSwitchConditionType(LLVMContext &Context, |
||
| 1252 | EVT ConditionVT) const; |
||
| 1253 | |||
| 1254 | /// Return true if lowering to a bit test is suitable for a set of case |
||
| 1255 | /// clusters which contains \p NumDests unique destinations, \p Low and |
||
| 1256 | /// \p High as its lowest and highest case values, and expects \p NumCmps |
||
| 1257 | /// case value comparisons. Check if the number of destinations, comparison |
||
| 1258 | /// metric, and range are all suitable. |
||
| 1259 | bool isSuitableForBitTests(unsigned NumDests, unsigned NumCmps, |
||
| 1260 | const APInt &Low, const APInt &High, |
||
| 1261 | const DataLayout &DL) const { |
||
| 1262 | // FIXME: I don't think NumCmps is the correct metric: a single case and a |
||
| 1263 | // range of cases both require only one branch to lower. Just looking at the |
||
| 1264 | // number of clusters and destinations should be enough to decide whether to |
||
| 1265 | // build bit tests. |
||
| 1266 | |||
| 1267 | // To lower a range with bit tests, the range must fit the bitwidth of a |
||
| 1268 | // machine word. |
||
| 1269 | if (!rangeFitsInWord(Low, High, DL)) |
||
| 1270 | return false; |
||
| 1271 | |||
| 1272 | // Decide whether it's profitable to lower this range with bit tests. Each |
||
| 1273 | // destination requires a bit test and branch, and there is an overall range |
||
| 1274 | // check branch. For a small number of clusters, separate comparisons might |
||
| 1275 | // be cheaper, and for many destinations, splitting the range might be |
||
| 1276 | // better. |
||
| 1277 | return (NumDests == 1 && NumCmps >= 3) || (NumDests == 2 && NumCmps >= 5) || |
||
| 1278 | (NumDests == 3 && NumCmps >= 6); |
||
| 1279 | } |
||
| 1280 | |||
| 1281 | /// Return true if the specified operation is illegal on this target or |
||
| 1282 | /// unlikely to be made legal with custom lowering. This is used to help guide |
||
| 1283 | /// high-level lowering decisions. |
||
| 1284 | bool isOperationExpand(unsigned Op, EVT VT) const { |
||
| 1285 | return (!isTypeLegal(VT) || getOperationAction(Op, VT) == Expand); |
||
| 1286 | } |
||
| 1287 | |||
| 1288 | /// Return true if the specified operation is legal on this target. |
||
| 1289 | bool isOperationLegal(unsigned Op, EVT VT) const { |
||
| 1290 | return (VT == MVT::Other || isTypeLegal(VT)) && |
||
| 1291 | getOperationAction(Op, VT) == Legal; |
||
| 1292 | } |
||
| 1293 | |||
| 1294 | /// Return how this load with extension should be treated: either it is legal, |
||
| 1295 | /// needs to be promoted to a larger size, needs to be expanded to some other |
||
| 1296 | /// code sequence, or the target has a custom expander for it. |
||
| 1297 | LegalizeAction getLoadExtAction(unsigned ExtType, EVT ValVT, |
||
| 1298 | EVT MemVT) const { |
||
| 1299 | if (ValVT.isExtended() || MemVT.isExtended()) return Expand; |
||
| 1300 | unsigned ValI = (unsigned) ValVT.getSimpleVT().SimpleTy; |
||
| 1301 | unsigned MemI = (unsigned) MemVT.getSimpleVT().SimpleTy; |
||
| 1302 | assert(ExtType < ISD::LAST_LOADEXT_TYPE && ValI < MVT::VALUETYPE_SIZE && |
||
| 1303 | MemI < MVT::VALUETYPE_SIZE && "Table isn't big enough!"); |
||
| 1304 | unsigned Shift = 4 * ExtType; |
||
| 1305 | return (LegalizeAction)((LoadExtActions[ValI][MemI] >> Shift) & 0xf); |
||
| 1306 | } |
||
| 1307 | |||
| 1308 | /// Return true if the specified load with extension is legal on this target. |
||
| 1309 | bool isLoadExtLegal(unsigned ExtType, EVT ValVT, EVT MemVT) const { |
||
| 1310 | return getLoadExtAction(ExtType, ValVT, MemVT) == Legal; |
||
| 1311 | } |
||
| 1312 | |||
| 1313 | /// Return true if the specified load with extension is legal or custom |
||
| 1314 | /// on this target. |
||
| 1315 | bool isLoadExtLegalOrCustom(unsigned ExtType, EVT ValVT, EVT MemVT) const { |
||
| 1316 | return getLoadExtAction(ExtType, ValVT, MemVT) == Legal || |
||
| 1317 | getLoadExtAction(ExtType, ValVT, MemVT) == Custom; |
||
| 1318 | } |
||
| 1319 | |||
| 1320 | /// Return how this store with truncation should be treated: either it is |
||
| 1321 | /// legal, needs to be promoted to a larger size, needs to be expanded to some |
||
| 1322 | /// other code sequence, or the target has a custom expander for it. |
||
| 1323 | LegalizeAction getTruncStoreAction(EVT ValVT, EVT MemVT) const { |
||
| 1324 | if (ValVT.isExtended() || MemVT.isExtended()) return Expand; |
||
| 1325 | unsigned ValI = (unsigned) ValVT.getSimpleVT().SimpleTy; |
||
| 1326 | unsigned MemI = (unsigned) MemVT.getSimpleVT().SimpleTy; |
||
| 1327 | assert(ValI < MVT::VALUETYPE_SIZE && MemI < MVT::VALUETYPE_SIZE && |
||
| 1328 | "Table isn't big enough!"); |
||
| 1329 | return TruncStoreActions[ValI][MemI]; |
||
| 1330 | } |
||
| 1331 | |||
| 1332 | /// Return true if the specified store with truncation is legal on this |
||
| 1333 | /// target. |
||
| 1334 | bool isTruncStoreLegal(EVT ValVT, EVT MemVT) const { |
||
| 1335 | return isTypeLegal(ValVT) && getTruncStoreAction(ValVT, MemVT) == Legal; |
||
| 1336 | } |
||
| 1337 | |||
| 1338 | /// Return true if the specified store with truncation has solution on this |
||
| 1339 | /// target. |
||
| 1340 | bool isTruncStoreLegalOrCustom(EVT ValVT, EVT MemVT) const { |
||
| 1341 | return isTypeLegal(ValVT) && |
||
| 1342 | (getTruncStoreAction(ValVT, MemVT) == Legal || |
||
| 1343 | getTruncStoreAction(ValVT, MemVT) == Custom); |
||
| 1344 | } |
||
| 1345 | |||
| 1346 | virtual bool canCombineTruncStore(EVT ValVT, EVT MemVT, |
||
| 1347 | bool LegalOnly) const { |
||
| 1348 | if (LegalOnly) |
||
| 1349 | return isTruncStoreLegal(ValVT, MemVT); |
||
| 1350 | |||
| 1351 | return isTruncStoreLegalOrCustom(ValVT, MemVT); |
||
| 1352 | } |
||
| 1353 | |||
| 1354 | /// Return how the indexed load should be treated: either it is legal, needs |
||
| 1355 | /// to be promoted to a larger size, needs to be expanded to some other code |
||
| 1356 | /// sequence, or the target has a custom expander for it. |
||
| 1357 | LegalizeAction getIndexedLoadAction(unsigned IdxMode, MVT VT) const { |
||
| 1358 | return getIndexedModeAction(IdxMode, VT, IMAB_Load); |
||
| 1359 | } |
||
| 1360 | |||
| 1361 | /// Return true if the specified indexed load is legal on this target. |
||
| 1362 | bool isIndexedLoadLegal(unsigned IdxMode, EVT VT) const { |
||
| 1363 | return VT.isSimple() && |
||
| 1364 | (getIndexedLoadAction(IdxMode, VT.getSimpleVT()) == Legal || |
||
| 1365 | getIndexedLoadAction(IdxMode, VT.getSimpleVT()) == Custom); |
||
| 1366 | } |
||
| 1367 | |||
| 1368 | /// Return how the indexed store should be treated: either it is legal, needs |
||
| 1369 | /// to be promoted to a larger size, needs to be expanded to some other code |
||
| 1370 | /// sequence, or the target has a custom expander for it. |
||
| 1371 | LegalizeAction getIndexedStoreAction(unsigned IdxMode, MVT VT) const { |
||
| 1372 | return getIndexedModeAction(IdxMode, VT, IMAB_Store); |
||
| 1373 | } |
||
| 1374 | |||
| 1375 | /// Return true if the specified indexed load is legal on this target. |
||
| 1376 | bool isIndexedStoreLegal(unsigned IdxMode, EVT VT) const { |
||
| 1377 | return VT.isSimple() && |
||
| 1378 | (getIndexedStoreAction(IdxMode, VT.getSimpleVT()) == Legal || |
||
| 1379 | getIndexedStoreAction(IdxMode, VT.getSimpleVT()) == Custom); |
||
| 1380 | } |
||
| 1381 | |||
| 1382 | /// Return how the indexed load should be treated: either it is legal, needs |
||
| 1383 | /// to be promoted to a larger size, needs to be expanded to some other code |
||
| 1384 | /// sequence, or the target has a custom expander for it. |
||
| 1385 | LegalizeAction getIndexedMaskedLoadAction(unsigned IdxMode, MVT VT) const { |
||
| 1386 | return getIndexedModeAction(IdxMode, VT, IMAB_MaskedLoad); |
||
| 1387 | } |
||
| 1388 | |||
| 1389 | /// Return true if the specified indexed load is legal on this target. |
||
| 1390 | bool isIndexedMaskedLoadLegal(unsigned IdxMode, EVT VT) const { |
||
| 1391 | return VT.isSimple() && |
||
| 1392 | (getIndexedMaskedLoadAction(IdxMode, VT.getSimpleVT()) == Legal || |
||
| 1393 | getIndexedMaskedLoadAction(IdxMode, VT.getSimpleVT()) == Custom); |
||
| 1394 | } |
||
| 1395 | |||
| 1396 | /// Return how the indexed store should be treated: either it is legal, needs |
||
| 1397 | /// to be promoted to a larger size, needs to be expanded to some other code |
||
| 1398 | /// sequence, or the target has a custom expander for it. |
||
| 1399 | LegalizeAction getIndexedMaskedStoreAction(unsigned IdxMode, MVT VT) const { |
||
| 1400 | return getIndexedModeAction(IdxMode, VT, IMAB_MaskedStore); |
||
| 1401 | } |
||
| 1402 | |||
| 1403 | /// Return true if the specified indexed load is legal on this target. |
||
| 1404 | bool isIndexedMaskedStoreLegal(unsigned IdxMode, EVT VT) const { |
||
| 1405 | return VT.isSimple() && |
||
| 1406 | (getIndexedMaskedStoreAction(IdxMode, VT.getSimpleVT()) == Legal || |
||
| 1407 | getIndexedMaskedStoreAction(IdxMode, VT.getSimpleVT()) == Custom); |
||
| 1408 | } |
||
| 1409 | |||
| 1410 | /// Returns true if the index type for a masked gather/scatter requires |
||
| 1411 | /// extending |
||
| 1412 | virtual bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const { return false; } |
||
| 1413 | |||
| 1414 | // Returns true if VT is a legal index type for masked gathers/scatters |
||
| 1415 | // on this target |
||
| 1416 | virtual bool shouldRemoveExtendFromGSIndex(EVT IndexVT, EVT DataVT) const { |
||
| 1417 | return false; |
||
| 1418 | } |
||
| 1419 | |||
| 1420 | // Return true if the target supports a scatter/gather instruction with |
||
| 1421 | // indices which are scaled by the particular value. Note that all targets |
||
| 1422 | // must by definition support scale of 1. |
||
| 1423 | virtual bool isLegalScaleForGatherScatter(uint64_t Scale, |
||
| 1424 | uint64_t ElemSize) const { |
||
| 1425 | // MGATHER/MSCATTER are only required to support scaling by one or by the |
||
| 1426 | // element size. |
||
| 1427 | if (Scale != ElemSize && Scale != 1) |
||
| 1428 | return false; |
||
| 1429 | return true; |
||
| 1430 | } |
||
| 1431 | |||
| 1432 | /// Return how the condition code should be treated: either it is legal, needs |
||
| 1433 | /// to be expanded to some other code sequence, or the target has a custom |
||
| 1434 | /// expander for it. |
||
| 1435 | LegalizeAction |
||
| 1436 | getCondCodeAction(ISD::CondCode CC, MVT VT) const { |
||
| 1437 | assert((unsigned)CC < std::size(CondCodeActions) && |
||
| 1438 | ((unsigned)VT.SimpleTy >> 3) < std::size(CondCodeActions[0]) && |
||
| 1439 | "Table isn't big enough!"); |
||
| 1440 | // See setCondCodeAction for how this is encoded. |
||
| 1441 | uint32_t Shift = 4 * (VT.SimpleTy & 0x7); |
||
| 1442 | uint32_t Value = CondCodeActions[CC][VT.SimpleTy >> 3]; |
||
| 1443 | LegalizeAction Action = (LegalizeAction) ((Value >> Shift) & 0xF); |
||
| 1444 | assert(Action != Promote && "Can't promote condition code!"); |
||
| 1445 | return Action; |
||
| 1446 | } |
||
| 1447 | |||
| 1448 | /// Return true if the specified condition code is legal on this target. |
||
| 1449 | bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const { |
||
| 1450 | return getCondCodeAction(CC, VT) == Legal; |
||
| 1451 | } |
||
| 1452 | |||
| 1453 | /// Return true if the specified condition code is legal or custom on this |
||
| 1454 | /// target. |
||
| 1455 | bool isCondCodeLegalOrCustom(ISD::CondCode CC, MVT VT) const { |
||
| 1456 | return getCondCodeAction(CC, VT) == Legal || |
||
| 1457 | getCondCodeAction(CC, VT) == Custom; |
||
| 1458 | } |
||
| 1459 | |||
| 1460 | /// If the action for this operation is to promote, this method returns the |
||
| 1461 | /// ValueType to promote to. |
||
| 1462 | MVT getTypeToPromoteTo(unsigned Op, MVT VT) const { |
||
| 1463 | assert(getOperationAction(Op, VT) == Promote && |
||
| 1464 | "This operation isn't promoted!"); |
||
| 1465 | |||
| 1466 | // See if this has an explicit type specified. |
||
| 1467 | std::map<std::pair<unsigned, MVT::SimpleValueType>, |
||
| 1468 | MVT::SimpleValueType>::const_iterator PTTI = |
||
| 1469 | PromoteToType.find(std::make_pair(Op, VT.SimpleTy)); |
||
| 1470 | if (PTTI != PromoteToType.end()) return PTTI->second; |
||
| 1471 | |||
| 1472 | assert((VT.isInteger() || VT.isFloatingPoint()) && |
||
| 1473 | "Cannot autopromote this type, add it with AddPromotedToType."); |
||
| 1474 | |||
| 1475 | MVT NVT = VT; |
||
| 1476 | do { |
||
| 1477 | NVT = (MVT::SimpleValueType)(NVT.SimpleTy+1); |
||
| 1478 | assert(NVT.isInteger() == VT.isInteger() && NVT != MVT::isVoid && |
||
| 1479 | "Didn't find type to promote to!"); |
||
| 1480 | } while (!isTypeLegal(NVT) || |
||
| 1481 | getOperationAction(Op, NVT) == Promote); |
||
| 1482 | return NVT; |
||
| 1483 | } |
||
| 1484 | |||
| 1485 | virtual EVT getAsmOperandValueType(const DataLayout &DL, Type *Ty, |
||
| 1486 | bool AllowUnknown = false) const { |
||
| 1487 | return getValueType(DL, Ty, AllowUnknown); |
||
| 1488 | } |
||
| 1489 | |||
| 1490 | /// Return the EVT corresponding to this LLVM type. This is fixed by the LLVM |
||
| 1491 | /// operations except for the pointer size. If AllowUnknown is true, this |
||
| 1492 | /// will return MVT::Other for types with no EVT counterpart (e.g. structs), |
||
| 1493 | /// otherwise it will assert. |
||
| 1494 | EVT getValueType(const DataLayout &DL, Type *Ty, |
||
| 1495 | bool AllowUnknown = false) const { |
||
| 1496 | // Lower scalar pointers to native pointer types. |
||
| 1497 | if (auto *PTy = dyn_cast<PointerType>(Ty)) |
||
| 1498 | return getPointerTy(DL, PTy->getAddressSpace()); |
||
| 1499 | |||
| 1500 | if (auto *VTy = dyn_cast<VectorType>(Ty)) { |
||
| 1501 | Type *EltTy = VTy->getElementType(); |
||
| 1502 | // Lower vectors of pointers to native pointer types. |
||
| 1503 | if (auto *PTy = dyn_cast<PointerType>(EltTy)) { |
||
| 1504 | EVT PointerTy(getPointerTy(DL, PTy->getAddressSpace())); |
||
| 1505 | EltTy = PointerTy.getTypeForEVT(Ty->getContext()); |
||
| 1506 | } |
||
| 1507 | return EVT::getVectorVT(Ty->getContext(), EVT::getEVT(EltTy, false), |
||
| 1508 | VTy->getElementCount()); |
||
| 1509 | } |
||
| 1510 | |||
| 1511 | return EVT::getEVT(Ty, AllowUnknown); |
||
| 1512 | } |
||
| 1513 | |||
| 1514 | EVT getMemValueType(const DataLayout &DL, Type *Ty, |
||
| 1515 | bool AllowUnknown = false) const { |
||
| 1516 | // Lower scalar pointers to native pointer types. |
||
| 1517 | if (PointerType *PTy = dyn_cast<PointerType>(Ty)) |
||
| 1518 | return getPointerMemTy(DL, PTy->getAddressSpace()); |
||
| 1519 | else if (VectorType *VTy = dyn_cast<VectorType>(Ty)) { |
||
| 1520 | Type *Elm = VTy->getElementType(); |
||
| 1521 | if (PointerType *PT = dyn_cast<PointerType>(Elm)) { |
||
| 1522 | EVT PointerTy(getPointerMemTy(DL, PT->getAddressSpace())); |
||
| 1523 | Elm = PointerTy.getTypeForEVT(Ty->getContext()); |
||
| 1524 | } |
||
| 1525 | return EVT::getVectorVT(Ty->getContext(), EVT::getEVT(Elm, false), |
||
| 1526 | VTy->getElementCount()); |
||
| 1527 | } |
||
| 1528 | |||
| 1529 | return getValueType(DL, Ty, AllowUnknown); |
||
| 1530 | } |
||
| 1531 | |||
| 1532 | |||
| 1533 | /// Return the MVT corresponding to this LLVM type. See getValueType. |
||
| 1534 | MVT getSimpleValueType(const DataLayout &DL, Type *Ty, |
||
| 1535 | bool AllowUnknown = false) const { |
||
| 1536 | return getValueType(DL, Ty, AllowUnknown).getSimpleVT(); |
||
| 1537 | } |
||
| 1538 | |||
| 1539 | /// Return the desired alignment for ByVal or InAlloca aggregate function |
||
| 1540 | /// arguments in the caller parameter area. This is the actual alignment, not |
||
| 1541 | /// its logarithm. |
||
| 1542 | virtual uint64_t getByValTypeAlignment(Type *Ty, const DataLayout &DL) const; |
||
| 1543 | |||
| 1544 | /// Return the type of registers that this ValueType will eventually require. |
||
| 1545 | MVT getRegisterType(MVT VT) const { |
||
| 1546 | assert((unsigned)VT.SimpleTy < std::size(RegisterTypeForVT)); |
||
| 1547 | return RegisterTypeForVT[VT.SimpleTy]; |
||
| 1548 | } |
||
| 1549 | |||
| 1550 | /// Return the type of registers that this ValueType will eventually require. |
||
| 1551 | MVT getRegisterType(LLVMContext &Context, EVT VT) const { |
||
| 1552 | if (VT.isSimple()) { |
||
| 1553 | assert((unsigned)VT.getSimpleVT().SimpleTy < |
||
| 1554 | std::size(RegisterTypeForVT)); |
||
| 1555 | return RegisterTypeForVT[VT.getSimpleVT().SimpleTy]; |
||
| 1556 | } |
||
| 1557 | if (VT.isVector()) { |
||
| 1558 | EVT VT1; |
||
| 1559 | MVT RegisterVT; |
||
| 1560 | unsigned NumIntermediates; |
||
| 1561 | (void)getVectorTypeBreakdown(Context, VT, VT1, |
||
| 1562 | NumIntermediates, RegisterVT); |
||
| 1563 | return RegisterVT; |
||
| 1564 | } |
||
| 1565 | if (VT.isInteger()) { |
||
| 1566 | return getRegisterType(Context, getTypeToTransformTo(Context, VT)); |
||
| 1567 | } |
||
| 1568 | llvm_unreachable("Unsupported extended type!"); |
||
| 1569 | } |
||
| 1570 | |||
| 1571 | /// Return the number of registers that this ValueType will eventually |
||
| 1572 | /// require. |
||
| 1573 | /// |
||
| 1574 | /// This is one for any types promoted to live in larger registers, but may be |
||
| 1575 | /// more than one for types (like i64) that are split into pieces. For types |
||
| 1576 | /// like i140, which are first promoted then expanded, it is the number of |
||
| 1577 | /// registers needed to hold all the bits of the original type. For an i140 |
||
| 1578 | /// on a 32 bit machine this means 5 registers. |
||
| 1579 | /// |
||
| 1580 | /// RegisterVT may be passed as a way to override the default settings, for |
||
| 1581 | /// instance with i128 inline assembly operands on SystemZ. |
||
| 1582 | virtual unsigned |
||
| 1583 | getNumRegisters(LLVMContext &Context, EVT VT, |
||
| 1584 | std::optional<MVT> RegisterVT = std::nullopt) const { |
||
| 1585 | if (VT.isSimple()) { |
||
| 1586 | assert((unsigned)VT.getSimpleVT().SimpleTy < |
||
| 1587 | std::size(NumRegistersForVT)); |
||
| 1588 | return NumRegistersForVT[VT.getSimpleVT().SimpleTy]; |
||
| 1589 | } |
||
| 1590 | if (VT.isVector()) { |
||
| 1591 | EVT VT1; |
||
| 1592 | MVT VT2; |
||
| 1593 | unsigned NumIntermediates; |
||
| 1594 | return getVectorTypeBreakdown(Context, VT, VT1, NumIntermediates, VT2); |
||
| 1595 | } |
||
| 1596 | if (VT.isInteger()) { |
||
| 1597 | unsigned BitWidth = VT.getSizeInBits(); |
||
| 1598 | unsigned RegWidth = getRegisterType(Context, VT).getSizeInBits(); |
||
| 1599 | return (BitWidth + RegWidth - 1) / RegWidth; |
||
| 1600 | } |
||
| 1601 | llvm_unreachable("Unsupported extended type!"); |
||
| 1602 | } |
||
| 1603 | |||
| 1604 | /// Certain combinations of ABIs, Targets and features require that types |
||
| 1605 | /// are legal for some operations and not for other operations. |
||
| 1606 | /// For MIPS all vector types must be passed through the integer register set. |
||
| 1607 | virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, |
||
| 1608 | CallingConv::ID CC, EVT VT) const { |
||
| 1609 | return getRegisterType(Context, VT); |
||
| 1610 | } |
||
| 1611 | |||
| 1612 | /// Certain targets require unusual breakdowns of certain types. For MIPS, |
||
| 1613 | /// this occurs when a vector type is used, as vector are passed through the |
||
| 1614 | /// integer register set. |
||
| 1615 | virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, |
||
| 1616 | CallingConv::ID CC, |
||
| 1617 | EVT VT) const { |
||
| 1618 | return getNumRegisters(Context, VT); |
||
| 1619 | } |
||
| 1620 | |||
| 1621 | /// Certain targets have context sensitive alignment requirements, where one |
||
| 1622 | /// type has the alignment requirement of another type. |
||
| 1623 | virtual Align getABIAlignmentForCallingConv(Type *ArgTy, |
||
| 1624 | const DataLayout &DL) const { |
||
| 1625 | return DL.getABITypeAlign(ArgTy); |
||
| 1626 | } |
||
| 1627 | |||
| 1628 | /// If true, then instruction selection should seek to shrink the FP constant |
||
| 1629 | /// of the specified type to a smaller type in order to save space and / or |
||
| 1630 | /// reduce runtime. |
||
| 1631 | virtual bool ShouldShrinkFPConstant(EVT) const { return true; } |
||
| 1632 | |||
| 1633 | /// Return true if it is profitable to reduce a load to a smaller type. |
||
| 1634 | /// Example: (i16 (trunc (i32 (load x))) -> i16 load x |
||
| 1635 | virtual bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, |
||
| 1636 | EVT NewVT) const { |
||
| 1637 | // By default, assume that it is cheaper to extract a subvector from a wide |
||
| 1638 | // vector load rather than creating multiple narrow vector loads. |
||
| 1639 | if (NewVT.isVector() && !Load->hasOneUse()) |
||
| 1640 | return false; |
||
| 1641 | |||
| 1642 | return true; |
||
| 1643 | } |
||
| 1644 | |||
| 1645 | /// When splitting a value of the specified type into parts, does the Lo |
||
| 1646 | /// or Hi part come first? This usually follows the endianness, except |
||
| 1647 | /// for ppcf128, where the Hi part always comes first. |
||
| 1648 | bool hasBigEndianPartOrdering(EVT VT, const DataLayout &DL) const { |
||
| 1649 | return DL.isBigEndian() || VT == MVT::ppcf128; |
||
| 1650 | } |
||
| 1651 | |||
| 1652 | /// If true, the target has custom DAG combine transformations that it can |
||
| 1653 | /// perform for the specified node. |
||
| 1654 | bool hasTargetDAGCombine(ISD::NodeType NT) const { |
||
| 1655 | assert(unsigned(NT >> 3) < std::size(TargetDAGCombineArray)); |
||
| 1656 | return TargetDAGCombineArray[NT >> 3] & (1 << (NT&7)); |
||
| 1657 | } |
||
| 1658 | |||
| 1659 | unsigned getGatherAllAliasesMaxDepth() const { |
||
| 1660 | return GatherAllAliasesMaxDepth; |
||
| 1661 | } |
||
| 1662 | |||
| 1663 | /// Returns the size of the platform's va_list object. |
||
| 1664 | virtual unsigned getVaListSizeInBits(const DataLayout &DL) const { |
||
| 1665 | return getPointerTy(DL).getSizeInBits(); |
||
| 1666 | } |
||
| 1667 | |||
| 1668 | /// Get maximum # of store operations permitted for llvm.memset |
||
| 1669 | /// |
||
| 1670 | /// This function returns the maximum number of store operations permitted |
||
| 1671 | /// to replace a call to llvm.memset. The value is set by the target at the |
||
| 1672 | /// performance threshold for such a replacement. If OptSize is true, |
||
| 1673 | /// return the limit for functions that have OptSize attribute. |
||
| 1674 | unsigned getMaxStoresPerMemset(bool OptSize) const { |
||
| 1675 | return OptSize ? MaxStoresPerMemsetOptSize : MaxStoresPerMemset; |
||
| 1676 | } |
||
| 1677 | |||
| 1678 | /// Get maximum # of store operations permitted for llvm.memcpy |
||
| 1679 | /// |
||
| 1680 | /// This function returns the maximum number of store operations permitted |
||
| 1681 | /// to replace a call to llvm.memcpy. The value is set by the target at the |
||
| 1682 | /// performance threshold for such a replacement. If OptSize is true, |
||
| 1683 | /// return the limit for functions that have OptSize attribute. |
||
| 1684 | unsigned getMaxStoresPerMemcpy(bool OptSize) const { |
||
| 1685 | return OptSize ? MaxStoresPerMemcpyOptSize : MaxStoresPerMemcpy; |
||
| 1686 | } |
||
| 1687 | |||
| 1688 | /// \brief Get maximum # of store operations to be glued together |
||
| 1689 | /// |
||
| 1690 | /// This function returns the maximum number of store operations permitted |
||
| 1691 | /// to glue together during lowering of llvm.memcpy. The value is set by |
||
| 1692 | // the target at the performance threshold for such a replacement. |
||
| 1693 | virtual unsigned getMaxGluedStoresPerMemcpy() const { |
||
| 1694 | return MaxGluedStoresPerMemcpy; |
||
| 1695 | } |
||
| 1696 | |||
| 1697 | /// Get maximum # of load operations permitted for memcmp |
||
| 1698 | /// |
||
| 1699 | /// This function returns the maximum number of load operations permitted |
||
| 1700 | /// to replace a call to memcmp. The value is set by the target at the |
||
| 1701 | /// performance threshold for such a replacement. If OptSize is true, |
||
| 1702 | /// return the limit for functions that have OptSize attribute. |
||
| 1703 | unsigned getMaxExpandSizeMemcmp(bool OptSize) const { |
||
| 1704 | return OptSize ? MaxLoadsPerMemcmpOptSize : MaxLoadsPerMemcmp; |
||
| 1705 | } |
||
| 1706 | |||
| 1707 | /// Get maximum # of store operations permitted for llvm.memmove |
||
| 1708 | /// |
||
| 1709 | /// This function returns the maximum number of store operations permitted |
||
| 1710 | /// to replace a call to llvm.memmove. The value is set by the target at the |
||
| 1711 | /// performance threshold for such a replacement. If OptSize is true, |
||
| 1712 | /// return the limit for functions that have OptSize attribute. |
||
| 1713 | unsigned getMaxStoresPerMemmove(bool OptSize) const { |
||
| 1714 | return OptSize ? MaxStoresPerMemmoveOptSize : MaxStoresPerMemmove; |
||
| 1715 | } |
||
| 1716 | |||
| 1717 | /// Determine if the target supports unaligned memory accesses. |
||
| 1718 | /// |
||
| 1719 | /// This function returns true if the target allows unaligned memory accesses |
||
| 1720 | /// of the specified type in the given address space. If true, it also returns |
||
| 1721 | /// a relative speed of the unaligned memory access in the last argument by |
||
| 1722 | /// reference. The higher the speed number the faster the operation comparing |
||
| 1723 | /// to a number returned by another such call. This is used, for example, in |
||
| 1724 | /// situations where an array copy/move/set is converted to a sequence of |
||
| 1725 | /// store operations. Its use helps to ensure that such replacements don't |
||
| 1726 | /// generate code that causes an alignment error (trap) on the target machine. |
||
| 1727 | virtual bool allowsMisalignedMemoryAccesses( |
||
| 1728 | EVT, unsigned AddrSpace = 0, Align Alignment = Align(1), |
||
| 1729 | MachineMemOperand::Flags Flags = MachineMemOperand::MONone, |
||
| 1730 | unsigned * /*Fast*/ = nullptr) const { |
||
| 1731 | return false; |
||
| 1732 | } |
||
| 1733 | |||
| 1734 | /// LLT handling variant. |
||
| 1735 | virtual bool allowsMisalignedMemoryAccesses( |
||
| 1736 | LLT, unsigned AddrSpace = 0, Align Alignment = Align(1), |
||
| 1737 | MachineMemOperand::Flags Flags = MachineMemOperand::MONone, |
||
| 1738 | unsigned * /*Fast*/ = nullptr) const { |
||
| 1739 | return false; |
||
| 1740 | } |
||
| 1741 | |||
| 1742 | /// This function returns true if the memory access is aligned or if the |
||
| 1743 | /// target allows this specific unaligned memory access. If the access is |
||
| 1744 | /// allowed, the optional final parameter returns a relative speed of the |
||
| 1745 | /// access (as defined by the target). |
||
| 1746 | bool allowsMemoryAccessForAlignment( |
||
| 1747 | LLVMContext &Context, const DataLayout &DL, EVT VT, |
||
| 1748 | unsigned AddrSpace = 0, Align Alignment = Align(1), |
||
| 1749 | MachineMemOperand::Flags Flags = MachineMemOperand::MONone, |
||
| 1750 | unsigned *Fast = nullptr) const; |
||
| 1751 | |||
| 1752 | /// Return true if the memory access of this type is aligned or if the target |
||
| 1753 | /// allows this specific unaligned access for the given MachineMemOperand. |
||
| 1754 | /// If the access is allowed, the optional final parameter returns a relative |
||
| 1755 | /// speed of the access (as defined by the target). |
||
| 1756 | bool allowsMemoryAccessForAlignment(LLVMContext &Context, |
||
| 1757 | const DataLayout &DL, EVT VT, |
||
| 1758 | const MachineMemOperand &MMO, |
||
| 1759 | unsigned *Fast = nullptr) const; |
||
| 1760 | |||
| 1761 | /// Return true if the target supports a memory access of this type for the |
||
| 1762 | /// given address space and alignment. If the access is allowed, the optional |
||
| 1763 | /// final parameter returns the relative speed of the access (as defined by |
||
| 1764 | /// the target). |
||
| 1765 | virtual bool |
||
| 1766 | allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, |
||
| 1767 | unsigned AddrSpace = 0, Align Alignment = Align(1), |
||
| 1768 | MachineMemOperand::Flags Flags = MachineMemOperand::MONone, |
||
| 1769 | unsigned *Fast = nullptr) const; |
||
| 1770 | |||
| 1771 | /// Return true if the target supports a memory access of this type for the |
||
| 1772 | /// given MachineMemOperand. If the access is allowed, the optional |
||
| 1773 | /// final parameter returns the relative access speed (as defined by the |
||
| 1774 | /// target). |
||
| 1775 | bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, |
||
| 1776 | const MachineMemOperand &MMO, |
||
| 1777 | unsigned *Fast = nullptr) const; |
||
| 1778 | |||
| 1779 | /// LLT handling variant. |
||
| 1780 | bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, LLT Ty, |
||
| 1781 | const MachineMemOperand &MMO, |
||
| 1782 | unsigned *Fast = nullptr) const; |
||
| 1783 | |||
| 1784 | /// Returns the target specific optimal type for load and store operations as |
||
| 1785 | /// a result of memset, memcpy, and memmove lowering. |
||
| 1786 | /// It returns EVT::Other if the type should be determined using generic |
||
| 1787 | /// target-independent logic. |
||
| 1788 | virtual EVT |
||
| 1789 | getOptimalMemOpType(const MemOp &Op, |
||
| 1790 | const AttributeList & /*FuncAttributes*/) const { |
||
| 1791 | return MVT::Other; |
||
| 1792 | } |
||
| 1793 | |||
| 1794 | /// LLT returning variant. |
||
| 1795 | virtual LLT |
||
| 1796 | getOptimalMemOpLLT(const MemOp &Op, |
||
| 1797 | const AttributeList & /*FuncAttributes*/) const { |
||
| 1798 | return LLT(); |
||
| 1799 | } |
||
| 1800 | |||
| 1801 | /// Returns true if it's safe to use load / store of the specified type to |
||
| 1802 | /// expand memcpy / memset inline. |
||
| 1803 | /// |
||
| 1804 | /// This is mostly true for all types except for some special cases. For |
||
| 1805 | /// example, on X86 targets without SSE2 f64 load / store are done with fldl / |
||
| 1806 | /// fstpl which also does type conversion. Note the specified type doesn't |
||
| 1807 | /// have to be legal as the hook is used before type legalization. |
||
| 1808 | virtual bool isSafeMemOpType(MVT /*VT*/) const { return true; } |
||
| 1809 | |||
| 1810 | /// Return lower limit for number of blocks in a jump table. |
||
| 1811 | virtual unsigned getMinimumJumpTableEntries() const; |
||
| 1812 | |||
| 1813 | /// Return lower limit of the density in a jump table. |
||
| 1814 | unsigned getMinimumJumpTableDensity(bool OptForSize) const; |
||
| 1815 | |||
| 1816 | /// Return upper limit for number of entries in a jump table. |
||
| 1817 | /// Zero if no limit. |
||
| 1818 | unsigned getMaximumJumpTableSize() const; |
||
| 1819 | |||
| 1820 | virtual bool isJumpTableRelative() const; |
||
| 1821 | |||
| 1822 | /// If a physical register, this specifies the register that |
||
| 1823 | /// llvm.savestack/llvm.restorestack should save and restore. |
||
| 1824 | Register getStackPointerRegisterToSaveRestore() const { |
||
| 1825 | return StackPointerRegisterToSaveRestore; |
||
| 1826 | } |
||
| 1827 | |||
| 1828 | /// If a physical register, this returns the register that receives the |
||
| 1829 | /// exception address on entry to an EH pad. |
||
| 1830 | virtual Register |
||
| 1831 | getExceptionPointerRegister(const Constant *PersonalityFn) const { |
||
| 1832 | return Register(); |
||
| 1833 | } |
||
| 1834 | |||
| 1835 | /// If a physical register, this returns the register that receives the |
||
| 1836 | /// exception typeid on entry to a landing pad. |
||
| 1837 | virtual Register |
||
| 1838 | getExceptionSelectorRegister(const Constant *PersonalityFn) const { |
||
| 1839 | return Register(); |
||
| 1840 | } |
||
| 1841 | |||
| 1842 | virtual bool needsFixedCatchObjects() const { |
||
| 1843 | report_fatal_error("Funclet EH is not implemented for this target"); |
||
| 1844 | } |
||
| 1845 | |||
| 1846 | /// Return the minimum stack alignment of an argument. |
||
| 1847 | Align getMinStackArgumentAlignment() const { |
||
| 1848 | return MinStackArgumentAlignment; |
||
| 1849 | } |
||
| 1850 | |||
| 1851 | /// Return the minimum function alignment. |
||
| 1852 | Align getMinFunctionAlignment() const { return MinFunctionAlignment; } |
||
| 1853 | |||
| 1854 | /// Return the preferred function alignment. |
||
| 1855 | Align getPrefFunctionAlignment() const { return PrefFunctionAlignment; } |
||
| 1856 | |||
| 1857 | /// Return the preferred loop alignment. |
||
| 1858 | virtual Align getPrefLoopAlignment(MachineLoop *ML = nullptr) const; |
||
| 1859 | |||
| 1860 | /// Return the maximum amount of bytes allowed to be emitted when padding for |
||
| 1861 | /// alignment |
||
| 1862 | virtual unsigned |
||
| 1863 | getMaxPermittedBytesForAlignment(MachineBasicBlock *MBB) const; |
||
| 1864 | |||
| 1865 | /// Should loops be aligned even when the function is marked OptSize (but not |
||
| 1866 | /// MinSize). |
||
| 1867 | virtual bool alignLoopsWithOptSize() const { return false; } |
||
| 1868 | |||
| 1869 | /// If the target has a standard location for the stack protector guard, |
||
| 1870 | /// returns the address of that location. Otherwise, returns nullptr. |
||
| 1871 | /// DEPRECATED: please override useLoadStackGuardNode and customize |
||
| 1872 | /// LOAD_STACK_GUARD, or customize \@llvm.stackguard(). |
||
| 1873 | virtual Value *getIRStackGuard(IRBuilderBase &IRB) const; |
||
| 1874 | |||
| 1875 | /// Inserts necessary declarations for SSP (stack protection) purpose. |
||
| 1876 | /// Should be used only when getIRStackGuard returns nullptr. |
||
| 1877 | virtual void insertSSPDeclarations(Module &M) const; |
||
| 1878 | |||
| 1879 | /// Return the variable that's previously inserted by insertSSPDeclarations, |
||
| 1880 | /// if any, otherwise return nullptr. Should be used only when |
||
| 1881 | /// getIRStackGuard returns nullptr. |
||
| 1882 | virtual Value *getSDagStackGuard(const Module &M) const; |
||
| 1883 | |||
| 1884 | /// If this function returns true, stack protection checks should XOR the |
||
| 1885 | /// frame pointer (or whichever pointer is used to address locals) into the |
||
| 1886 | /// stack guard value before checking it. getIRStackGuard must return nullptr |
||
| 1887 | /// if this returns true. |
||
| 1888 | virtual bool useStackGuardXorFP() const { return false; } |
||
| 1889 | |||
| 1890 | /// If the target has a standard stack protection check function that |
||
| 1891 | /// performs validation and error handling, returns the function. Otherwise, |
||
| 1892 | /// returns nullptr. Must be previously inserted by insertSSPDeclarations. |
||
| 1893 | /// Should be used only when getIRStackGuard returns nullptr. |
||
| 1894 | virtual Function *getSSPStackGuardCheck(const Module &M) const; |
||
| 1895 | |||
| 1896 | /// \returns true if a constant G_UBFX is legal on the target. |
||
| 1897 | virtual bool isConstantUnsignedBitfieldExtractLegal(unsigned Opc, LLT Ty1, |
||
| 1898 | LLT Ty2) const { |
||
| 1899 | return false; |
||
| 1900 | } |
||
| 1901 | |||
| 1902 | protected: |
||
| 1903 | Value *getDefaultSafeStackPointerLocation(IRBuilderBase &IRB, |
||
| 1904 | bool UseTLS) const; |
||
| 1905 | |||
| 1906 | public: |
||
| 1907 | /// Returns the target-specific address of the unsafe stack pointer. |
||
| 1908 | virtual Value *getSafeStackPointerLocation(IRBuilderBase &IRB) const; |
||
| 1909 | |||
| 1910 | /// Returns the name of the symbol used to emit stack probes or the empty |
||
| 1911 | /// string if not applicable. |
||
| 1912 | virtual bool hasStackProbeSymbol(const MachineFunction &MF) const { return false; } |
||
| 1913 | |||
| 1914 | virtual bool hasInlineStackProbe(const MachineFunction &MF) const { return false; } |
||
| 1915 | |||
| 1916 | virtual StringRef getStackProbeSymbolName(const MachineFunction &MF) const { |
||
| 1917 | return ""; |
||
| 1918 | } |
||
| 1919 | |||
| 1920 | /// Returns true if a cast from SrcAS to DestAS is "cheap", such that e.g. we |
||
| 1921 | /// are happy to sink it into basic blocks. A cast may be free, but not |
||
| 1922 | /// necessarily a no-op. e.g. a free truncate from a 64-bit to 32-bit pointer. |
||
| 1923 | virtual bool isFreeAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const; |
||
| 1924 | |||
| 1925 | /// Return true if the pointer arguments to CI should be aligned by aligning |
||
| 1926 | /// the object whose address is being passed. If so then MinSize is set to the |
||
| 1927 | /// minimum size the object must be to be aligned and PrefAlign is set to the |
||
| 1928 | /// preferred alignment. |
||
| 1929 | virtual bool shouldAlignPointerArgs(CallInst * /*CI*/, unsigned & /*MinSize*/, |
||
| 1930 | Align & /*PrefAlign*/) const { |
||
| 1931 | return false; |
||
| 1932 | } |
||
| 1933 | |||
| 1934 | //===--------------------------------------------------------------------===// |
||
| 1935 | /// \name Helpers for TargetTransformInfo implementations |
||
| 1936 | /// @{ |
||
| 1937 | |||
| 1938 | /// Get the ISD node that corresponds to the Instruction class opcode. |
||
| 1939 | int InstructionOpcodeToISD(unsigned Opcode) const; |
||
| 1940 | |||
| 1941 | /// @} |
||
| 1942 | |||
| 1943 | //===--------------------------------------------------------------------===// |
||
| 1944 | /// \name Helpers for atomic expansion. |
||
| 1945 | /// @{ |
||
| 1946 | |||
| 1947 | /// Returns the maximum atomic operation size (in bits) supported by |
||
| 1948 | /// the backend. Atomic operations greater than this size (as well |
||
| 1949 | /// as ones that are not naturally aligned), will be expanded by |
||
| 1950 | /// AtomicExpandPass into an __atomic_* library call. |
||
| 1951 | unsigned getMaxAtomicSizeInBitsSupported() const { |
||
| 1952 | return MaxAtomicSizeInBitsSupported; |
||
| 1953 | } |
||
| 1954 | |||
| 1955 | /// Returns the size in bits of the maximum div/rem the backend supports. |
||
| 1956 | /// Larger operations will be expanded by ExpandLargeDivRem. |
||
| 1957 | unsigned getMaxDivRemBitWidthSupported() const { |
||
| 1958 | return MaxDivRemBitWidthSupported; |
||
| 1959 | } |
||
| 1960 | |||
| 1961 | /// Returns the size in bits of the maximum larget fp convert the backend |
||
| 1962 | /// supports. Larger operations will be expanded by ExpandLargeFPConvert. |
||
| 1963 | unsigned getMaxLargeFPConvertBitWidthSupported() const { |
||
| 1964 | return MaxLargeFPConvertBitWidthSupported; |
||
| 1965 | } |
||
| 1966 | |||
| 1967 | /// Returns the size of the smallest cmpxchg or ll/sc instruction |
||
| 1968 | /// the backend supports. Any smaller operations are widened in |
||
| 1969 | /// AtomicExpandPass. |
||
| 1970 | /// |
||
| 1971 | /// Note that *unlike* operations above the maximum size, atomic ops |
||
| 1972 | /// are still natively supported below the minimum; they just |
||
| 1973 | /// require a more complex expansion. |
||
| 1974 | unsigned getMinCmpXchgSizeInBits() const { return MinCmpXchgSizeInBits; } |
||
| 1975 | |||
| 1976 | /// Whether the target supports unaligned atomic operations. |
||
| 1977 | bool supportsUnalignedAtomics() const { return SupportsUnalignedAtomics; } |
||
| 1978 | |||
| 1979 | /// Whether AtomicExpandPass should automatically insert fences and reduce |
||
| 1980 | /// ordering for this atomic. This should be true for most architectures with |
||
| 1981 | /// weak memory ordering. Defaults to false. |
||
| 1982 | virtual bool shouldInsertFencesForAtomic(const Instruction *I) const { |
||
| 1983 | return false; |
||
| 1984 | } |
||
| 1985 | |||
| 1986 | /// Whether AtomicExpandPass should automatically insert a trailing fence |
||
| 1987 | /// without reducing the ordering for this atomic. Defaults to false. |
||
| 1988 | virtual bool |
||
| 1989 | shouldInsertTrailingFenceForAtomicStore(const Instruction *I) const { |
||
| 1990 | return false; |
||
| 1991 | } |
||
| 1992 | |||
| 1993 | /// Perform a load-linked operation on Addr, returning a "Value *" with the |
||
| 1994 | /// corresponding pointee type. This may entail some non-trivial operations to |
||
| 1995 | /// truncate or reconstruct types that will be illegal in the backend. See |
||
| 1996 | /// ARMISelLowering for an example implementation. |
||
| 1997 | virtual Value *emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy, |
||
| 1998 | Value *Addr, AtomicOrdering Ord) const { |
||
| 1999 | llvm_unreachable("Load linked unimplemented on this target"); |
||
| 2000 | } |
||
| 2001 | |||
| 2002 | /// Perform a store-conditional operation to Addr. Return the status of the |
||
| 2003 | /// store. This should be 0 if the store succeeded, non-zero otherwise. |
||
| 2004 | virtual Value *emitStoreConditional(IRBuilderBase &Builder, Value *Val, |
||
| 2005 | Value *Addr, AtomicOrdering Ord) const { |
||
| 2006 | llvm_unreachable("Store conditional unimplemented on this target"); |
||
| 2007 | } |
||
| 2008 | |||
| 2009 | /// Perform a masked atomicrmw using a target-specific intrinsic. This |
||
| 2010 | /// represents the core LL/SC loop which will be lowered at a late stage by |
||
| 2011 | /// the backend. The target-specific intrinsic returns the loaded value and |
||
| 2012 | /// is not responsible for masking and shifting the result. |
||
| 2013 | virtual Value *emitMaskedAtomicRMWIntrinsic(IRBuilderBase &Builder, |
||
| 2014 | AtomicRMWInst *AI, |
||
| 2015 | Value *AlignedAddr, Value *Incr, |
||
| 2016 | Value *Mask, Value *ShiftAmt, |
||
| 2017 | AtomicOrdering Ord) const { |
||
| 2018 | llvm_unreachable("Masked atomicrmw expansion unimplemented on this target"); |
||
| 2019 | } |
||
| 2020 | |||
| 2021 | /// Perform a atomicrmw expansion using a target-specific way. This is |
||
| 2022 | /// expected to be called when masked atomicrmw and bit test atomicrmw don't |
||
| 2023 | /// work, and the target supports another way to lower atomicrmw. |
||
| 2024 | virtual void emitExpandAtomicRMW(AtomicRMWInst *AI) const { |
||
| 2025 | llvm_unreachable( |
||
| 2026 | "Generic atomicrmw expansion unimplemented on this target"); |
||
| 2027 | } |
||
| 2028 | |||
| 2029 | /// Perform a bit test atomicrmw using a target-specific intrinsic. This |
||
| 2030 | /// represents the combined bit test intrinsic which will be lowered at a late |
||
| 2031 | /// stage by the backend. |
||
| 2032 | virtual void emitBitTestAtomicRMWIntrinsic(AtomicRMWInst *AI) const { |
||
| 2033 | llvm_unreachable( |
||
| 2034 | "Bit test atomicrmw expansion unimplemented on this target"); |
||
| 2035 | } |
||
| 2036 | |||
| 2037 | /// Perform a atomicrmw which the result is only used by comparison, using a |
||
| 2038 | /// target-specific intrinsic. This represents the combined atomic and compare |
||
| 2039 | /// intrinsic which will be lowered at a late stage by the backend. |
||
| 2040 | virtual void emitCmpArithAtomicRMWIntrinsic(AtomicRMWInst *AI) const { |
||
| 2041 | llvm_unreachable( |
||
| 2042 | "Compare arith atomicrmw expansion unimplemented on this target"); |
||
| 2043 | } |
||
| 2044 | |||
| 2045 | /// Perform a masked cmpxchg using a target-specific intrinsic. This |
||
| 2046 | /// represents the core LL/SC loop which will be lowered at a late stage by |
||
| 2047 | /// the backend. The target-specific intrinsic returns the loaded value and |
||
| 2048 | /// is not responsible for masking and shifting the result. |
||
| 2049 | virtual Value *emitMaskedAtomicCmpXchgIntrinsic( |
||
| 2050 | IRBuilderBase &Builder, AtomicCmpXchgInst *CI, Value *AlignedAddr, |
||
| 2051 | Value *CmpVal, Value *NewVal, Value *Mask, AtomicOrdering Ord) const { |
||
| 2052 | llvm_unreachable("Masked cmpxchg expansion unimplemented on this target"); |
||
| 2053 | } |
||
| 2054 | |||
| 2055 | /// Inserts in the IR a target-specific intrinsic specifying a fence. |
||
| 2056 | /// It is called by AtomicExpandPass before expanding an |
||
| 2057 | /// AtomicRMW/AtomicCmpXchg/AtomicStore/AtomicLoad |
||
| 2058 | /// if shouldInsertFencesForAtomic returns true. |
||
| 2059 | /// |
||
| 2060 | /// Inst is the original atomic instruction, prior to other expansions that |
||
| 2061 | /// may be performed. |
||
| 2062 | /// |
||
| 2063 | /// This function should either return a nullptr, or a pointer to an IR-level |
||
| 2064 | /// Instruction*. Even complex fence sequences can be represented by a |
||
| 2065 | /// single Instruction* through an intrinsic to be lowered later. |
||
| 2066 | /// Backends should override this method to produce target-specific intrinsic |
||
| 2067 | /// for their fences. |
||
| 2068 | /// FIXME: Please note that the default implementation here in terms of |
||
| 2069 | /// IR-level fences exists for historical/compatibility reasons and is |
||
| 2070 | /// *unsound* ! Fences cannot, in general, be used to restore sequential |
||
| 2071 | /// consistency. For example, consider the following example: |
||
| 2072 | /// atomic<int> x = y = 0; |
||
| 2073 | /// int r1, r2, r3, r4; |
||
| 2074 | /// Thread 0: |
||
| 2075 | /// x.store(1); |
||
| 2076 | /// Thread 1: |
||
| 2077 | /// y.store(1); |
||
| 2078 | /// Thread 2: |
||
| 2079 | /// r1 = x.load(); |
||
| 2080 | /// r2 = y.load(); |
||
| 2081 | /// Thread 3: |
||
| 2082 | /// r3 = y.load(); |
||
| 2083 | /// r4 = x.load(); |
||
| 2084 | /// r1 = r3 = 1 and r2 = r4 = 0 is impossible as long as the accesses are all |
||
| 2085 | /// seq_cst. But if they are lowered to monotonic accesses, no amount of |
||
| 2086 | /// IR-level fences can prevent it. |
||
| 2087 | /// @{ |
||
| 2088 | virtual Instruction *emitLeadingFence(IRBuilderBase &Builder, |
||
| 2089 | Instruction *Inst, |
||
| 2090 | AtomicOrdering Ord) const; |
||
| 2091 | |||
| 2092 | virtual Instruction *emitTrailingFence(IRBuilderBase &Builder, |
||
| 2093 | Instruction *Inst, |
||
| 2094 | AtomicOrdering Ord) const; |
||
| 2095 | /// @} |
||
| 2096 | |||
| 2097 | // Emits code that executes when the comparison result in the ll/sc |
||
| 2098 | // expansion of a cmpxchg instruction is such that the store-conditional will |
||
| 2099 | // not execute. This makes it possible to balance out the load-linked with |
||
| 2100 | // a dedicated instruction, if desired. |
||
| 2101 | // E.g., on ARM, if ldrex isn't followed by strex, the exclusive monitor would |
||
| 2102 | // be unnecessarily held, except if clrex, inserted by this hook, is executed. |
||
| 2103 | virtual void emitAtomicCmpXchgNoStoreLLBalance(IRBuilderBase &Builder) const {} |
||
| 2104 | |||
| 2105 | /// Returns true if arguments should be sign-extended in lib calls. |
||
| 2106 | virtual bool shouldSignExtendTypeInLibCall(EVT Type, bool IsSigned) const { |
||
| 2107 | return IsSigned; |
||
| 2108 | } |
||
| 2109 | |||
| 2110 | /// Returns true if arguments should be extended in lib calls. |
||
| 2111 | virtual bool shouldExtendTypeInLibCall(EVT Type) const { |
||
| 2112 | return true; |
||
| 2113 | } |
||
| 2114 | |||
| 2115 | /// Returns how the given (atomic) load should be expanded by the |
||
| 2116 | /// IR-level AtomicExpand pass. |
||
| 2117 | virtual AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const { |
||
| 2118 | return AtomicExpansionKind::None; |
||
| 2119 | } |
||
| 2120 | |||
| 2121 | /// Returns how the given (atomic) load should be cast by the IR-level |
||
| 2122 | /// AtomicExpand pass. |
||
| 2123 | virtual AtomicExpansionKind shouldCastAtomicLoadInIR(LoadInst *LI) const { |
||
| 2124 | if (LI->getType()->isFloatingPointTy()) |
||
| 2125 | return AtomicExpansionKind::CastToInteger; |
||
| 2126 | return AtomicExpansionKind::None; |
||
| 2127 | } |
||
| 2128 | |||
| 2129 | /// Returns how the given (atomic) store should be expanded by the IR-level |
||
| 2130 | /// AtomicExpand pass into. For instance AtomicExpansionKind::Expand will try |
||
| 2131 | /// to use an atomicrmw xchg. |
||
| 2132 | virtual AtomicExpansionKind shouldExpandAtomicStoreInIR(StoreInst *SI) const { |
||
| 2133 | return AtomicExpansionKind::None; |
||
| 2134 | } |
||
| 2135 | |||
| 2136 | /// Returns how the given (atomic) store should be cast by the IR-level |
||
| 2137 | /// AtomicExpand pass into. For instance AtomicExpansionKind::CastToInteger |
||
| 2138 | /// will try to cast the operands to integer values. |
||
| 2139 | virtual AtomicExpansionKind shouldCastAtomicStoreInIR(StoreInst *SI) const { |
||
| 2140 | if (SI->getValueOperand()->getType()->isFloatingPointTy()) |
||
| 2141 | return AtomicExpansionKind::CastToInteger; |
||
| 2142 | return AtomicExpansionKind::None; |
||
| 2143 | } |
||
| 2144 | |||
| 2145 | /// Returns how the given atomic cmpxchg should be expanded by the IR-level |
||
| 2146 | /// AtomicExpand pass. |
||
| 2147 | virtual AtomicExpansionKind |
||
| 2148 | shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const { |
||
| 2149 | return AtomicExpansionKind::None; |
||
| 2150 | } |
||
| 2151 | |||
| 2152 | /// Returns how the IR-level AtomicExpand pass should expand the given |
||
| 2153 | /// AtomicRMW, if at all. Default is to never expand. |
||
| 2154 | virtual AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *RMW) const { |
||
| 2155 | return RMW->isFloatingPointOperation() ? |
||
| 2156 | AtomicExpansionKind::CmpXChg : AtomicExpansionKind::None; |
||
| 2157 | } |
||
| 2158 | |||
| 2159 | /// Returns how the given atomic atomicrmw should be cast by the IR-level |
||
| 2160 | /// AtomicExpand pass. |
||
| 2161 | virtual AtomicExpansionKind |
||
| 2162 | shouldCastAtomicRMWIInIR(AtomicRMWInst *RMWI) const { |
||
| 2163 | if (RMWI->getOperation() == AtomicRMWInst::Xchg && |
||
| 2164 | (RMWI->getValOperand()->getType()->isFloatingPointTy() || |
||
| 2165 | RMWI->getValOperand()->getType()->isPointerTy())) |
||
| 2166 | return AtomicExpansionKind::CastToInteger; |
||
| 2167 | |||
| 2168 | return AtomicExpansionKind::None; |
||
| 2169 | } |
||
| 2170 | |||
| 2171 | /// On some platforms, an AtomicRMW that never actually modifies the value |
||
| 2172 | /// (such as fetch_add of 0) can be turned into a fence followed by an |
||
| 2173 | /// atomic load. This may sound useless, but it makes it possible for the |
||
| 2174 | /// processor to keep the cacheline shared, dramatically improving |
||
| 2175 | /// performance. And such idempotent RMWs are useful for implementing some |
||
| 2176 | /// kinds of locks, see for example (justification + benchmarks): |
||
| 2177 | /// http://www.hpl.hp.com/techreports/2012/HPL-2012-68.pdf |
||
| 2178 | /// This method tries doing that transformation, returning the atomic load if |
||
| 2179 | /// it succeeds, and nullptr otherwise. |
||
| 2180 | /// If shouldExpandAtomicLoadInIR returns true on that load, it will undergo |
||
| 2181 | /// another round of expansion. |
||
| 2182 | virtual LoadInst * |
||
| 2183 | lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *RMWI) const { |
||
| 2184 | return nullptr; |
||
| 2185 | } |
||
| 2186 | |||
| 2187 | /// Returns how the platform's atomic operations are extended (ZERO_EXTEND, |
||
| 2188 | /// SIGN_EXTEND, or ANY_EXTEND). |
||
| 2189 | virtual ISD::NodeType getExtendForAtomicOps() const { |
||
| 2190 | return ISD::ZERO_EXTEND; |
||
| 2191 | } |
||
| 2192 | |||
| 2193 | /// Returns how the platform's atomic compare and swap expects its comparison |
||
| 2194 | /// value to be extended (ZERO_EXTEND, SIGN_EXTEND, or ANY_EXTEND). This is |
||
| 2195 | /// separate from getExtendForAtomicOps, which is concerned with the |
||
| 2196 | /// sign-extension of the instruction's output, whereas here we are concerned |
||
| 2197 | /// with the sign-extension of the input. For targets with compare-and-swap |
||
| 2198 | /// instructions (or sub-word comparisons in their LL/SC loop expansions), |
||
| 2199 | /// the input can be ANY_EXTEND, but the output will still have a specific |
||
| 2200 | /// extension. |
||
| 2201 | virtual ISD::NodeType getExtendForAtomicCmpSwapArg() const { |
||
| 2202 | return ISD::ANY_EXTEND; |
||
| 2203 | } |
||
| 2204 | |||
| 2205 | /// @} |
||
| 2206 | |||
| 2207 | /// Returns true if we should normalize |
||
| 2208 | /// select(N0&N1, X, Y) => select(N0, select(N1, X, Y), Y) and |
||
| 2209 | /// select(N0|N1, X, Y) => select(N0, select(N1, X, Y, Y)) if it is likely |
||
| 2210 | /// that it saves us from materializing N0 and N1 in an integer register. |
||
| 2211 | /// Targets that are able to perform and/or on flags should return false here. |
||
| 2212 | virtual bool shouldNormalizeToSelectSequence(LLVMContext &Context, |
||
| 2213 | EVT VT) const { |
||
| 2214 | // If a target has multiple condition registers, then it likely has logical |
||
| 2215 | // operations on those registers. |
||
| 2216 | if (hasMultipleConditionRegisters()) |
||
| 2217 | return false; |
||
| 2218 | // Only do the transform if the value won't be split into multiple |
||
| 2219 | // registers. |
||
| 2220 | LegalizeTypeAction Action = getTypeAction(Context, VT); |
||
| 2221 | return Action != TypeExpandInteger && Action != TypeExpandFloat && |
||
| 2222 | Action != TypeSplitVector; |
||
| 2223 | } |
||
| 2224 | |||
| 2225 | virtual bool isProfitableToCombineMinNumMaxNum(EVT VT) const { return true; } |
||
| 2226 | |||
| 2227 | /// Return true if a select of constants (select Cond, C1, C2) should be |
||
| 2228 | /// transformed into simple math ops with the condition value. For example: |
||
| 2229 | /// select Cond, C1, C1-1 --> add (zext Cond), C1-1 |
||
| 2230 | virtual bool convertSelectOfConstantsToMath(EVT VT) const { |
||
| 2231 | return false; |
||
| 2232 | } |
||
| 2233 | |||
| 2234 | /// Return true if it is profitable to transform an integer |
||
| 2235 | /// multiplication-by-constant into simpler operations like shifts and adds. |
||
| 2236 | /// This may be true if the target does not directly support the |
||
| 2237 | /// multiplication operation for the specified type or the sequence of simpler |
||
| 2238 | /// ops is faster than the multiply. |
||
| 2239 | virtual bool decomposeMulByConstant(LLVMContext &Context, |
||
| 2240 | EVT VT, SDValue C) const { |
||
| 2241 | return false; |
||
| 2242 | } |
||
| 2243 | |||
| 2244 | /// Return true if it may be profitable to transform |
||
| 2245 | /// (mul (add x, c1), c2) -> (add (mul x, c2), c1*c2). |
||
| 2246 | /// This may not be true if c1 and c2 can be represented as immediates but |
||
| 2247 | /// c1*c2 cannot, for example. |
||
| 2248 | /// The target should check if c1, c2 and c1*c2 can be represented as |
||
| 2249 | /// immediates, or have to be materialized into registers. If it is not sure |
||
| 2250 | /// about some cases, a default true can be returned to let the DAGCombiner |
||
| 2251 | /// decide. |
||
| 2252 | /// AddNode is (add x, c1), and ConstNode is c2. |
||
| 2253 | virtual bool isMulAddWithConstProfitable(SDValue AddNode, |
||
| 2254 | SDValue ConstNode) const { |
||
| 2255 | return true; |
||
| 2256 | } |
||
| 2257 | |||
| 2258 | /// Return true if it is more correct/profitable to use strict FP_TO_INT |
||
| 2259 | /// conversion operations - canonicalizing the FP source value instead of |
||
| 2260 | /// converting all cases and then selecting based on value. |
||
| 2261 | /// This may be true if the target throws exceptions for out of bounds |
||
| 2262 | /// conversions or has fast FP CMOV. |
||
| 2263 | virtual bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT, |
||
| 2264 | bool IsSigned) const { |
||
| 2265 | return false; |
||
| 2266 | } |
||
| 2267 | |||
| 2268 | /// Return true if it is beneficial to expand an @llvm.powi.* intrinsic. |
||
| 2269 | /// If not optimizing for size, expanding @llvm.powi.* intrinsics is always |
||
| 2270 | /// considered beneficial. |
||
| 2271 | /// If optimizing for size, expansion is only considered beneficial for upto |
||
| 2272 | /// 5 multiplies and a divide (if the exponent is negative). |
||
| 2273 | bool isBeneficialToExpandPowI(int Exponent, bool OptForSize) const { |
||
| 2274 | if (Exponent < 0) |
||
| 2275 | Exponent = -Exponent; |
||
| 2276 | return !OptForSize || |
||
| 2277 | (llvm::popcount((unsigned int)Exponent) + Log2_32(Exponent) < 7); |
||
| 2278 | } |
||
| 2279 | |||
| 2280 | //===--------------------------------------------------------------------===// |
||
| 2281 | // TargetLowering Configuration Methods - These methods should be invoked by |
||
| 2282 | // the derived class constructor to configure this object for the target. |
||
| 2283 | // |
||
| 2284 | protected: |
||
| 2285 | /// Specify how the target extends the result of integer and floating point |
||
| 2286 | /// boolean values from i1 to a wider type. See getBooleanContents. |
||
| 2287 | void setBooleanContents(BooleanContent Ty) { |
||
| 2288 | BooleanContents = Ty; |
||
| 2289 | BooleanFloatContents = Ty; |
||
| 2290 | } |
||
| 2291 | |||
| 2292 | /// Specify how the target extends the result of integer and floating point |
||
| 2293 | /// boolean values from i1 to a wider type. See getBooleanContents. |
||
| 2294 | void setBooleanContents(BooleanContent IntTy, BooleanContent FloatTy) { |
||
| 2295 | BooleanContents = IntTy; |
||
| 2296 | BooleanFloatContents = FloatTy; |
||
| 2297 | } |
||
| 2298 | |||
| 2299 | /// Specify how the target extends the result of a vector boolean value from a |
||
| 2300 | /// vector of i1 to a wider type. See getBooleanContents. |
||
| 2301 | void setBooleanVectorContents(BooleanContent Ty) { |
||
| 2302 | BooleanVectorContents = Ty; |
||
| 2303 | } |
||
| 2304 | |||
| 2305 | /// Specify the target scheduling preference. |
||
| 2306 | void setSchedulingPreference(Sched::Preference Pref) { |
||
| 2307 | SchedPreferenceInfo = Pref; |
||
| 2308 | } |
||
| 2309 | |||
| 2310 | /// Indicate the minimum number of blocks to generate jump tables. |
||
| 2311 | void setMinimumJumpTableEntries(unsigned Val); |
||
| 2312 | |||
| 2313 | /// Indicate the maximum number of entries in jump tables. |
||
| 2314 | /// Set to zero to generate unlimited jump tables. |
||
| 2315 | void setMaximumJumpTableSize(unsigned); |
||
| 2316 | |||
| 2317 | /// If set to a physical register, this specifies the register that |
||
| 2318 | /// llvm.savestack/llvm.restorestack should save and restore. |
||
| 2319 | void setStackPointerRegisterToSaveRestore(Register R) { |
||
| 2320 | StackPointerRegisterToSaveRestore = R; |
||
| 2321 | } |
||
| 2322 | |||
| 2323 | /// Tells the code generator that the target has multiple (allocatable) |
||
| 2324 | /// condition registers that can be used to store the results of comparisons |
||
| 2325 | /// for use by selects and conditional branches. With multiple condition |
||
| 2326 | /// registers, the code generator will not aggressively sink comparisons into |
||
| 2327 | /// the blocks of their users. |
||
| 2328 | void setHasMultipleConditionRegisters(bool hasManyRegs = true) { |
||
| 2329 | HasMultipleConditionRegisters = hasManyRegs; |
||
| 2330 | } |
||
| 2331 | |||
| 2332 | /// Tells the code generator that the target has BitExtract instructions. |
||
| 2333 | /// The code generator will aggressively sink "shift"s into the blocks of |
||
| 2334 | /// their users if the users will generate "and" instructions which can be |
||
| 2335 | /// combined with "shift" to BitExtract instructions. |
||
| 2336 | void setHasExtractBitsInsn(bool hasExtractInsn = true) { |
||
| 2337 | HasExtractBitsInsn = hasExtractInsn; |
||
| 2338 | } |
||
| 2339 | |||
| 2340 | /// Tells the code generator not to expand logic operations on comparison |
||
| 2341 | /// predicates into separate sequences that increase the amount of flow |
||
| 2342 | /// control. |
||
| 2343 | void setJumpIsExpensive(bool isExpensive = true); |
||
| 2344 | |||
| 2345 | /// Tells the code generator which bitwidths to bypass. |
||
| 2346 | void addBypassSlowDiv(unsigned int SlowBitWidth, unsigned int FastBitWidth) { |
||
| 2347 | BypassSlowDivWidths[SlowBitWidth] = FastBitWidth; |
||
| 2348 | } |
||
| 2349 | |||
| 2350 | /// Add the specified register class as an available regclass for the |
||
| 2351 | /// specified value type. This indicates the selector can handle values of |
||
| 2352 | /// that class natively. |
||
| 2353 | void addRegisterClass(MVT VT, const TargetRegisterClass *RC) { |
||
| 2354 | assert((unsigned)VT.SimpleTy < std::size(RegClassForVT)); |
||
| 2355 | RegClassForVT[VT.SimpleTy] = RC; |
||
| 2356 | } |
||
| 2357 | |||
| 2358 | /// Return the largest legal super-reg register class of the register class |
||
| 2359 | /// for the specified type and its associated "cost". |
||
| 2360 | virtual std::pair<const TargetRegisterClass *, uint8_t> |
||
| 2361 | findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const; |
||
| 2362 | |||
| 2363 | /// Once all of the register classes are added, this allows us to compute |
||
| 2364 | /// derived properties we expose. |
||
| 2365 | void computeRegisterProperties(const TargetRegisterInfo *TRI); |
||
| 2366 | |||
| 2367 | /// Indicate that the specified operation does not work with the specified |
||
| 2368 | /// type and indicate what to do about it. Note that VT may refer to either |
||
| 2369 | /// the type of a result or that of an operand of Op. |
||
| 2370 | void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action) { |
||
| 2371 | assert(Op < std::size(OpActions[0]) && "Table isn't big enough!"); |
||
| 2372 | OpActions[(unsigned)VT.SimpleTy][Op] = Action; |
||
| 2373 | } |
||
| 2374 | void setOperationAction(ArrayRef<unsigned> Ops, MVT VT, |
||
| 2375 | LegalizeAction Action) { |
||
| 2376 | for (auto Op : Ops) |
||
| 2377 | setOperationAction(Op, VT, Action); |
||
| 2378 | } |
||
| 2379 | void setOperationAction(ArrayRef<unsigned> Ops, ArrayRef<MVT> VTs, |
||
| 2380 | LegalizeAction Action) { |
||
| 2381 | for (auto VT : VTs) |
||
| 2382 | setOperationAction(Ops, VT, Action); |
||
| 2383 | } |
||
| 2384 | |||
| 2385 | /// Indicate that the specified load with extension does not work with the |
||
| 2386 | /// specified type and indicate what to do about it. |
||
| 2387 | void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, |
||
| 2388 | LegalizeAction Action) { |
||
| 2389 | assert(ExtType < ISD::LAST_LOADEXT_TYPE && ValVT.isValid() && |
||
| 2390 | MemVT.isValid() && "Table isn't big enough!"); |
||
| 2391 | assert((unsigned)Action < 0x10 && "too many bits for bitfield array"); |
||
| 2392 | unsigned Shift = 4 * ExtType; |
||
| 2393 | LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] &= ~((uint16_t)0xF << Shift); |
||
| 2394 | LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] |= (uint16_t)Action << Shift; |
||
| 2395 | } |
||
| 2396 | void setLoadExtAction(ArrayRef<unsigned> ExtTypes, MVT ValVT, MVT MemVT, |
||
| 2397 | LegalizeAction Action) { |
||
| 2398 | for (auto ExtType : ExtTypes) |
||
| 2399 | setLoadExtAction(ExtType, ValVT, MemVT, Action); |
||
| 2400 | } |
||
| 2401 | void setLoadExtAction(ArrayRef<unsigned> ExtTypes, MVT ValVT, |
||
| 2402 | ArrayRef<MVT> MemVTs, LegalizeAction Action) { |
||
| 2403 | for (auto MemVT : MemVTs) |
||
| 2404 | setLoadExtAction(ExtTypes, ValVT, MemVT, Action); |
||
| 2405 | } |
||
| 2406 | |||
| 2407 | /// Indicate that the specified truncating store does not work with the |
||
| 2408 | /// specified type and indicate what to do about it. |
||
| 2409 | void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action) { |
||
| 2410 | assert(ValVT.isValid() && MemVT.isValid() && "Table isn't big enough!"); |
||
| 2411 | TruncStoreActions[(unsigned)ValVT.SimpleTy][MemVT.SimpleTy] = Action; |
||
| 2412 | } |
||
| 2413 | |||
| 2414 | /// Indicate that the specified indexed load does or does not work with the |
||
| 2415 | /// specified type and indicate what to do abort it. |
||
| 2416 | /// |
||
| 2417 | /// NOTE: All indexed mode loads are initialized to Expand in |
||
| 2418 | /// TargetLowering.cpp |
||
| 2419 | void setIndexedLoadAction(ArrayRef<unsigned> IdxModes, MVT VT, |
||
| 2420 | LegalizeAction Action) { |
||
| 2421 | for (auto IdxMode : IdxModes) |
||
| 2422 | setIndexedModeAction(IdxMode, VT, IMAB_Load, Action); |
||
| 2423 | } |
||
| 2424 | |||
| 2425 | void setIndexedLoadAction(ArrayRef<unsigned> IdxModes, ArrayRef<MVT> VTs, |
||
| 2426 | LegalizeAction Action) { |
||
| 2427 | for (auto VT : VTs) |
||
| 2428 | setIndexedLoadAction(IdxModes, VT, Action); |
||
| 2429 | } |
||
| 2430 | |||
| 2431 | /// Indicate that the specified indexed store does or does not work with the |
||
| 2432 | /// specified type and indicate what to do about it. |
||
| 2433 | /// |
||
| 2434 | /// NOTE: All indexed mode stores are initialized to Expand in |
||
| 2435 | /// TargetLowering.cpp |
||
| 2436 | void setIndexedStoreAction(ArrayRef<unsigned> IdxModes, MVT VT, |
||
| 2437 | LegalizeAction Action) { |
||
| 2438 | for (auto IdxMode : IdxModes) |
||
| 2439 | setIndexedModeAction(IdxMode, VT, IMAB_Store, Action); |
||
| 2440 | } |
||
| 2441 | |||
| 2442 | void setIndexedStoreAction(ArrayRef<unsigned> IdxModes, ArrayRef<MVT> VTs, |
||
| 2443 | LegalizeAction Action) { |
||
| 2444 | for (auto VT : VTs) |
||
| 2445 | setIndexedStoreAction(IdxModes, VT, Action); |
||
| 2446 | } |
||
| 2447 | |||
| 2448 | /// Indicate that the specified indexed masked load does or does not work with |
||
| 2449 | /// the specified type and indicate what to do about it. |
||
| 2450 | /// |
||
| 2451 | /// NOTE: All indexed mode masked loads are initialized to Expand in |
||
| 2452 | /// TargetLowering.cpp |
||
| 2453 | void setIndexedMaskedLoadAction(unsigned IdxMode, MVT VT, |
||
| 2454 | LegalizeAction Action) { |
||
| 2455 | setIndexedModeAction(IdxMode, VT, IMAB_MaskedLoad, Action); |
||
| 2456 | } |
||
| 2457 | |||
| 2458 | /// Indicate that the specified indexed masked store does or does not work |
||
| 2459 | /// with the specified type and indicate what to do about it. |
||
| 2460 | /// |
||
| 2461 | /// NOTE: All indexed mode masked stores are initialized to Expand in |
||
| 2462 | /// TargetLowering.cpp |
||
| 2463 | void setIndexedMaskedStoreAction(unsigned IdxMode, MVT VT, |
||
| 2464 | LegalizeAction Action) { |
||
| 2465 | setIndexedModeAction(IdxMode, VT, IMAB_MaskedStore, Action); |
||
| 2466 | } |
||
| 2467 | |||
| 2468 | /// Indicate that the specified condition code is or isn't supported on the |
||
| 2469 | /// target and indicate what to do about it. |
||
| 2470 | void setCondCodeAction(ArrayRef<ISD::CondCode> CCs, MVT VT, |
||
| 2471 | LegalizeAction Action) { |
||
| 2472 | for (auto CC : CCs) { |
||
| 2473 | assert(VT.isValid() && (unsigned)CC < std::size(CondCodeActions) && |
||
| 2474 | "Table isn't big enough!"); |
||
| 2475 | assert((unsigned)Action < 0x10 && "too many bits for bitfield array"); |
||
| 2476 | /// The lower 3 bits of the SimpleTy index into Nth 4bit set from the |
||
| 2477 | /// 32-bit value and the upper 29 bits index into the second dimension of |
||
| 2478 | /// the array to select what 32-bit value to use. |
||
| 2479 | uint32_t Shift = 4 * (VT.SimpleTy & 0x7); |
||
| 2480 | CondCodeActions[CC][VT.SimpleTy >> 3] &= ~((uint32_t)0xF << Shift); |
||
| 2481 | CondCodeActions[CC][VT.SimpleTy >> 3] |= (uint32_t)Action << Shift; |
||
| 2482 | } |
||
| 2483 | } |
||
| 2484 | void setCondCodeAction(ArrayRef<ISD::CondCode> CCs, ArrayRef<MVT> VTs, |
||
| 2485 | LegalizeAction Action) { |
||
| 2486 | for (auto VT : VTs) |
||
| 2487 | setCondCodeAction(CCs, VT, Action); |
||
| 2488 | } |
||
| 2489 | |||
| 2490 | /// If Opc/OrigVT is specified as being promoted, the promotion code defaults |
||
| 2491 | /// to trying a larger integer/fp until it can find one that works. If that |
||
| 2492 | /// default is insufficient, this method can be used by the target to override |
||
| 2493 | /// the default. |
||
| 2494 | void AddPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT) { |
||
| 2495 | PromoteToType[std::make_pair(Opc, OrigVT.SimpleTy)] = DestVT.SimpleTy; |
||
| 2496 | } |
||
| 2497 | |||
| 2498 | /// Convenience method to set an operation to Promote and specify the type |
||
| 2499 | /// in a single call. |
||
| 2500 | void setOperationPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT) { |
||
| 2501 | setOperationAction(Opc, OrigVT, Promote); |
||
| 2502 | AddPromotedToType(Opc, OrigVT, DestVT); |
||
| 2503 | } |
||
| 2504 | |||
| 2505 | /// Targets should invoke this method for each target independent node that |
||
| 2506 | /// they want to provide a custom DAG combiner for by implementing the |
||
| 2507 | /// PerformDAGCombine virtual method. |
||
| 2508 | void setTargetDAGCombine(ArrayRef<ISD::NodeType> NTs) { |
||
| 2509 | for (auto NT : NTs) { |
||
| 2510 | assert(unsigned(NT >> 3) < std::size(TargetDAGCombineArray)); |
||
| 2511 | TargetDAGCombineArray[NT >> 3] |= 1 << (NT & 7); |
||
| 2512 | } |
||
| 2513 | } |
||
| 2514 | |||
| 2515 | /// Set the target's minimum function alignment. |
||
| 2516 | void setMinFunctionAlignment(Align Alignment) { |
||
| 2517 | MinFunctionAlignment = Alignment; |
||
| 2518 | } |
||
| 2519 | |||
| 2520 | /// Set the target's preferred function alignment. This should be set if |
||
| 2521 | /// there is a performance benefit to higher-than-minimum alignment |
||
| 2522 | void setPrefFunctionAlignment(Align Alignment) { |
||
| 2523 | PrefFunctionAlignment = Alignment; |
||
| 2524 | } |
||
| 2525 | |||
| 2526 | /// Set the target's preferred loop alignment. Default alignment is one, it |
||
| 2527 | /// means the target does not care about loop alignment. The target may also |
||
| 2528 | /// override getPrefLoopAlignment to provide per-loop values. |
||
| 2529 | void setPrefLoopAlignment(Align Alignment) { PrefLoopAlignment = Alignment; } |
||
| 2530 | void setMaxBytesForAlignment(unsigned MaxBytes) { |
||
| 2531 | MaxBytesForAlignment = MaxBytes; |
||
| 2532 | } |
||
| 2533 | |||
| 2534 | /// Set the minimum stack alignment of an argument. |
||
| 2535 | void setMinStackArgumentAlignment(Align Alignment) { |
||
| 2536 | MinStackArgumentAlignment = Alignment; |
||
| 2537 | } |
||
| 2538 | |||
| 2539 | /// Set the maximum atomic operation size supported by the |
||
| 2540 | /// backend. Atomic operations greater than this size (as well as |
||
| 2541 | /// ones that are not naturally aligned), will be expanded by |
||
| 2542 | /// AtomicExpandPass into an __atomic_* library call. |
||
| 2543 | void setMaxAtomicSizeInBitsSupported(unsigned SizeInBits) { |
||
| 2544 | MaxAtomicSizeInBitsSupported = SizeInBits; |
||
| 2545 | } |
||
| 2546 | |||
| 2547 | /// Set the size in bits of the maximum div/rem the backend supports. |
||
| 2548 | /// Larger operations will be expanded by ExpandLargeDivRem. |
||
| 2549 | void setMaxDivRemBitWidthSupported(unsigned SizeInBits) { |
||
| 2550 | MaxDivRemBitWidthSupported = SizeInBits; |
||
| 2551 | } |
||
| 2552 | |||
| 2553 | /// Set the size in bits of the maximum fp convert the backend supports. |
||
| 2554 | /// Larger operations will be expanded by ExpandLargeFPConvert. |
||
| 2555 | void setMaxLargeFPConvertBitWidthSupported(unsigned SizeInBits) { |
||
| 2556 | MaxLargeFPConvertBitWidthSupported = SizeInBits; |
||
| 2557 | } |
||
| 2558 | |||
| 2559 | /// Sets the minimum cmpxchg or ll/sc size supported by the backend. |
||
| 2560 | void setMinCmpXchgSizeInBits(unsigned SizeInBits) { |
||
| 2561 | MinCmpXchgSizeInBits = SizeInBits; |
||
| 2562 | } |
||
| 2563 | |||
| 2564 | /// Sets whether unaligned atomic operations are supported. |
||
| 2565 | void setSupportsUnalignedAtomics(bool UnalignedSupported) { |
||
| 2566 | SupportsUnalignedAtomics = UnalignedSupported; |
||
| 2567 | } |
||
| 2568 | |||
| 2569 | public: |
||
| 2570 | //===--------------------------------------------------------------------===// |
||
| 2571 | // Addressing mode description hooks (used by LSR etc). |
||
| 2572 | // |
||
| 2573 | |||
| 2574 | /// CodeGenPrepare sinks address calculations into the same BB as Load/Store |
||
| 2575 | /// instructions reading the address. This allows as much computation as |
||
| 2576 | /// possible to be done in the address mode for that operand. This hook lets |
||
| 2577 | /// targets also pass back when this should be done on intrinsics which |
||
| 2578 | /// load/store. |
||
| 2579 | virtual bool getAddrModeArguments(IntrinsicInst * /*I*/, |
||
| 2580 | SmallVectorImpl<Value*> &/*Ops*/, |
||
| 2581 | Type *&/*AccessTy*/) const { |
||
| 2582 | return false; |
||
| 2583 | } |
||
| 2584 | |||
| 2585 | /// This represents an addressing mode of: |
||
| 2586 | /// BaseGV + BaseOffs + BaseReg + Scale*ScaleReg |
||
| 2587 | /// If BaseGV is null, there is no BaseGV. |
||
| 2588 | /// If BaseOffs is zero, there is no base offset. |
||
| 2589 | /// If HasBaseReg is false, there is no base register. |
||
| 2590 | /// If Scale is zero, there is no ScaleReg. Scale of 1 indicates a reg with |
||
| 2591 | /// no scale. |
||
| 2592 | struct AddrMode { |
||
| 2593 | GlobalValue *BaseGV = nullptr; |
||
| 2594 | int64_t BaseOffs = 0; |
||
| 2595 | bool HasBaseReg = false; |
||
| 2596 | int64_t Scale = 0; |
||
| 2597 | AddrMode() = default; |
||
| 2598 | }; |
||
| 2599 | |||
| 2600 | /// Return true if the addressing mode represented by AM is legal for this |
||
| 2601 | /// target, for a load/store of the specified type. |
||
| 2602 | /// |
||
| 2603 | /// The type may be VoidTy, in which case only return true if the addressing |
||
| 2604 | /// mode is legal for a load/store of any legal type. TODO: Handle |
||
| 2605 | /// pre/postinc as well. |
||
| 2606 | /// |
||
| 2607 | /// If the address space cannot be determined, it will be -1. |
||
| 2608 | /// |
||
| 2609 | /// TODO: Remove default argument |
||
| 2610 | virtual bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, |
||
| 2611 | Type *Ty, unsigned AddrSpace, |
||
| 2612 | Instruction *I = nullptr) const; |
||
| 2613 | |||
| 2614 | /// Return true if the specified immediate is legal icmp immediate, that is |
||
| 2615 | /// the target has icmp instructions which can compare a register against the |
||
| 2616 | /// immediate without having to materialize the immediate into a register. |
||
| 2617 | virtual bool isLegalICmpImmediate(int64_t) const { |
||
| 2618 | return true; |
||
| 2619 | } |
||
| 2620 | |||
| 2621 | /// Return true if the specified immediate is legal add immediate, that is the |
||
| 2622 | /// target has add instructions which can add a register with the immediate |
||
| 2623 | /// without having to materialize the immediate into a register. |
||
| 2624 | virtual bool isLegalAddImmediate(int64_t) const { |
||
| 2625 | return true; |
||
| 2626 | } |
||
| 2627 | |||
| 2628 | /// Return true if the specified immediate is legal for the value input of a |
||
| 2629 | /// store instruction. |
||
| 2630 | virtual bool isLegalStoreImmediate(int64_t Value) const { |
||
| 2631 | // Default implementation assumes that at least 0 works since it is likely |
||
| 2632 | // that a zero register exists or a zero immediate is allowed. |
||
| 2633 | return Value == 0; |
||
| 2634 | } |
||
| 2635 | |||
| 2636 | /// Return true if it's significantly cheaper to shift a vector by a uniform |
||
| 2637 | /// scalar than by an amount which will vary across each lane. On x86 before |
||
| 2638 | /// AVX2 for example, there is a "psllw" instruction for the former case, but |
||
| 2639 | /// no simple instruction for a general "a << b" operation on vectors. |
||
| 2640 | /// This should also apply to lowering for vector funnel shifts (rotates). |
||
| 2641 | virtual bool isVectorShiftByScalarCheap(Type *Ty) const { |
||
| 2642 | return false; |
||
| 2643 | } |
||
| 2644 | |||
| 2645 | /// Given a shuffle vector SVI representing a vector splat, return a new |
||
| 2646 | /// scalar type of size equal to SVI's scalar type if the new type is more |
||
| 2647 | /// profitable. Returns nullptr otherwise. For example under MVE float splats |
||
| 2648 | /// are converted to integer to prevent the need to move from SPR to GPR |
||
| 2649 | /// registers. |
||
| 2650 | virtual Type* shouldConvertSplatType(ShuffleVectorInst* SVI) const { |
||
| 2651 | return nullptr; |
||
| 2652 | } |
||
| 2653 | |||
| 2654 | /// Given a set in interconnected phis of type 'From' that are loaded/stored |
||
| 2655 | /// or bitcast to type 'To', return true if the set should be converted to |
||
| 2656 | /// 'To'. |
||
| 2657 | virtual bool shouldConvertPhiType(Type *From, Type *To) const { |
||
| 2658 | return (From->isIntegerTy() || From->isFloatingPointTy()) && |
||
| 2659 | (To->isIntegerTy() || To->isFloatingPointTy()); |
||
| 2660 | } |
||
| 2661 | |||
| 2662 | /// Returns true if the opcode is a commutative binary operation. |
||
| 2663 | virtual bool isCommutativeBinOp(unsigned Opcode) const { |
||
| 2664 | // FIXME: This should get its info from the td file. |
||
| 2665 | switch (Opcode) { |
||
| 2666 | case ISD::ADD: |
||
| 2667 | case ISD::SMIN: |
||
| 2668 | case ISD::SMAX: |
||
| 2669 | case ISD::UMIN: |
||
| 2670 | case ISD::UMAX: |
||
| 2671 | case ISD::MUL: |
||
| 2672 | case ISD::MULHU: |
||
| 2673 | case ISD::MULHS: |
||
| 2674 | case ISD::SMUL_LOHI: |
||
| 2675 | case ISD::UMUL_LOHI: |
||
| 2676 | case ISD::FADD: |
||
| 2677 | case ISD::FMUL: |
||
| 2678 | case ISD::AND: |
||
| 2679 | case ISD::OR: |
||
| 2680 | case ISD::XOR: |
||
| 2681 | case ISD::SADDO: |
||
| 2682 | case ISD::UADDO: |
||
| 2683 | case ISD::ADDC: |
||
| 2684 | case ISD::ADDE: |
||
| 2685 | case ISD::SADDSAT: |
||
| 2686 | case ISD::UADDSAT: |
||
| 2687 | case ISD::FMINNUM: |
||
| 2688 | case ISD::FMAXNUM: |
||
| 2689 | case ISD::FMINNUM_IEEE: |
||
| 2690 | case ISD::FMAXNUM_IEEE: |
||
| 2691 | case ISD::FMINIMUM: |
||
| 2692 | case ISD::FMAXIMUM: |
||
| 2693 | case ISD::AVGFLOORS: |
||
| 2694 | case ISD::AVGFLOORU: |
||
| 2695 | case ISD::AVGCEILS: |
||
| 2696 | case ISD::AVGCEILU: |
||
| 2697 | return true; |
||
| 2698 | default: return false; |
||
| 2699 | } |
||
| 2700 | } |
||
| 2701 | |||
| 2702 | /// Return true if the node is a math/logic binary operator. |
||
| 2703 | virtual bool isBinOp(unsigned Opcode) const { |
||
| 2704 | // A commutative binop must be a binop. |
||
| 2705 | if (isCommutativeBinOp(Opcode)) |
||
| 2706 | return true; |
||
| 2707 | // These are non-commutative binops. |
||
| 2708 | switch (Opcode) { |
||
| 2709 | case ISD::SUB: |
||
| 2710 | case ISD::SHL: |
||
| 2711 | case ISD::SRL: |
||
| 2712 | case ISD::SRA: |
||
| 2713 | case ISD::ROTL: |
||
| 2714 | case ISD::ROTR: |
||
| 2715 | case ISD::SDIV: |
||
| 2716 | case ISD::UDIV: |
||
| 2717 | case ISD::SREM: |
||
| 2718 | case ISD::UREM: |
||
| 2719 | case ISD::SSUBSAT: |
||
| 2720 | case ISD::USUBSAT: |
||
| 2721 | case ISD::FSUB: |
||
| 2722 | case ISD::FDIV: |
||
| 2723 | case ISD::FREM: |
||
| 2724 | return true; |
||
| 2725 | default: |
||
| 2726 | return false; |
||
| 2727 | } |
||
| 2728 | } |
||
| 2729 | |||
| 2730 | /// Return true if it's free to truncate a value of type FromTy to type |
||
| 2731 | /// ToTy. e.g. On x86 it's free to truncate a i32 value in register EAX to i16 |
||
| 2732 | /// by referencing its sub-register AX. |
||
| 2733 | /// Targets must return false when FromTy <= ToTy. |
||
| 2734 | virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const { |
||
| 2735 | return false; |
||
| 2736 | } |
||
| 2737 | |||
| 2738 | /// Return true if a truncation from FromTy to ToTy is permitted when deciding |
||
| 2739 | /// whether a call is in tail position. Typically this means that both results |
||
| 2740 | /// would be assigned to the same register or stack slot, but it could mean |
||
| 2741 | /// the target performs adequate checks of its own before proceeding with the |
||
| 2742 | /// tail call. Targets must return false when FromTy <= ToTy. |
||
| 2743 | virtual bool allowTruncateForTailCall(Type *FromTy, Type *ToTy) const { |
||
| 2744 | return false; |
||
| 2745 | } |
||
| 2746 | |||
| 2747 | virtual bool isTruncateFree(EVT FromVT, EVT ToVT) const { return false; } |
||
| 2748 | virtual bool isTruncateFree(LLT FromTy, LLT ToTy, const DataLayout &DL, |
||
| 2749 | LLVMContext &Ctx) const { |
||
| 2750 | return isTruncateFree(getApproximateEVTForLLT(FromTy, DL, Ctx), |
||
| 2751 | getApproximateEVTForLLT(ToTy, DL, Ctx)); |
||
| 2752 | } |
||
| 2753 | |||
| 2754 | virtual bool isProfitableToHoist(Instruction *I) const { return true; } |
||
| 2755 | |||
| 2756 | /// Return true if the extension represented by \p I is free. |
||
| 2757 | /// Unlikely the is[Z|FP]ExtFree family which is based on types, |
||
| 2758 | /// this method can use the context provided by \p I to decide |
||
| 2759 | /// whether or not \p I is free. |
||
| 2760 | /// This method extends the behavior of the is[Z|FP]ExtFree family. |
||
| 2761 | /// In other words, if is[Z|FP]Free returns true, then this method |
||
| 2762 | /// returns true as well. The converse is not true. |
||
| 2763 | /// The target can perform the adequate checks by overriding isExtFreeImpl. |
||
| 2764 | /// \pre \p I must be a sign, zero, or fp extension. |
||
| 2765 | bool isExtFree(const Instruction *I) const { |
||
| 2766 | switch (I->getOpcode()) { |
||
| 2767 | case Instruction::FPExt: |
||
| 2768 | if (isFPExtFree(EVT::getEVT(I->getType()), |
||
| 2769 | EVT::getEVT(I->getOperand(0)->getType()))) |
||
| 2770 | return true; |
||
| 2771 | break; |
||
| 2772 | case Instruction::ZExt: |
||
| 2773 | if (isZExtFree(I->getOperand(0)->getType(), I->getType())) |
||
| 2774 | return true; |
||
| 2775 | break; |
||
| 2776 | case Instruction::SExt: |
||
| 2777 | break; |
||
| 2778 | default: |
||
| 2779 | llvm_unreachable("Instruction is not an extension"); |
||
| 2780 | } |
||
| 2781 | return isExtFreeImpl(I); |
||
| 2782 | } |
||
| 2783 | |||
| 2784 | /// Return true if \p Load and \p Ext can form an ExtLoad. |
||
| 2785 | /// For example, in AArch64 |
||
| 2786 | /// %L = load i8, i8* %ptr |
||
| 2787 | /// %E = zext i8 %L to i32 |
||
| 2788 | /// can be lowered into one load instruction |
||
| 2789 | /// ldrb w0, [x0] |
||
| 2790 | bool isExtLoad(const LoadInst *Load, const Instruction *Ext, |
||
| 2791 | const DataLayout &DL) const { |
||
| 2792 | EVT VT = getValueType(DL, Ext->getType()); |
||
| 2793 | EVT LoadVT = getValueType(DL, Load->getType()); |
||
| 2794 | |||
| 2795 | // If the load has other users and the truncate is not free, the ext |
||
| 2796 | // probably isn't free. |
||
| 2797 | if (!Load->hasOneUse() && (isTypeLegal(LoadVT) || !isTypeLegal(VT)) && |
||
| 2798 | !isTruncateFree(Ext->getType(), Load->getType())) |
||
| 2799 | return false; |
||
| 2800 | |||
| 2801 | // Check whether the target supports casts folded into loads. |
||
| 2802 | unsigned LType; |
||
| 2803 | if (isa<ZExtInst>(Ext)) |
||
| 2804 | LType = ISD::ZEXTLOAD; |
||
| 2805 | else { |
||
| 2806 | assert(isa<SExtInst>(Ext) && "Unexpected ext type!"); |
||
| 2807 | LType = ISD::SEXTLOAD; |
||
| 2808 | } |
||
| 2809 | |||
| 2810 | return isLoadExtLegal(LType, VT, LoadVT); |
||
| 2811 | } |
||
| 2812 | |||
| 2813 | /// Return true if any actual instruction that defines a value of type FromTy |
||
| 2814 | /// implicitly zero-extends the value to ToTy in the result register. |
||
| 2815 | /// |
||
| 2816 | /// The function should return true when it is likely that the truncate can |
||
| 2817 | /// be freely folded with an instruction defining a value of FromTy. If |
||
| 2818 | /// the defining instruction is unknown (because you're looking at a |
||
| 2819 | /// function argument, PHI, etc.) then the target may require an |
||
| 2820 | /// explicit truncate, which is not necessarily free, but this function |
||
| 2821 | /// does not deal with those cases. |
||
| 2822 | /// Targets must return false when FromTy >= ToTy. |
||
| 2823 | virtual bool isZExtFree(Type *FromTy, Type *ToTy) const { |
||
| 2824 | return false; |
||
| 2825 | } |
||
| 2826 | |||
| 2827 | virtual bool isZExtFree(EVT FromTy, EVT ToTy) const { return false; } |
||
| 2828 | virtual bool isZExtFree(LLT FromTy, LLT ToTy, const DataLayout &DL, |
||
| 2829 | LLVMContext &Ctx) const { |
||
| 2830 | return isZExtFree(getApproximateEVTForLLT(FromTy, DL, Ctx), |
||
| 2831 | getApproximateEVTForLLT(ToTy, DL, Ctx)); |
||
| 2832 | } |
||
| 2833 | |||
| 2834 | /// Return true if sign-extension from FromTy to ToTy is cheaper than |
||
| 2835 | /// zero-extension. |
||
| 2836 | virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const { |
||
| 2837 | return false; |
||
| 2838 | } |
||
| 2839 | |||
| 2840 | /// Return true if this constant should be sign extended when promoting to |
||
| 2841 | /// a larger type. |
||
| 2842 | virtual bool signExtendConstant(const ConstantInt *C) const { return false; } |
||
| 2843 | |||
| 2844 | /// Return true if sinking I's operands to the same basic block as I is |
||
| 2845 | /// profitable, e.g. because the operands can be folded into a target |
||
| 2846 | /// instruction during instruction selection. After calling the function |
||
| 2847 | /// \p Ops contains the Uses to sink ordered by dominance (dominating users |
||
| 2848 | /// come first). |
||
| 2849 | virtual bool shouldSinkOperands(Instruction *I, |
||
| 2850 | SmallVectorImpl<Use *> &Ops) const { |
||
| 2851 | return false; |
||
| 2852 | } |
||
| 2853 | |||
| 2854 | /// Try to optimize extending or truncating conversion instructions (like |
||
| 2855 | /// zext, trunc, fptoui, uitofp) for the target. |
||
| 2856 | virtual bool optimizeExtendOrTruncateConversion(Instruction *I, |
||
| 2857 | Loop *L) const { |
||
| 2858 | return false; |
||
| 2859 | } |
||
| 2860 | |||
| 2861 | /// Return true if the target supplies and combines to a paired load |
||
| 2862 | /// two loaded values of type LoadedType next to each other in memory. |
||
| 2863 | /// RequiredAlignment gives the minimal alignment constraints that must be met |
||
| 2864 | /// to be able to select this paired load. |
||
| 2865 | /// |
||
| 2866 | /// This information is *not* used to generate actual paired loads, but it is |
||
| 2867 | /// used to generate a sequence of loads that is easier to combine into a |
||
| 2868 | /// paired load. |
||
| 2869 | /// For instance, something like this: |
||
| 2870 | /// a = load i64* addr |
||
| 2871 | /// b = trunc i64 a to i32 |
||
| 2872 | /// c = lshr i64 a, 32 |
||
| 2873 | /// d = trunc i64 c to i32 |
||
| 2874 | /// will be optimized into: |
||
| 2875 | /// b = load i32* addr1 |
||
| 2876 | /// d = load i32* addr2 |
||
| 2877 | /// Where addr1 = addr2 +/- sizeof(i32). |
||
| 2878 | /// |
||
| 2879 | /// In other words, unless the target performs a post-isel load combining, |
||
| 2880 | /// this information should not be provided because it will generate more |
||
| 2881 | /// loads. |
||
| 2882 | virtual bool hasPairedLoad(EVT /*LoadedType*/, |
||
| 2883 | Align & /*RequiredAlignment*/) const { |
||
| 2884 | return false; |
||
| 2885 | } |
||
| 2886 | |||
| 2887 | /// Return true if the target has a vector blend instruction. |
||
| 2888 | virtual bool hasVectorBlend() const { return false; } |
||
| 2889 | |||
| 2890 | /// Get the maximum supported factor for interleaved memory accesses. |
||
| 2891 | /// Default to be the minimum interleave factor: 2. |
||
| 2892 | virtual unsigned getMaxSupportedInterleaveFactor() const { return 2; } |
||
| 2893 | |||
| 2894 | /// Lower an interleaved load to target specific intrinsics. Return |
||
| 2895 | /// true on success. |
||
| 2896 | /// |
||
| 2897 | /// \p LI is the vector load instruction. |
||
| 2898 | /// \p Shuffles is the shufflevector list to DE-interleave the loaded vector. |
||
| 2899 | /// \p Indices is the corresponding indices for each shufflevector. |
||
| 2900 | /// \p Factor is the interleave factor. |
||
| 2901 | virtual bool lowerInterleavedLoad(LoadInst *LI, |
||
| 2902 | ArrayRef<ShuffleVectorInst *> Shuffles, |
||
| 2903 | ArrayRef<unsigned> Indices, |
||
| 2904 | unsigned Factor) const { |
||
| 2905 | return false; |
||
| 2906 | } |
||
| 2907 | |||
| 2908 | /// Lower an interleaved store to target specific intrinsics. Return |
||
| 2909 | /// true on success. |
||
| 2910 | /// |
||
| 2911 | /// \p SI is the vector store instruction. |
||
| 2912 | /// \p SVI is the shufflevector to RE-interleave the stored vector. |
||
| 2913 | /// \p Factor is the interleave factor. |
||
| 2914 | virtual bool lowerInterleavedStore(StoreInst *SI, ShuffleVectorInst *SVI, |
||
| 2915 | unsigned Factor) const { |
||
| 2916 | return false; |
||
| 2917 | } |
||
| 2918 | |||
| 2919 | /// Return true if zero-extending the specific node Val to type VT2 is free |
||
| 2920 | /// (either because it's implicitly zero-extended such as ARM ldrb / ldrh or |
||
| 2921 | /// because it's folded such as X86 zero-extending loads). |
||
| 2922 | virtual bool isZExtFree(SDValue Val, EVT VT2) const { |
||
| 2923 | return isZExtFree(Val.getValueType(), VT2); |
||
| 2924 | } |
||
| 2925 | |||
| 2926 | /// Return true if an fpext operation is free (for instance, because |
||
| 2927 | /// single-precision floating-point numbers are implicitly extended to |
||
| 2928 | /// double-precision). |
||
| 2929 | virtual bool isFPExtFree(EVT DestVT, EVT SrcVT) const { |
||
| 2930 | assert(SrcVT.isFloatingPoint() && DestVT.isFloatingPoint() && |
||
| 2931 | "invalid fpext types"); |
||
| 2932 | return false; |
||
| 2933 | } |
||
| 2934 | |||
| 2935 | /// Return true if an fpext operation input to an \p Opcode operation is free |
||
| 2936 | /// (for instance, because half-precision floating-point numbers are |
||
| 2937 | /// implicitly extended to float-precision) for an FMA instruction. |
||
| 2938 | virtual bool isFPExtFoldable(const MachineInstr &MI, unsigned Opcode, |
||
| 2939 | LLT DestTy, LLT SrcTy) const { |
||
| 2940 | return false; |
||
| 2941 | } |
||
| 2942 | |||
| 2943 | /// Return true if an fpext operation input to an \p Opcode operation is free |
||
| 2944 | /// (for instance, because half-precision floating-point numbers are |
||
| 2945 | /// implicitly extended to float-precision) for an FMA instruction. |
||
| 2946 | virtual bool isFPExtFoldable(const SelectionDAG &DAG, unsigned Opcode, |
||
| 2947 | EVT DestVT, EVT SrcVT) const { |
||
| 2948 | assert(DestVT.isFloatingPoint() && SrcVT.isFloatingPoint() && |
||
| 2949 | "invalid fpext types"); |
||
| 2950 | return isFPExtFree(DestVT, SrcVT); |
||
| 2951 | } |
||
| 2952 | |||
| 2953 | /// Return true if folding a vector load into ExtVal (a sign, zero, or any |
||
| 2954 | /// extend node) is profitable. |
||
| 2955 | virtual bool isVectorLoadExtDesirable(SDValue ExtVal) const { return false; } |
||
| 2956 | |||
| 2957 | /// Return true if an fneg operation is free to the point where it is never |
||
| 2958 | /// worthwhile to replace it with a bitwise operation. |
||
| 2959 | virtual bool isFNegFree(EVT VT) const { |
||
| 2960 | assert(VT.isFloatingPoint()); |
||
| 2961 | return false; |
||
| 2962 | } |
||
| 2963 | |||
| 2964 | /// Return true if an fabs operation is free to the point where it is never |
||
| 2965 | /// worthwhile to replace it with a bitwise operation. |
||
| 2966 | virtual bool isFAbsFree(EVT VT) const { |
||
| 2967 | assert(VT.isFloatingPoint()); |
||
| 2968 | return false; |
||
| 2969 | } |
||
| 2970 | |||
| 2971 | /// Return true if an FMA operation is faster than a pair of fmul and fadd |
||
| 2972 | /// instructions. fmuladd intrinsics will be expanded to FMAs when this method |
||
| 2973 | /// returns true, otherwise fmuladd is expanded to fmul + fadd. |
||
| 2974 | /// |
||
| 2975 | /// NOTE: This may be called before legalization on types for which FMAs are |
||
| 2976 | /// not legal, but should return true if those types will eventually legalize |
||
| 2977 | /// to types that support FMAs. After legalization, it will only be called on |
||
| 2978 | /// types that support FMAs (via Legal or Custom actions) |
||
| 2979 | virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, |
||
| 2980 | EVT) const { |
||
| 2981 | return false; |
||
| 2982 | } |
||
| 2983 | |||
| 2984 | /// Return true if an FMA operation is faster than a pair of fmul and fadd |
||
| 2985 | /// instructions. fmuladd intrinsics will be expanded to FMAs when this method |
||
| 2986 | /// returns true, otherwise fmuladd is expanded to fmul + fadd. |
||
| 2987 | /// |
||
| 2988 | /// NOTE: This may be called before legalization on types for which FMAs are |
||
| 2989 | /// not legal, but should return true if those types will eventually legalize |
||
| 2990 | /// to types that support FMAs. After legalization, it will only be called on |
||
| 2991 | /// types that support FMAs (via Legal or Custom actions) |
||
| 2992 | virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, |
||
| 2993 | LLT) const { |
||
| 2994 | return false; |
||
| 2995 | } |
||
| 2996 | |||
| 2997 | /// IR version |
||
| 2998 | virtual bool isFMAFasterThanFMulAndFAdd(const Function &F, Type *) const { |
||
| 2999 | return false; |
||
| 3000 | } |
||
| 3001 | |||
| 3002 | /// Returns true if \p MI can be combined with another instruction to |
||
| 3003 | /// form TargetOpcode::G_FMAD. \p N may be an TargetOpcode::G_FADD, |
||
| 3004 | /// TargetOpcode::G_FSUB, or an TargetOpcode::G_FMUL which will be |
||
| 3005 | /// distributed into an fadd/fsub. |
||
| 3006 | virtual bool isFMADLegal(const MachineInstr &MI, LLT Ty) const { |
||
| 3007 | assert((MI.getOpcode() == TargetOpcode::G_FADD || |
||
| 3008 | MI.getOpcode() == TargetOpcode::G_FSUB || |
||
| 3009 | MI.getOpcode() == TargetOpcode::G_FMUL) && |
||
| 3010 | "unexpected node in FMAD forming combine"); |
||
| 3011 | switch (Ty.getScalarSizeInBits()) { |
||
| 3012 | case 16: |
||
| 3013 | return isOperationLegal(TargetOpcode::G_FMAD, MVT::f16); |
||
| 3014 | case 32: |
||
| 3015 | return isOperationLegal(TargetOpcode::G_FMAD, MVT::f32); |
||
| 3016 | case 64: |
||
| 3017 | return isOperationLegal(TargetOpcode::G_FMAD, MVT::f64); |
||
| 3018 | default: |
||
| 3019 | break; |
||
| 3020 | } |
||
| 3021 | |||
| 3022 | return false; |
||
| 3023 | } |
||
| 3024 | |||
| 3025 | /// Returns true if be combined with to form an ISD::FMAD. \p N may be an |
||
| 3026 | /// ISD::FADD, ISD::FSUB, or an ISD::FMUL which will be distributed into an |
||
| 3027 | /// fadd/fsub. |
||
| 3028 | virtual bool isFMADLegal(const SelectionDAG &DAG, const SDNode *N) const { |
||
| 3029 | assert((N->getOpcode() == ISD::FADD || N->getOpcode() == ISD::FSUB || |
||
| 3030 | N->getOpcode() == ISD::FMUL) && |
||
| 3031 | "unexpected node in FMAD forming combine"); |
||
| 3032 | return isOperationLegal(ISD::FMAD, N->getValueType(0)); |
||
| 3033 | } |
||
| 3034 | |||
| 3035 | // Return true when the decision to generate FMA's (or FMS, FMLA etc) rather |
||
| 3036 | // than FMUL and ADD is delegated to the machine combiner. |
||
| 3037 | virtual bool generateFMAsInMachineCombiner(EVT VT, |
||
| 3038 | CodeGenOpt::Level OptLevel) const { |
||
| 3039 | return false; |
||
| 3040 | } |
||
| 3041 | |||
| 3042 | /// Return true if it's profitable to narrow operations of type VT1 to |
||
| 3043 | /// VT2. e.g. on x86, it's profitable to narrow from i32 to i8 but not from |
||
| 3044 | /// i32 to i16. |
||
| 3045 | virtual bool isNarrowingProfitable(EVT /*VT1*/, EVT /*VT2*/) const { |
||
| 3046 | return false; |
||
| 3047 | } |
||
| 3048 | |||
| 3049 | /// Return true if pulling a binary operation into a select with an identity |
||
| 3050 | /// constant is profitable. This is the inverse of an IR transform. |
||
| 3051 | /// Example: X + (Cond ? Y : 0) --> Cond ? (X + Y) : X |
||
| 3052 | virtual bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, |
||
| 3053 | EVT VT) const { |
||
| 3054 | return false; |
||
| 3055 | } |
||
| 3056 | |||
| 3057 | /// Return true if it is beneficial to convert a load of a constant to |
||
| 3058 | /// just the constant itself. |
||
| 3059 | /// On some targets it might be more efficient to use a combination of |
||
| 3060 | /// arithmetic instructions to materialize the constant instead of loading it |
||
| 3061 | /// from a constant pool. |
||
| 3062 | virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, |
||
| 3063 | Type *Ty) const { |
||
| 3064 | return false; |
||
| 3065 | } |
||
| 3066 | |||
| 3067 | /// Return true if EXTRACT_SUBVECTOR is cheap for extracting this result type |
||
| 3068 | /// from this source type with this index. This is needed because |
||
| 3069 | /// EXTRACT_SUBVECTOR usually has custom lowering that depends on the index of |
||
| 3070 | /// the first element, and only the target knows which lowering is cheap. |
||
| 3071 | virtual bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT, |
||
| 3072 | unsigned Index) const { |
||
| 3073 | return false; |
||
| 3074 | } |
||
| 3075 | |||
| 3076 | /// Try to convert an extract element of a vector binary operation into an |
||
| 3077 | /// extract element followed by a scalar operation. |
||
| 3078 | virtual bool shouldScalarizeBinop(SDValue VecOp) const { |
||
| 3079 | return false; |
||
| 3080 | } |
||
| 3081 | |||
| 3082 | /// Return true if extraction of a scalar element from the given vector type |
||
| 3083 | /// at the given index is cheap. For example, if scalar operations occur on |
||
| 3084 | /// the same register file as vector operations, then an extract element may |
||
| 3085 | /// be a sub-register rename rather than an actual instruction. |
||
| 3086 | virtual bool isExtractVecEltCheap(EVT VT, unsigned Index) const { |
||
| 3087 | return false; |
||
| 3088 | } |
||
| 3089 | |||
| 3090 | /// Try to convert math with an overflow comparison into the corresponding DAG |
||
| 3091 | /// node operation. Targets may want to override this independently of whether |
||
| 3092 | /// the operation is legal/custom for the given type because it may obscure |
||
| 3093 | /// matching of other patterns. |
||
| 3094 | virtual bool shouldFormOverflowOp(unsigned Opcode, EVT VT, |
||
| 3095 | bool MathUsed) const { |
||
| 3096 | // TODO: The default logic is inherited from code in CodeGenPrepare. |
||
| 3097 | // The opcode should not make a difference by default? |
||
| 3098 | if (Opcode != ISD::UADDO) |
||
| 3099 | return false; |
||
| 3100 | |||
| 3101 | // Allow the transform as long as we have an integer type that is not |
||
| 3102 | // obviously illegal and unsupported and if the math result is used |
||
| 3103 | // besides the overflow check. On some targets (e.g. SPARC), it is |
||
| 3104 | // not profitable to form on overflow op if the math result has no |
||
| 3105 | // concrete users. |
||
| 3106 | if (VT.isVector()) |
||
| 3107 | return false; |
||
| 3108 | return MathUsed && (VT.isSimple() || !isOperationExpand(Opcode, VT)); |
||
| 3109 | } |
||
| 3110 | |||
| 3111 | // Return true if it is profitable to use a scalar input to a BUILD_VECTOR |
||
| 3112 | // even if the vector itself has multiple uses. |
||
| 3113 | virtual bool aggressivelyPreferBuildVectorSources(EVT VecVT) const { |
||
| 3114 | return false; |
||
| 3115 | } |
||
| 3116 | |||
| 3117 | // Return true if CodeGenPrepare should consider splitting large offset of a |
||
| 3118 | // GEP to make the GEP fit into the addressing mode and can be sunk into the |
||
| 3119 | // same blocks of its users. |
||
| 3120 | virtual bool shouldConsiderGEPOffsetSplit() const { return false; } |
||
| 3121 | |||
| 3122 | /// Return true if creating a shift of the type by the given |
||
| 3123 | /// amount is not profitable. |
||
| 3124 | virtual bool shouldAvoidTransformToShift(EVT VT, unsigned Amount) const { |
||
| 3125 | return false; |
||
| 3126 | } |
||
| 3127 | |||
| 3128 | /// Does this target require the clearing of high-order bits in a register |
||
| 3129 | /// passed to the fp16 to fp conversion library function. |
||
| 3130 | virtual bool shouldKeepZExtForFP16Conv() const { return false; } |
||
| 3131 | |||
| 3132 | /// Should we generate fp_to_si_sat and fp_to_ui_sat from type FPVT to type VT |
||
| 3133 | /// from min(max(fptoi)) saturation patterns. |
||
| 3134 | virtual bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const { |
||
| 3135 | return isOperationLegalOrCustom(Op, VT); |
||
| 3136 | } |
||
| 3137 | |||
| 3138 | /// Does this target support complex deinterleaving |
||
| 3139 | virtual bool isComplexDeinterleavingSupported() const { return false; } |
||
| 3140 | |||
| 3141 | /// Does this target support complex deinterleaving with the given operation |
||
| 3142 | /// and type |
||
| 3143 | virtual bool isComplexDeinterleavingOperationSupported( |
||
| 3144 | ComplexDeinterleavingOperation Operation, Type *Ty) const { |
||
| 3145 | return false; |
||
| 3146 | } |
||
| 3147 | |||
| 3148 | /// Create the IR node for the given complex deinterleaving operation. |
||
| 3149 | /// If one cannot be created using all the given inputs, nullptr should be |
||
| 3150 | /// returned. |
||
| 3151 | virtual Value *createComplexDeinterleavingIR( |
||
| 3152 | Instruction *I, ComplexDeinterleavingOperation OperationType, |
||
| 3153 | ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB, |
||
| 3154 | Value *Accumulator = nullptr) const { |
||
| 3155 | return nullptr; |
||
| 3156 | } |
||
| 3157 | |||
| 3158 | //===--------------------------------------------------------------------===// |
||
| 3159 | // Runtime Library hooks |
||
| 3160 | // |
||
| 3161 | |||
| 3162 | /// Rename the default libcall routine name for the specified libcall. |
||
| 3163 | void setLibcallName(RTLIB::Libcall Call, const char *Name) { |
||
| 3164 | LibcallRoutineNames[Call] = Name; |
||
| 3165 | } |
||
| 3166 | void setLibcallName(ArrayRef<RTLIB::Libcall> Calls, const char *Name) { |
||
| 3167 | for (auto Call : Calls) |
||
| 3168 | setLibcallName(Call, Name); |
||
| 3169 | } |
||
| 3170 | |||
| 3171 | /// Get the libcall routine name for the specified libcall. |
||
| 3172 | const char *getLibcallName(RTLIB::Libcall Call) const { |
||
| 3173 | return LibcallRoutineNames[Call]; |
||
| 3174 | } |
||
| 3175 | |||
| 3176 | /// Override the default CondCode to be used to test the result of the |
||
| 3177 | /// comparison libcall against zero. |
||
| 3178 | void setCmpLibcallCC(RTLIB::Libcall Call, ISD::CondCode CC) { |
||
| 3179 | CmpLibcallCCs[Call] = CC; |
||
| 3180 | } |
||
| 3181 | |||
| 3182 | /// Get the CondCode that's to be used to test the result of the comparison |
||
| 3183 | /// libcall against zero. |
||
| 3184 | ISD::CondCode getCmpLibcallCC(RTLIB::Libcall Call) const { |
||
| 3185 | return CmpLibcallCCs[Call]; |
||
| 3186 | } |
||
| 3187 | |||
| 3188 | /// Set the CallingConv that should be used for the specified libcall. |
||
| 3189 | void setLibcallCallingConv(RTLIB::Libcall Call, CallingConv::ID CC) { |
||
| 3190 | LibcallCallingConvs[Call] = CC; |
||
| 3191 | } |
||
| 3192 | |||
| 3193 | /// Get the CallingConv that should be used for the specified libcall. |
||
| 3194 | CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const { |
||
| 3195 | return LibcallCallingConvs[Call]; |
||
| 3196 | } |
||
| 3197 | |||
| 3198 | /// Execute target specific actions to finalize target lowering. |
||
| 3199 | /// This is used to set extra flags in MachineFrameInformation and freezing |
||
| 3200 | /// the set of reserved registers. |
||
| 3201 | /// The default implementation just freezes the set of reserved registers. |
||
| 3202 | virtual void finalizeLowering(MachineFunction &MF) const; |
||
| 3203 | |||
| 3204 | //===----------------------------------------------------------------------===// |
||
| 3205 | // GlobalISel Hooks |
||
| 3206 | //===----------------------------------------------------------------------===// |
||
| 3207 | /// Check whether or not \p MI needs to be moved close to its uses. |
||
| 3208 | virtual bool shouldLocalize(const MachineInstr &MI, const TargetTransformInfo *TTI) const; |
||
| 3209 | |||
| 3210 | |||
| 3211 | private: |
||
| 3212 | const TargetMachine &TM; |
||
| 3213 | |||
| 3214 | /// Tells the code generator that the target has multiple (allocatable) |
||
| 3215 | /// condition registers that can be used to store the results of comparisons |
||
| 3216 | /// for use by selects and conditional branches. With multiple condition |
||
| 3217 | /// registers, the code generator will not aggressively sink comparisons into |
||
| 3218 | /// the blocks of their users. |
||
| 3219 | bool HasMultipleConditionRegisters; |
||
| 3220 | |||
| 3221 | /// Tells the code generator that the target has BitExtract instructions. |
||
| 3222 | /// The code generator will aggressively sink "shift"s into the blocks of |
||
| 3223 | /// their users if the users will generate "and" instructions which can be |
||
| 3224 | /// combined with "shift" to BitExtract instructions. |
||
| 3225 | bool HasExtractBitsInsn; |
||
| 3226 | |||
| 3227 | /// Tells the code generator to bypass slow divide or remainder |
||
| 3228 | /// instructions. For example, BypassSlowDivWidths[32,8] tells the code |
||
| 3229 | /// generator to bypass 32-bit integer div/rem with an 8-bit unsigned integer |
||
| 3230 | /// div/rem when the operands are positive and less than 256. |
||
| 3231 | DenseMap <unsigned int, unsigned int> BypassSlowDivWidths; |
||
| 3232 | |||
| 3233 | /// Tells the code generator that it shouldn't generate extra flow control |
||
| 3234 | /// instructions and should attempt to combine flow control instructions via |
||
| 3235 | /// predication. |
||
| 3236 | bool JumpIsExpensive; |
||
| 3237 | |||
| 3238 | /// Information about the contents of the high-bits in boolean values held in |
||
| 3239 | /// a type wider than i1. See getBooleanContents. |
||
| 3240 | BooleanContent BooleanContents; |
||
| 3241 | |||
| 3242 | /// Information about the contents of the high-bits in boolean values held in |
||
| 3243 | /// a type wider than i1. See getBooleanContents. |
||
| 3244 | BooleanContent BooleanFloatContents; |
||
| 3245 | |||
| 3246 | /// Information about the contents of the high-bits in boolean vector values |
||
| 3247 | /// when the element type is wider than i1. See getBooleanContents. |
||
| 3248 | BooleanContent BooleanVectorContents; |
||
| 3249 | |||
| 3250 | /// The target scheduling preference: shortest possible total cycles or lowest |
||
| 3251 | /// register usage. |
||
| 3252 | Sched::Preference SchedPreferenceInfo; |
||
| 3253 | |||
| 3254 | /// The minimum alignment that any argument on the stack needs to have. |
||
| 3255 | Align MinStackArgumentAlignment; |
||
| 3256 | |||
| 3257 | /// The minimum function alignment (used when optimizing for size, and to |
||
| 3258 | /// prevent explicitly provided alignment from leading to incorrect code). |
||
| 3259 | Align MinFunctionAlignment; |
||
| 3260 | |||
| 3261 | /// The preferred function alignment (used when alignment unspecified and |
||
| 3262 | /// optimizing for speed). |
||
| 3263 | Align PrefFunctionAlignment; |
||
| 3264 | |||
| 3265 | /// The preferred loop alignment (in log2 bot in bytes). |
||
| 3266 | Align PrefLoopAlignment; |
||
| 3267 | /// The maximum amount of bytes permitted to be emitted for alignment. |
||
| 3268 | unsigned MaxBytesForAlignment; |
||
| 3269 | |||
| 3270 | /// Size in bits of the maximum atomics size the backend supports. |
||
| 3271 | /// Accesses larger than this will be expanded by AtomicExpandPass. |
||
| 3272 | unsigned MaxAtomicSizeInBitsSupported; |
||
| 3273 | |||
| 3274 | /// Size in bits of the maximum div/rem size the backend supports. |
||
| 3275 | /// Larger operations will be expanded by ExpandLargeDivRem. |
||
| 3276 | unsigned MaxDivRemBitWidthSupported; |
||
| 3277 | |||
| 3278 | /// Size in bits of the maximum larget fp convert size the backend |
||
| 3279 | /// supports. Larger operations will be expanded by ExpandLargeFPConvert. |
||
| 3280 | unsigned MaxLargeFPConvertBitWidthSupported; |
||
| 3281 | |||
| 3282 | /// Size in bits of the minimum cmpxchg or ll/sc operation the |
||
| 3283 | /// backend supports. |
||
| 3284 | unsigned MinCmpXchgSizeInBits; |
||
| 3285 | |||
| 3286 | /// This indicates if the target supports unaligned atomic operations. |
||
| 3287 | bool SupportsUnalignedAtomics; |
||
| 3288 | |||
| 3289 | /// If set to a physical register, this specifies the register that |
||
| 3290 | /// llvm.savestack/llvm.restorestack should save and restore. |
||
| 3291 | Register StackPointerRegisterToSaveRestore; |
||
| 3292 | |||
| 3293 | /// This indicates the default register class to use for each ValueType the |
||
| 3294 | /// target supports natively. |
||
| 3295 | const TargetRegisterClass *RegClassForVT[MVT::VALUETYPE_SIZE]; |
||
| 3296 | uint16_t NumRegistersForVT[MVT::VALUETYPE_SIZE]; |
||
| 3297 | MVT RegisterTypeForVT[MVT::VALUETYPE_SIZE]; |
||
| 3298 | |||
| 3299 | /// This indicates the "representative" register class to use for each |
||
| 3300 | /// ValueType the target supports natively. This information is used by the |
||
| 3301 | /// scheduler to track register pressure. By default, the representative |
||
| 3302 | /// register class is the largest legal super-reg register class of the |
||
| 3303 | /// register class of the specified type. e.g. On x86, i8, i16, and i32's |
||
| 3304 | /// representative class would be GR32. |
||
| 3305 | const TargetRegisterClass *RepRegClassForVT[MVT::VALUETYPE_SIZE]; |
||
| 3306 | |||
| 3307 | /// This indicates the "cost" of the "representative" register class for each |
||
| 3308 | /// ValueType. The cost is used by the scheduler to approximate register |
||
| 3309 | /// pressure. |
||
| 3310 | uint8_t RepRegClassCostForVT[MVT::VALUETYPE_SIZE]; |
||
| 3311 | |||
| 3312 | /// For any value types we are promoting or expanding, this contains the value |
||
| 3313 | /// type that we are changing to. For Expanded types, this contains one step |
||
| 3314 | /// of the expand (e.g. i64 -> i32), even if there are multiple steps required |
||
| 3315 | /// (e.g. i64 -> i16). For types natively supported by the system, this holds |
||
| 3316 | /// the same type (e.g. i32 -> i32). |
||
| 3317 | MVT TransformToType[MVT::VALUETYPE_SIZE]; |
||
| 3318 | |||
| 3319 | /// For each operation and each value type, keep a LegalizeAction that |
||
| 3320 | /// indicates how instruction selection should deal with the operation. Most |
||
| 3321 | /// operations are Legal (aka, supported natively by the target), but |
||
| 3322 | /// operations that are not should be described. Note that operations on |
||
| 3323 | /// non-legal value types are not described here. |
||
| 3324 | LegalizeAction OpActions[MVT::VALUETYPE_SIZE][ISD::BUILTIN_OP_END]; |
||
| 3325 | |||
| 3326 | /// For each load extension type and each value type, keep a LegalizeAction |
||
| 3327 | /// that indicates how instruction selection should deal with a load of a |
||
| 3328 | /// specific value type and extension type. Uses 4-bits to store the action |
||
| 3329 | /// for each of the 4 load ext types. |
||
| 3330 | uint16_t LoadExtActions[MVT::VALUETYPE_SIZE][MVT::VALUETYPE_SIZE]; |
||
| 3331 | |||
| 3332 | /// For each value type pair keep a LegalizeAction that indicates whether a |
||
| 3333 | /// truncating store of a specific value type and truncating type is legal. |
||
| 3334 | LegalizeAction TruncStoreActions[MVT::VALUETYPE_SIZE][MVT::VALUETYPE_SIZE]; |
||
| 3335 | |||
| 3336 | /// For each indexed mode and each value type, keep a quad of LegalizeAction |
||
| 3337 | /// that indicates how instruction selection should deal with the load / |
||
| 3338 | /// store / maskedload / maskedstore. |
||
| 3339 | /// |
||
| 3340 | /// The first dimension is the value_type for the reference. The second |
||
| 3341 | /// dimension represents the various modes for load store. |
||
| 3342 | uint16_t IndexedModeActions[MVT::VALUETYPE_SIZE][ISD::LAST_INDEXED_MODE]; |
||
| 3343 | |||
| 3344 | /// For each condition code (ISD::CondCode) keep a LegalizeAction that |
||
| 3345 | /// indicates how instruction selection should deal with the condition code. |
||
| 3346 | /// |
||
| 3347 | /// Because each CC action takes up 4 bits, we need to have the array size be |
||
| 3348 | /// large enough to fit all of the value types. This can be done by rounding |
||
| 3349 | /// up the MVT::VALUETYPE_SIZE value to the next multiple of 8. |
||
| 3350 | uint32_t CondCodeActions[ISD::SETCC_INVALID][(MVT::VALUETYPE_SIZE + 7) / 8]; |
||
| 3351 | |||
| 3352 | ValueTypeActionImpl ValueTypeActions; |
||
| 3353 | |||
| 3354 | private: |
||
| 3355 | /// Targets can specify ISD nodes that they would like PerformDAGCombine |
||
| 3356 | /// callbacks for by calling setTargetDAGCombine(), which sets a bit in this |
||
| 3357 | /// array. |
||
| 3358 | unsigned char |
||
| 3359 | TargetDAGCombineArray[(ISD::BUILTIN_OP_END+CHAR_BIT-1)/CHAR_BIT]; |
||
| 3360 | |||
| 3361 | /// For operations that must be promoted to a specific type, this holds the |
||
| 3362 | /// destination type. This map should be sparse, so don't hold it as an |
||
| 3363 | /// array. |
||
| 3364 | /// |
||
| 3365 | /// Targets add entries to this map with AddPromotedToType(..), clients access |
||
| 3366 | /// this with getTypeToPromoteTo(..). |
||
| 3367 | std::map<std::pair<unsigned, MVT::SimpleValueType>, MVT::SimpleValueType> |
||
| 3368 | PromoteToType; |
||
| 3369 | |||
| 3370 | /// Stores the name each libcall. |
||
| 3371 | const char *LibcallRoutineNames[RTLIB::UNKNOWN_LIBCALL + 1]; |
||
| 3372 | |||
| 3373 | /// The ISD::CondCode that should be used to test the result of each of the |
||
| 3374 | /// comparison libcall against zero. |
||
| 3375 | ISD::CondCode CmpLibcallCCs[RTLIB::UNKNOWN_LIBCALL]; |
||
| 3376 | |||
| 3377 | /// Stores the CallingConv that should be used for each libcall. |
||
| 3378 | CallingConv::ID LibcallCallingConvs[RTLIB::UNKNOWN_LIBCALL]; |
||
| 3379 | |||
| 3380 | /// Set default libcall names and calling conventions. |
||
| 3381 | void InitLibcalls(const Triple &TT); |
||
| 3382 | |||
| 3383 | /// The bits of IndexedModeActions used to store the legalisation actions |
||
| 3384 | /// We store the data as | ML | MS | L | S | each taking 4 bits. |
||
| 3385 | enum IndexedModeActionsBits { |
||
| 3386 | IMAB_Store = 0, |
||
| 3387 | IMAB_Load = 4, |
||
| 3388 | IMAB_MaskedStore = 8, |
||
| 3389 | IMAB_MaskedLoad = 12 |
||
| 3390 | }; |
||
| 3391 | |||
| 3392 | void setIndexedModeAction(unsigned IdxMode, MVT VT, unsigned Shift, |
||
| 3393 | LegalizeAction Action) { |
||
| 3394 | assert(VT.isValid() && IdxMode < ISD::LAST_INDEXED_MODE && |
||
| 3395 | (unsigned)Action < 0xf && "Table isn't big enough!"); |
||
| 3396 | unsigned Ty = (unsigned)VT.SimpleTy; |
||
| 3397 | IndexedModeActions[Ty][IdxMode] &= ~(0xf << Shift); |
||
| 3398 | IndexedModeActions[Ty][IdxMode] |= ((uint16_t)Action) << Shift; |
||
| 3399 | } |
||
| 3400 | |||
| 3401 | LegalizeAction getIndexedModeAction(unsigned IdxMode, MVT VT, |
||
| 3402 | unsigned Shift) const { |
||
| 3403 | assert(IdxMode < ISD::LAST_INDEXED_MODE && VT.isValid() && |
||
| 3404 | "Table isn't big enough!"); |
||
| 3405 | unsigned Ty = (unsigned)VT.SimpleTy; |
||
| 3406 | return (LegalizeAction)((IndexedModeActions[Ty][IdxMode] >> Shift) & 0xf); |
||
| 3407 | } |
||
| 3408 | |||
| 3409 | protected: |
||
| 3410 | /// Return true if the extension represented by \p I is free. |
||
| 3411 | /// \pre \p I is a sign, zero, or fp extension and |
||
| 3412 | /// is[Z|FP]ExtFree of the related types is not true. |
||
| 3413 | virtual bool isExtFreeImpl(const Instruction *I) const { return false; } |
||
| 3414 | |||
| 3415 | /// Depth that GatherAllAliases should should continue looking for chain |
||
| 3416 | /// dependencies when trying to find a more preferable chain. As an |
||
| 3417 | /// approximation, this should be more than the number of consecutive stores |
||
| 3418 | /// expected to be merged. |
||
| 3419 | unsigned GatherAllAliasesMaxDepth; |
||
| 3420 | |||
| 3421 | /// \brief Specify maximum number of store instructions per memset call. |
||
| 3422 | /// |
||
| 3423 | /// When lowering \@llvm.memset this field specifies the maximum number of |
||
| 3424 | /// store operations that may be substituted for the call to memset. Targets |
||
| 3425 | /// must set this value based on the cost threshold for that target. Targets |
||
| 3426 | /// should assume that the memset will be done using as many of the largest |
||
| 3427 | /// store operations first, followed by smaller ones, if necessary, per |
||
| 3428 | /// alignment restrictions. For example, storing 9 bytes on a 32-bit machine |
||
| 3429 | /// with 16-bit alignment would result in four 2-byte stores and one 1-byte |
||
| 3430 | /// store. This only applies to setting a constant array of a constant size. |
||
| 3431 | unsigned MaxStoresPerMemset; |
||
| 3432 | /// Likewise for functions with the OptSize attribute. |
||
| 3433 | unsigned MaxStoresPerMemsetOptSize; |
||
| 3434 | |||
| 3435 | /// \brief Specify maximum number of store instructions per memcpy call. |
||
| 3436 | /// |
||
| 3437 | /// When lowering \@llvm.memcpy this field specifies the maximum number of |
||
| 3438 | /// store operations that may be substituted for a call to memcpy. Targets |
||
| 3439 | /// must set this value based on the cost threshold for that target. Targets |
||
| 3440 | /// should assume that the memcpy will be done using as many of the largest |
||
| 3441 | /// store operations first, followed by smaller ones, if necessary, per |
||
| 3442 | /// alignment restrictions. For example, storing 7 bytes on a 32-bit machine |
||
| 3443 | /// with 32-bit alignment would result in one 4-byte store, a one 2-byte store |
||
| 3444 | /// and one 1-byte store. This only applies to copying a constant array of |
||
| 3445 | /// constant size. |
||
| 3446 | unsigned MaxStoresPerMemcpy; |
||
| 3447 | /// Likewise for functions with the OptSize attribute. |
||
| 3448 | unsigned MaxStoresPerMemcpyOptSize; |
||
| 3449 | /// \brief Specify max number of store instructions to glue in inlined memcpy. |
||
| 3450 | /// |
||
| 3451 | /// When memcpy is inlined based on MaxStoresPerMemcpy, specify maximum number |
||
| 3452 | /// of store instructions to keep together. This helps in pairing and |
||
| 3453 | // vectorization later on. |
||
| 3454 | unsigned MaxGluedStoresPerMemcpy = 0; |
||
| 3455 | |||
| 3456 | /// \brief Specify maximum number of load instructions per memcmp call. |
||
| 3457 | /// |
||
| 3458 | /// When lowering \@llvm.memcmp this field specifies the maximum number of |
||
| 3459 | /// pairs of load operations that may be substituted for a call to memcmp. |
||
| 3460 | /// Targets must set this value based on the cost threshold for that target. |
||
| 3461 | /// Targets should assume that the memcmp will be done using as many of the |
||
| 3462 | /// largest load operations first, followed by smaller ones, if necessary, per |
||
| 3463 | /// alignment restrictions. For example, loading 7 bytes on a 32-bit machine |
||
| 3464 | /// with 32-bit alignment would result in one 4-byte load, a one 2-byte load |
||
| 3465 | /// and one 1-byte load. This only applies to copying a constant array of |
||
| 3466 | /// constant size. |
||
| 3467 | unsigned MaxLoadsPerMemcmp; |
||
| 3468 | /// Likewise for functions with the OptSize attribute. |
||
| 3469 | unsigned MaxLoadsPerMemcmpOptSize; |
||
| 3470 | |||
| 3471 | /// \brief Specify maximum number of store instructions per memmove call. |
||
| 3472 | /// |
||
| 3473 | /// When lowering \@llvm.memmove this field specifies the maximum number of |
||
| 3474 | /// store instructions that may be substituted for a call to memmove. Targets |
||
| 3475 | /// must set this value based on the cost threshold for that target. Targets |
||
| 3476 | /// should assume that the memmove will be done using as many of the largest |
||
| 3477 | /// store operations first, followed by smaller ones, if necessary, per |
||
| 3478 | /// alignment restrictions. For example, moving 9 bytes on a 32-bit machine |
||
| 3479 | /// with 8-bit alignment would result in nine 1-byte stores. This only |
||
| 3480 | /// applies to copying a constant array of constant size. |
||
| 3481 | unsigned MaxStoresPerMemmove; |
||
| 3482 | /// Likewise for functions with the OptSize attribute. |
||
| 3483 | unsigned MaxStoresPerMemmoveOptSize; |
||
| 3484 | |||
| 3485 | /// Tells the code generator that select is more expensive than a branch if |
||
| 3486 | /// the branch is usually predicted right. |
||
| 3487 | bool PredictableSelectIsExpensive; |
||
| 3488 | |||
| 3489 | /// \see enableExtLdPromotion. |
||
| 3490 | bool EnableExtLdPromotion; |
||
| 3491 | |||
| 3492 | /// Return true if the value types that can be represented by the specified |
||
| 3493 | /// register class are all legal. |
||
| 3494 | bool isLegalRC(const TargetRegisterInfo &TRI, |
||
| 3495 | const TargetRegisterClass &RC) const; |
||
| 3496 | |||
| 3497 | /// Replace/modify any TargetFrameIndex operands with a targte-dependent |
||
| 3498 | /// sequence of memory operands that is recognized by PrologEpilogInserter. |
||
| 3499 | MachineBasicBlock *emitPatchPoint(MachineInstr &MI, |
||
| 3500 | MachineBasicBlock *MBB) const; |
||
| 3501 | |||
| 3502 | bool IsStrictFPEnabled; |
||
| 3503 | }; |
||
| 3504 | |||
| 3505 | /// This class defines information used to lower LLVM code to legal SelectionDAG |
||
| 3506 | /// operators that the target instruction selector can accept natively. |
||
| 3507 | /// |
||
| 3508 | /// This class also defines callbacks that targets must implement to lower |
||
| 3509 | /// target-specific constructs to SelectionDAG operators. |
||
| 3510 | class TargetLowering : public TargetLoweringBase { |
||
| 3511 | public: |
||
| 3512 | struct DAGCombinerInfo; |
||
| 3513 | struct MakeLibCallOptions; |
||
| 3514 | |||
| 3515 | TargetLowering(const TargetLowering &) = delete; |
||
| 3516 | TargetLowering &operator=(const TargetLowering &) = delete; |
||
| 3517 | |||
| 3518 | explicit TargetLowering(const TargetMachine &TM); |
||
| 3519 | |||
| 3520 | bool isPositionIndependent() const; |
||
| 3521 | |||
| 3522 | virtual bool isSDNodeSourceOfDivergence(const SDNode *N, |
||
| 3523 | FunctionLoweringInfo *FLI, |
||
| 3524 | LegacyDivergenceAnalysis *DA) const { |
||
| 3525 | return false; |
||
| 3526 | } |
||
| 3527 | |||
| 3528 | // Lets target to control the following reassociation of operands: (op (op x, |
||
| 3529 | // c1), y) -> (op (op x, y), c1) where N0 is (op x, c1) and N1 is y. By |
||
| 3530 | // default consider profitable any case where N0 has single use. This |
||
| 3531 | // behavior reflects the condition replaced by this target hook call in the |
||
| 3532 | // DAGCombiner. Any particular target can implement its own heuristic to |
||
| 3533 | // restrict common combiner. |
||
| 3534 | virtual bool isReassocProfitable(SelectionDAG &DAG, SDValue N0, |
||
| 3535 | SDValue N1) const { |
||
| 3536 | return N0.hasOneUse(); |
||
| 3537 | } |
||
| 3538 | |||
| 3539 | virtual bool isSDNodeAlwaysUniform(const SDNode * N) const { |
||
| 3540 | return false; |
||
| 3541 | } |
||
| 3542 | |||
| 3543 | /// Returns true by value, base pointer and offset pointer and addressing mode |
||
| 3544 | /// by reference if the node's address can be legally represented as |
||
| 3545 | /// pre-indexed load / store address. |
||
| 3546 | virtual bool getPreIndexedAddressParts(SDNode * /*N*/, SDValue &/*Base*/, |
||
| 3547 | SDValue &/*Offset*/, |
||
| 3548 | ISD::MemIndexedMode &/*AM*/, |
||
| 3549 | SelectionDAG &/*DAG*/) const { |
||
| 3550 | return false; |
||
| 3551 | } |
||
| 3552 | |||
| 3553 | /// Returns true by value, base pointer and offset pointer and addressing mode |
||
| 3554 | /// by reference if this node can be combined with a load / store to form a |
||
| 3555 | /// post-indexed load / store. |
||
| 3556 | virtual bool getPostIndexedAddressParts(SDNode * /*N*/, SDNode * /*Op*/, |
||
| 3557 | SDValue &/*Base*/, |
||
| 3558 | SDValue &/*Offset*/, |
||
| 3559 | ISD::MemIndexedMode &/*AM*/, |
||
| 3560 | SelectionDAG &/*DAG*/) const { |
||
| 3561 | return false; |
||
| 3562 | } |
||
| 3563 | |||
| 3564 | /// Returns true if the specified base+offset is a legal indexed addressing |
||
| 3565 | /// mode for this target. \p MI is the load or store instruction that is being |
||
| 3566 | /// considered for transformation. |
||
| 3567 | virtual bool isIndexingLegal(MachineInstr &MI, Register Base, Register Offset, |
||
| 3568 | bool IsPre, MachineRegisterInfo &MRI) const { |
||
| 3569 | return false; |
||
| 3570 | } |
||
| 3571 | |||
| 3572 | /// Return the entry encoding for a jump table in the current function. The |
||
| 3573 | /// returned value is a member of the MachineJumpTableInfo::JTEntryKind enum. |
||
| 3574 | virtual unsigned getJumpTableEncoding() const; |
||
| 3575 | |||
| 3576 | virtual const MCExpr * |
||
| 3577 | LowerCustomJumpTableEntry(const MachineJumpTableInfo * /*MJTI*/, |
||
| 3578 | const MachineBasicBlock * /*MBB*/, unsigned /*uid*/, |
||
| 3579 | MCContext &/*Ctx*/) const { |
||
| 3580 | llvm_unreachable("Need to implement this hook if target has custom JTIs"); |
||
| 3581 | } |
||
| 3582 | |||
| 3583 | /// Returns relocation base for the given PIC jumptable. |
||
| 3584 | virtual SDValue getPICJumpTableRelocBase(SDValue Table, |
||
| 3585 | SelectionDAG &DAG) const; |
||
| 3586 | |||
| 3587 | /// This returns the relocation base for the given PIC jumptable, the same as |
||
| 3588 | /// getPICJumpTableRelocBase, but as an MCExpr. |
||
| 3589 | virtual const MCExpr * |
||
| 3590 | getPICJumpTableRelocBaseExpr(const MachineFunction *MF, |
||
| 3591 | unsigned JTI, MCContext &Ctx) const; |
||
| 3592 | |||
| 3593 | /// Return true if folding a constant offset with the given GlobalAddress is |
||
| 3594 | /// legal. It is frequently not legal in PIC relocation models. |
||
| 3595 | virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const; |
||
| 3596 | |||
| 3597 | /// Return true if the operand with index OpNo corresponding to a target |
||
| 3598 | /// branch, for example, in following case |
||
| 3599 | /// |
||
| 3600 | /// call void asm "lea r8, $0\0A\09call qword ptr ${1:P}\0A\09ret", |
||
| 3601 | /// "*m,*m,~{r8},~{dirflag},~{fpsr},~{flags}" |
||
| 3602 | /// ([9 x i32]* @Arr), void (...)* @sincos_asm) |
||
| 3603 | /// |
||
| 3604 | /// the operand $1 (sincos_asm) is target branch in inline asm, but the |
||
| 3605 | /// operand $0 (Arr) is not. |
||
| 3606 | virtual bool |
||
| 3607 | isInlineAsmTargetBranch(const SmallVectorImpl<StringRef> &AsmStrs, |
||
| 3608 | unsigned OpNo) const { |
||
| 3609 | return false; |
||
| 3610 | } |
||
| 3611 | |||
| 3612 | bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, |
||
| 3613 | SDValue &Chain) const; |
||
| 3614 | |||
| 3615 | void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS, |
||
| 3616 | SDValue &NewRHS, ISD::CondCode &CCCode, |
||
| 3617 | const SDLoc &DL, const SDValue OldLHS, |
||
| 3618 | const SDValue OldRHS) const; |
||
| 3619 | |||
| 3620 | void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS, |
||
| 3621 | SDValue &NewRHS, ISD::CondCode &CCCode, |
||
| 3622 | const SDLoc &DL, const SDValue OldLHS, |
||
| 3623 | const SDValue OldRHS, SDValue &Chain, |
||
| 3624 | bool IsSignaling = false) const; |
||
| 3625 | |||
| 3626 | /// Returns a pair of (return value, chain). |
||
| 3627 | /// It is an error to pass RTLIB::UNKNOWN_LIBCALL as \p LC. |
||
| 3628 | std::pair<SDValue, SDValue> makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, |
||
| 3629 | EVT RetVT, ArrayRef<SDValue> Ops, |
||
| 3630 | MakeLibCallOptions CallOptions, |
||
| 3631 | const SDLoc &dl, |
||
| 3632 | SDValue Chain = SDValue()) const; |
||
| 3633 | |||
| 3634 | /// Check whether parameters to a call that are passed in callee saved |
||
| 3635 | /// registers are the same as from the calling function. This needs to be |
||
| 3636 | /// checked for tail call eligibility. |
||
| 3637 | bool parametersInCSRMatch(const MachineRegisterInfo &MRI, |
||
| 3638 | const uint32_t *CallerPreservedMask, |
||
| 3639 | const SmallVectorImpl<CCValAssign> &ArgLocs, |
||
| 3640 | const SmallVectorImpl<SDValue> &OutVals) const; |
||
| 3641 | |||
| 3642 | //===--------------------------------------------------------------------===// |
||
| 3643 | // TargetLowering Optimization Methods |
||
| 3644 | // |
||
| 3645 | |||
| 3646 | /// A convenience struct that encapsulates a DAG, and two SDValues for |
||
| 3647 | /// returning information from TargetLowering to its clients that want to |
||
| 3648 | /// combine. |
||
| 3649 | struct TargetLoweringOpt { |
||
| 3650 | SelectionDAG &DAG; |
||
| 3651 | bool LegalTys; |
||
| 3652 | bool LegalOps; |
||
| 3653 | SDValue Old; |
||
| 3654 | SDValue New; |
||
| 3655 | |||
| 3656 | explicit TargetLoweringOpt(SelectionDAG &InDAG, |
||
| 3657 | bool LT, bool LO) : |
||
| 3658 | DAG(InDAG), LegalTys(LT), LegalOps(LO) {} |
||
| 3659 | |||
| 3660 | bool LegalTypes() const { return LegalTys; } |
||
| 3661 | bool LegalOperations() const { return LegalOps; } |
||
| 3662 | |||
| 3663 | bool CombineTo(SDValue O, SDValue N) { |
||
| 3664 | Old = O; |
||
| 3665 | New = N; |
||
| 3666 | return true; |
||
| 3667 | } |
||
| 3668 | }; |
||
| 3669 | |||
| 3670 | /// Determines the optimal series of memory ops to replace the memset / memcpy. |
||
| 3671 | /// Return true if the number of memory ops is below the threshold (Limit). |
||
| 3672 | /// Note that this is always the case when Limit is ~0. |
||
| 3673 | /// It returns the types of the sequence of memory ops to perform |
||
| 3674 | /// memset / memcpy by reference. |
||
| 3675 | virtual bool |
||
| 3676 | findOptimalMemOpLowering(std::vector<EVT> &MemOps, unsigned Limit, |
||
| 3677 | const MemOp &Op, unsigned DstAS, unsigned SrcAS, |
||
| 3678 | const AttributeList &FuncAttributes) const; |
||
| 3679 | |||
| 3680 | /// Check to see if the specified operand of the specified instruction is a |
||
| 3681 | /// constant integer. If so, check to see if there are any bits set in the |
||
| 3682 | /// constant that are not demanded. If so, shrink the constant and return |
||
| 3683 | /// true. |
||
| 3684 | bool ShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, |
||
| 3685 | const APInt &DemandedElts, |
||
| 3686 | TargetLoweringOpt &TLO) const; |
||
| 3687 | |||
| 3688 | /// Helper wrapper around ShrinkDemandedConstant, demanding all elements. |
||
| 3689 | bool ShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, |
||
| 3690 | TargetLoweringOpt &TLO) const; |
||
| 3691 | |||
| 3692 | // Target hook to do target-specific const optimization, which is called by |
||
| 3693 | // ShrinkDemandedConstant. This function should return true if the target |
||
| 3694 | // doesn't want ShrinkDemandedConstant to further optimize the constant. |
||
| 3695 | virtual bool targetShrinkDemandedConstant(SDValue Op, |
||
| 3696 | const APInt &DemandedBits, |
||
| 3697 | const APInt &DemandedElts, |
||
| 3698 | TargetLoweringOpt &TLO) const { |
||
| 3699 | return false; |
||
| 3700 | } |
||
| 3701 | |||
| 3702 | /// Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free. This |
||
| 3703 | /// uses isZExtFree and ZERO_EXTEND for the widening cast, but it could be |
||
| 3704 | /// generalized for targets with other types of implicit widening casts. |
||
| 3705 | bool ShrinkDemandedOp(SDValue Op, unsigned BitWidth, const APInt &Demanded, |
||
| 3706 | TargetLoweringOpt &TLO) const; |
||
| 3707 | |||
| 3708 | /// Look at Op. At this point, we know that only the DemandedBits bits of the |
||
| 3709 | /// result of Op are ever used downstream. If we can use this information to |
||
| 3710 | /// simplify Op, create a new simplified DAG node and return true, returning |
||
| 3711 | /// the original and new nodes in Old and New. Otherwise, analyze the |
||
| 3712 | /// expression and return a mask of KnownOne and KnownZero bits for the |
||
| 3713 | /// expression (used to simplify the caller). The KnownZero/One bits may only |
||
| 3714 | /// be accurate for those bits in the Demanded masks. |
||
| 3715 | /// \p AssumeSingleUse When this parameter is true, this function will |
||
| 3716 | /// attempt to simplify \p Op even if there are multiple uses. |
||
| 3717 | /// Callers are responsible for correctly updating the DAG based on the |
||
| 3718 | /// results of this function, because simply replacing replacing TLO.Old |
||
| 3719 | /// with TLO.New will be incorrect when this parameter is true and TLO.Old |
||
| 3720 | /// has multiple uses. |
||
| 3721 | bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, |
||
| 3722 | const APInt &DemandedElts, KnownBits &Known, |
||
| 3723 | TargetLoweringOpt &TLO, unsigned Depth = 0, |
||
| 3724 | bool AssumeSingleUse = false) const; |
||
| 3725 | |||
| 3726 | /// Helper wrapper around SimplifyDemandedBits, demanding all elements. |
||
| 3727 | /// Adds Op back to the worklist upon success. |
||
| 3728 | bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, |
||
| 3729 | KnownBits &Known, TargetLoweringOpt &TLO, |
||
| 3730 | unsigned Depth = 0, |
||
| 3731 | bool AssumeSingleUse = false) const; |
||
| 3732 | |||
| 3733 | /// Helper wrapper around SimplifyDemandedBits. |
||
| 3734 | /// Adds Op back to the worklist upon success. |
||
| 3735 | bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, |
||
| 3736 | DAGCombinerInfo &DCI) const; |
||
| 3737 | |||
| 3738 | /// Helper wrapper around SimplifyDemandedBits. |
||
| 3739 | /// Adds Op back to the worklist upon success. |
||
| 3740 | bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, |
||
| 3741 | const APInt &DemandedElts, |
||
| 3742 | DAGCombinerInfo &DCI) const; |
||
| 3743 | |||
| 3744 | /// More limited version of SimplifyDemandedBits that can be used to "look |
||
| 3745 | /// through" ops that don't contribute to the DemandedBits/DemandedElts - |
||
| 3746 | /// bitwise ops etc. |
||
| 3747 | SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits, |
||
| 3748 | const APInt &DemandedElts, |
||
| 3749 | SelectionDAG &DAG, |
||
| 3750 | unsigned Depth = 0) const; |
||
| 3751 | |||
| 3752 | /// Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all |
||
| 3753 | /// elements. |
||
| 3754 | SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits, |
||
| 3755 | SelectionDAG &DAG, |
||
| 3756 | unsigned Depth = 0) const; |
||
| 3757 | |||
| 3758 | /// Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all |
||
| 3759 | /// bits from only some vector elements. |
||
| 3760 | SDValue SimplifyMultipleUseDemandedVectorElts(SDValue Op, |
||
| 3761 | const APInt &DemandedElts, |
||
| 3762 | SelectionDAG &DAG, |
||
| 3763 | unsigned Depth = 0) const; |
||
| 3764 | |||
| 3765 | /// Look at Vector Op. At this point, we know that only the DemandedElts |
||
| 3766 | /// elements of the result of Op are ever used downstream. If we can use |
||
| 3767 | /// this information to simplify Op, create a new simplified DAG node and |
||
| 3768 | /// return true, storing the original and new nodes in TLO. |
||
| 3769 | /// Otherwise, analyze the expression and return a mask of KnownUndef and |
||
| 3770 | /// KnownZero elements for the expression (used to simplify the caller). |
||
| 3771 | /// The KnownUndef/Zero elements may only be accurate for those bits |
||
| 3772 | /// in the DemandedMask. |
||
| 3773 | /// \p AssumeSingleUse When this parameter is true, this function will |
||
| 3774 | /// attempt to simplify \p Op even if there are multiple uses. |
||
| 3775 | /// Callers are responsible for correctly updating the DAG based on the |
||
| 3776 | /// results of this function, because simply replacing replacing TLO.Old |
||
| 3777 | /// with TLO.New will be incorrect when this parameter is true and TLO.Old |
||
| 3778 | /// has multiple uses. |
||
| 3779 | bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedEltMask, |
||
| 3780 | APInt &KnownUndef, APInt &KnownZero, |
||
| 3781 | TargetLoweringOpt &TLO, unsigned Depth = 0, |
||
| 3782 | bool AssumeSingleUse = false) const; |
||
| 3783 | |||
| 3784 | /// Helper wrapper around SimplifyDemandedVectorElts. |
||
| 3785 | /// Adds Op back to the worklist upon success. |
||
| 3786 | bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedElts, |
||
| 3787 | DAGCombinerInfo &DCI) const; |
||
| 3788 | |||
| 3789 | /// Return true if the target supports simplifying demanded vector elements by |
||
| 3790 | /// converting them to undefs. |
||
| 3791 | virtual bool |
||
| 3792 | shouldSimplifyDemandedVectorElts(SDValue Op, |
||
| 3793 | const TargetLoweringOpt &TLO) const { |
||
| 3794 | return true; |
||
| 3795 | } |
||
| 3796 | |||
| 3797 | /// Determine which of the bits specified in Mask are known to be either zero |
||
| 3798 | /// or one and return them in the KnownZero/KnownOne bitsets. The DemandedElts |
||
| 3799 | /// argument allows us to only collect the known bits that are shared by the |
||
| 3800 | /// requested vector elements. |
||
| 3801 | virtual void computeKnownBitsForTargetNode(const SDValue Op, |
||
| 3802 | KnownBits &Known, |
||
| 3803 | const APInt &DemandedElts, |
||
| 3804 | const SelectionDAG &DAG, |
||
| 3805 | unsigned Depth = 0) const; |
||
| 3806 | |||
| 3807 | /// Determine which of the bits specified in Mask are known to be either zero |
||
| 3808 | /// or one and return them in the KnownZero/KnownOne bitsets. The DemandedElts |
||
| 3809 | /// argument allows us to only collect the known bits that are shared by the |
||
| 3810 | /// requested vector elements. This is for GISel. |
||
| 3811 | virtual void computeKnownBitsForTargetInstr(GISelKnownBits &Analysis, |
||
| 3812 | Register R, KnownBits &Known, |
||
| 3813 | const APInt &DemandedElts, |
||
| 3814 | const MachineRegisterInfo &MRI, |
||
| 3815 | unsigned Depth = 0) const; |
||
| 3816 | |||
| 3817 | /// Determine the known alignment for the pointer value \p R. This is can |
||
| 3818 | /// typically be inferred from the number of low known 0 bits. However, for a |
||
| 3819 | /// pointer with a non-integral address space, the alignment value may be |
||
| 3820 | /// independent from the known low bits. |
||
| 3821 | virtual Align computeKnownAlignForTargetInstr(GISelKnownBits &Analysis, |
||
| 3822 | Register R, |
||
| 3823 | const MachineRegisterInfo &MRI, |
||
| 3824 | unsigned Depth = 0) const; |
||
| 3825 | |||
| 3826 | /// Determine which of the bits of FrameIndex \p FIOp are known to be 0. |
||
| 3827 | /// Default implementation computes low bits based on alignment |
||
| 3828 | /// information. This should preserve known bits passed into it. |
||
| 3829 | virtual void computeKnownBitsForFrameIndex(int FIOp, |
||
| 3830 | KnownBits &Known, |
||
| 3831 | const MachineFunction &MF) const; |
||
| 3832 | |||
| 3833 | /// This method can be implemented by targets that want to expose additional |
||
| 3834 | /// information about sign bits to the DAG Combiner. The DemandedElts |
||
| 3835 | /// argument allows us to only collect the minimum sign bits that are shared |
||
| 3836 | /// by the requested vector elements. |
||
| 3837 | virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, |
||
| 3838 | const APInt &DemandedElts, |
||
| 3839 | const SelectionDAG &DAG, |
||
| 3840 | unsigned Depth = 0) const; |
||
| 3841 | |||
| 3842 | /// This method can be implemented by targets that want to expose additional |
||
| 3843 | /// information about sign bits to GlobalISel combiners. The DemandedElts |
||
| 3844 | /// argument allows us to only collect the minimum sign bits that are shared |
||
| 3845 | /// by the requested vector elements. |
||
| 3846 | virtual unsigned computeNumSignBitsForTargetInstr(GISelKnownBits &Analysis, |
||
| 3847 | Register R, |
||
| 3848 | const APInt &DemandedElts, |
||
| 3849 | const MachineRegisterInfo &MRI, |
||
| 3850 | unsigned Depth = 0) const; |
||
| 3851 | |||
| 3852 | /// Attempt to simplify any target nodes based on the demanded vector |
||
| 3853 | /// elements, returning true on success. Otherwise, analyze the expression and |
||
| 3854 | /// return a mask of KnownUndef and KnownZero elements for the expression |
||
| 3855 | /// (used to simplify the caller). The KnownUndef/Zero elements may only be |
||
| 3856 | /// accurate for those bits in the DemandedMask. |
||
| 3857 | virtual bool SimplifyDemandedVectorEltsForTargetNode( |
||
| 3858 | SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, |
||
| 3859 | APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth = 0) const; |
||
| 3860 | |||
| 3861 | /// Attempt to simplify any target nodes based on the demanded bits/elts, |
||
| 3862 | /// returning true on success. Otherwise, analyze the |
||
| 3863 | /// expression and return a mask of KnownOne and KnownZero bits for the |
||
| 3864 | /// expression (used to simplify the caller). The KnownZero/One bits may only |
||
| 3865 | /// be accurate for those bits in the Demanded masks. |
||
| 3866 | virtual bool SimplifyDemandedBitsForTargetNode(SDValue Op, |
||
| 3867 | const APInt &DemandedBits, |
||
| 3868 | const APInt &DemandedElts, |
||
| 3869 | KnownBits &Known, |
||
| 3870 | TargetLoweringOpt &TLO, |
||
| 3871 | unsigned Depth = 0) const; |
||
| 3872 | |||
| 3873 | /// More limited version of SimplifyDemandedBits that can be used to "look |
||
| 3874 | /// through" ops that don't contribute to the DemandedBits/DemandedElts - |
||
| 3875 | /// bitwise ops etc. |
||
| 3876 | virtual SDValue SimplifyMultipleUseDemandedBitsForTargetNode( |
||
| 3877 | SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, |
||
| 3878 | SelectionDAG &DAG, unsigned Depth) const; |
||
| 3879 | |||
| 3880 | /// Return true if this function can prove that \p Op is never poison |
||
| 3881 | /// and, if \p PoisonOnly is false, does not have undef bits. The DemandedElts |
||
| 3882 | /// argument limits the check to the requested vector elements. |
||
| 3883 | virtual bool isGuaranteedNotToBeUndefOrPoisonForTargetNode( |
||
| 3884 | SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, |
||
| 3885 | bool PoisonOnly, unsigned Depth) const; |
||
| 3886 | |||
| 3887 | /// Return true if Op can create undef or poison from non-undef & non-poison |
||
| 3888 | /// operands. The DemandedElts argument limits the check to the requested |
||
| 3889 | /// vector elements. |
||
| 3890 | virtual bool |
||
| 3891 | canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, |
||
| 3892 | const SelectionDAG &DAG, bool PoisonOnly, |
||
| 3893 | bool ConsiderFlags, unsigned Depth) const; |
||
| 3894 | |||
| 3895 | /// Tries to build a legal vector shuffle using the provided parameters |
||
| 3896 | /// or equivalent variations. The Mask argument maybe be modified as the |
||
| 3897 | /// function tries different variations. |
||
| 3898 | /// Returns an empty SDValue if the operation fails. |
||
| 3899 | SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0, |
||
| 3900 | SDValue N1, MutableArrayRef<int> Mask, |
||
| 3901 | SelectionDAG &DAG) const; |
||
| 3902 | |||
| 3903 | /// This method returns the constant pool value that will be loaded by LD. |
||
| 3904 | /// NOTE: You must check for implicit extensions of the constant by LD. |
||
| 3905 | virtual const Constant *getTargetConstantFromLoad(LoadSDNode *LD) const; |
||
| 3906 | |||
| 3907 | /// If \p SNaN is false, \returns true if \p Op is known to never be any |
||
| 3908 | /// NaN. If \p sNaN is true, returns if \p Op is known to never be a signaling |
||
| 3909 | /// NaN. |
||
| 3910 | virtual bool isKnownNeverNaNForTargetNode(SDValue Op, |
||
| 3911 | const SelectionDAG &DAG, |
||
| 3912 | bool SNaN = false, |
||
| 3913 | unsigned Depth = 0) const; |
||
| 3914 | |||
| 3915 | /// Return true if vector \p Op has the same value across all \p DemandedElts, |
||
| 3916 | /// indicating any elements which may be undef in the output \p UndefElts. |
||
| 3917 | virtual bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, |
||
| 3918 | APInt &UndefElts, |
||
| 3919 | const SelectionDAG &DAG, |
||
| 3920 | unsigned Depth = 0) const; |
||
| 3921 | |||
| 3922 | /// Returns true if the given Opc is considered a canonical constant for the |
||
| 3923 | /// target, which should not be transformed back into a BUILD_VECTOR. |
||
| 3924 | virtual bool isTargetCanonicalConstantNode(SDValue Op) const { |
||
| 3925 | return Op.getOpcode() == ISD::SPLAT_VECTOR; |
||
| 3926 | } |
||
| 3927 | |||
| 3928 | struct DAGCombinerInfo { |
||
| 3929 | void *DC; // The DAG Combiner object. |
||
| 3930 | CombineLevel Level; |
||
| 3931 | bool CalledByLegalizer; |
||
| 3932 | |||
| 3933 | public: |
||
| 3934 | SelectionDAG &DAG; |
||
| 3935 | |||
| 3936 | DAGCombinerInfo(SelectionDAG &dag, CombineLevel level, bool cl, void *dc) |
||
| 3937 | : DC(dc), Level(level), CalledByLegalizer(cl), DAG(dag) {} |
||
| 3938 | |||
| 3939 | bool isBeforeLegalize() const { return Level == BeforeLegalizeTypes; } |
||
| 3940 | bool isBeforeLegalizeOps() const { return Level < AfterLegalizeVectorOps; } |
||
| 3941 | bool isAfterLegalizeDAG() const { return Level >= AfterLegalizeDAG; } |
||
| 3942 | CombineLevel getDAGCombineLevel() { return Level; } |
||
| 3943 | bool isCalledByLegalizer() const { return CalledByLegalizer; } |
||
| 3944 | |||
| 3945 | void AddToWorklist(SDNode *N); |
||
| 3946 | SDValue CombineTo(SDNode *N, ArrayRef<SDValue> To, bool AddTo = true); |
||
| 3947 | SDValue CombineTo(SDNode *N, SDValue Res, bool AddTo = true); |
||
| 3948 | SDValue CombineTo(SDNode *N, SDValue Res0, SDValue Res1, bool AddTo = true); |
||
| 3949 | |||
| 3950 | bool recursivelyDeleteUnusedNodes(SDNode *N); |
||
| 3951 | |||
| 3952 | void CommitTargetLoweringOpt(const TargetLoweringOpt &TLO); |
||
| 3953 | }; |
||
| 3954 | |||
| 3955 | /// Return if the N is a constant or constant vector equal to the true value |
||
| 3956 | /// from getBooleanContents(). |
||
| 3957 | bool isConstTrueVal(SDValue N) const; |
||
| 3958 | |||
| 3959 | /// Return if the N is a constant or constant vector equal to the false value |
||
| 3960 | /// from getBooleanContents(). |
||
| 3961 | bool isConstFalseVal(SDValue N) const; |
||
| 3962 | |||
| 3963 | /// Return if \p N is a True value when extended to \p VT. |
||
| 3964 | bool isExtendedTrueVal(const ConstantSDNode *N, EVT VT, bool SExt) const; |
||
| 3965 | |||
| 3966 | /// Try to simplify a setcc built with the specified operands and cc. If it is |
||
| 3967 | /// unable to simplify it, return a null SDValue. |
||
| 3968 | SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, |
||
| 3969 | bool foldBooleans, DAGCombinerInfo &DCI, |
||
| 3970 | const SDLoc &dl) const; |
||
| 3971 | |||
| 3972 | // For targets which wrap address, unwrap for analysis. |
||
| 3973 | virtual SDValue unwrapAddress(SDValue N) const { return N; } |
||
| 3974 | |||
| 3975 | /// Returns true (and the GlobalValue and the offset) if the node is a |
||
| 3976 | /// GlobalAddress + offset. |
||
| 3977 | virtual bool |
||
| 3978 | isGAPlusOffset(SDNode *N, const GlobalValue* &GA, int64_t &Offset) const; |
||
| 3979 | |||
| 3980 | /// This method will be invoked for all target nodes and for any |
||
| 3981 | /// target-independent nodes that the target has registered with invoke it |
||
| 3982 | /// for. |
||
| 3983 | /// |
||
| 3984 | /// The semantics are as follows: |
||
| 3985 | /// Return Value: |
||
| 3986 | /// SDValue.Val == 0 - No change was made |
||
| 3987 | /// SDValue.Val == N - N was replaced, is dead, and is already handled. |
||
| 3988 | /// otherwise - N should be replaced by the returned Operand. |
||
| 3989 | /// |
||
| 3990 | /// In addition, methods provided by DAGCombinerInfo may be used to perform |
||
| 3991 | /// more complex transformations. |
||
| 3992 | /// |
||
| 3993 | virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; |
||
| 3994 | |||
| 3995 | /// Return true if it is profitable to move this shift by a constant amount |
||
| 3996 | /// through its operand, adjusting any immediate operands as necessary to |
||
| 3997 | /// preserve semantics. This transformation may not be desirable if it |
||
| 3998 | /// disrupts a particularly auspicious target-specific tree (e.g. bitfield |
||
| 3999 | /// extraction in AArch64). By default, it returns true. |
||
| 4000 | /// |
||
| 4001 | /// @param N the shift node |
||
| 4002 | /// @param Level the current DAGCombine legalization level. |
||
| 4003 | virtual bool isDesirableToCommuteWithShift(const SDNode *N, |
||
| 4004 | CombineLevel Level) const { |
||
| 4005 | return true; |
||
| 4006 | } |
||
| 4007 | |||
| 4008 | /// Return true if it is profitable to combine an XOR of a logical shift |
||
| 4009 | /// to create a logical shift of NOT. This transformation may not be desirable |
||
| 4010 | /// if it disrupts a particularly auspicious target-specific tree (e.g. |
||
| 4011 | /// BIC on ARM/AArch64). By default, it returns true. |
||
| 4012 | virtual bool isDesirableToCommuteXorWithShift(const SDNode *N) const { |
||
| 4013 | return true; |
||
| 4014 | } |
||
| 4015 | |||
| 4016 | /// Return true if the target has native support for the specified value type |
||
| 4017 | /// and it is 'desirable' to use the type for the given node type. e.g. On x86 |
||
| 4018 | /// i16 is legal, but undesirable since i16 instruction encodings are longer |
||
| 4019 | /// and some i16 instructions are slow. |
||
| 4020 | virtual bool isTypeDesirableForOp(unsigned /*Opc*/, EVT VT) const { |
||
| 4021 | // By default, assume all legal types are desirable. |
||
| 4022 | return isTypeLegal(VT); |
||
| 4023 | } |
||
| 4024 | |||
| 4025 | /// Return true if it is profitable for dag combiner to transform a floating |
||
| 4026 | /// point op of specified opcode to a equivalent op of an integer |
||
| 4027 | /// type. e.g. f32 load -> i32 load can be profitable on ARM. |
||
| 4028 | virtual bool isDesirableToTransformToIntegerOp(unsigned /*Opc*/, |
||
| 4029 | EVT /*VT*/) const { |
||
| 4030 | return false; |
||
| 4031 | } |
||
| 4032 | |||
| 4033 | /// This method query the target whether it is beneficial for dag combiner to |
||
| 4034 | /// promote the specified node. If true, it should return the desired |
||
| 4035 | /// promotion type by reference. |
||
| 4036 | virtual bool IsDesirableToPromoteOp(SDValue /*Op*/, EVT &/*PVT*/) const { |
||
| 4037 | return false; |
||
| 4038 | } |
||
| 4039 | |||
| 4040 | /// Return true if the target supports swifterror attribute. It optimizes |
||
| 4041 | /// loads and stores to reading and writing a specific register. |
||
| 4042 | virtual bool supportSwiftError() const { |
||
| 4043 | return false; |
||
| 4044 | } |
||
| 4045 | |||
| 4046 | /// Return true if the target supports that a subset of CSRs for the given |
||
| 4047 | /// machine function is handled explicitly via copies. |
||
| 4048 | virtual bool supportSplitCSR(MachineFunction *MF) const { |
||
| 4049 | return false; |
||
| 4050 | } |
||
| 4051 | |||
| 4052 | /// Return true if the target supports kcfi operand bundles. |
||
| 4053 | virtual bool supportKCFIBundles() const { return false; } |
||
| 4054 | |||
| 4055 | /// Perform necessary initialization to handle a subset of CSRs explicitly |
||
| 4056 | /// via copies. This function is called at the beginning of instruction |
||
| 4057 | /// selection. |
||
| 4058 | virtual void initializeSplitCSR(MachineBasicBlock *Entry) const { |
||
| 4059 | llvm_unreachable("Not Implemented"); |
||
| 4060 | } |
||
| 4061 | |||
| 4062 | /// Insert explicit copies in entry and exit blocks. We copy a subset of |
||
| 4063 | /// CSRs to virtual registers in the entry block, and copy them back to |
||
| 4064 | /// physical registers in the exit blocks. This function is called at the end |
||
| 4065 | /// of instruction selection. |
||
| 4066 | virtual void insertCopiesSplitCSR( |
||
| 4067 | MachineBasicBlock *Entry, |
||
| 4068 | const SmallVectorImpl<MachineBasicBlock *> &Exits) const { |
||
| 4069 | llvm_unreachable("Not Implemented"); |
||
| 4070 | } |
||
| 4071 | |||
| 4072 | /// Return the newly negated expression if the cost is not expensive and |
||
| 4073 | /// set the cost in \p Cost to indicate that if it is cheaper or neutral to |
||
| 4074 | /// do the negation. |
||
| 4075 | virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, |
||
| 4076 | bool LegalOps, bool OptForSize, |
||
| 4077 | NegatibleCost &Cost, |
||
| 4078 | unsigned Depth = 0) const; |
||
| 4079 | |||
| 4080 | SDValue getCheaperOrNeutralNegatedExpression( |
||
| 4081 | SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, |
||
| 4082 | const NegatibleCost CostThreshold = NegatibleCost::Neutral, |
||
| 4083 | unsigned Depth = 0) const { |
||
| 4084 | NegatibleCost Cost = NegatibleCost::Expensive; |
||
| 4085 | SDValue Neg = |
||
| 4086 | getNegatedExpression(Op, DAG, LegalOps, OptForSize, Cost, Depth); |
||
| 4087 | if (!Neg) |
||
| 4088 | return SDValue(); |
||
| 4089 | |||
| 4090 | if (Cost <= CostThreshold) |
||
| 4091 | return Neg; |
||
| 4092 | |||
| 4093 | // Remove the new created node to avoid the side effect to the DAG. |
||
| 4094 | if (Neg->use_empty()) |
||
| 4095 | DAG.RemoveDeadNode(Neg.getNode()); |
||
| 4096 | return SDValue(); |
||
| 4097 | } |
||
| 4098 | |||
| 4099 | /// This is the helper function to return the newly negated expression only |
||
| 4100 | /// when the cost is cheaper. |
||
| 4101 | SDValue getCheaperNegatedExpression(SDValue Op, SelectionDAG &DAG, |
||
| 4102 | bool LegalOps, bool OptForSize, |
||
| 4103 | unsigned Depth = 0) const { |
||
| 4104 | return getCheaperOrNeutralNegatedExpression(Op, DAG, LegalOps, OptForSize, |
||
| 4105 | NegatibleCost::Cheaper, Depth); |
||
| 4106 | } |
||
| 4107 | |||
| 4108 | /// This is the helper function to return the newly negated expression if |
||
| 4109 | /// the cost is not expensive. |
||
| 4110 | SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, |
||
| 4111 | bool OptForSize, unsigned Depth = 0) const { |
||
| 4112 | NegatibleCost Cost = NegatibleCost::Expensive; |
||
| 4113 | return getNegatedExpression(Op, DAG, LegalOps, OptForSize, Cost, Depth); |
||
| 4114 | } |
||
| 4115 | |||
| 4116 | //===--------------------------------------------------------------------===// |
||
| 4117 | // Lowering methods - These methods must be implemented by targets so that |
||
| 4118 | // the SelectionDAGBuilder code knows how to lower these. |
||
| 4119 | // |
||
| 4120 | |||
| 4121 | /// Target-specific splitting of values into parts that fit a register |
||
| 4122 | /// storing a legal type |
||
| 4123 | virtual bool splitValueIntoRegisterParts( |
||
| 4124 | SelectionDAG & DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, |
||
| 4125 | unsigned NumParts, MVT PartVT, std::optional<CallingConv::ID> CC) const { |
||
| 4126 | return false; |
||
| 4127 | } |
||
| 4128 | |||
| 4129 | /// Allows the target to handle physreg-carried dependency |
||
| 4130 | /// in target-specific way. Used from the ScheduleDAGSDNodes to decide whether |
||
| 4131 | /// to add the edge to the dependency graph. |
||
| 4132 | /// Def - input: Selection DAG node defininfg physical register |
||
| 4133 | /// User - input: Selection DAG node using physical register |
||
| 4134 | /// Op - input: Number of User operand |
||
| 4135 | /// PhysReg - inout: set to the physical register if the edge is |
||
| 4136 | /// necessary, unchanged otherwise |
||
| 4137 | /// Cost - inout: physical register copy cost. |
||
| 4138 | /// Returns 'true' is the edge is necessary, 'false' otherwise |
||
| 4139 | virtual bool checkForPhysRegDependency(SDNode *Def, SDNode *User, unsigned Op, |
||
| 4140 | const TargetRegisterInfo *TRI, |
||
| 4141 | const TargetInstrInfo *TII, |
||
| 4142 | unsigned &PhysReg, int &Cost) const { |
||
| 4143 | return false; |
||
| 4144 | } |
||
| 4145 | |||
| 4146 | /// Target-specific combining of register parts into its original value |
||
| 4147 | virtual SDValue |
||
| 4148 | joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, |
||
| 4149 | const SDValue *Parts, unsigned NumParts, |
||
| 4150 | MVT PartVT, EVT ValueVT, |
||
| 4151 | std::optional<CallingConv::ID> CC) const { |
||
| 4152 | return SDValue(); |
||
| 4153 | } |
||
| 4154 | |||
| 4155 | /// This hook must be implemented to lower the incoming (formal) arguments, |
||
| 4156 | /// described by the Ins array, into the specified DAG. The implementation |
||
| 4157 | /// should fill in the InVals array with legal-type argument values, and |
||
| 4158 | /// return the resulting token chain value. |
||
| 4159 | virtual SDValue LowerFormalArguments( |
||
| 4160 | SDValue /*Chain*/, CallingConv::ID /*CallConv*/, bool /*isVarArg*/, |
||
| 4161 | const SmallVectorImpl<ISD::InputArg> & /*Ins*/, const SDLoc & /*dl*/, |
||
| 4162 | SelectionDAG & /*DAG*/, SmallVectorImpl<SDValue> & /*InVals*/) const { |
||
| 4163 | llvm_unreachable("Not Implemented"); |
||
| 4164 | } |
||
| 4165 | |||
| 4166 | /// This structure contains all information that is necessary for lowering |
||
| 4167 | /// calls. It is passed to TLI::LowerCallTo when the SelectionDAG builder |
||
| 4168 | /// needs to lower a call, and targets will see this struct in their LowerCall |
||
| 4169 | /// implementation. |
||
| 4170 | struct CallLoweringInfo { |
||
| 4171 | SDValue Chain; |
||
| 4172 | Type *RetTy = nullptr; |
||
| 4173 | bool RetSExt : 1; |
||
| 4174 | bool RetZExt : 1; |
||
| 4175 | bool IsVarArg : 1; |
||
| 4176 | bool IsInReg : 1; |
||
| 4177 | bool DoesNotReturn : 1; |
||
| 4178 | bool IsReturnValueUsed : 1; |
||
| 4179 | bool IsConvergent : 1; |
||
| 4180 | bool IsPatchPoint : 1; |
||
| 4181 | bool IsPreallocated : 1; |
||
| 4182 | bool NoMerge : 1; |
||
| 4183 | |||
| 4184 | // IsTailCall should be modified by implementations of |
||
| 4185 | // TargetLowering::LowerCall that perform tail call conversions. |
||
| 4186 | bool IsTailCall = false; |
||
| 4187 | |||
| 4188 | // Is Call lowering done post SelectionDAG type legalization. |
||
| 4189 | bool IsPostTypeLegalization = false; |
||
| 4190 | |||
| 4191 | unsigned NumFixedArgs = -1; |
||
| 4192 | CallingConv::ID CallConv = CallingConv::C; |
||
| 4193 | SDValue Callee; |
||
| 4194 | ArgListTy Args; |
||
| 4195 | SelectionDAG &DAG; |
||
| 4196 | SDLoc DL; |
||
| 4197 | const CallBase *CB = nullptr; |
||
| 4198 | SmallVector<ISD::OutputArg, 32> Outs; |
||
| 4199 | SmallVector<SDValue, 32> OutVals; |
||
| 4200 | SmallVector<ISD::InputArg, 32> Ins; |
||
| 4201 | SmallVector<SDValue, 4> InVals; |
||
| 4202 | const ConstantInt *CFIType = nullptr; |
||
| 4203 | |||
| 4204 | CallLoweringInfo(SelectionDAG &DAG) |
||
| 4205 | : RetSExt(false), RetZExt(false), IsVarArg(false), IsInReg(false), |
||
| 4206 | DoesNotReturn(false), IsReturnValueUsed(true), IsConvergent(false), |
||
| 4207 | IsPatchPoint(false), IsPreallocated(false), NoMerge(false), |
||
| 4208 | DAG(DAG) {} |
||
| 4209 | |||
| 4210 | CallLoweringInfo &setDebugLoc(const SDLoc &dl) { |
||
| 4211 | DL = dl; |
||
| 4212 | return *this; |
||
| 4213 | } |
||
| 4214 | |||
| 4215 | CallLoweringInfo &setChain(SDValue InChain) { |
||
| 4216 | Chain = InChain; |
||
| 4217 | return *this; |
||
| 4218 | } |
||
| 4219 | |||
| 4220 | // setCallee with target/module-specific attributes |
||
| 4221 | CallLoweringInfo &setLibCallee(CallingConv::ID CC, Type *ResultType, |
||
| 4222 | SDValue Target, ArgListTy &&ArgsList) { |
||
| 4223 | RetTy = ResultType; |
||
| 4224 | Callee = Target; |
||
| 4225 | CallConv = CC; |
||
| 4226 | NumFixedArgs = ArgsList.size(); |
||
| 4227 | Args = std::move(ArgsList); |
||
| 4228 | |||
| 4229 | DAG.getTargetLoweringInfo().markLibCallAttributes( |
||
| 4230 | &(DAG.getMachineFunction()), CC, Args); |
||
| 4231 | return *this; |
||
| 4232 | } |
||
| 4233 | |||
| 4234 | CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultType, |
||
| 4235 | SDValue Target, ArgListTy &&ArgsList) { |
||
| 4236 | RetTy = ResultType; |
||
| 4237 | Callee = Target; |
||
| 4238 | CallConv = CC; |
||
| 4239 | NumFixedArgs = ArgsList.size(); |
||
| 4240 | Args = std::move(ArgsList); |
||
| 4241 | return *this; |
||
| 4242 | } |
||
| 4243 | |||
| 4244 | CallLoweringInfo &setCallee(Type *ResultType, FunctionType *FTy, |
||
| 4245 | SDValue Target, ArgListTy &&ArgsList, |
||
| 4246 | const CallBase &Call) { |
||
| 4247 | RetTy = ResultType; |
||
| 4248 | |||
| 4249 | IsInReg = Call.hasRetAttr(Attribute::InReg); |
||
| 4250 | DoesNotReturn = |
||
| 4251 | Call.doesNotReturn() || |
||
| 4252 | (!isa<InvokeInst>(Call) && isa<UnreachableInst>(Call.getNextNode())); |
||
| 4253 | IsVarArg = FTy->isVarArg(); |
||
| 4254 | IsReturnValueUsed = !Call.use_empty(); |
||
| 4255 | RetSExt = Call.hasRetAttr(Attribute::SExt); |
||
| 4256 | RetZExt = Call.hasRetAttr(Attribute::ZExt); |
||
| 4257 | NoMerge = Call.hasFnAttr(Attribute::NoMerge); |
||
| 4258 | |||
| 4259 | Callee = Target; |
||
| 4260 | |||
| 4261 | CallConv = Call.getCallingConv(); |
||
| 4262 | NumFixedArgs = FTy->getNumParams(); |
||
| 4263 | Args = std::move(ArgsList); |
||
| 4264 | |||
| 4265 | CB = &Call; |
||
| 4266 | |||
| 4267 | return *this; |
||
| 4268 | } |
||
| 4269 | |||
| 4270 | CallLoweringInfo &setInRegister(bool Value = true) { |
||
| 4271 | IsInReg = Value; |
||
| 4272 | return *this; |
||
| 4273 | } |
||
| 4274 | |||
| 4275 | CallLoweringInfo &setNoReturn(bool Value = true) { |
||
| 4276 | DoesNotReturn = Value; |
||
| 4277 | return *this; |
||
| 4278 | } |
||
| 4279 | |||
| 4280 | CallLoweringInfo &setVarArg(bool Value = true) { |
||
| 4281 | IsVarArg = Value; |
||
| 4282 | return *this; |
||
| 4283 | } |
||
| 4284 | |||
| 4285 | CallLoweringInfo &setTailCall(bool Value = true) { |
||
| 4286 | IsTailCall = Value; |
||
| 4287 | return *this; |
||
| 4288 | } |
||
| 4289 | |||
| 4290 | CallLoweringInfo &setDiscardResult(bool Value = true) { |
||
| 4291 | IsReturnValueUsed = !Value; |
||
| 4292 | return *this; |
||
| 4293 | } |
||
| 4294 | |||
| 4295 | CallLoweringInfo &setConvergent(bool Value = true) { |
||
| 4296 | IsConvergent = Value; |
||
| 4297 | return *this; |
||
| 4298 | } |
||
| 4299 | |||
| 4300 | CallLoweringInfo &setSExtResult(bool Value = true) { |
||
| 4301 | RetSExt = Value; |
||
| 4302 | return *this; |
||
| 4303 | } |
||
| 4304 | |||
| 4305 | CallLoweringInfo &setZExtResult(bool Value = true) { |
||
| 4306 | RetZExt = Value; |
||
| 4307 | return *this; |
||
| 4308 | } |
||
| 4309 | |||
| 4310 | CallLoweringInfo &setIsPatchPoint(bool Value = true) { |
||
| 4311 | IsPatchPoint = Value; |
||
| 4312 | return *this; |
||
| 4313 | } |
||
| 4314 | |||
| 4315 | CallLoweringInfo &setIsPreallocated(bool Value = true) { |
||
| 4316 | IsPreallocated = Value; |
||
| 4317 | return *this; |
||
| 4318 | } |
||
| 4319 | |||
| 4320 | CallLoweringInfo &setIsPostTypeLegalization(bool Value=true) { |
||
| 4321 | IsPostTypeLegalization = Value; |
||
| 4322 | return *this; |
||
| 4323 | } |
||
| 4324 | |||
| 4325 | CallLoweringInfo &setCFIType(const ConstantInt *Type) { |
||
| 4326 | CFIType = Type; |
||
| 4327 | return *this; |
||
| 4328 | } |
||
| 4329 | |||
| 4330 | ArgListTy &getArgs() { |
||
| 4331 | return Args; |
||
| 4332 | } |
||
| 4333 | }; |
||
| 4334 | |||
| 4335 | /// This structure is used to pass arguments to makeLibCall function. |
||
| 4336 | struct MakeLibCallOptions { |
||
| 4337 | // By passing type list before soften to makeLibCall, the target hook |
||
| 4338 | // shouldExtendTypeInLibCall can get the original type before soften. |
||
| 4339 | ArrayRef<EVT> OpsVTBeforeSoften; |
||
| 4340 | EVT RetVTBeforeSoften; |
||
| 4341 | bool IsSExt : 1; |
||
| 4342 | bool DoesNotReturn : 1; |
||
| 4343 | bool IsReturnValueUsed : 1; |
||
| 4344 | bool IsPostTypeLegalization : 1; |
||
| 4345 | bool IsSoften : 1; |
||
| 4346 | |||
| 4347 | MakeLibCallOptions() |
||
| 4348 | : IsSExt(false), DoesNotReturn(false), IsReturnValueUsed(true), |
||
| 4349 | IsPostTypeLegalization(false), IsSoften(false) {} |
||
| 4350 | |||
| 4351 | MakeLibCallOptions &setSExt(bool Value = true) { |
||
| 4352 | IsSExt = Value; |
||
| 4353 | return *this; |
||
| 4354 | } |
||
| 4355 | |||
| 4356 | MakeLibCallOptions &setNoReturn(bool Value = true) { |
||
| 4357 | DoesNotReturn = Value; |
||
| 4358 | return *this; |
||
| 4359 | } |
||
| 4360 | |||
| 4361 | MakeLibCallOptions &setDiscardResult(bool Value = true) { |
||
| 4362 | IsReturnValueUsed = !Value; |
||
| 4363 | return *this; |
||
| 4364 | } |
||
| 4365 | |||
| 4366 | MakeLibCallOptions &setIsPostTypeLegalization(bool Value = true) { |
||
| 4367 | IsPostTypeLegalization = Value; |
||
| 4368 | return *this; |
||
| 4369 | } |
||
| 4370 | |||
| 4371 | MakeLibCallOptions &setTypeListBeforeSoften(ArrayRef<EVT> OpsVT, EVT RetVT, |
||
| 4372 | bool Value = true) { |
||
| 4373 | OpsVTBeforeSoften = OpsVT; |
||
| 4374 | RetVTBeforeSoften = RetVT; |
||
| 4375 | IsSoften = Value; |
||
| 4376 | return *this; |
||
| 4377 | } |
||
| 4378 | }; |
||
| 4379 | |||
| 4380 | /// This function lowers an abstract call to a function into an actual call. |
||
| 4381 | /// This returns a pair of operands. The first element is the return value |
||
| 4382 | /// for the function (if RetTy is not VoidTy). The second element is the |
||
| 4383 | /// outgoing token chain. It calls LowerCall to do the actual lowering. |
||
| 4384 | std::pair<SDValue, SDValue> LowerCallTo(CallLoweringInfo &CLI) const; |
||
| 4385 | |||
| 4386 | /// This hook must be implemented to lower calls into the specified |
||
| 4387 | /// DAG. The outgoing arguments to the call are described by the Outs array, |
||
| 4388 | /// and the values to be returned by the call are described by the Ins |
||
| 4389 | /// array. The implementation should fill in the InVals array with legal-type |
||
| 4390 | /// return values from the call, and return the resulting token chain value. |
||
| 4391 | virtual SDValue |
||
| 4392 | LowerCall(CallLoweringInfo &/*CLI*/, |
||
| 4393 | SmallVectorImpl<SDValue> &/*InVals*/) const { |
||
| 4394 | llvm_unreachable("Not Implemented"); |
||
| 4395 | } |
||
| 4396 | |||
| 4397 | /// Target-specific cleanup for formal ByVal parameters. |
||
| 4398 | virtual void HandleByVal(CCState *, unsigned &, Align) const {} |
||
| 4399 | |||
| 4400 | /// This hook should be implemented to check whether the return values |
||
| 4401 | /// described by the Outs array can fit into the return registers. If false |
||
| 4402 | /// is returned, an sret-demotion is performed. |
||
| 4403 | virtual bool CanLowerReturn(CallingConv::ID /*CallConv*/, |
||
| 4404 | MachineFunction &/*MF*/, bool /*isVarArg*/, |
||
| 4405 | const SmallVectorImpl<ISD::OutputArg> &/*Outs*/, |
||
| 4406 | LLVMContext &/*Context*/) const |
||
| 4407 | { |
||
| 4408 | // Return true by default to get preexisting behavior. |
||
| 4409 | return true; |
||
| 4410 | } |
||
| 4411 | |||
| 4412 | /// This hook must be implemented to lower outgoing return values, described |
||
| 4413 | /// by the Outs array, into the specified DAG. The implementation should |
||
| 4414 | /// return the resulting token chain value. |
||
| 4415 | virtual SDValue LowerReturn(SDValue /*Chain*/, CallingConv::ID /*CallConv*/, |
||
| 4416 | bool /*isVarArg*/, |
||
| 4417 | const SmallVectorImpl<ISD::OutputArg> & /*Outs*/, |
||
| 4418 | const SmallVectorImpl<SDValue> & /*OutVals*/, |
||
| 4419 | const SDLoc & /*dl*/, |
||
| 4420 | SelectionDAG & /*DAG*/) const { |
||
| 4421 | llvm_unreachable("Not Implemented"); |
||
| 4422 | } |
||
| 4423 | |||
| 4424 | /// Return true if result of the specified node is used by a return node |
||
| 4425 | /// only. It also compute and return the input chain for the tail call. |
||
| 4426 | /// |
||
| 4427 | /// This is used to determine whether it is possible to codegen a libcall as |
||
| 4428 | /// tail call at legalization time. |
||
| 4429 | virtual bool isUsedByReturnOnly(SDNode *, SDValue &/*Chain*/) const { |
||
| 4430 | return false; |
||
| 4431 | } |
||
| 4432 | |||
| 4433 | /// Return true if the target may be able emit the call instruction as a tail |
||
| 4434 | /// call. This is used by optimization passes to determine if it's profitable |
||
| 4435 | /// to duplicate return instructions to enable tailcall optimization. |
||
| 4436 | virtual bool mayBeEmittedAsTailCall(const CallInst *) const { |
||
| 4437 | return false; |
||
| 4438 | } |
||
| 4439 | |||
| 4440 | /// Return the builtin name for the __builtin___clear_cache intrinsic |
||
| 4441 | /// Default is to invoke the clear cache library call |
||
| 4442 | virtual const char * getClearCacheBuiltinName() const { |
||
| 4443 | return "__clear_cache"; |
||
| 4444 | } |
||
| 4445 | |||
| 4446 | /// Return the register ID of the name passed in. Used by named register |
||
| 4447 | /// global variables extension. There is no target-independent behaviour |
||
| 4448 | /// so the default action is to bail. |
||
| 4449 | virtual Register getRegisterByName(const char* RegName, LLT Ty, |
||
| 4450 | const MachineFunction &MF) const { |
||
| 4451 | report_fatal_error("Named registers not implemented for this target"); |
||
| 4452 | } |
||
| 4453 | |||
| 4454 | /// Return the type that should be used to zero or sign extend a |
||
| 4455 | /// zeroext/signext integer return value. FIXME: Some C calling conventions |
||
| 4456 | /// require the return type to be promoted, but this is not true all the time, |
||
| 4457 | /// e.g. i1/i8/i16 on x86/x86_64. It is also not necessary for non-C calling |
||
| 4458 | /// conventions. The frontend should handle this and include all of the |
||
| 4459 | /// necessary information. |
||
| 4460 | virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, |
||
| 4461 | ISD::NodeType /*ExtendKind*/) const { |
||
| 4462 | EVT MinVT = getRegisterType(Context, MVT::i32); |
||
| 4463 | return VT.bitsLT(MinVT) ? MinVT : VT; |
||
| 4464 | } |
||
| 4465 | |||
| 4466 | /// For some targets, an LLVM struct type must be broken down into multiple |
||
| 4467 | /// simple types, but the calling convention specifies that the entire struct |
||
| 4468 | /// must be passed in a block of consecutive registers. |
||
| 4469 | virtual bool |
||
| 4470 | functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, |
||
| 4471 | bool isVarArg, |
||
| 4472 | const DataLayout &DL) const { |
||
| 4473 | return false; |
||
| 4474 | } |
||
| 4475 | |||
| 4476 | /// For most targets, an LLVM type must be broken down into multiple |
||
| 4477 | /// smaller types. Usually the halves are ordered according to the endianness |
||
| 4478 | /// but for some platform that would break. So this method will default to |
||
| 4479 | /// matching the endianness but can be overridden. |
||
| 4480 | virtual bool |
||
| 4481 | shouldSplitFunctionArgumentsAsLittleEndian(const DataLayout &DL) const { |
||
| 4482 | return DL.isLittleEndian(); |
||
| 4483 | } |
||
| 4484 | |||
| 4485 | /// Returns a 0 terminated array of registers that can be safely used as |
||
| 4486 | /// scratch registers. |
||
| 4487 | virtual const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const { |
||
| 4488 | return nullptr; |
||
| 4489 | } |
||
| 4490 | |||
| 4491 | /// This callback is used to prepare for a volatile or atomic load. |
||
| 4492 | /// It takes a chain node as input and returns the chain for the load itself. |
||
| 4493 | /// |
||
| 4494 | /// Having a callback like this is necessary for targets like SystemZ, |
||
| 4495 | /// which allows a CPU to reuse the result of a previous load indefinitely, |
||
| 4496 | /// even if a cache-coherent store is performed by another CPU. The default |
||
| 4497 | /// implementation does nothing. |
||
| 4498 | virtual SDValue prepareVolatileOrAtomicLoad(SDValue Chain, const SDLoc &DL, |
||
| 4499 | SelectionDAG &DAG) const { |
||
| 4500 | return Chain; |
||
| 4501 | } |
||
| 4502 | |||
| 4503 | /// Should SelectionDAG lower an atomic store of the given kind as a normal |
||
| 4504 | /// StoreSDNode (as opposed to an AtomicSDNode)? NOTE: The intention is to |
||
| 4505 | /// eventually migrate all targets to the using StoreSDNodes, but porting is |
||
| 4506 | /// being done target at a time. |
||
| 4507 | virtual bool lowerAtomicStoreAsStoreSDNode(const StoreInst &SI) const { |
||
| 4508 | assert(SI.isAtomic() && "violated precondition"); |
||
| 4509 | return false; |
||
| 4510 | } |
||
| 4511 | |||
| 4512 | /// Should SelectionDAG lower an atomic load of the given kind as a normal |
||
| 4513 | /// LoadSDNode (as opposed to an AtomicSDNode)? NOTE: The intention is to |
||
| 4514 | /// eventually migrate all targets to the using LoadSDNodes, but porting is |
||
| 4515 | /// being done target at a time. |
||
| 4516 | virtual bool lowerAtomicLoadAsLoadSDNode(const LoadInst &LI) const { |
||
| 4517 | assert(LI.isAtomic() && "violated precondition"); |
||
| 4518 | return false; |
||
| 4519 | } |
||
| 4520 | |||
| 4521 | |||
| 4522 | /// This callback is invoked by the type legalizer to legalize nodes with an |
||
| 4523 | /// illegal operand type but legal result types. It replaces the |
||
| 4524 | /// LowerOperation callback in the type Legalizer. The reason we can not do |
||
| 4525 | /// away with LowerOperation entirely is that LegalizeDAG isn't yet ready to |
||
| 4526 | /// use this callback. |
||
| 4527 | /// |
||
| 4528 | /// TODO: Consider merging with ReplaceNodeResults. |
||
| 4529 | /// |
||
| 4530 | /// The target places new result values for the node in Results (their number |
||
| 4531 | /// and types must exactly match those of the original return values of |
||
| 4532 | /// the node), or leaves Results empty, which indicates that the node is not |
||
| 4533 | /// to be custom lowered after all. |
||
| 4534 | /// The default implementation calls LowerOperation. |
||
| 4535 | virtual void LowerOperationWrapper(SDNode *N, |
||
| 4536 | SmallVectorImpl<SDValue> &Results, |
||
| 4537 | SelectionDAG &DAG) const; |
||
| 4538 | |||
| 4539 | /// This callback is invoked for operations that are unsupported by the |
||
| 4540 | /// target, which are registered to use 'custom' lowering, and whose defined |
||
| 4541 | /// values are all legal. If the target has no operations that require custom |
||
| 4542 | /// lowering, it need not implement this. The default implementation of this |
||
| 4543 | /// aborts. |
||
| 4544 | virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; |
||
| 4545 | |||
| 4546 | /// This callback is invoked when a node result type is illegal for the |
||
| 4547 | /// target, and the operation was registered to use 'custom' lowering for that |
||
| 4548 | /// result type. The target places new result values for the node in Results |
||
| 4549 | /// (their number and types must exactly match those of the original return |
||
| 4550 | /// values of the node), or leaves Results empty, which indicates that the |
||
| 4551 | /// node is not to be custom lowered after all. |
||
| 4552 | /// |
||
| 4553 | /// If the target has no operations that require custom lowering, it need not |
||
| 4554 | /// implement this. The default implementation aborts. |
||
| 4555 | virtual void ReplaceNodeResults(SDNode * /*N*/, |
||
| 4556 | SmallVectorImpl<SDValue> &/*Results*/, |
||
| 4557 | SelectionDAG &/*DAG*/) const { |
||
| 4558 | llvm_unreachable("ReplaceNodeResults not implemented for this target!"); |
||
| 4559 | } |
||
| 4560 | |||
| 4561 | /// This method returns the name of a target specific DAG node. |
||
| 4562 | virtual const char *getTargetNodeName(unsigned Opcode) const; |
||
| 4563 | |||
| 4564 | /// This method returns a target specific FastISel object, or null if the |
||
| 4565 | /// target does not support "fast" ISel. |
||
| 4566 | virtual FastISel *createFastISel(FunctionLoweringInfo &, |
||
| 4567 | const TargetLibraryInfo *) const { |
||
| 4568 | return nullptr; |
||
| 4569 | } |
||
| 4570 | |||
| 4571 | bool verifyReturnAddressArgumentIsConstant(SDValue Op, |
||
| 4572 | SelectionDAG &DAG) const; |
||
| 4573 | |||
| 4574 | //===--------------------------------------------------------------------===// |
||
| 4575 | // Inline Asm Support hooks |
||
| 4576 | // |
||
| 4577 | |||
| 4578 | /// This hook allows the target to expand an inline asm call to be explicit |
||
| 4579 | /// llvm code if it wants to. This is useful for turning simple inline asms |
||
| 4580 | /// into LLVM intrinsics, which gives the compiler more information about the |
||
| 4581 | /// behavior of the code. |
||
| 4582 | virtual bool ExpandInlineAsm(CallInst *) const { |
||
| 4583 | return false; |
||
| 4584 | } |
||
| 4585 | |||
| 4586 | enum ConstraintType { |
||
| 4587 | C_Register, // Constraint represents specific register(s). |
||
| 4588 | C_RegisterClass, // Constraint represents any of register(s) in class. |
||
| 4589 | C_Memory, // Memory constraint. |
||
| 4590 | C_Address, // Address constraint. |
||
| 4591 | C_Immediate, // Requires an immediate. |
||
| 4592 | C_Other, // Something else. |
||
| 4593 | C_Unknown // Unsupported constraint. |
||
| 4594 | }; |
||
| 4595 | |||
| 4596 | enum ConstraintWeight { |
||
| 4597 | // Generic weights. |
||
| 4598 | CW_Invalid = -1, // No match. |
||
| 4599 | CW_Okay = 0, // Acceptable. |
||
| 4600 | CW_Good = 1, // Good weight. |
||
| 4601 | CW_Better = 2, // Better weight. |
||
| 4602 | CW_Best = 3, // Best weight. |
||
| 4603 | |||
| 4604 | // Well-known weights. |
||
| 4605 | CW_SpecificReg = CW_Okay, // Specific register operands. |
||
| 4606 | CW_Register = CW_Good, // Register operands. |
||
| 4607 | CW_Memory = CW_Better, // Memory operands. |
||
| 4608 | CW_Constant = CW_Best, // Constant operand. |
||
| 4609 | CW_Default = CW_Okay // Default or don't know type. |
||
| 4610 | }; |
||
| 4611 | |||
| 4612 | /// This contains information for each constraint that we are lowering. |
||
| 4613 | struct AsmOperandInfo : public InlineAsm::ConstraintInfo { |
||
| 4614 | /// This contains the actual string for the code, like "m". TargetLowering |
||
| 4615 | /// picks the 'best' code from ConstraintInfo::Codes that most closely |
||
| 4616 | /// matches the operand. |
||
| 4617 | std::string ConstraintCode; |
||
| 4618 | |||
| 4619 | /// Information about the constraint code, e.g. Register, RegisterClass, |
||
| 4620 | /// Memory, Other, Unknown. |
||
| 4621 | TargetLowering::ConstraintType ConstraintType = TargetLowering::C_Unknown; |
||
| 4622 | |||
| 4623 | /// If this is the result output operand or a clobber, this is null, |
||
| 4624 | /// otherwise it is the incoming operand to the CallInst. This gets |
||
| 4625 | /// modified as the asm is processed. |
||
| 4626 | Value *CallOperandVal = nullptr; |
||
| 4627 | |||
| 4628 | /// The ValueType for the operand value. |
||
| 4629 | MVT ConstraintVT = MVT::Other; |
||
| 4630 | |||
| 4631 | /// Copy constructor for copying from a ConstraintInfo. |
||
| 4632 | AsmOperandInfo(InlineAsm::ConstraintInfo Info) |
||
| 4633 | : InlineAsm::ConstraintInfo(std::move(Info)) {} |
||
| 4634 | |||
| 4635 | /// Return true of this is an input operand that is a matching constraint |
||
| 4636 | /// like "4". |
||
| 4637 | bool isMatchingInputConstraint() const; |
||
| 4638 | |||
| 4639 | /// If this is an input matching constraint, this method returns the output |
||
| 4640 | /// operand it matches. |
||
| 4641 | unsigned getMatchedOperand() const; |
||
| 4642 | }; |
||
| 4643 | |||
| 4644 | using AsmOperandInfoVector = std::vector<AsmOperandInfo>; |
||
| 4645 | |||
| 4646 | /// Split up the constraint string from the inline assembly value into the |
||
| 4647 | /// specific constraints and their prefixes, and also tie in the associated |
||
| 4648 | /// operand values. If this returns an empty vector, and if the constraint |
||
| 4649 | /// string itself isn't empty, there was an error parsing. |
||
| 4650 | virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, |
||
| 4651 | const TargetRegisterInfo *TRI, |
||
| 4652 | const CallBase &Call) const; |
||
| 4653 | |||
| 4654 | /// Examine constraint type and operand type and determine a weight value. |
||
| 4655 | /// The operand object must already have been set up with the operand type. |
||
| 4656 | virtual ConstraintWeight getMultipleConstraintMatchWeight( |
||
| 4657 | AsmOperandInfo &info, int maIndex) const; |
||
| 4658 | |||
| 4659 | /// Examine constraint string and operand type and determine a weight value. |
||
| 4660 | /// The operand object must already have been set up with the operand type. |
||
| 4661 | virtual ConstraintWeight getSingleConstraintMatchWeight( |
||
| 4662 | AsmOperandInfo &info, const char *constraint) const; |
||
| 4663 | |||
| 4664 | /// Determines the constraint code and constraint type to use for the specific |
||
| 4665 | /// AsmOperandInfo, setting OpInfo.ConstraintCode and OpInfo.ConstraintType. |
||
| 4666 | /// If the actual operand being passed in is available, it can be passed in as |
||
| 4667 | /// Op, otherwise an empty SDValue can be passed. |
||
| 4668 | virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, |
||
| 4669 | SDValue Op, |
||
| 4670 | SelectionDAG *DAG = nullptr) const; |
||
| 4671 | |||
| 4672 | /// Given a constraint, return the type of constraint it is for this target. |
||
| 4673 | virtual ConstraintType getConstraintType(StringRef Constraint) const; |
||
| 4674 | |||
| 4675 | /// Given a physical register constraint (e.g. {edx}), return the register |
||
| 4676 | /// number and the register class for the register. |
||
| 4677 | /// |
||
| 4678 | /// Given a register class constraint, like 'r', if this corresponds directly |
||
| 4679 | /// to an LLVM register class, return a register of 0 and the register class |
||
| 4680 | /// pointer. |
||
| 4681 | /// |
||
| 4682 | /// This should only be used for C_Register constraints. On error, this |
||
| 4683 | /// returns a register number of 0 and a null register class pointer. |
||
| 4684 | virtual std::pair<unsigned, const TargetRegisterClass *> |
||
| 4685 | getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, |
||
| 4686 | StringRef Constraint, MVT VT) const; |
||
| 4687 | |||
| 4688 | virtual unsigned getInlineAsmMemConstraint(StringRef ConstraintCode) const { |
||
| 4689 | if (ConstraintCode == "m") |
||
| 4690 | return InlineAsm::Constraint_m; |
||
| 4691 | if (ConstraintCode == "o") |
||
| 4692 | return InlineAsm::Constraint_o; |
||
| 4693 | if (ConstraintCode == "X") |
||
| 4694 | return InlineAsm::Constraint_X; |
||
| 4695 | if (ConstraintCode == "p") |
||
| 4696 | return InlineAsm::Constraint_p; |
||
| 4697 | return InlineAsm::Constraint_Unknown; |
||
| 4698 | } |
||
| 4699 | |||
| 4700 | /// Try to replace an X constraint, which matches anything, with another that |
||
| 4701 | /// has more specific requirements based on the type of the corresponding |
||
| 4702 | /// operand. This returns null if there is no replacement to make. |
||
| 4703 | virtual const char *LowerXConstraint(EVT ConstraintVT) const; |
||
| 4704 | |||
| 4705 | /// Lower the specified operand into the Ops vector. If it is invalid, don't |
||
| 4706 | /// add anything to Ops. |
||
| 4707 | virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint, |
||
| 4708 | std::vector<SDValue> &Ops, |
||
| 4709 | SelectionDAG &DAG) const; |
||
| 4710 | |||
| 4711 | // Lower custom output constraints. If invalid, return SDValue(). |
||
| 4712 | virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, |
||
| 4713 | const SDLoc &DL, |
||
| 4714 | const AsmOperandInfo &OpInfo, |
||
| 4715 | SelectionDAG &DAG) const; |
||
| 4716 | |||
| 4717 | // Targets may override this function to collect operands from the CallInst |
||
| 4718 | // and for example, lower them into the SelectionDAG operands. |
||
| 4719 | virtual void CollectTargetIntrinsicOperands(const CallInst &I, |
||
| 4720 | SmallVectorImpl<SDValue> &Ops, |
||
| 4721 | SelectionDAG &DAG) const; |
||
| 4722 | |||
| 4723 | //===--------------------------------------------------------------------===// |
||
| 4724 | // Div utility functions |
||
| 4725 | // |
||
| 4726 | |||
| 4727 | SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, |
||
| 4728 | SmallVectorImpl<SDNode *> &Created) const; |
||
| 4729 | SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, |
||
| 4730 | SmallVectorImpl<SDNode *> &Created) const; |
||
| 4731 | |||
| 4732 | /// Targets may override this function to provide custom SDIV lowering for |
||
| 4733 | /// power-of-2 denominators. If the target returns an empty SDValue, LLVM |
||
| 4734 | /// assumes SDIV is expensive and replaces it with a series of other integer |
||
| 4735 | /// operations. |
||
| 4736 | virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, |
||
| 4737 | SelectionDAG &DAG, |
||
| 4738 | SmallVectorImpl<SDNode *> &Created) const; |
||
| 4739 | |||
| 4740 | /// Targets may override this function to provide custom SREM lowering for |
||
| 4741 | /// power-of-2 denominators. If the target returns an empty SDValue, LLVM |
||
| 4742 | /// assumes SREM is expensive and replaces it with a series of other integer |
||
| 4743 | /// operations. |
||
| 4744 | virtual SDValue BuildSREMPow2(SDNode *N, const APInt &Divisor, |
||
| 4745 | SelectionDAG &DAG, |
||
| 4746 | SmallVectorImpl<SDNode *> &Created) const; |
||
| 4747 | |||
| 4748 | /// Indicate whether this target prefers to combine FDIVs with the same |
||
| 4749 | /// divisor. If the transform should never be done, return zero. If the |
||
| 4750 | /// transform should be done, return the minimum number of divisor uses |
||
| 4751 | /// that must exist. |
||
| 4752 | virtual unsigned combineRepeatedFPDivisors() const { |
||
| 4753 | return 0; |
||
| 4754 | } |
||
| 4755 | |||
| 4756 | /// Hooks for building estimates in place of slower divisions and square |
||
| 4757 | /// roots. |
||
| 4758 | |||
| 4759 | /// Return either a square root or its reciprocal estimate value for the input |
||
| 4760 | /// operand. |
||
| 4761 | /// \p Enabled is a ReciprocalEstimate enum with value either 'Unspecified' or |
||
| 4762 | /// 'Enabled' as set by a potential default override attribute. |
||
| 4763 | /// If \p RefinementSteps is 'Unspecified', the number of Newton-Raphson |
||
| 4764 | /// refinement iterations required to generate a sufficient (though not |
||
| 4765 | /// necessarily IEEE-754 compliant) estimate is returned in that parameter. |
||
| 4766 | /// The boolean UseOneConstNR output is used to select a Newton-Raphson |
||
| 4767 | /// algorithm implementation that uses either one or two constants. |
||
| 4768 | /// The boolean Reciprocal is used to select whether the estimate is for the |
||
| 4769 | /// square root of the input operand or the reciprocal of its square root. |
||
| 4770 | /// A target may choose to implement its own refinement within this function. |
||
| 4771 | /// If that's true, then return '0' as the number of RefinementSteps to avoid |
||
| 4772 | /// any further refinement of the estimate. |
||
| 4773 | /// An empty SDValue return means no estimate sequence can be created. |
||
| 4774 | virtual SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, |
||
| 4775 | int Enabled, int &RefinementSteps, |
||
| 4776 | bool &UseOneConstNR, bool Reciprocal) const { |
||
| 4777 | return SDValue(); |
||
| 4778 | } |
||
| 4779 | |||
| 4780 | /// Try to convert the fminnum/fmaxnum to a compare/select sequence. This is |
||
| 4781 | /// required for correctness since InstCombine might have canonicalized a |
||
| 4782 | /// fcmp+select sequence to a FMINNUM/FMAXNUM intrinsic. If we were to fall |
||
| 4783 | /// through to the default expansion/soften to libcall, we might introduce a |
||
| 4784 | /// link-time dependency on libm into a file that originally did not have one. |
||
| 4785 | SDValue createSelectForFMINNUM_FMAXNUM(SDNode *Node, SelectionDAG &DAG) const; |
||
| 4786 | |||
| 4787 | /// Return a reciprocal estimate value for the input operand. |
||
| 4788 | /// \p Enabled is a ReciprocalEstimate enum with value either 'Unspecified' or |
||
| 4789 | /// 'Enabled' as set by a potential default override attribute. |
||
| 4790 | /// If \p RefinementSteps is 'Unspecified', the number of Newton-Raphson |
||
| 4791 | /// refinement iterations required to generate a sufficient (though not |
||
| 4792 | /// necessarily IEEE-754 compliant) estimate is returned in that parameter. |
||
| 4793 | /// A target may choose to implement its own refinement within this function. |
||
| 4794 | /// If that's true, then return '0' as the number of RefinementSteps to avoid |
||
| 4795 | /// any further refinement of the estimate. |
||
| 4796 | /// An empty SDValue return means no estimate sequence can be created. |
||
| 4797 | virtual SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, |
||
| 4798 | int Enabled, int &RefinementSteps) const { |
||
| 4799 | return SDValue(); |
||
| 4800 | } |
||
| 4801 | |||
| 4802 | /// Return a target-dependent comparison result if the input operand is |
||
| 4803 | /// suitable for use with a square root estimate calculation. For example, the |
||
| 4804 | /// comparison may check if the operand is NAN, INF, zero, normal, etc. The |
||
| 4805 | /// result should be used as the condition operand for a select or branch. |
||
| 4806 | virtual SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG, |
||
| 4807 | const DenormalMode &Mode) const; |
||
| 4808 | |||
| 4809 | /// Return a target-dependent result if the input operand is not suitable for |
||
| 4810 | /// use with a square root estimate calculation. |
||
| 4811 | virtual SDValue getSqrtResultForDenormInput(SDValue Operand, |
||
| 4812 | SelectionDAG &DAG) const { |
||
| 4813 | return DAG.getConstantFP(0.0, SDLoc(Operand), Operand.getValueType()); |
||
| 4814 | } |
||
| 4815 | |||
| 4816 | //===--------------------------------------------------------------------===// |
||
| 4817 | // Legalization utility functions |
||
| 4818 | // |
||
| 4819 | |||
| 4820 | /// Expand a MUL or [US]MUL_LOHI of n-bit values into two or four nodes, |
||
| 4821 | /// respectively, each computing an n/2-bit part of the result. |
||
| 4822 | /// \param Result A vector that will be filled with the parts of the result |
||
| 4823 | /// in little-endian order. |
||
| 4824 | /// \param LL Low bits of the LHS of the MUL. You can use this parameter |
||
| 4825 | /// if you want to control how low bits are extracted from the LHS. |
||
| 4826 | /// \param LH High bits of the LHS of the MUL. See LL for meaning. |
||
| 4827 | /// \param RL Low bits of the RHS of the MUL. See LL for meaning |
||
| 4828 | /// \param RH High bits of the RHS of the MUL. See LL for meaning. |
||
| 4829 | /// \returns true if the node has been expanded, false if it has not |
||
| 4830 | bool expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl, SDValue LHS, |
||
| 4831 | SDValue RHS, SmallVectorImpl<SDValue> &Result, EVT HiLoVT, |
||
| 4832 | SelectionDAG &DAG, MulExpansionKind Kind, |
||
| 4833 | SDValue LL = SDValue(), SDValue LH = SDValue(), |
||
| 4834 | SDValue RL = SDValue(), SDValue RH = SDValue()) const; |
||
| 4835 | |||
| 4836 | /// Expand a MUL into two nodes. One that computes the high bits of |
||
| 4837 | /// the result and one that computes the low bits. |
||
| 4838 | /// \param HiLoVT The value type to use for the Lo and Hi nodes. |
||
| 4839 | /// \param LL Low bits of the LHS of the MUL. You can use this parameter |
||
| 4840 | /// if you want to control how low bits are extracted from the LHS. |
||
| 4841 | /// \param LH High bits of the LHS of the MUL. See LL for meaning. |
||
| 4842 | /// \param RL Low bits of the RHS of the MUL. See LL for meaning |
||
| 4843 | /// \param RH High bits of the RHS of the MUL. See LL for meaning. |
||
| 4844 | /// \returns true if the node has been expanded. false if it has not |
||
| 4845 | bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT, |
||
| 4846 | SelectionDAG &DAG, MulExpansionKind Kind, |
||
| 4847 | SDValue LL = SDValue(), SDValue LH = SDValue(), |
||
| 4848 | SDValue RL = SDValue(), SDValue RH = SDValue()) const; |
||
| 4849 | |||
| 4850 | /// Attempt to expand an n-bit div/rem/divrem by constant using a n/2-bit |
||
| 4851 | /// urem by constant and other arithmetic ops. The n/2-bit urem by constant |
||
| 4852 | /// will be expanded by DAGCombiner. This is not possible for all constant |
||
| 4853 | /// divisors. |
||
| 4854 | /// \param N Node to expand |
||
| 4855 | /// \param Result A vector that will be filled with the lo and high parts of |
||
| 4856 | /// the results. For *DIVREM, this will be the quotient parts followed |
||
| 4857 | /// by the remainder parts. |
||
| 4858 | /// \param HiLoVT The value type to use for the Lo and Hi parts. Should be |
||
| 4859 | /// half of VT. |
||
| 4860 | /// \param LL Low bits of the LHS of the operation. You can use this |
||
| 4861 | /// parameter if you want to control how low bits are extracted from |
||
| 4862 | /// the LHS. |
||
| 4863 | /// \param LH High bits of the LHS of the operation. See LL for meaning. |
||
| 4864 | /// \returns true if the node has been expanded, false if it has not. |
||
| 4865 | bool expandDIVREMByConstant(SDNode *N, SmallVectorImpl<SDValue> &Result, |
||
| 4866 | EVT HiLoVT, SelectionDAG &DAG, |
||
| 4867 | SDValue LL = SDValue(), |
||
| 4868 | SDValue LH = SDValue()) const; |
||
| 4869 | |||
| 4870 | /// Expand funnel shift. |
||
| 4871 | /// \param N Node to expand |
||
| 4872 | /// \returns The expansion if successful, SDValue() otherwise |
||
| 4873 | SDValue expandFunnelShift(SDNode *N, SelectionDAG &DAG) const; |
||
| 4874 | |||
| 4875 | /// Expand rotations. |
||
| 4876 | /// \param N Node to expand |
||
| 4877 | /// \param AllowVectorOps expand vector rotate, this should only be performed |
||
| 4878 | /// if the legalization is happening outside of LegalizeVectorOps |
||
| 4879 | /// \returns The expansion if successful, SDValue() otherwise |
||
| 4880 | SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const; |
||
| 4881 | |||
| 4882 | /// Expand shift-by-parts. |
||
| 4883 | /// \param N Node to expand |
||
| 4884 | /// \param Lo lower-output-part after conversion |
||
| 4885 | /// \param Hi upper-output-part after conversion |
||
| 4886 | void expandShiftParts(SDNode *N, SDValue &Lo, SDValue &Hi, |
||
| 4887 | SelectionDAG &DAG) const; |
||
| 4888 | |||
| 4889 | /// Expand float(f32) to SINT(i64) conversion |
||
| 4890 | /// \param N Node to expand |
||
| 4891 | /// \param Result output after conversion |
||
| 4892 | /// \returns True, if the expansion was successful, false otherwise |
||
| 4893 | bool expandFP_TO_SINT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const; |
||
| 4894 | |||
| 4895 | /// Expand float to UINT conversion |
||
| 4896 | /// \param N Node to expand |
||
| 4897 | /// \param Result output after conversion |
||
| 4898 | /// \param Chain output chain after conversion |
||
| 4899 | /// \returns True, if the expansion was successful, false otherwise |
||
| 4900 | bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain, |
||
| 4901 | SelectionDAG &DAG) const; |
||
| 4902 | |||
| 4903 | /// Expand UINT(i64) to double(f64) conversion |
||
| 4904 | /// \param N Node to expand |
||
| 4905 | /// \param Result output after conversion |
||
| 4906 | /// \param Chain output chain after conversion |
||
| 4907 | /// \returns True, if the expansion was successful, false otherwise |
||
| 4908 | bool expandUINT_TO_FP(SDNode *N, SDValue &Result, SDValue &Chain, |
||
| 4909 | SelectionDAG &DAG) const; |
||
| 4910 | |||
| 4911 | /// Expand fminnum/fmaxnum into fminnum_ieee/fmaxnum_ieee with quieted inputs. |
||
| 4912 | SDValue expandFMINNUM_FMAXNUM(SDNode *N, SelectionDAG &DAG) const; |
||
| 4913 | |||
| 4914 | /// Expand FP_TO_[US]INT_SAT into FP_TO_[US]INT and selects or min/max. |
||
| 4915 | /// \param N Node to expand |
||
| 4916 | /// \returns The expansion result |
||
| 4917 | SDValue expandFP_TO_INT_SAT(SDNode *N, SelectionDAG &DAG) const; |
||
| 4918 | |||
| 4919 | /// Expand check for floating point class. |
||
| 4920 | /// \param ResultVT The type of intrinsic call result. |
||
| 4921 | /// \param Op The tested value. |
||
| 4922 | /// \param Test The test to perform. |
||
| 4923 | /// \param Flags The optimization flags. |
||
| 4924 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4925 | SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, unsigned Test, |
||
| 4926 | SDNodeFlags Flags, const SDLoc &DL, |
||
| 4927 | SelectionDAG &DAG) const; |
||
| 4928 | |||
| 4929 | /// Expand CTPOP nodes. Expands vector/scalar CTPOP nodes, |
||
| 4930 | /// vector nodes can only succeed if all operations are legal/custom. |
||
| 4931 | /// \param N Node to expand |
||
| 4932 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4933 | SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const; |
||
| 4934 | |||
| 4935 | /// Expand VP_CTPOP nodes. |
||
| 4936 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4937 | SDValue expandVPCTPOP(SDNode *N, SelectionDAG &DAG) const; |
||
| 4938 | |||
| 4939 | /// Expand CTLZ/CTLZ_ZERO_UNDEF nodes. Expands vector/scalar CTLZ nodes, |
||
| 4940 | /// vector nodes can only succeed if all operations are legal/custom. |
||
| 4941 | /// \param N Node to expand |
||
| 4942 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4943 | SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const; |
||
| 4944 | |||
| 4945 | /// Expand VP_CTLZ/VP_CTLZ_ZERO_UNDEF nodes. |
||
| 4946 | /// \param N Node to expand |
||
| 4947 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4948 | SDValue expandVPCTLZ(SDNode *N, SelectionDAG &DAG) const; |
||
| 4949 | |||
| 4950 | /// Expand CTTZ via Table Lookup. |
||
| 4951 | /// \param N Node to expand |
||
| 4952 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4953 | SDValue CTTZTableLookup(SDNode *N, SelectionDAG &DAG, const SDLoc &DL, EVT VT, |
||
| 4954 | SDValue Op, unsigned NumBitsPerElt) const; |
||
| 4955 | |||
| 4956 | /// Expand CTTZ/CTTZ_ZERO_UNDEF nodes. Expands vector/scalar CTTZ nodes, |
||
| 4957 | /// vector nodes can only succeed if all operations are legal/custom. |
||
| 4958 | /// \param N Node to expand |
||
| 4959 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4960 | SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const; |
||
| 4961 | |||
| 4962 | /// Expand VP_CTTZ/VP_CTTZ_ZERO_UNDEF nodes. |
||
| 4963 | /// \param N Node to expand |
||
| 4964 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4965 | SDValue expandVPCTTZ(SDNode *N, SelectionDAG &DAG) const; |
||
| 4966 | |||
| 4967 | /// Expand ABS nodes. Expands vector/scalar ABS nodes, |
||
| 4968 | /// vector nodes can only succeed if all operations are legal/custom. |
||
| 4969 | /// (ABS x) -> (XOR (ADD x, (SRA x, type_size)), (SRA x, type_size)) |
||
| 4970 | /// \param N Node to expand |
||
| 4971 | /// \param IsNegative indicate negated abs |
||
| 4972 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4973 | SDValue expandABS(SDNode *N, SelectionDAG &DAG, |
||
| 4974 | bool IsNegative = false) const; |
||
| 4975 | |||
| 4976 | /// Expand BSWAP nodes. Expands scalar/vector BSWAP nodes with i16/i32/i64 |
||
| 4977 | /// scalar types. Returns SDValue() if expand fails. |
||
| 4978 | /// \param N Node to expand |
||
| 4979 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4980 | SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const; |
||
| 4981 | |||
| 4982 | /// Expand VP_BSWAP nodes. Expands VP_BSWAP nodes with |
||
| 4983 | /// i16/i32/i64 scalar types. Returns SDValue() if expand fails. \param N Node |
||
| 4984 | /// to expand \returns The expansion result or SDValue() if it fails. |
||
| 4985 | SDValue expandVPBSWAP(SDNode *N, SelectionDAG &DAG) const; |
||
| 4986 | |||
| 4987 | /// Expand BITREVERSE nodes. Expands scalar/vector BITREVERSE nodes. |
||
| 4988 | /// Returns SDValue() if expand fails. |
||
| 4989 | /// \param N Node to expand |
||
| 4990 | /// \returns The expansion result or SDValue() if it fails. |
||
| 4991 | SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const; |
||
| 4992 | |||
| 4993 | /// Expand VP_BITREVERSE nodes. Expands VP_BITREVERSE nodes with |
||
| 4994 | /// i8/i16/i32/i64 scalar types. \param N Node to expand \returns The |
||
| 4995 | /// expansion result or SDValue() if it fails. |
||
| 4996 | SDValue expandVPBITREVERSE(SDNode *N, SelectionDAG &DAG) const; |
||
| 4997 | |||
| 4998 | /// Turn load of vector type into a load of the individual elements. |
||
| 4999 | /// \param LD load to expand |
||
| 5000 | /// \returns BUILD_VECTOR and TokenFactor nodes. |
||
| 5001 | std::pair<SDValue, SDValue> scalarizeVectorLoad(LoadSDNode *LD, |
||
| 5002 | SelectionDAG &DAG) const; |
||
| 5003 | |||
| 5004 | // Turn a store of a vector type into stores of the individual elements. |
||
| 5005 | /// \param ST Store with a vector value type |
||
| 5006 | /// \returns TokenFactor of the individual store chains. |
||
| 5007 | SDValue scalarizeVectorStore(StoreSDNode *ST, SelectionDAG &DAG) const; |
||
| 5008 | |||
| 5009 | /// Expands an unaligned load to 2 half-size loads for an integer, and |
||
| 5010 | /// possibly more for vectors. |
||
| 5011 | std::pair<SDValue, SDValue> expandUnalignedLoad(LoadSDNode *LD, |
||
| 5012 | SelectionDAG &DAG) const; |
||
| 5013 | |||
| 5014 | /// Expands an unaligned store to 2 half-size stores for integer values, and |
||
| 5015 | /// possibly more for vectors. |
||
| 5016 | SDValue expandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG) const; |
||
| 5017 | |||
| 5018 | /// Increments memory address \p Addr according to the type of the value |
||
| 5019 | /// \p DataVT that should be stored. If the data is stored in compressed |
||
| 5020 | /// form, the memory address should be incremented according to the number of |
||
| 5021 | /// the stored elements. This number is equal to the number of '1's bits |
||
| 5022 | /// in the \p Mask. |
||
| 5023 | /// \p DataVT is a vector type. \p Mask is a vector value. |
||
| 5024 | /// \p DataVT and \p Mask have the same number of vector elements. |
||
| 5025 | SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL, |
||
| 5026 | EVT DataVT, SelectionDAG &DAG, |
||
| 5027 | bool IsCompressedMemory) const; |
||
| 5028 | |||
| 5029 | /// Get a pointer to vector element \p Idx located in memory for a vector of |
||
| 5030 | /// type \p VecVT starting at a base address of \p VecPtr. If \p Idx is out of |
||
| 5031 | /// bounds the returned pointer is unspecified, but will be within the vector |
||
| 5032 | /// bounds. |
||
| 5033 | SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, |
||
| 5034 | SDValue Index) const; |
||
| 5035 | |||
| 5036 | /// Get a pointer to a sub-vector of type \p SubVecVT at index \p Idx located |
||
| 5037 | /// in memory for a vector of type \p VecVT starting at a base address of |
||
| 5038 | /// \p VecPtr. If \p Idx plus the size of \p SubVecVT is out of bounds the |
||
| 5039 | /// returned pointer is unspecified, but the value returned will be such that |
||
| 5040 | /// the entire subvector would be within the vector bounds. |
||
| 5041 | SDValue getVectorSubVecPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, |
||
| 5042 | EVT SubVecVT, SDValue Index) const; |
||
| 5043 | |||
| 5044 | /// Method for building the DAG expansion of ISD::[US][MIN|MAX]. This |
||
| 5045 | /// method accepts integers as its arguments. |
||
| 5046 | SDValue expandIntMINMAX(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5047 | |||
| 5048 | /// Method for building the DAG expansion of ISD::[US][ADD|SUB]SAT. This |
||
| 5049 | /// method accepts integers as its arguments. |
||
| 5050 | SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5051 | |||
| 5052 | /// Method for building the DAG expansion of ISD::[US]SHLSAT. This |
||
| 5053 | /// method accepts integers as its arguments. |
||
| 5054 | SDValue expandShlSat(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5055 | |||
| 5056 | /// Method for building the DAG expansion of ISD::[U|S]MULFIX[SAT]. This |
||
| 5057 | /// method accepts integers as its arguments. |
||
| 5058 | SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5059 | |||
| 5060 | /// Method for building the DAG expansion of ISD::[US]DIVFIX[SAT]. This |
||
| 5061 | /// method accepts integers as its arguments. |
||
| 5062 | /// Note: This method may fail if the division could not be performed |
||
| 5063 | /// within the type. Clients must retry with a wider type if this happens. |
||
| 5064 | SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl, |
||
| 5065 | SDValue LHS, SDValue RHS, |
||
| 5066 | unsigned Scale, SelectionDAG &DAG) const; |
||
| 5067 | |||
| 5068 | /// Method for building the DAG expansion of ISD::U(ADD|SUB)O. Expansion |
||
| 5069 | /// always suceeds and populates the Result and Overflow arguments. |
||
| 5070 | void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, |
||
| 5071 | SelectionDAG &DAG) const; |
||
| 5072 | |||
| 5073 | /// Method for building the DAG expansion of ISD::S(ADD|SUB)O. Expansion |
||
| 5074 | /// always suceeds and populates the Result and Overflow arguments. |
||
| 5075 | void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, |
||
| 5076 | SelectionDAG &DAG) const; |
||
| 5077 | |||
| 5078 | /// Method for building the DAG expansion of ISD::[US]MULO. Returns whether |
||
| 5079 | /// expansion was successful and populates the Result and Overflow arguments. |
||
| 5080 | bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow, |
||
| 5081 | SelectionDAG &DAG) const; |
||
| 5082 | |||
| 5083 | /// Expand a VECREDUCE_* into an explicit calculation. If Count is specified, |
||
| 5084 | /// only the first Count elements of the vector are used. |
||
| 5085 | SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5086 | |||
| 5087 | /// Expand a VECREDUCE_SEQ_* into an explicit ordered calculation. |
||
| 5088 | SDValue expandVecReduceSeq(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5089 | |||
| 5090 | /// Expand an SREM or UREM using SDIV/UDIV or SDIVREM/UDIVREM, if legal. |
||
| 5091 | /// Returns true if the expansion was successful. |
||
| 5092 | bool expandREM(SDNode *Node, SDValue &Result, SelectionDAG &DAG) const; |
||
| 5093 | |||
| 5094 | /// Method for building the DAG expansion of ISD::VECTOR_SPLICE. This |
||
| 5095 | /// method accepts vectors as its arguments. |
||
| 5096 | SDValue expandVectorSplice(SDNode *Node, SelectionDAG &DAG) const; |
||
| 5097 | |||
| 5098 | /// Legalize a SETCC or VP_SETCC with given LHS and RHS and condition code CC |
||
| 5099 | /// on the current target. A VP_SETCC will additionally be given a Mask |
||
| 5100 | /// and/or EVL not equal to SDValue(). |
||
| 5101 | /// |
||
| 5102 | /// If the SETCC has been legalized using AND / OR, then the legalized node |
||
| 5103 | /// will be stored in LHS. RHS and CC will be set to SDValue(). NeedInvert |
||
| 5104 | /// will be set to false. This will also hold if the VP_SETCC has been |
||
| 5105 | /// legalized using VP_AND / VP_OR. |
||
| 5106 | /// |
||
| 5107 | /// If the SETCC / VP_SETCC has been legalized by using |
||
| 5108 | /// getSetCCSwappedOperands(), then the values of LHS and RHS will be |
||
| 5109 | /// swapped, CC will be set to the new condition, and NeedInvert will be set |
||
| 5110 | /// to false. |
||
| 5111 | /// |
||
| 5112 | /// If the SETCC / VP_SETCC has been legalized using the inverse condcode, |
||
| 5113 | /// then LHS and RHS will be unchanged, CC will set to the inverted condcode, |
||
| 5114 | /// and NeedInvert will be set to true. The caller must invert the result of |
||
| 5115 | /// the SETCC with SelectionDAG::getLogicalNOT() or take equivalent action to |
||
| 5116 | /// swap the effect of a true/false result. |
||
| 5117 | /// |
||
| 5118 | /// \returns true if the SETCC / VP_SETCC has been legalized, false if it |
||
| 5119 | /// hasn't. |
||
| 5120 | bool LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS, |
||
| 5121 | SDValue &RHS, SDValue &CC, SDValue Mask, |
||
| 5122 | SDValue EVL, bool &NeedInvert, const SDLoc &dl, |
||
| 5123 | SDValue &Chain, bool IsSignaling = false) const; |
||
| 5124 | |||
| 5125 | //===--------------------------------------------------------------------===// |
||
| 5126 | // Instruction Emitting Hooks |
||
| 5127 | // |
||
| 5128 | |||
| 5129 | /// This method should be implemented by targets that mark instructions with |
||
| 5130 | /// the 'usesCustomInserter' flag. These instructions are special in various |
||
| 5131 | /// ways, which require special support to insert. The specified MachineInstr |
||
| 5132 | /// is created but not inserted into any basic blocks, and this method is |
||
| 5133 | /// called to expand it into a sequence of instructions, potentially also |
||
| 5134 | /// creating new basic blocks and control flow. |
||
| 5135 | /// As long as the returned basic block is different (i.e., we created a new |
||
| 5136 | /// one), the custom inserter is free to modify the rest of \p MBB. |
||
| 5137 | virtual MachineBasicBlock * |
||
| 5138 | EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const; |
||
| 5139 | |||
| 5140 | /// This method should be implemented by targets that mark instructions with |
||
| 5141 | /// the 'hasPostISelHook' flag. These instructions must be adjusted after |
||
| 5142 | /// instruction selection by target hooks. e.g. To fill in optional defs for |
||
| 5143 | /// ARM 's' setting instructions. |
||
| 5144 | virtual void AdjustInstrPostInstrSelection(MachineInstr &MI, |
||
| 5145 | SDNode *Node) const; |
||
| 5146 | |||
| 5147 | /// If this function returns true, SelectionDAGBuilder emits a |
||
| 5148 | /// LOAD_STACK_GUARD node when it is lowering Intrinsic::stackprotector. |
||
| 5149 | virtual bool useLoadStackGuardNode() const { |
||
| 5150 | return false; |
||
| 5151 | } |
||
| 5152 | |||
| 5153 | virtual SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val, |
||
| 5154 | const SDLoc &DL) const { |
||
| 5155 | llvm_unreachable("not implemented for this target"); |
||
| 5156 | } |
||
| 5157 | |||
| 5158 | /// Lower TLS global address SDNode for target independent emulated TLS model. |
||
| 5159 | virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, |
||
| 5160 | SelectionDAG &DAG) const; |
||
| 5161 | |||
| 5162 | /// Expands target specific indirect branch for the case of JumpTable |
||
| 5163 | /// expanasion. |
||
| 5164 | virtual SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value, SDValue Addr, |
||
| 5165 | SelectionDAG &DAG) const { |
||
| 5166 | return DAG.getNode(ISD::BRIND, dl, MVT::Other, Value, Addr); |
||
| 5167 | } |
||
| 5168 | |||
| 5169 | // seteq(x, 0) -> truncate(srl(ctlz(zext(x)), log2(#bits))) |
||
| 5170 | // If we're comparing for equality to zero and isCtlzFast is true, expose the |
||
| 5171 | // fact that this can be implemented as a ctlz/srl pair, so that the dag |
||
| 5172 | // combiner can fold the new nodes. |
||
| 5173 | SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const; |
||
| 5174 | |||
| 5175 | private: |
||
| 5176 | SDValue foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, |
||
| 5177 | const SDLoc &DL, DAGCombinerInfo &DCI) const; |
||
| 5178 | SDValue foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, |
||
| 5179 | const SDLoc &DL, DAGCombinerInfo &DCI) const; |
||
| 5180 | |||
| 5181 | SDValue optimizeSetCCOfSignedTruncationCheck(EVT SCCVT, SDValue N0, |
||
| 5182 | SDValue N1, ISD::CondCode Cond, |
||
| 5183 | DAGCombinerInfo &DCI, |
||
| 5184 | const SDLoc &DL) const; |
||
| 5185 | |||
| 5186 | // (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0 |
||
| 5187 | SDValue optimizeSetCCByHoistingAndByConstFromLogicalShift( |
||
| 5188 | EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond, |
||
| 5189 | DAGCombinerInfo &DCI, const SDLoc &DL) const; |
||
| 5190 | |||
| 5191 | SDValue prepareUREMEqFold(EVT SETCCVT, SDValue REMNode, |
||
| 5192 | SDValue CompTargetNode, ISD::CondCode Cond, |
||
| 5193 | DAGCombinerInfo &DCI, const SDLoc &DL, |
||
| 5194 | SmallVectorImpl<SDNode *> &Created) const; |
||
| 5195 | SDValue buildUREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode, |
||
| 5196 | ISD::CondCode Cond, DAGCombinerInfo &DCI, |
||
| 5197 | const SDLoc &DL) const; |
||
| 5198 | |||
| 5199 | SDValue prepareSREMEqFold(EVT SETCCVT, SDValue REMNode, |
||
| 5200 | SDValue CompTargetNode, ISD::CondCode Cond, |
||
| 5201 | DAGCombinerInfo &DCI, const SDLoc &DL, |
||
| 5202 | SmallVectorImpl<SDNode *> &Created) const; |
||
| 5203 | SDValue buildSREMEqFold(EVT SETCCVT, SDValue REMNode, SDValue CompTargetNode, |
||
| 5204 | ISD::CondCode Cond, DAGCombinerInfo &DCI, |
||
| 5205 | const SDLoc &DL) const; |
||
| 5206 | }; |
||
| 5207 | |||
| 5208 | /// Given an LLVM IR type and return type attributes, compute the return value |
||
| 5209 | /// EVTs and flags, and optionally also the offsets, if the return value is |
||
| 5210 | /// being lowered to memory. |
||
| 5211 | void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, |
||
| 5212 | SmallVectorImpl<ISD::OutputArg> &Outs, |
||
| 5213 | const TargetLowering &TLI, const DataLayout &DL); |
||
| 5214 | |||
| 5215 | } // end namespace llvm |
||
| 5216 | |||
| 5217 | #endif // LLVM_CODEGEN_TARGETLOWERING_H |