LLVM 20.0.0git
AArch64InstrInfo.h
Go to the documentation of this file.
1//===- AArch64InstrInfo.h - AArch64 Instruction Information -----*- 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// This file contains the AArch64 implementation of the TargetInstrInfo class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64INSTRINFO_H
14#define LLVM_LIB_TARGET_AARCH64_AARCH64INSTRINFO_H
15
16#include "AArch64.h"
17#include "AArch64RegisterInfo.h"
20#include <optional>
21
22#define GET_INSTRINFO_HEADER
23#include "AArch64GenInstrInfo.inc"
24
25namespace llvm {
26
27class AArch64Subtarget;
28
33
34#define FALKOR_STRIDED_ACCESS_MD "falkor.strided.access"
35
36// AArch64 MachineCombiner patterns
38 // These are patterns used to reduce the length of dependence chain.
41
42 // These are multiply-add patterns matched by the AArch64 machine combiner.
55 // NEON integers vectors
68
81
90
99
100 // Floating Point
162
173
175};
177 const AArch64RegisterInfo RI;
178 const AArch64Subtarget &Subtarget;
179
180public:
181 explicit AArch64InstrInfo(const AArch64Subtarget &STI);
182
183 /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
184 /// such, whenever a client has an instance of instruction info, it should
185 /// always be able to get register info as well (through this method).
186 const AArch64RegisterInfo &getRegisterInfo() const { return RI; }
187
188 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
189
190 bool isAsCheapAsAMove(const MachineInstr &MI) const override;
191
192 bool isCoalescableExtInstr(const MachineInstr &MI, Register &SrcReg,
193 Register &DstReg, unsigned &SubIdx) const override;
194
195 bool
197 const MachineInstr &MIb) const override;
198
200 int &FrameIndex) const override;
202 int &FrameIndex) const override;
203
204 /// Does this instruction set its full destination register to zero?
205 static bool isGPRZero(const MachineInstr &MI);
206
207 /// Does this instruction rename a GPR without modifying bits?
208 static bool isGPRCopy(const MachineInstr &MI);
209
210 /// Does this instruction rename an FPR without modifying bits?
211 static bool isFPRCopy(const MachineInstr &MI);
212
213 /// Return true if pairing the given load or store is hinted to be
214 /// unprofitable.
215 static bool isLdStPairSuppressed(const MachineInstr &MI);
216
217 /// Return true if the given load or store is a strided memory access.
218 static bool isStridedAccess(const MachineInstr &MI);
219
220 /// Return true if it has an unscaled load/store offset.
221 static bool hasUnscaledLdStOffset(unsigned Opc);
223 return hasUnscaledLdStOffset(MI.getOpcode());
224 }
225
226 /// Returns the unscaled load/store for the scaled load/store opcode,
227 /// if there is a corresponding unscaled variant available.
228 static std::optional<unsigned> getUnscaledLdSt(unsigned Opc);
229
230 /// Scaling factor for (scaled or unscaled) load or store.
231 static int getMemScale(unsigned Opc);
232 static int getMemScale(const MachineInstr &MI) {
233 return getMemScale(MI.getOpcode());
234 }
235
236 /// Returns whether the instruction is a pre-indexed load.
237 static bool isPreLd(const MachineInstr &MI);
238
239 /// Returns whether the instruction is a pre-indexed store.
240 static bool isPreSt(const MachineInstr &MI);
241
242 /// Returns whether the instruction is a pre-indexed load/store.
243 static bool isPreLdSt(const MachineInstr &MI);
244
245 /// Returns whether the instruction is a paired load/store.
246 static bool isPairedLdSt(const MachineInstr &MI);
247
248 /// Returns the base register operator of a load/store.
249 static const MachineOperand &getLdStBaseOp(const MachineInstr &MI);
250
251 /// Returns the immediate offset operator of a load/store.
252 static const MachineOperand &getLdStOffsetOp(const MachineInstr &MI);
253
254 /// Returns whether the physical register is FP or NEON.
255 static bool isFpOrNEON(Register Reg);
256
257 /// Returns whether the instruction is FP or NEON.
258 static bool isFpOrNEON(const MachineInstr &MI);
259
260 /// Returns whether the instruction is in H form (16 bit operands)
261 static bool isHForm(const MachineInstr &MI);
262
263 /// Returns whether the instruction is in Q form (128 bit operands)
264 static bool isQForm(const MachineInstr &MI);
265
266 /// Returns whether the instruction can be compatible with non-zero BTYPE.
267 static bool hasBTISemantics(const MachineInstr &MI);
268
269 /// Returns the index for the immediate for a given instruction.
270 static unsigned getLoadStoreImmIdx(unsigned Opc);
271
272 /// Return true if pairing the given load or store may be paired with another.
273 static bool isPairableLdStInst(const MachineInstr &MI);
274
275 /// Returns true if MI is one of the TCRETURN* instructions.
276 static bool isTailCallReturnInst(const MachineInstr &MI);
277
278 /// Return the opcode that set flags when possible. The caller is
279 /// responsible for ensuring the opc has a flag setting equivalent.
280 static unsigned convertToFlagSettingOpc(unsigned Opc);
281
282 /// Return true if this is a load/store that can be potentially paired/merged.
283 bool isCandidateToMergeOrPair(const MachineInstr &MI) const;
284
285 /// Hint that pairing the given load or store is unprofitable.
286 static void suppressLdStPair(MachineInstr &MI);
287
288 std::optional<ExtAddrMode>
290 const TargetRegisterInfo *TRI) const override;
291
293 const MachineInstr &AddrI,
294 ExtAddrMode &AM) const override;
295
297 const ExtAddrMode &AM) const override;
298
301 int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width,
302 const TargetRegisterInfo *TRI) const override;
303
304 /// If \p OffsetIsScalable is set to 'true', the offset is scaled by `vscale`.
305 /// This is true for some SVE instructions like ldr/str that have a
306 /// 'reg + imm' addressing mode where the immediate is an index to the
307 /// scalable vector located at 'reg + imm * vscale x #bytes'.
309 const MachineOperand *&BaseOp,
310 int64_t &Offset, bool &OffsetIsScalable,
311 TypeSize &Width,
312 const TargetRegisterInfo *TRI) const;
313
314 /// Return the immediate offset of the base register in a load/store \p LdSt.
316
317 /// Returns true if opcode \p Opc is a memory operation. If it is, set
318 /// \p Scale, \p Width, \p MinOffset, and \p MaxOffset accordingly.
319 ///
320 /// For unscaled instructions, \p Scale is set to 1. All values are in bytes.
321 /// MinOffset/MaxOffset are the un-scaled limits of the immediate in the
322 /// instruction, the actual offset limit is [MinOffset*Scale,
323 /// MaxOffset*Scale].
324 static bool getMemOpInfo(unsigned Opcode, TypeSize &Scale, TypeSize &Width,
325 int64_t &MinOffset, int64_t &MaxOffset);
326
328 int64_t Offset1, bool OffsetIsScalable1,
330 int64_t Offset2, bool OffsetIsScalable2,
331 unsigned ClusterSize,
332 unsigned NumBytes) const override;
333
335 const DebugLoc &DL, MCRegister DestReg,
336 MCRegister SrcReg, bool KillSrc, unsigned Opcode,
337 llvm::ArrayRef<unsigned> Indices) const;
339 DebugLoc DL, unsigned DestReg, unsigned SrcReg,
340 bool KillSrc, unsigned Opcode, unsigned ZeroReg,
341 llvm::ArrayRef<unsigned> Indices) const;
343 const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg,
344 bool KillSrc) const override;
345
348 bool isKill, int FrameIndex,
349 const TargetRegisterClass *RC,
350 const TargetRegisterInfo *TRI,
351 Register VReg) const override;
352
355 int FrameIndex, const TargetRegisterClass *RC,
356 const TargetRegisterInfo *TRI,
357 Register VReg) const override;
358
359 // This tells target independent code that it is okay to pass instructions
360 // with subreg operands to foldMemoryOperandImpl.
361 bool isSubregFoldable() const override { return true; }
362
367 MachineBasicBlock::iterator InsertPt, int FrameIndex,
368 LiveIntervals *LIS = nullptr,
369 VirtRegMap *VRM = nullptr) const override;
370
371 /// \returns true if a branch from an instruction with opcode \p BranchOpc
372 /// bytes is capable of jumping to a position \p BrOffset bytes away.
373 bool isBranchOffsetInRange(unsigned BranchOpc,
374 int64_t BrOffset) const override;
375
376 MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
377
379 MachineBasicBlock &NewDestBB,
380 MachineBasicBlock &RestoreBB, const DebugLoc &DL,
381 int64_t BrOffset, RegScavenger *RS) const override;
382
384 MachineBasicBlock *&FBB,
386 bool AllowModify = false) const override;
388 MachineBranchPredicate &MBP,
389 bool AllowModify) const override;
391 int *BytesRemoved = nullptr) const override;
394 const DebugLoc &DL,
395 int *BytesAdded = nullptr) const override;
396
397 std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
398 analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override;
399
400 bool
403 Register, Register, Register, int &, int &,
404 int &) const override;
406 const DebugLoc &DL, Register DstReg,
408 Register FalseReg) const override;
409
411 MachineBasicBlock::iterator MI) const override;
412
413 MCInst getNop() const override;
414
416 const MachineBasicBlock *MBB,
417 const MachineFunction &MF) const override;
418
419 /// analyzeCompare - For a comparison instruction, return the source registers
420 /// in SrcReg and SrcReg2, and the value it compares against in CmpValue.
421 /// Return true if the comparison instruction can be analyzed.
422 bool analyzeCompare(const MachineInstr &MI, Register &SrcReg,
423 Register &SrcReg2, int64_t &CmpMask,
424 int64_t &CmpValue) const override;
425 /// optimizeCompareInstr - Convert the instruction supplying the argument to
426 /// the comparison into one that sets the zero bit in the flags register.
427 bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
428 Register SrcReg2, int64_t CmpMask, int64_t CmpValue,
429 const MachineRegisterInfo *MRI) const override;
430 bool optimizeCondBranch(MachineInstr &MI) const override;
431
432 CombinerObjective getCombinerObjective(unsigned Pattern) const override;
433 /// Return true when a code sequence can improve throughput. It
434 /// should be called only for instructions in loops.
435 /// \param Pattern - combiner pattern
436 bool isThroughputPattern(unsigned Pattern) const override;
437 /// Return true when there is potentially a faster code sequence
438 /// for an instruction chain ending in ``Root``. All potential patterns are
439 /// listed in the ``Patterns`` array.
442 bool DoRegPressureReduce) const override;
443 /// Return true when Inst is associative and commutative so that it can be
444 /// reassociated. If Invert is true, then the inverse of Inst operation must
445 /// be checked.
447 bool Invert) const override;
448 /// When getMachineCombinerPatterns() finds patterns, this function generates
449 /// the instructions that could replace the original code sequence
451 MachineInstr &Root, unsigned Pattern,
454 DenseMap<unsigned, unsigned> &InstrIdxForVirtReg) const override;
455 /// AArch64 supports MachineCombiner.
456 bool useMachineCombiner() const override;
457
458 bool expandPostRAPseudo(MachineInstr &MI) const override;
459
460 std::pair<unsigned, unsigned>
461 decomposeMachineOperandsTargetFlags(unsigned TF) const override;
468
470 bool OutlineFromLinkOnceODRs) const override;
471 std::optional<outliner::OutlinedFunction> getOutliningCandidateInfo(
472 const MachineModuleInfo &MMI,
473 std::vector<outliner::Candidate> &RepeatedSequenceLocs) const override;
475 Function &F, std::vector<outliner::Candidate> &Candidates) const override;
478 unsigned Flags) const override;
480 std::pair<MachineBasicBlock::iterator, MachineBasicBlock::iterator>>
481 getOutlinableRanges(MachineBasicBlock &MBB, unsigned &Flags) const override;
483 const outliner::OutlinedFunction &OF) const override;
487 outliner::Candidate &C) const override;
489
492 bool AllowSideEffects = true) const override;
493
494 /// Returns the vector element size (B, H, S or D) of an SVE opcode.
495 uint64_t getElementSizeForOpcode(unsigned Opc) const;
496 /// Returns true if the opcode is for an SVE instruction that sets the
497 /// condition codes as if it's results had been fed to a PTEST instruction
498 /// along with the same general predicate.
499 bool isPTestLikeOpcode(unsigned Opc) const;
500 /// Returns true if the opcode is for an SVE WHILE## instruction.
501 bool isWhileOpcode(unsigned Opc) const;
502 /// Returns true if the instruction has a shift by immediate that can be
503 /// executed in one cycle less.
504 static bool isFalkorShiftExtFast(const MachineInstr &MI);
505 /// Return true if the instructions is a SEH instruciton used for unwinding
506 /// on Windows.
507 static bool isSEHInstruction(const MachineInstr &MI);
508
509 std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI,
510 Register Reg) const override;
511
512 bool isFunctionSafeToSplit(const MachineFunction &MF) const override;
513
514 bool isMBBSafeToSplitToCold(const MachineBasicBlock &MBB) const override;
515
516 std::optional<ParamLoadedValue>
517 describeLoadedValue(const MachineInstr &MI, Register Reg) const override;
518
519 unsigned int getTailDuplicateSize(CodeGenOptLevel OptLevel) const override;
520
522 MachineRegisterInfo &MRI) const override;
523
525 int64_t &NumBytes,
526 int64_t &NumPredicateVectors,
527 int64_t &NumDataVectors);
529 int64_t &ByteSized,
530 int64_t &VGSized);
531
532 // Return true if address of the form BaseReg + Scale * ScaledReg + Offset can
533 // be used for a load/store of NumBytes. BaseReg is always present and
534 // implicit.
535 bool isLegalAddressingMode(unsigned NumBytes, int64_t Offset,
536 unsigned Scale) const;
537
538 // Decrement the SP, issuing probes along the way. `TargetReg` is the new top
539 // of the stack. `FrameSetup` is passed as true, if the allocation is a part
540 // of constructing the activation frame of a function.
542 Register TargetReg,
543 bool FrameSetup) const;
544
545#define GET_INSTRINFO_HELPER_DECLS
546#include "AArch64GenInstrInfo.inc"
547
548protected:
549 /// If the specific machine instruction is an instruction that moves/copies
550 /// value from one register to another register return destination and source
551 /// registers as machine operands.
552 std::optional<DestSourcePair>
553 isCopyInstrImpl(const MachineInstr &MI) const override;
554 std::optional<DestSourcePair>
555 isCopyLikeInstrImpl(const MachineInstr &MI) const override;
556
557private:
558 unsigned getInstBundleLength(const MachineInstr &MI) const;
559
560 /// Sets the offsets on outlined instructions in \p MBB which use SP
561 /// so that they will be valid post-outlining.
562 ///
563 /// \param MBB A \p MachineBasicBlock in an outlined function.
564 void fixupPostOutline(MachineBasicBlock &MBB) const;
565
566 void instantiateCondBranch(MachineBasicBlock &MBB, const DebugLoc &DL,
567 MachineBasicBlock *TBB,
568 ArrayRef<MachineOperand> Cond) const;
569 bool substituteCmpToZero(MachineInstr &CmpInstr, unsigned SrcReg,
570 const MachineRegisterInfo &MRI) const;
571 bool removeCmpToZeroOrOne(MachineInstr &CmpInstr, unsigned SrcReg,
572 int CmpValue, const MachineRegisterInfo &MRI) const;
573
574 /// Returns an unused general-purpose register which can be used for
575 /// constructing an outlined call if one exists. Returns 0 otherwise.
576 Register findRegisterToSaveLRTo(outliner::Candidate &C) const;
577
578 /// Remove a ptest of a predicate-generating operation that already sets, or
579 /// can be made to set, the condition codes in an identical manner
580 bool optimizePTestInstr(MachineInstr *PTest, unsigned MaskReg,
581 unsigned PredReg,
582 const MachineRegisterInfo *MRI) const;
583 std::optional<unsigned>
584 canRemovePTestInstr(MachineInstr *PTest, MachineInstr *Mask,
585 MachineInstr *Pred, const MachineRegisterInfo *MRI) const;
586};
587
588struct UsedNZCV {
589 bool N = false;
590 bool Z = false;
591 bool C = false;
592 bool V = false;
593
594 UsedNZCV() = default;
595
596 UsedNZCV &operator|=(const UsedNZCV &UsedFlags) {
597 this->N |= UsedFlags.N;
598 this->Z |= UsedFlags.Z;
599 this->C |= UsedFlags.C;
600 this->V |= UsedFlags.V;
601 return *this;
602 }
603};
604
605/// \returns Conditions flags used after \p CmpInstr in its MachineBB if NZCV
606/// flags are not alive in successors of the same \p CmpInstr and \p MI parent.
607/// \returns std::nullopt otherwise.
608///
609/// Collect instructions using that flags in \p CCUseInstrs if provided.
610std::optional<UsedNZCV>
611examineCFlagsUse(MachineInstr &MI, MachineInstr &CmpInstr,
612 const TargetRegisterInfo &TRI,
613 SmallVectorImpl<MachineInstr *> *CCUseInstrs = nullptr);
614
615/// Return true if there is an instruction /after/ \p DefMI and before \p UseMI
616/// which either reads or clobbers NZCV.
617bool isNZCVTouchedInInstructionRange(const MachineInstr &DefMI,
618 const MachineInstr &UseMI,
619 const TargetRegisterInfo *TRI);
620
621MCCFIInstruction createDefCFA(const TargetRegisterInfo &TRI, unsigned FrameReg,
622 unsigned Reg, const StackOffset &Offset,
623 bool LastAdjustmentWasScalable = true);
624MCCFIInstruction createCFAOffset(const TargetRegisterInfo &MRI, unsigned Reg,
625 const StackOffset &OffsetFromDefCFA);
626
627/// emitFrameOffset - Emit instructions as needed to set DestReg to SrcReg
628/// plus Offset. This is intended to be used from within the prolog/epilog
629/// insertion (PEI) pass, where a virtual scratch register may be allocated
630/// if necessary, to be replaced by the scavenger at the end of PEI.
631void emitFrameOffset(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
632 const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
633 StackOffset Offset, const TargetInstrInfo *TII,
635 bool SetNZCV = false, bool NeedsWinCFI = false,
636 bool *HasWinCFI = nullptr, bool EmitCFAOffset = false,
637 StackOffset InitialOffset = {},
638 unsigned FrameReg = AArch64::SP);
639
640/// rewriteAArch64FrameIndex - Rewrite MI to access 'Offset' bytes from the
641/// FP. Return false if the offset could not be handled directly in MI, and
642/// return the left-over portion by reference.
643bool rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
644 unsigned FrameReg, StackOffset &Offset,
645 const AArch64InstrInfo *TII);
646
647/// Use to report the frame offset status in isAArch64FrameOffsetLegal.
649 AArch64FrameOffsetCannotUpdate = 0x0, ///< Offset cannot apply.
650 AArch64FrameOffsetIsLegal = 0x1, ///< Offset is legal.
651 AArch64FrameOffsetCanUpdate = 0x2 ///< Offset can apply, at least partly.
653
654/// Check if the @p Offset is a valid frame offset for @p MI.
655/// The returned value reports the validity of the frame offset for @p MI.
656/// It uses the values defined by AArch64FrameOffsetStatus for that.
657/// If result == AArch64FrameOffsetCannotUpdate, @p MI cannot be updated to
658/// use an offset.eq
659/// If result & AArch64FrameOffsetIsLegal, @p Offset can completely be
660/// rewritten in @p MI.
661/// If result & AArch64FrameOffsetCanUpdate, @p Offset contains the
662/// amount that is off the limit of the legal offset.
663/// If set, @p OutUseUnscaledOp will contain the whether @p MI should be
664/// turned into an unscaled operator, which opcode is in @p OutUnscaledOp.
665/// If set, @p EmittableOffset contains the amount that can be set in @p MI
666/// (possibly with @p OutUnscaledOp if OutUseUnscaledOp is true) and that
667/// is a legal offset.
668int isAArch64FrameOffsetLegal(const MachineInstr &MI, StackOffset &Offset,
669 bool *OutUseUnscaledOp = nullptr,
670 unsigned *OutUnscaledOp = nullptr,
671 int64_t *EmittableOffset = nullptr);
672
673static inline bool isUncondBranchOpcode(int Opc) { return Opc == AArch64::B; }
674
675static inline bool isCondBranchOpcode(int Opc) {
676 switch (Opc) {
677 case AArch64::Bcc:
678 case AArch64::CBZW:
679 case AArch64::CBZX:
680 case AArch64::CBNZW:
681 case AArch64::CBNZX:
682 case AArch64::TBZW:
683 case AArch64::TBZX:
684 case AArch64::TBNZW:
685 case AArch64::TBNZX:
686 return true;
687 default:
688 return false;
689 }
690}
691
692static inline bool isIndirectBranchOpcode(int Opc) {
693 switch (Opc) {
694 case AArch64::BR:
695 case AArch64::BRAA:
696 case AArch64::BRAB:
697 case AArch64::BRAAZ:
698 case AArch64::BRABZ:
699 return true;
700 }
701 return false;
702}
703
704static inline bool isPTrueOpcode(unsigned Opc) {
705 switch (Opc) {
706 case AArch64::PTRUE_B:
707 case AArch64::PTRUE_H:
708 case AArch64::PTRUE_S:
709 case AArch64::PTRUE_D:
710 return true;
711 default:
712 return false;
713 }
714}
715
716/// Return opcode to be used for indirect calls.
717unsigned getBLRCallOpcode(const MachineFunction &MF);
718
719/// Return XPAC opcode to be used for a ptrauth strip using the given key.
720static inline unsigned getXPACOpcodeForKey(AArch64PACKey::ID K) {
721 using namespace AArch64PACKey;
722 switch (K) {
723 case IA: case IB: return AArch64::XPACI;
724 case DA: case DB: return AArch64::XPACD;
725 }
726 llvm_unreachable("Unhandled AArch64PACKey::ID enum");
727}
728
729/// Return AUT opcode to be used for a ptrauth auth using the given key, or its
730/// AUT*Z variant that doesn't take a discriminator operand, using zero instead.
731static inline unsigned getAUTOpcodeForKey(AArch64PACKey::ID K, bool Zero) {
732 using namespace AArch64PACKey;
733 switch (K) {
734 case IA: return Zero ? AArch64::AUTIZA : AArch64::AUTIA;
735 case IB: return Zero ? AArch64::AUTIZB : AArch64::AUTIB;
736 case DA: return Zero ? AArch64::AUTDZA : AArch64::AUTDA;
737 case DB: return Zero ? AArch64::AUTDZB : AArch64::AUTDB;
738 }
739 llvm_unreachable("Unhandled AArch64PACKey::ID enum");
740}
741
742/// Return PAC opcode to be used for a ptrauth sign using the given key, or its
743/// PAC*Z variant that doesn't take a discriminator operand, using zero instead.
744static inline unsigned getPACOpcodeForKey(AArch64PACKey::ID K, bool Zero) {
745 using namespace AArch64PACKey;
746 switch (K) {
747 case IA: return Zero ? AArch64::PACIZA : AArch64::PACIA;
748 case IB: return Zero ? AArch64::PACIZB : AArch64::PACIB;
749 case DA: return Zero ? AArch64::PACDZA : AArch64::PACDA;
750 case DB: return Zero ? AArch64::PACDZB : AArch64::PACDB;
751 }
752 llvm_unreachable("Unhandled AArch64PACKey::ID enum");
753}
754
755// struct TSFlags {
756#define TSFLAG_ELEMENT_SIZE_TYPE(X) (X) // 3-bits
757#define TSFLAG_DESTRUCTIVE_INST_TYPE(X) ((X) << 3) // 4-bits
758#define TSFLAG_FALSE_LANE_TYPE(X) ((X) << 7) // 2-bits
759#define TSFLAG_INSTR_FLAGS(X) ((X) << 9) // 2-bits
760#define TSFLAG_SME_MATRIX_TYPE(X) ((X) << 11) // 3-bits
761// }
762
763namespace AArch64 {
764
772};
773
786};
787
792};
793
794// NOTE: This is a bit field.
797
807};
808
809#undef TSFLAG_ELEMENT_SIZE_TYPE
810#undef TSFLAG_DESTRUCTIVE_INST_TYPE
811#undef TSFLAG_FALSE_LANE_TYPE
812#undef TSFLAG_INSTR_FLAGS
813#undef TSFLAG_SME_MATRIX_TYPE
814
818
820}
821
822} // end namespace llvm
823
824#endif
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
#define TSFLAG_DESTRUCTIVE_INST_TYPE(X)
#define TSFLAG_SME_MATRIX_TYPE(X)
#define TSFLAG_FALSE_LANE_TYPE(X)
#define TSFLAG_INSTR_FLAGS(X)
#define TSFLAG_ELEMENT_SIZE_TYPE(X)
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
unsigned const TargetRegisterInfo * TRI
unsigned Reg
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool isHForm(const MachineInstr &MI)
Returns whether the instruction is in H form (16 bit operands)
void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DstReg, ArrayRef< MachineOperand > Cond, Register TrueReg, Register FalseReg) const override
static bool hasBTISemantics(const MachineInstr &MI)
Returns whether the instruction can be compatible with non-zero BTYPE.
static bool isQForm(const MachineInstr &MI)
Returns whether the instruction is in Q form (128 bit operands)
static void decomposeStackOffsetForFrameOffsets(const StackOffset &Offset, int64_t &NumBytes, int64_t &NumPredicateVectors, int64_t &NumDataVectors)
Returns the offset in parts to which this frame offset can be decomposed for the purpose of describin...
static bool getMemOpInfo(unsigned Opcode, TypeSize &Scale, TypeSize &Width, int64_t &MinOffset, int64_t &MaxOffset)
Returns true if opcode Opc is a memory operation.
static bool isTailCallReturnInst(const MachineInstr &MI)
Returns true if MI is one of the TCRETURN* instructions.
static bool isFPRCopy(const MachineInstr &MI)
Does this instruction rename an FPR without modifying bits?
MachineInstr * emitLdStWithAddr(MachineInstr &MemI, const ExtAddrMode &AM) const override
std::optional< DestSourcePair > isCopyInstrImpl(const MachineInstr &MI) const override
If the specific machine instruction is an instruction that moves/copies value from one register to an...
static int getMemScale(const MachineInstr &MI)
MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const override
std::optional< RegImmPair > isAddImmediate(const MachineInstr &MI, Register Reg) const override
bool isSubregFoldable() const override
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
GetInstSize - Return the number of bytes of code the specified instruction may be.
uint64_t getElementSizeForOpcode(unsigned Opc) const
Returns the vector element size (B, H, S or D) of an SVE opcode.
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc) const override
static bool isGPRCopy(const MachineInstr &MI)
Does this instruction rename a GPR without modifying bits?
static unsigned convertToFlagSettingOpc(unsigned Opc)
Return the opcode that set flags when possible.
bool getMachineCombinerPatterns(MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns, bool DoRegPressureReduce) const override
Return true when there is potentially a faster code sequence for an instruction chain ending in Root.
bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const override
bool canInsertSelect(const MachineBasicBlock &, ArrayRef< MachineOperand > Cond, Register, Register, Register, int &, int &, int &) const override
static const MachineOperand & getLdStOffsetOp(const MachineInstr &MI)
Returns the immediate offset operator of a load/store.
bool isCoalescableExtInstr(const MachineInstr &MI, Register &SrcReg, Register &DstReg, unsigned &SubIdx) const override
bool isWhileOpcode(unsigned Opc) const
Returns true if the opcode is for an SVE WHILE## instruction.
static std::optional< unsigned > getUnscaledLdSt(unsigned Opc)
Returns the unscaled load/store for the scaled load/store opcode, if there is a corresponding unscale...
static bool hasUnscaledLdStOffset(unsigned Opc)
Return true if it has an unscaled load/store offset.
static bool hasUnscaledLdStOffset(MachineInstr &MI)
static bool isPreLdSt(const MachineInstr &MI)
Returns whether the instruction is a pre-indexed load/store.
MachineBasicBlock::iterator insertOutlinedCall(Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It, MachineFunction &MF, outliner::Candidate &C) const override
std::optional< ExtAddrMode > getAddrModeFromMemoryOp(const MachineInstr &MemI, const TargetRegisterInfo *TRI) const override
bool getMemOperandsWithOffsetWidth(const MachineInstr &MI, SmallVectorImpl< const MachineOperand * > &BaseOps, int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width, const TargetRegisterInfo *TRI) const override
bool analyzeBranchPredicate(MachineBasicBlock &MBB, MachineBranchPredicate &MBP, bool AllowModify) const override
static bool isSEHInstruction(const MachineInstr &MI)
Return true if the instructions is a SEH instruciton used for unwinding on Windows.
void insertIndirectBranch(MachineBasicBlock &MBB, MachineBasicBlock &NewDestBB, MachineBasicBlock &RestoreBB, const DebugLoc &DL, int64_t BrOffset, RegScavenger *RS) const override
SmallVector< std::pair< MachineBasicBlock::iterator, MachineBasicBlock::iterator > > getOutlinableRanges(MachineBasicBlock &MBB, unsigned &Flags) const override
static bool isPairableLdStInst(const MachineInstr &MI)
Return true if pairing the given load or store may be paired with another.
void genAlternativeCodeSequence(MachineInstr &Root, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, DenseMap< unsigned, unsigned > &InstrIdxForVirtReg) const override
When getMachineCombinerPatterns() finds patterns, this function generates the instructions that could...
const AArch64RegisterInfo & getRegisterInfo() const
getRegisterInfo - TargetInstrInfo is a superset of MRegister info.
static bool isPreSt(const MachineInstr &MI)
Returns whether the instruction is a pre-indexed store.
MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const override
void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const override
static bool isPairedLdSt(const MachineInstr &MI)
Returns whether the instruction is a paired load/store.
outliner::InstrType getOutliningTypeImpl(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MIT, unsigned Flags) const override
bool useMachineCombiner() const override
AArch64 supports MachineCombiner.
ArrayRef< std::pair< MachineMemOperand::Flags, const char * > > getSerializableMachineMemOperandTargetFlags() const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const override
std::optional< outliner::OutlinedFunction > getOutliningCandidateInfo(const MachineModuleInfo &MMI, std::vector< outliner::Candidate > &RepeatedSequenceLocs) const override
bool isExtendLikelyToBeFolded(MachineInstr &ExtMI, MachineRegisterInfo &MRI) const override
static bool isFalkorShiftExtFast(const MachineInstr &MI)
Returns true if the instruction has a shift by immediate that can be executed in one cycle less.
std::optional< ParamLoadedValue > describeLoadedValue(const MachineInstr &MI, Register Reg) const override
bool getMemOperandWithOffsetWidth(const MachineInstr &MI, const MachineOperand *&BaseOp, int64_t &Offset, bool &OffsetIsScalable, TypeSize &Width, const TargetRegisterInfo *TRI) const
If OffsetIsScalable is set to 'true', the offset is scaled by vscale.
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
static bool isStridedAccess(const MachineInstr &MI)
Return true if the given load or store is a strided memory access.
bool shouldClusterMemOps(ArrayRef< const MachineOperand * > BaseOps1, int64_t Offset1, bool OffsetIsScalable1, ArrayRef< const MachineOperand * > BaseOps2, int64_t Offset2, bool OffsetIsScalable2, unsigned ClusterSize, unsigned NumBytes) const override
Detect opportunities for ldp/stp formation.
bool expandPostRAPseudo(MachineInstr &MI) const override
unsigned int getTailDuplicateSize(CodeGenOptLevel OptLevel) const override
bool isFunctionSafeToOutlineFrom(MachineFunction &MF, bool OutlineFromLinkOnceODRs) const override
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const override
bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
bool isThroughputPattern(unsigned Pattern) const override
Return true when a code sequence can improve throughput.
void copyGPRRegTuple(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc, unsigned Opcode, unsigned ZeroReg, llvm::ArrayRef< unsigned > Indices) const
void buildClearRegister(Register Reg, MachineBasicBlock &MBB, MachineBasicBlock::iterator Iter, DebugLoc &DL, bool AllowSideEffects=true) const override
void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF, const outliner::OutlinedFunction &OF) const override
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
MachineOperand & getMemOpBaseRegImmOfsOffsetOperand(MachineInstr &LdSt) const
Return the immediate offset of the base register in a load/store LdSt.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const override
bool canFoldIntoAddrMode(const MachineInstr &MemI, Register Reg, const MachineInstr &AddrI, ExtAddrMode &AM) const override
static bool isLdStPairSuppressed(const MachineInstr &MI)
Return true if pairing the given load or store is hinted to be unprofitable.
bool isFunctionSafeToSplit(const MachineFunction &MF) const override
bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert) const override
Return true when Inst is associative and commutative so that it can be reassociated.
std::unique_ptr< TargetInstrInfo::PipelinerLoopInfo > analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override
bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
MachineBasicBlock::iterator probedStackAlloc(MachineBasicBlock::iterator MBBI, Register TargetReg, bool FrameSetup) const
bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg, Register SrcReg2, int64_t CmpMask, int64_t CmpValue, const MachineRegisterInfo *MRI) const override
optimizeCompareInstr - Convert the instruction supplying the argument to the comparison into one that...
static unsigned getLoadStoreImmIdx(unsigned Opc)
Returns the index for the immediate for a given instruction.
static bool isGPRZero(const MachineInstr &MI)
Does this instruction set its full destination register to zero?
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &CmpMask, int64_t &CmpValue) const override
analyzeCompare - For a comparison instruction, return the source registers in SrcReg and SrcReg2,...
CombinerObjective getCombinerObjective(unsigned Pattern) const override
static bool isFpOrNEON(Register Reg)
Returns whether the physical register is FP or NEON.
bool isMBBSafeToSplitToCold(const MachineBasicBlock &MBB) const override
bool isAsCheapAsAMove(const MachineInstr &MI) const override
bool isLegalAddressingMode(unsigned NumBytes, int64_t Offset, unsigned Scale) const
std::optional< DestSourcePair > isCopyLikeInstrImpl(const MachineInstr &MI) const override
static void suppressLdStPair(MachineInstr &MI)
Hint that pairing the given load or store is unprofitable.
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
static bool isPreLd(const MachineInstr &MI)
Returns whether the instruction is a pre-indexed load.
ArrayRef< std::pair< unsigned, const char * > > getSerializableBitmaskMachineOperandTargetFlags() const override
void copyPhysRegTuple(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc, unsigned Opcode, llvm::ArrayRef< unsigned > Indices) const
bool optimizeCondBranch(MachineInstr &MI) const override
Replace csincr-branch sequence by simple conditional branch.
static int getMemScale(unsigned Opc)
Scaling factor for (scaled or unscaled) load or store.
bool isCandidateToMergeOrPair(const MachineInstr &MI) const
Return true if this is a load/store that can be potentially paired/merged.
MCInst getNop() const override
static const MachineOperand & getLdStBaseOp(const MachineInstr &MI)
Returns the base register operator of a load/store.
bool isPTestLikeOpcode(unsigned Opc) const
Returns true if the opcode is for an SVE instruction that sets the condition codes as if it's results...
void mergeOutliningCandidateAttributes(Function &F, std::vector< outliner::Candidate > &Candidates) const override
static void decomposeStackOffsetForDwarfOffsets(const StackOffset &Offset, int64_t &ByteSized, int64_t &VGSized)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
A debug info location.
Definition: DebugLoc.h:33
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
Definition: MachineInstr.h:69
Flags
Flags values. These may be or'd together.
This class contains meta information specific to a module.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:587
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1210
StackOffset holds a fixed and a scalable offset in bytes.
Definition: TypeSize.h:33
virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const
Target-dependent implementation for foldMemoryOperand.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
int getSVERevInstr(uint16_t Opcode)
int getSMEPseudoMap(uint16_t Opcode)
static const uint64_t InstrFlagIsWhile
static const uint64_t InstrFlagIsPTestLike
int getSVEPseudoMap(uint16_t Opcode)
int getSVENonRevInstr(uint16_t Opcode)
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
InstrType
Represents how an instruction should be mapped by the outliner.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
static bool isCondBranchOpcode(int Opc)
MCCFIInstruction createDefCFA(const TargetRegisterInfo &TRI, unsigned FrameReg, unsigned Reg, const StackOffset &Offset, bool LastAdjustmentWasScalable=true)
static bool isPTrueOpcode(unsigned Opc)
int isAArch64FrameOffsetLegal(const MachineInstr &MI, StackOffset &Offset, bool *OutUseUnscaledOp=nullptr, unsigned *OutUnscaledOp=nullptr, int64_t *EmittableOffset=nullptr)
Check if the Offset is a valid frame offset for MI.
static bool isIndirectBranchOpcode(int Opc)
static unsigned getXPACOpcodeForKey(AArch64PACKey::ID K)
Return XPAC opcode to be used for a ptrauth strip using the given key.
MCCFIInstruction createCFAOffset(const TargetRegisterInfo &MRI, unsigned Reg, const StackOffset &OffsetFromDefCFA)
unsigned getBLRCallOpcode(const MachineFunction &MF)
Return opcode to be used for indirect calls.
AArch64FrameOffsetStatus
Use to report the frame offset status in isAArch64FrameOffsetLegal.
@ AArch64FrameOffsetIsLegal
Offset is legal.
@ AArch64FrameOffsetCanUpdate
Offset can apply, at least partly.
@ AArch64FrameOffsetCannotUpdate
Offset cannot apply.
AArch64MachineCombinerPattern
@ MULSUBv8i16_OP2
@ FMULv4i16_indexed_OP1
@ FMLSv1i32_indexed_OP2
@ MULSUBv2i32_indexed_OP1
@ MULADDXI_OP1
@ FMLAv2i32_indexed_OP2
@ MULADDv4i16_indexed_OP2
@ FMLAv1i64_indexed_OP1
@ MULSUBv16i8_OP1
@ FMLAv8i16_indexed_OP2
@ FMULv2i32_indexed_OP1
@ MULSUBv8i16_indexed_OP2
@ FMLAv1i64_indexed_OP2
@ MULSUBv4i16_indexed_OP2
@ FMLAv1i32_indexed_OP1
@ FMLAv2i64_indexed_OP2
@ FMLSv8i16_indexed_OP1
@ MULSUBv2i32_OP1
@ FMULv4i16_indexed_OP2
@ MULSUBv4i32_indexed_OP2
@ FMULv2i64_indexed_OP2
@ MULSUBXI_OP1
@ FMLAv4i32_indexed_OP1
@ MULADDWI_OP1
@ MULADDv4i16_OP2
@ FMULv8i16_indexed_OP2
@ MULSUBv4i16_OP1
@ MULADDv4i32_OP2
@ MULADDv8i8_OP1
@ MULADDv2i32_OP2
@ MULADDv16i8_OP2
@ MULADDv8i8_OP2
@ FMLSv4i16_indexed_OP1
@ MULADDv16i8_OP1
@ FMLAv2i64_indexed_OP1
@ FMLAv1i32_indexed_OP2
@ FMLSv2i64_indexed_OP2
@ MULADDv2i32_OP1
@ MULADDv4i32_OP1
@ MULADDv2i32_indexed_OP1
@ MULSUBv16i8_OP2
@ MULADDv4i32_indexed_OP1
@ MULADDv2i32_indexed_OP2
@ FMLAv4i16_indexed_OP2
@ MULSUBv8i16_OP1
@ FMULv2i32_indexed_OP2
@ FMLSv2i32_indexed_OP2
@ FMLSv4i32_indexed_OP1
@ FMULv2i64_indexed_OP1
@ MULSUBv4i16_OP2
@ FMLSv4i16_indexed_OP2
@ FMLAv2i32_indexed_OP1
@ FMLSv2i32_indexed_OP1
@ FMLAv8i16_indexed_OP1
@ MULSUBv4i16_indexed_OP1
@ FMLSv4i32_indexed_OP2
@ MULADDv4i32_indexed_OP2
@ MULSUBv4i32_OP2
@ MULSUBv8i16_indexed_OP1
@ MULADDv8i16_OP2
@ MULSUBv2i32_indexed_OP2
@ FMULv4i32_indexed_OP2
@ FMLSv2i64_indexed_OP1
@ MULADDv4i16_OP1
@ FMLAv4i32_indexed_OP2
@ MULADDv8i16_indexed_OP1
@ FMULv4i32_indexed_OP1
@ FMLAv4i16_indexed_OP1
@ FMULv8i16_indexed_OP1
@ MULSUBv8i8_OP1
@ MULADDv8i16_OP1
@ MULSUBv4i32_indexed_OP1
@ MULSUBv4i32_OP1
@ FMLSv8i16_indexed_OP2
@ MULADDv8i16_indexed_OP2
@ MULSUBWI_OP1
@ MULSUBv2i32_OP2
@ FMLSv1i64_indexed_OP2
@ MULADDv4i16_indexed_OP1
@ MULSUBv8i8_OP2
void emitFrameOffset(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, unsigned DestReg, unsigned SrcReg, StackOffset Offset, const TargetInstrInfo *TII, MachineInstr::MIFlag=MachineInstr::NoFlags, bool SetNZCV=false, bool NeedsWinCFI=false, bool *HasWinCFI=nullptr, bool EmitCFAOffset=false, StackOffset InitialOffset={}, unsigned FrameReg=AArch64::SP)
emitFrameOffset - Emit instructions as needed to set DestReg to SrcReg plus Offset.
CombinerObjective
The combiner's goal may differ based on which pattern it is attempting to optimize.
std::optional< UsedNZCV > examineCFlagsUse(MachineInstr &MI, MachineInstr &CmpInstr, const TargetRegisterInfo &TRI, SmallVectorImpl< MachineInstr * > *CCUseInstrs=nullptr)
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
static bool isUncondBranchOpcode(int Opc)
static unsigned getPACOpcodeForKey(AArch64PACKey::ID K, bool Zero)
Return PAC opcode to be used for a ptrauth sign using the given key, or its PAC*Z variant that doesn'...
bool rewriteAArch64FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, StackOffset &Offset, const AArch64InstrInfo *TII)
rewriteAArch64FrameIndex - Rewrite MI to access 'Offset' bytes from the FP.
static const MachineMemOperand::Flags MOSuppressPair
bool isNZCVTouchedInInstructionRange(const MachineInstr &DefMI, const MachineInstr &UseMI, const TargetRegisterInfo *TRI)
Return true if there is an instruction /after/ DefMI and before UseMI which either reads or clobbers ...
static const MachineMemOperand::Flags MOStridedAccess
static unsigned getAUTOpcodeForKey(AArch64PACKey::ID K, bool Zero)
Return AUT opcode to be used for a ptrauth auth using the given key, or its AUT*Z variant that doesn'...
Used to describe addressing mode similar to ExtAddrMode in CodeGenPrepare.
UsedNZCV & operator|=(const UsedNZCV &UsedFlags)
UsedNZCV()=default
An individual sequence of instructions to be replaced with a call to an outlined function.
The information necessary to create an outlined function for some class of candidate.