003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/include/llvm/CodeGen
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
include
/
llvm
/
CodeGen
/
📁
..
📄
AccelTable.h
(13.54 KB)
📄
Analysis.h
(6.04 KB)
📄
AntiDepBreaker.h
(3.78 KB)
📄
AsmPrinter.h
(27.35 KB)
📄
AsmPrinterHandler.h
(2.6 KB)
📄
AtomicExpandUtils.h
(2.49 KB)
📄
BasicTTIImpl.h
(73.64 KB)
📄
BuiltinGCs.h
(1008 B)
📄
CSEConfigBase.h
(1.09 KB)
📄
CalcSpillWeights.h
(4.69 KB)
📄
CallingConvLower.h
(21 KB)
📄
CommandFlags.h
(3.65 KB)
📄
CostTable.h
(1.87 KB)
📄
DAGCombine.h
(606 B)
📄
DFAPacketizer.h
(7.47 KB)
📄
DIE.h
(32.19 KB)
📄
DIEValue.def
(1.4 KB)
📄
DbgEntityHistoryCalculator.h
(4.37 KB)
📄
DebugHandlerBase.h
(4.68 KB)
📄
DwarfStringPoolEntry.h
(2.18 KB)
📄
EdgeBundles.h
(2.13 KB)
📄
ExecutionDomainFix.h
(7.72 KB)
📄
ExpandReductions.h
(726 B)
📄
FastISel.h
(22.87 KB)
📄
FaultMaps.h
(6.66 KB)
📄
FunctionLoweringInfo.h
(9.68 KB)
📄
GCMetadata.h
(7.24 KB)
📄
GCMetadataPrinter.h
(2.46 KB)
📄
GCStrategy.h
(5.25 KB)
📁
GlobalISel
📄
ISDOpcodes.h
(52.75 KB)
📄
IndirectThunks.h
(3.85 KB)
📄
IntrinsicLowering.h
(1.67 KB)
📄
LatencyPriorityQueue.h
(3.09 KB)
📄
LazyMachineBlockFrequencyInfo.h
(2.82 KB)
📄
LexicalScopes.h
(10.06 KB)
📄
LinkAllAsmWriterComponents.h
(1.34 KB)
📄
LinkAllCodegenComponents.h
(2.18 KB)
📄
LiveInterval.h
(37.24 KB)
📄
LiveIntervalCalc.h
(2.91 KB)
📄
LiveIntervalUnion.h
(6.93 KB)
📄
LiveIntervals.h
(19.86 KB)
📄
LivePhysRegs.h
(7.51 KB)
📄
LiveRangeCalc.h
(11.49 KB)
📄
LiveRangeEdit.h
(10.45 KB)
📄
LiveRegMatrix.h
(6.18 KB)
📄
LiveRegUnits.h
(6.24 KB)
📄
LiveStacks.h
(3.35 KB)
📄
LiveVariables.h
(12.98 KB)
📄
LoopTraversal.h
(4.38 KB)
📄
LowLevelType.h
(1.28 KB)
📄
MBFIWrapper.h
(1.58 KB)
📄
MIRFormatter.h
(3.13 KB)
📁
MIRParser
📄
MIRPrinter.h
(1.73 KB)
📄
MIRYamlMapping.h
(23.95 KB)
📄
MachORelocation.h
(2.19 KB)
📄
MachineBasicBlock.h
(42.95 KB)
📄
MachineBlockFrequencyInfo.h
(3.21 KB)
📄
MachineBranchProbabilityInfo.h
(2.69 KB)
📄
MachineCombinerPattern.h
(3.5 KB)
📄
MachineConstantPool.h
(5.25 KB)
📄
MachineDominanceFrontier.h
(2.93 KB)
📄
MachineDominators.h
(9.59 KB)
📄
MachineFrameInfo.h
(34.84 KB)
📄
MachineFunction.h
(42.94 KB)
📄
MachineFunctionPass.h
(2.93 KB)
📄
MachineInstr.h
(73.72 KB)
📄
MachineInstrBuilder.h
(22.84 KB)
📄
MachineInstrBundle.h
(10.16 KB)
📄
MachineInstrBundleIterator.h
(10.92 KB)
📄
MachineJumpTableInfo.h
(4.66 KB)
📄
MachineLoopInfo.h
(7.3 KB)
📄
MachineLoopUtils.h
(1.74 KB)
📄
MachineMemOperand.h
(12.69 KB)
📄
MachineModuleInfo.h
(9.88 KB)
📄
MachineModuleInfoImpls.h
(3.36 KB)
📄
MachineOperand.h
(37.64 KB)
📄
MachineOptimizationRemarkEmitter.h
(8.99 KB)
📄
MachineOutliner.h
(8.04 KB)
📄
MachinePassRegistry.h
(6.1 KB)
📄
MachinePipeliner.h
(21.17 KB)
📄
MachinePostDominators.h
(2.93 KB)
📄
MachineRegionInfo.h
(5.93 KB)
📄
MachineRegisterInfo.h
(46.75 KB)
📄
MachineSSAUpdater.h
(4.37 KB)
📄
MachineScheduler.h
(36.6 KB)
📄
MachineSizeOpts.h
(1.86 KB)
📄
MachineTraceMetrics.h
(17.17 KB)
📄
MacroFusion.h
(1.96 KB)
📄
ModuloSchedule.h
(15.8 KB)
📄
NonRelocatableStringpool.h
(2.9 KB)
📁
PBQP
📄
PBQPRAConstraint.h
(1.83 KB)
📄
ParallelCG.h
(1.66 KB)
📄
Passes.h
(18.96 KB)
📄
PreISelIntrinsicLowering.h
(944 B)
📄
PseudoSourceValue.h
(6.21 KB)
📄
RDFGraph.h
(33.73 KB)
📄
RDFLiveness.h
(5.01 KB)
📄
RDFRegisters.h
(6.51 KB)
📄
ReachingDefAnalysis.h
(10.68 KB)
📄
RegAllocPBQP.h
(16.47 KB)
📄
RegAllocRegistry.h
(2.27 KB)
📄
Register.h
(5.61 KB)
📄
RegisterClassInfo.h
(4.86 KB)
📄
RegisterPressure.h
(21.04 KB)
📄
RegisterScavenging.h
(8.73 KB)
📄
RegisterUsageInfo.h
(2.3 KB)
📄
ResourcePriorityQueue.h
(4.19 KB)
📄
RuntimeLibcalls.h
(3.05 KB)
📄
SDNodeProperties.td
(1.57 KB)
📄
ScheduleDAG.h
(28.92 KB)
📄
ScheduleDAGInstrs.h
(15.49 KB)
📄
ScheduleDAGMutation.h
(1021 B)
📄
ScheduleDFS.h
(5.79 KB)
📄
ScheduleHazardRecognizer.h
(4.65 KB)
📄
SchedulerRegistry.h
(4.27 KB)
📄
ScoreboardHazardRecognizer.h
(3.7 KB)
📄
SelectionDAG.h
(89.12 KB)
📄
SelectionDAGAddressAnalysis.h
(3.58 KB)
📄
SelectionDAGISel.h
(13.48 KB)
📄
SelectionDAGNodes.h
(91.77 KB)
📄
SelectionDAGTargetInfo.h
(7.99 KB)
📄
SlotIndexes.h
(24.12 KB)
📄
Spiller.h
(1.16 KB)
📄
StackMaps.h
(11.45 KB)
📄
StackProtector.h
(4.1 KB)
📄
SwiftErrorValueTracking.h
(3.87 KB)
📄
SwitchLoweringUtils.h
(9.51 KB)
📄
TailDuplicator.h
(5.54 KB)
📄
TargetCallingConv.h
(8.26 KB)
📄
TargetFrameLowering.h
(19.21 KB)
📄
TargetInstrInfo.h
(84.48 KB)
📄
TargetLowering.h
(194.17 KB)
📄
TargetLoweringObjectFileImpl.h
(11.63 KB)
📄
TargetOpcodes.h
(1.37 KB)
📄
TargetPassConfig.h
(17.9 KB)
📄
TargetRegisterInfo.h
(48.65 KB)
📄
TargetSchedule.h
(7.75 KB)
📄
TargetSubtargetInfo.h
(12.53 KB)
📄
UnreachableBlockElim.h
(1.39 KB)
📄
ValueTypes.h
(17.2 KB)
📄
ValueTypes.td
(11.42 KB)
📄
VirtRegMap.h
(6.37 KB)
📄
WasmEHFuncInfo.h
(1.92 KB)
📄
WinEHFuncInfo.h
(4.01 KB)
Editing: MachineInstrBundle.h
//===- llvm/CodeGen/MachineInstrBundle.h - MI bundle utilities --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file provide utility functions to manipulate machine instruction // bundles. // //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_MACHINEINSTRBUNDLE_H #define LLVM_CODEGEN_MACHINEINSTRBUNDLE_H #include "llvm/CodeGen/MachineBasicBlock.h" namespace llvm { /// finalizeBundle - Finalize a machine instruction bundle which includes /// a sequence of instructions starting from FirstMI to LastMI (exclusive). /// This routine adds a BUNDLE instruction to represent the bundle, it adds /// IsInternalRead markers to MachineOperands which are defined inside the /// bundle, and it copies externally visible defs and uses to the BUNDLE /// instruction. void finalizeBundle(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI); /// finalizeBundle - Same functionality as the previous finalizeBundle except /// the last instruction in the bundle is not provided as an input. This is /// used in cases where bundles are pre-determined by marking instructions /// with 'InsideBundle' marker. It returns the MBB instruction iterator that /// points to the end of the bundle. MachineBasicBlock::instr_iterator finalizeBundle(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator FirstMI); /// finalizeBundles - Finalize instruction bundles in the specified /// MachineFunction. Return true if any bundles are finalized. bool finalizeBundles(MachineFunction &MF); /// Returns an iterator to the first instruction in the bundle containing \p I. inline MachineBasicBlock::instr_iterator getBundleStart( MachineBasicBlock::instr_iterator I) { while (I->isBundledWithPred()) --I; return I; } /// Returns an iterator to the first instruction in the bundle containing \p I. inline MachineBasicBlock::const_instr_iterator getBundleStart( MachineBasicBlock::const_instr_iterator I) { while (I->isBundledWithPred()) --I; return I; } /// Returns an iterator pointing beyond the bundle containing \p I. inline MachineBasicBlock::instr_iterator getBundleEnd( MachineBasicBlock::instr_iterator I) { while (I->isBundledWithSucc()) ++I; ++I; return I; } /// Returns an iterator pointing beyond the bundle containing \p I. inline MachineBasicBlock::const_instr_iterator getBundleEnd( MachineBasicBlock::const_instr_iterator I) { while (I->isBundledWithSucc()) ++I; ++I; return I; } //===----------------------------------------------------------------------===// // MachineBundleOperand iterator // /// MIBundleOperandIteratorBase - Iterator that visits all operands in a bundle /// of MachineInstrs. This class is not intended to be used directly, use one /// of the sub-classes instead. /// /// Intended use: /// /// for (MIBundleOperands MIO(MI); MIO.isValid(); ++MIO) { /// if (!MIO->isReg()) /// continue; /// ... /// } /// template <typename ValueT> class MIBundleOperandIteratorBase : public iterator_facade_base<MIBundleOperandIteratorBase<ValueT>, std::forward_iterator_tag, ValueT> { MachineBasicBlock::instr_iterator InstrI, InstrE; MachineInstr::mop_iterator OpI, OpE; // If the operands on InstrI are exhausted, advance InstrI to the next // bundled instruction with operands. void advance() { while (OpI == OpE) { // Don't advance off the basic block, or into a new bundle. if (++InstrI == InstrE || !InstrI->isInsideBundle()) { InstrI = InstrE; break; } OpI = InstrI->operands_begin(); OpE = InstrI->operands_end(); } } protected: /// MIBundleOperandIteratorBase - Create an iterator that visits all operands /// on MI, or all operands on every instruction in the bundle containing MI. /// /// @param MI The instruction to examine. /// explicit MIBundleOperandIteratorBase(MachineInstr &MI) { InstrI = getBundleStart(MI.getIterator()); InstrE = MI.getParent()->instr_end(); OpI = InstrI->operands_begin(); OpE = InstrI->operands_end(); advance(); } /// Constructor for an iterator past the last iteration: both instruction /// iterators point to the end of the BB and OpI == OpE. explicit MIBundleOperandIteratorBase(MachineBasicBlock::instr_iterator InstrE, MachineInstr::mop_iterator OpE) : InstrI(InstrE), InstrE(InstrE), OpI(OpE), OpE(OpE) {} public: /// isValid - Returns true until all the operands have been visited. bool isValid() const { return OpI != OpE; } /// Preincrement. Move to the next operand. void operator++() { assert(isValid() && "Cannot advance MIOperands beyond the last operand"); ++OpI; advance(); } ValueT &operator*() const { return *OpI; } ValueT *operator->() const { return &*OpI; } bool operator==(const MIBundleOperandIteratorBase &Arg) const { // Iterators are equal, if InstrI matches and either OpIs match or OpI == // OpE match for both. The second condition allows us to construct an 'end' // iterator, without finding the last instruction in a bundle up-front. return InstrI == Arg.InstrI && (OpI == Arg.OpI || (OpI == OpE && Arg.OpI == Arg.OpE)); } /// getOperandNo - Returns the number of the current operand relative to its /// instruction. /// unsigned getOperandNo() const { return OpI - InstrI->operands_begin(); } }; /// MIBundleOperands - Iterate over all operands in a bundle of machine /// instructions. /// class MIBundleOperands : public MIBundleOperandIteratorBase<MachineOperand> { /// Constructor for an iterator past the last iteration. MIBundleOperands(MachineBasicBlock::instr_iterator InstrE, MachineInstr::mop_iterator OpE) : MIBundleOperandIteratorBase(InstrE, OpE) {} public: MIBundleOperands(MachineInstr &MI) : MIBundleOperandIteratorBase(MI) {} /// Returns an iterator past the last iteration. static MIBundleOperands end(const MachineBasicBlock &MBB) { return {const_cast<MachineBasicBlock &>(MBB).instr_end(), const_cast<MachineBasicBlock &>(MBB).instr_begin()->operands_end()}; } }; /// ConstMIBundleOperands - Iterate over all operands in a const bundle of /// machine instructions. /// class ConstMIBundleOperands : public MIBundleOperandIteratorBase<const MachineOperand> { /// Constructor for an iterator past the last iteration. ConstMIBundleOperands(MachineBasicBlock::instr_iterator InstrE, MachineInstr::mop_iterator OpE) : MIBundleOperandIteratorBase(InstrE, OpE) {} public: ConstMIBundleOperands(const MachineInstr &MI) : MIBundleOperandIteratorBase(const_cast<MachineInstr &>(MI)) {} /// Returns an iterator past the last iteration. static ConstMIBundleOperands end(const MachineBasicBlock &MBB) { return {const_cast<MachineBasicBlock &>(MBB).instr_end(), const_cast<MachineBasicBlock &>(MBB).instr_begin()->operands_end()}; } }; inline iterator_range<ConstMIBundleOperands> const_mi_bundle_ops(const MachineInstr &MI) { return make_range(ConstMIBundleOperands(MI), ConstMIBundleOperands::end(*MI.getParent())); } inline iterator_range<MIBundleOperands> mi_bundle_ops(MachineInstr &MI) { return make_range(MIBundleOperands(MI), MIBundleOperands::end(*MI.getParent())); } /// VirtRegInfo - Information about a virtual register used by a set of /// operands. /// struct VirtRegInfo { /// Reads - One of the operands read the virtual register. This does not /// include undef or internal use operands, see MO::readsReg(). bool Reads; /// Writes - One of the operands writes the virtual register. bool Writes; /// Tied - Uses and defs must use the same register. This can be because of /// a two-address constraint, or there may be a partial redefinition of a /// sub-register. bool Tied; }; /// AnalyzeVirtRegInBundle - Analyze how the current instruction or bundle uses /// a virtual register. This function should not be called after operator++(), /// it expects a fresh iterator. /// /// @param Reg The virtual register to analyze. /// @param Ops When set, this vector will receive an (MI, OpNum) entry for /// each operand referring to Reg. /// @returns A filled-in RegInfo struct. VirtRegInfo AnalyzeVirtRegInBundle( MachineInstr &MI, Register Reg, SmallVectorImpl<std::pair<MachineInstr *, unsigned>> *Ops = nullptr); /// Information about how a physical register Reg is used by a set of /// operands. struct PhysRegInfo { /// There is a regmask operand indicating Reg is clobbered. /// \see MachineOperand::CreateRegMask(). bool Clobbered; /// Reg or one of its aliases is defined. The definition may only cover /// parts of the register. bool Defined; /// Reg or a super-register is defined. The definition covers the full /// register. bool FullyDefined; /// Reg or one of its aliases is read. The register may only be read /// partially. bool Read; /// Reg or a super-register is read. The full register is read. bool FullyRead; /// Either: /// - Reg is FullyDefined and all defs of reg or an overlapping /// register are dead, or /// - Reg is completely dead because "defined" by a clobber. bool DeadDef; /// Reg is Defined and all defs of reg or an overlapping register are /// dead. bool PartialDeadDef; /// There is a use operand of reg or a super-register with kill flag set. bool Killed; }; /// AnalyzePhysRegInBundle - Analyze how the current instruction or bundle uses /// a physical register. This function should not be called after operator++(), /// it expects a fresh iterator. /// /// @param Reg The physical register to analyze. /// @returns A filled-in PhysRegInfo struct. PhysRegInfo AnalyzePhysRegInBundle(const MachineInstr &MI, Register Reg, const TargetRegisterInfo *TRI); } // End llvm namespace #endif
Upload File
Create Folder