1 //===- llvm/CodeGen/GlobalISel/InstructionSelector.h ------------*- 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 This file declares the API for the instruction selector. 10 /// This class is responsible for selecting machine instructions. 11 /// It's implemented by the target. It's used by the InstructionSelect pass. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H 16 #define LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H 17 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/Optional.h" 20 #include "llvm/ADT/SmallVector.h" 21 #include "llvm/Analysis/BlockFrequencyInfo.h" 22 #include "llvm/Analysis/ProfileSummaryInfo.h" 23 #include "llvm/CodeGen/GlobalISel/Utils.h" 24 #include "llvm/CodeGen/MachineBasicBlock.h" 25 #include "llvm/CodeGen/MachineFunction.h" 26 #include "llvm/Support/CodeGenCoverage.h" 27 #include "llvm/Support/LowLevelTypeImpl.h" 28 #include <bitset> 29 #include <cstddef> 30 #include <cstdint> 31 #include <functional> 32 #include <initializer_list> 33 #include <vector> 34 35 namespace llvm { 36 37 class APInt; 38 class APFloat; 39 class GISelKnownBits; 40 class MachineInstr; 41 class MachineInstrBuilder; 42 class MachineFunction; 43 class MachineOperand; 44 class MachineRegisterInfo; 45 class RegisterBankInfo; 46 class TargetInstrInfo; 47 class TargetRegisterInfo; 48 49 /// Container class for CodeGen predicate results. 50 /// This is convenient because std::bitset does not have a constructor 51 /// with an initializer list of set bits. 52 /// 53 /// Each InstructionSelector subclass should define a PredicateBitset class 54 /// with: 55 /// const unsigned MAX_SUBTARGET_PREDICATES = 192; 56 /// using PredicateBitset = PredicateBitsetImpl<MAX_SUBTARGET_PREDICATES>; 57 /// and updating the constant to suit the target. Tablegen provides a suitable 58 /// definition for the predicates in use in <Target>GenGlobalISel.inc when 59 /// GET_GLOBALISEL_PREDICATE_BITSET is defined. 60 template <std::size_t MaxPredicates> 61 class PredicateBitsetImpl : public std::bitset<MaxPredicates> { 62 public: 63 // Cannot inherit constructors because it's not supported by VC++.. 64 PredicateBitsetImpl() = default; 65 66 PredicateBitsetImpl(const std::bitset<MaxPredicates> &B) 67 : std::bitset<MaxPredicates>(B) {} 68 69 PredicateBitsetImpl(std::initializer_list<unsigned> Init) { 70 for (auto I : Init) 71 std::bitset<MaxPredicates>::set(I); 72 } 73 }; 74 75 enum { 76 /// Begin a try-block to attempt a match and jump to OnFail if it is 77 /// unsuccessful. 78 /// - OnFail - The MatchTable entry at which to resume if the match fails. 79 /// 80 /// FIXME: This ought to take an argument indicating the number of try-blocks 81 /// to exit on failure. It's usually one but the last match attempt of 82 /// a block will need more. The (implemented) alternative is to tack a 83 /// GIM_Reject on the end of each try-block which is simpler but 84 /// requires an extra opcode and iteration in the interpreter on each 85 /// failed match. 86 GIM_Try, 87 88 /// Switch over the opcode on the specified instruction 89 /// - InsnID - Instruction ID 90 /// - LowerBound - numerically minimum opcode supported 91 /// - UpperBound - numerically maximum + 1 opcode supported 92 /// - Default - failure jump target 93 /// - JumpTable... - (UpperBound - LowerBound) (at least 2) jump targets 94 GIM_SwitchOpcode, 95 96 /// Switch over the LLT on the specified instruction operand 97 /// - InsnID - Instruction ID 98 /// - OpIdx - Operand index 99 /// - LowerBound - numerically minimum Type ID supported 100 /// - UpperBound - numerically maximum + 1 Type ID supported 101 /// - Default - failure jump target 102 /// - JumpTable... - (UpperBound - LowerBound) (at least 2) jump targets 103 GIM_SwitchType, 104 105 /// Record the specified instruction 106 /// - NewInsnID - Instruction ID to define 107 /// - InsnID - Instruction ID 108 /// - OpIdx - Operand index 109 GIM_RecordInsn, 110 111 /// Check the feature bits 112 /// - Expected features 113 GIM_CheckFeatures, 114 115 /// Check the opcode on the specified instruction 116 /// - InsnID - Instruction ID 117 /// - Expected opcode 118 GIM_CheckOpcode, 119 120 /// Check the opcode on the specified instruction, checking 2 acceptable 121 /// alternatives. 122 /// - InsnID - Instruction ID 123 /// - Expected opcode 124 /// - Alternative expected opcode 125 GIM_CheckOpcodeIsEither, 126 127 /// Check the instruction has the right number of operands 128 /// - InsnID - Instruction ID 129 /// - Expected number of operands 130 GIM_CheckNumOperands, 131 /// Check an immediate predicate on the specified instruction 132 /// - InsnID - Instruction ID 133 /// - The predicate to test 134 GIM_CheckI64ImmPredicate, 135 /// Check an immediate predicate on the specified instruction via an APInt. 136 /// - InsnID - Instruction ID 137 /// - The predicate to test 138 GIM_CheckAPIntImmPredicate, 139 /// Check a floating point immediate predicate on the specified instruction. 140 /// - InsnID - Instruction ID 141 /// - The predicate to test 142 GIM_CheckAPFloatImmPredicate, 143 /// Check an immediate predicate on the specified instruction 144 /// - InsnID - Instruction ID 145 /// - OpIdx - Operand index 146 /// - The predicate to test 147 GIM_CheckImmOperandPredicate, 148 /// Check a memory operation has the specified atomic ordering. 149 /// - InsnID - Instruction ID 150 /// - Ordering - The AtomicOrdering value 151 GIM_CheckAtomicOrdering, 152 GIM_CheckAtomicOrderingOrStrongerThan, 153 GIM_CheckAtomicOrderingWeakerThan, 154 /// Check the size of the memory access for the given machine memory operand. 155 /// - InsnID - Instruction ID 156 /// - MMOIdx - MMO index 157 /// - Size - The size in bytes of the memory access 158 GIM_CheckMemorySizeEqualTo, 159 160 /// Check the address space of the memory access for the given machine memory 161 /// operand. 162 /// - InsnID - Instruction ID 163 /// - MMOIdx - MMO index 164 /// - NumAddrSpace - Number of valid address spaces 165 /// - AddrSpaceN - An allowed space of the memory access 166 /// - AddrSpaceN+1 ... 167 GIM_CheckMemoryAddressSpace, 168 169 /// Check the minimum alignment of the memory access for the given machine 170 /// memory operand. 171 /// - InsnID - Instruction ID 172 /// - MMOIdx - MMO index 173 /// - MinAlign - Minimum acceptable alignment 174 GIM_CheckMemoryAlignment, 175 176 /// Check the size of the memory access for the given machine memory operand 177 /// against the size of an operand. 178 /// - InsnID - Instruction ID 179 /// - MMOIdx - MMO index 180 /// - OpIdx - The operand index to compare the MMO against 181 GIM_CheckMemorySizeEqualToLLT, 182 GIM_CheckMemorySizeLessThanLLT, 183 GIM_CheckMemorySizeGreaterThanLLT, 184 185 /// Check if this is a vector that can be treated as a vector splat 186 /// constant. This is valid for both G_BUILD_VECTOR as well as 187 /// G_BUILD_VECTOR_TRUNC. For AllOnes refers to individual bits, so a -1 188 /// element. 189 /// - InsnID - Instruction ID 190 GIM_CheckIsBuildVectorAllOnes, 191 GIM_CheckIsBuildVectorAllZeros, 192 193 /// Check a generic C++ instruction predicate 194 /// - InsnID - Instruction ID 195 /// - PredicateID - The ID of the predicate function to call 196 GIM_CheckCxxInsnPredicate, 197 198 /// Check the type for the specified operand 199 /// - InsnID - Instruction ID 200 /// - OpIdx - Operand index 201 /// - Expected type 202 GIM_CheckType, 203 /// Check the type of a pointer to any address space. 204 /// - InsnID - Instruction ID 205 /// - OpIdx - Operand index 206 /// - SizeInBits - The size of the pointer value in bits. 207 GIM_CheckPointerToAny, 208 /// Check the register bank for the specified operand 209 /// - InsnID - Instruction ID 210 /// - OpIdx - Operand index 211 /// - Expected register bank (specified as a register class) 212 GIM_CheckRegBankForClass, 213 214 /// Check the operand matches a complex predicate 215 /// - InsnID - Instruction ID 216 /// - OpIdx - Operand index 217 /// - RendererID - The renderer to hold the result 218 /// - Complex predicate ID 219 GIM_CheckComplexPattern, 220 221 /// Check the operand is a specific integer 222 /// - InsnID - Instruction ID 223 /// - OpIdx - Operand index 224 /// - Expected integer 225 GIM_CheckConstantInt, 226 /// Check the operand is a specific literal integer (i.e. MO.isImm() or 227 /// MO.isCImm() is true). 228 /// - InsnID - Instruction ID 229 /// - OpIdx - Operand index 230 /// - Expected integer 231 GIM_CheckLiteralInt, 232 /// Check the operand is a specific intrinsic ID 233 /// - InsnID - Instruction ID 234 /// - OpIdx - Operand index 235 /// - Expected Intrinsic ID 236 GIM_CheckIntrinsicID, 237 238 /// Check the operand is a specific predicate 239 /// - InsnID - Instruction ID 240 /// - OpIdx - Operand index 241 /// - Expected predicate 242 GIM_CheckCmpPredicate, 243 244 /// Check the specified operand is an MBB 245 /// - InsnID - Instruction ID 246 /// - OpIdx - Operand index 247 GIM_CheckIsMBB, 248 249 /// Check the specified operand is an Imm 250 /// - InsnID - Instruction ID 251 /// - OpIdx - Operand index 252 GIM_CheckIsImm, 253 254 /// Check if the specified operand is safe to fold into the current 255 /// instruction. 256 /// - InsnID - Instruction ID 257 GIM_CheckIsSafeToFold, 258 259 /// Check the specified operands are identical. 260 /// - InsnID - Instruction ID 261 /// - OpIdx - Operand index 262 /// - OtherInsnID - Other instruction ID 263 /// - OtherOpIdx - Other operand index 264 GIM_CheckIsSameOperand, 265 266 /// Predicates with 'let PredicateCodeUsesOperands = 1' need to examine some 267 /// named operands that will be recorded in RecordedOperands. Names of these 268 /// operands are referenced in predicate argument list. Emitter determines 269 /// StoreIdx(corresponds to the order in which names appear in argument list). 270 /// - InsnID - Instruction ID 271 /// - OpIdx - Operand index 272 /// - StoreIdx - Store location in RecordedOperands. 273 GIM_RecordNamedOperand, 274 275 /// Fail the current try-block, or completely fail to match if there is no 276 /// current try-block. 277 GIM_Reject, 278 279 //=== Renderers === 280 281 /// Mutate an instruction 282 /// - NewInsnID - Instruction ID to define 283 /// - OldInsnID - Instruction ID to mutate 284 /// - NewOpcode - The new opcode to use 285 GIR_MutateOpcode, 286 287 /// Build a new instruction 288 /// - InsnID - Instruction ID to define 289 /// - Opcode - The new opcode to use 290 GIR_BuildMI, 291 292 /// Copy an operand to the specified instruction 293 /// - NewInsnID - Instruction ID to modify 294 /// - OldInsnID - Instruction ID to copy from 295 /// - OpIdx - The operand to copy 296 GIR_Copy, 297 298 /// Copy an operand to the specified instruction or add a zero register if the 299 /// operand is a zero immediate. 300 /// - NewInsnID - Instruction ID to modify 301 /// - OldInsnID - Instruction ID to copy from 302 /// - OpIdx - The operand to copy 303 /// - ZeroReg - The zero register to use 304 GIR_CopyOrAddZeroReg, 305 /// Copy an operand to the specified instruction 306 /// - NewInsnID - Instruction ID to modify 307 /// - OldInsnID - Instruction ID to copy from 308 /// - OpIdx - The operand to copy 309 /// - SubRegIdx - The subregister to copy 310 GIR_CopySubReg, 311 312 /// Add an implicit register def to the specified instruction 313 /// - InsnID - Instruction ID to modify 314 /// - RegNum - The register to add 315 GIR_AddImplicitDef, 316 /// Add an implicit register use to the specified instruction 317 /// - InsnID - Instruction ID to modify 318 /// - RegNum - The register to add 319 GIR_AddImplicitUse, 320 /// Add an register to the specified instruction 321 /// - InsnID - Instruction ID to modify 322 /// - RegNum - The register to add 323 GIR_AddRegister, 324 325 /// Add a temporary register to the specified instruction 326 /// - InsnID - Instruction ID to modify 327 /// - TempRegID - The temporary register ID to add 328 /// - TempRegFlags - The register flags to set 329 GIR_AddTempRegister, 330 331 /// Add a temporary register to the specified instruction 332 /// - InsnID - Instruction ID to modify 333 /// - TempRegID - The temporary register ID to add 334 /// - TempRegFlags - The register flags to set 335 /// - SubRegIndex - The subregister index to set 336 GIR_AddTempSubRegister, 337 338 /// Add an immediate to the specified instruction 339 /// - InsnID - Instruction ID to modify 340 /// - Imm - The immediate to add 341 GIR_AddImm, 342 /// Render complex operands to the specified instruction 343 /// - InsnID - Instruction ID to modify 344 /// - RendererID - The renderer to call 345 GIR_ComplexRenderer, 346 347 /// Render sub-operands of complex operands to the specified instruction 348 /// - InsnID - Instruction ID to modify 349 /// - RendererID - The renderer to call 350 /// - RenderOpID - The suboperand to render. 351 GIR_ComplexSubOperandRenderer, 352 /// Render operands to the specified instruction using a custom function 353 /// - InsnID - Instruction ID to modify 354 /// - OldInsnID - Instruction ID to get the matched operand from 355 /// - RendererFnID - Custom renderer function to call 356 GIR_CustomRenderer, 357 358 /// Render operands to the specified instruction using a custom function, 359 /// reading from a specific operand. 360 /// - InsnID - Instruction ID to modify 361 /// - OldInsnID - Instruction ID to get the matched operand from 362 /// - OpIdx - Operand index in OldInsnID the render function should read from.. 363 /// - RendererFnID - Custom renderer function to call 364 GIR_CustomOperandRenderer, 365 366 /// Render a G_CONSTANT operator as a sign-extended immediate. 367 /// - NewInsnID - Instruction ID to modify 368 /// - OldInsnID - Instruction ID to copy from 369 /// The operand index is implicitly 1. 370 GIR_CopyConstantAsSImm, 371 372 /// Render a G_FCONSTANT operator as a sign-extended immediate. 373 /// - NewInsnID - Instruction ID to modify 374 /// - OldInsnID - Instruction ID to copy from 375 /// The operand index is implicitly 1. 376 GIR_CopyFConstantAsFPImm, 377 378 /// Constrain an instruction operand to a register class. 379 /// - InsnID - Instruction ID to modify 380 /// - OpIdx - Operand index 381 /// - RCEnum - Register class enumeration value 382 GIR_ConstrainOperandRC, 383 384 /// Constrain an instructions operands according to the instruction 385 /// description. 386 /// - InsnID - Instruction ID to modify 387 GIR_ConstrainSelectedInstOperands, 388 389 /// Merge all memory operands into instruction. 390 /// - InsnID - Instruction ID to modify 391 /// - MergeInsnID... - One or more Instruction ID to merge into the result. 392 /// - GIU_MergeMemOperands_EndOfList - Terminates the list of instructions to 393 /// merge. 394 GIR_MergeMemOperands, 395 396 /// Erase from parent. 397 /// - InsnID - Instruction ID to erase 398 GIR_EraseFromParent, 399 400 /// Create a new temporary register that's not constrained. 401 /// - TempRegID - The temporary register ID to initialize. 402 /// - Expected type 403 GIR_MakeTempReg, 404 405 /// A successful emission 406 GIR_Done, 407 408 /// Increment the rule coverage counter. 409 /// - RuleID - The ID of the rule that was covered. 410 GIR_Coverage, 411 412 /// Keeping track of the number of the GI opcodes. Must be the last entry. 413 GIU_NumOpcodes, 414 }; 415 416 enum { 417 /// Indicates the end of the variable-length MergeInsnID list in a 418 /// GIR_MergeMemOperands opcode. 419 GIU_MergeMemOperands_EndOfList = -1, 420 }; 421 422 /// Provides the logic to select generic machine instructions. 423 class InstructionSelector { 424 public: 425 virtual ~InstructionSelector() = default; 426 427 /// Select the (possibly generic) instruction \p I to only use target-specific 428 /// opcodes. It is OK to insert multiple instructions, but they cannot be 429 /// generic pre-isel instructions. 430 /// 431 /// \returns whether selection succeeded. 432 /// \pre I.getParent() && I.getParent()->getParent() 433 /// \post 434 /// if returns true: 435 /// for I in all mutated/inserted instructions: 436 /// !isPreISelGenericOpcode(I.getOpcode()) 437 virtual bool select(MachineInstr &I) = 0; 438 439 CodeGenCoverage *CoverageInfo = nullptr; 440 GISelKnownBits *KnownBits = nullptr; 441 MachineFunction *MF = nullptr; 442 ProfileSummaryInfo *PSI = nullptr; 443 BlockFrequencyInfo *BFI = nullptr; 444 // For some predicates, we need to track the current MBB. 445 MachineBasicBlock *CurMBB = nullptr; 446 447 virtual void setupGeneratedPerFunctionState(MachineFunction &MF) { 448 llvm_unreachable("TableGen should have emitted implementation"); 449 } 450 451 /// Setup per-MF selector state. 452 virtual void setupMF(MachineFunction &mf, GISelKnownBits *KB, 453 CodeGenCoverage &covinfo, ProfileSummaryInfo *psi, 454 BlockFrequencyInfo *bfi) { 455 CoverageInfo = &covinfo; 456 KnownBits = KB; 457 MF = &mf; 458 PSI = psi; 459 BFI = bfi; 460 CurMBB = nullptr; 461 setupGeneratedPerFunctionState(mf); 462 } 463 464 protected: 465 using ComplexRendererFns = 466 Optional<SmallVector<std::function<void(MachineInstrBuilder &)>, 4>>; 467 using RecordedMIVector = SmallVector<MachineInstr *, 4>; 468 using NewMIVector = SmallVector<MachineInstrBuilder, 4>; 469 470 struct MatcherState { 471 std::vector<ComplexRendererFns::value_type> Renderers; 472 RecordedMIVector MIs; 473 DenseMap<unsigned, unsigned> TempRegisters; 474 /// Named operands that predicate with 'let PredicateCodeUsesOperands = 1' 475 /// referenced in its argument list. Operands are inserted at index set by 476 /// emitter, it corresponds to the order in which names appear in argument 477 /// list. Currently such predicates don't have more then 3 arguments. 478 std::array<const MachineOperand *, 3> RecordedOperands; 479 480 MatcherState(unsigned MaxRenderers); 481 }; 482 483 bool shouldOptForSize(const MachineFunction *MF) const { 484 const auto &F = MF->getFunction(); 485 return F.hasOptSize() || F.hasMinSize() || 486 (PSI && BFI && CurMBB && llvm::shouldOptForSize(*CurMBB, PSI, BFI)); 487 } 488 489 public: 490 template <class PredicateBitset, class ComplexMatcherMemFn, 491 class CustomRendererFn> 492 struct ISelInfoTy { 493 ISelInfoTy(const LLT *TypeObjects, size_t NumTypeObjects, 494 const PredicateBitset *FeatureBitsets, 495 const ComplexMatcherMemFn *ComplexPredicates, 496 const CustomRendererFn *CustomRenderers) 497 : TypeObjects(TypeObjects), 498 FeatureBitsets(FeatureBitsets), 499 ComplexPredicates(ComplexPredicates), 500 CustomRenderers(CustomRenderers) { 501 502 for (size_t I = 0; I < NumTypeObjects; ++I) 503 TypeIDMap[TypeObjects[I]] = I; 504 } 505 const LLT *TypeObjects; 506 const PredicateBitset *FeatureBitsets; 507 const ComplexMatcherMemFn *ComplexPredicates; 508 const CustomRendererFn *CustomRenderers; 509 510 SmallDenseMap<LLT, unsigned, 64> TypeIDMap; 511 }; 512 513 protected: 514 InstructionSelector(); 515 516 /// Execute a given matcher table and return true if the match was successful 517 /// and false otherwise. 518 template <class TgtInstructionSelector, class PredicateBitset, 519 class ComplexMatcherMemFn, class CustomRendererFn> 520 bool executeMatchTable( 521 TgtInstructionSelector &ISel, NewMIVector &OutMIs, MatcherState &State, 522 const ISelInfoTy<PredicateBitset, ComplexMatcherMemFn, CustomRendererFn> 523 &ISelInfo, 524 const int64_t *MatchTable, const TargetInstrInfo &TII, 525 MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, 526 const RegisterBankInfo &RBI, const PredicateBitset &AvailableFeatures, 527 CodeGenCoverage &CoverageInfo) const; 528 529 virtual const int64_t *getMatchTable() const { 530 llvm_unreachable("Should have been overridden by tablegen if used"); 531 } 532 533 virtual bool testImmPredicate_I64(unsigned, int64_t) const { 534 llvm_unreachable( 535 "Subclasses must override this with a tablegen-erated function"); 536 } 537 virtual bool testImmPredicate_APInt(unsigned, const APInt &) const { 538 llvm_unreachable( 539 "Subclasses must override this with a tablegen-erated function"); 540 } 541 virtual bool testImmPredicate_APFloat(unsigned, const APFloat &) const { 542 llvm_unreachable( 543 "Subclasses must override this with a tablegen-erated function"); 544 } 545 virtual bool testMIPredicate_MI( 546 unsigned, const MachineInstr &, 547 const std::array<const MachineOperand *, 3> &Operands) const { 548 llvm_unreachable( 549 "Subclasses must override this with a tablegen-erated function"); 550 } 551 552 bool isOperandImmEqual(const MachineOperand &MO, int64_t Value, 553 const MachineRegisterInfo &MRI) const; 554 555 /// Return true if the specified operand is a G_PTR_ADD with a G_CONSTANT on the 556 /// right-hand side. GlobalISel's separation of pointer and integer types 557 /// means that we don't need to worry about G_OR with equivalent semantics. 558 bool isBaseWithConstantOffset(const MachineOperand &Root, 559 const MachineRegisterInfo &MRI) const; 560 561 /// Return true if MI can obviously be folded into IntoMI. 562 /// MI and IntoMI do not need to be in the same basic blocks, but MI must 563 /// preceed IntoMI. 564 bool isObviouslySafeToFold(MachineInstr &MI, MachineInstr &IntoMI) const; 565 }; 566 567 } // end namespace llvm 568 569 #endif // LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H 570