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 |