Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

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