30#include "llvm/Config/config.h"
38#define DEBUG_TYPE "instruction-select"
43 "Controls whether to select function with GlobalISel");
45#ifdef LLVM_GISEL_COV_PREFIX
48 cl::desc(
"Record GlobalISel rule coverage files of this "
49 "prefix if instrumentation was generated"));
56 "Select target instructions out of generic instructions",
63 "Select target instructions out of generic instructions",
97 if (
MII.getInstrIterator().getNodePtr() == &
MI) {
108 if (CreatedInstrs.empty()) {
109 dbgs() <<
"Created no instructions.\n";
111 dbgs() <<
"Created:\n";
112 for (
const auto *
MI : CreatedInstrs) {
115 CreatedInstrs.clear();
151 if (
PSI &&
PSI->hasProfileSummary())
160 assert(
ISel &&
"Cannot work without InstructionSelector");
181 "instruction is not legal", *
MI);
186 const size_t NumBlocks = MF.
size();
201 ISel->AllObservers = &AllObservers;
208 MIIMaintainer.
MII =
MBB->rbegin();
209 for (
auto End =
MBB->rend(); MIIMaintainer.
MII != End;) {
241 for (
auto MII =
MBB.rbegin(), End =
MBB.rend(); MII != End;) {
245 if (
MI.getOpcode() != TargetOpcode::COPY)
250 auto SrcRC =
MRI.getRegClass(SrcReg);
251 auto DstRC =
MRI.getRegClass(DstReg);
252 if (SrcRC == DstRC) {
253 MRI.replaceRegWith(DstReg, SrcReg);
254 MI.eraseFromParent();
265 for (
unsigned I = 0, E =
MRI.getNumVirtRegs();
I != E; ++
I) {
269 if (!
MRI.def_empty(VReg))
270 MI = &*
MRI.def_instr_begin(VReg);
271 else if (!
MRI.use_empty(VReg)) {
272 MI = &*
MRI.use_instr_begin(VReg);
274 if (
MI->isDebugValue())
283 "VReg has no regclass after selection", *
MI);
287 const LLT Ty =
MRI.getType(VReg);
291 MF, TPC,
MORE,
"gisel-select",
292 "VReg's low-level type and register class have different sizes", *
MI);
297 if (MF.
size() != NumBlocks) {
301 R <<
"inserting blocks is not supported yet";
308 dbgs() <<
"Falling back for function " << MF.
getName() <<
"\n";
316 for (
const auto &
MBB : MF) {
320 for (
const auto &
MI :
MBB) {
321 if ((
MI.isCall() && !
MI.isReturn()) ||
MI.isStackAligningInlineAsm())
323 if (
MI.isInlineAsm())
333 dbgs() <<
"Rules covered by selecting function: " << MF.
getName() <<
":";
334 for (
auto RuleID : CoverageInfo.
covered())
335 dbgs() <<
" id" << RuleID;
339 TLI.getTargetMachine().getTarget().getBackendName());
344 MRI.clearVirtRegTypes();
358 MI.eraseFromParent();
364 MI.getOpcode() == TargetOpcode::G_CONSTANT_FOLD_BARRIER) {
365 auto [DstReg, SrcReg] =
MI.getFirst2Regs();
373 MRI.setRegClass(SrcReg, DstRC);
375 "Must be able to replace dst with src!");
376 MI.eraseFromParent();
377 MRI.replaceRegWith(DstReg, SrcReg);
381 if (
MI.getOpcode() == TargetOpcode::G_INVOKE_REGION_START) {
382 MI.eraseFromParent();
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file provides an implementation of debug counters.
#define DEBUG_COUNTER(VARNAME, COUNTERNAME, DESC)
This contains common code to allow clients to notify changes to machine instr.
Provides analysis for querying information about KnownBits during GISel passes.
static const std::string CoveragePrefix
Interface for Targets to specify which operations they can successfully select and how the others sho...
Register const TargetRegisterInfo * TRI
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file implements a set that has insertion order iteration characteristics.
This file describes how to lower LLVM code to machine code.
Target-Independent Code Generator Pass Configuration Options pass.
This class observes instruction insertions/removals.
MachineBasicBlock::reverse_iterator MII
void reportFullyCreatedInstrs()
void erasingInstr(MachineInstr &MI) override
An instruction is about to be erased.
void changedInstr(MachineInstr &MI) override
This instruction was mutated in some way.
void changingInstr(MachineInstr &MI) override
This instruction is about to be mutated in some way.
void createdInstr(MachineInstr &MI) override
An instruction has been created and inserted into the function.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
iterator_range< const_covered_iterator > covered() const
bool emit(StringRef FilePrefix, StringRef BackendName) const
static bool shouldExecute(unsigned CounterName)
Implements a dense probed hash-table based set.
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasOptNone() const
Do not optimize this function (-O0).
Abstract class that contains various methods for clients to notify about changes.
Simple wrapper observer that takes several observers, and calls each one for each event.
void addObserver(GISelChangeObserver *O)
To use KnownBitsInfo analysis in a pass, KnownBitsInfo &Info = getAnalysis<GISelValueTrackingInfoAnal...
This pass is responsible for selecting generic machine instructions to target-specific instructions.
InstructionSelector * ISel
bool selectMachineFunction(MachineFunction &MF)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
InstructionSelect(CodeGenOptLevel OL=CodeGenOptLevel::Default, char &PassID=ID)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
bool selectInstr(MachineInstr &MI)
This is an alternative analysis pass to BlockFrequencyInfoWrapperPass.
static void getLazyBFIAnalysisUsage(AnalysisUsage &AU)
Helper for client passes to set up the analysis usage on behalf of this pass.
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasCalls() const
Return true if the current function has any function calls.
MachineFunctionPass(char &ID)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
void setHasInlineAsm(bool B)
Set a flag that indicates that the function contains inline assembly.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool hasInlineAsm() const
Returns true if the function contains any inline assembly.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineFunctionProperties & getProperties() const
Get the function properties.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
A simple RAII based Delegate installer.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
A SetVector that performs no allocations if smaller than a certain size.
virtual void finalizeLowering(MachineFunction &MF) const
Execute target specific actions to finalize target lowering.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
Target-Independent Code Generator Pass Configuration Options.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual InstructionSelector * getInstructionSelector() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
iterator_range< po_iterator< T > > post_order(const T &G)
bool isPreISelGenericOptimizationHint(unsigned Opcode)
LLVM_ABI cl::opt< bool > DisableGISelLegalityCheck
LLVM_ABI bool canReplaceReg(Register DstReg, Register SrcReg, MachineRegisterInfo &MRI)
Check if DstReg can be replaced with SrcReg depending on the register constraints.
LLVM_ABI void reportGISelFailure(MachineFunction &MF, const TargetPassConfig &TPC, MachineOptimizationRemarkEmitter &MORE, MachineOptimizationRemarkMissed &R)
Report an ISel error as a missed optimization remark to the LLVMContext's diagnostic stream.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
const MachineInstr * machineFunctionIsIllegal(const MachineFunction &MF)
Checks that MIR is fully legal, returns an illegal instruction if it's not, nullptr otherwise.
CodeGenOptLevel
Code generation optimization level.
LLVM_ABI void getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU)
Modify analysis usage so it preserves passes required for the SelectionDAG fallback.
LLVM_ABI bool isTriviallyDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
Check whether an instruction MI is dead: it only defines dead virtual registers, and doesn't have oth...