109467b48Spatrick //===- llvm/CodeGen/GlobalISel/InstructionSelect.cpp - InstructionSelect ---==//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick /// \file
909467b48Spatrick /// This file implements the InstructionSelect class.
1009467b48Spatrick //===----------------------------------------------------------------------===//
1109467b48Spatrick
1209467b48Spatrick #include "llvm/CodeGen/GlobalISel/InstructionSelect.h"
1309467b48Spatrick #include "llvm/ADT/PostOrderIterator.h"
1473471bf0Spatrick #include "llvm/ADT/ScopeExit.h"
1573471bf0Spatrick #include "llvm/Analysis/LazyBlockFrequencyInfo.h"
1673471bf0Spatrick #include "llvm/Analysis/ProfileSummaryInfo.h"
1709467b48Spatrick #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
1809467b48Spatrick #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
1909467b48Spatrick #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
2009467b48Spatrick #include "llvm/CodeGen/GlobalISel/Utils.h"
2109467b48Spatrick #include "llvm/CodeGen/MachineFrameInfo.h"
22*d415bd75Srobert #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
2309467b48Spatrick #include "llvm/CodeGen/MachineRegisterInfo.h"
2409467b48Spatrick #include "llvm/CodeGen/TargetLowering.h"
2509467b48Spatrick #include "llvm/CodeGen/TargetPassConfig.h"
2609467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h"
2709467b48Spatrick #include "llvm/Config/config.h"
2809467b48Spatrick #include "llvm/IR/Function.h"
29*d415bd75Srobert #include "llvm/MC/TargetRegistry.h"
30*d415bd75Srobert #include "llvm/Support/CodeGenCoverage.h"
3109467b48Spatrick #include "llvm/Support/CommandLine.h"
3209467b48Spatrick #include "llvm/Support/Debug.h"
33097a140dSpatrick #include "llvm/Target/TargetMachine.h"
3409467b48Spatrick
3509467b48Spatrick #define DEBUG_TYPE "instruction-select"
3609467b48Spatrick
3709467b48Spatrick using namespace llvm;
3809467b48Spatrick
3909467b48Spatrick #ifdef LLVM_GISEL_COV_PREFIX
4009467b48Spatrick static cl::opt<std::string>
4109467b48Spatrick CoveragePrefix("gisel-coverage-prefix", cl::init(LLVM_GISEL_COV_PREFIX),
4209467b48Spatrick cl::desc("Record GlobalISel rule coverage files of this "
4309467b48Spatrick "prefix if instrumentation was generated"));
4409467b48Spatrick #else
4573471bf0Spatrick static const std::string CoveragePrefix;
4609467b48Spatrick #endif
4709467b48Spatrick
4809467b48Spatrick char InstructionSelect::ID = 0;
4909467b48Spatrick INITIALIZE_PASS_BEGIN(InstructionSelect, DEBUG_TYPE,
5009467b48Spatrick "Select target instructions out of generic instructions",
5109467b48Spatrick false, false)
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)5209467b48Spatrick INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
5309467b48Spatrick INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
5473471bf0Spatrick INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
5573471bf0Spatrick INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass)
5609467b48Spatrick INITIALIZE_PASS_END(InstructionSelect, DEBUG_TYPE,
5709467b48Spatrick "Select target instructions out of generic instructions",
5809467b48Spatrick false, false)
5909467b48Spatrick
6073471bf0Spatrick InstructionSelect::InstructionSelect(CodeGenOpt::Level OL)
6173471bf0Spatrick : MachineFunctionPass(ID), OptLevel(OL) {}
6273471bf0Spatrick
6373471bf0Spatrick // In order not to crash when calling getAnalysis during testing with -run-pass
6473471bf0Spatrick // we use the default opt level here instead of None, so that the addRequired()
6573471bf0Spatrick // calls are made in getAnalysisUsage().
InstructionSelect()6673471bf0Spatrick InstructionSelect::InstructionSelect()
6773471bf0Spatrick : MachineFunctionPass(ID), OptLevel(CodeGenOpt::Default) {}
6809467b48Spatrick
getAnalysisUsage(AnalysisUsage & AU) const6909467b48Spatrick void InstructionSelect::getAnalysisUsage(AnalysisUsage &AU) const {
7009467b48Spatrick AU.addRequired<TargetPassConfig>();
7109467b48Spatrick AU.addRequired<GISelKnownBitsAnalysis>();
7209467b48Spatrick AU.addPreserved<GISelKnownBitsAnalysis>();
73*d415bd75Srobert
74*d415bd75Srobert if (OptLevel != CodeGenOpt::None) {
7573471bf0Spatrick AU.addRequired<ProfileSummaryInfoWrapperPass>();
7673471bf0Spatrick LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU);
7773471bf0Spatrick }
7809467b48Spatrick getSelectionDAGFallbackAnalysisUsage(AU);
7909467b48Spatrick MachineFunctionPass::getAnalysisUsage(AU);
8009467b48Spatrick }
8109467b48Spatrick
runOnMachineFunction(MachineFunction & MF)8209467b48Spatrick bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) {
8309467b48Spatrick // If the ISel pipeline failed, do not bother running that pass.
8409467b48Spatrick if (MF.getProperties().hasProperty(
8509467b48Spatrick MachineFunctionProperties::Property::FailedISel))
8609467b48Spatrick return false;
8709467b48Spatrick
8809467b48Spatrick LLVM_DEBUG(dbgs() << "Selecting function: " << MF.getName() << '\n');
8909467b48Spatrick
9009467b48Spatrick const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
9109467b48Spatrick InstructionSelector *ISel = MF.getSubtarget().getInstructionSelector();
9273471bf0Spatrick
9373471bf0Spatrick CodeGenOpt::Level OldOptLevel = OptLevel;
9473471bf0Spatrick auto RestoreOptLevel = make_scope_exit([=]() { OptLevel = OldOptLevel; });
9573471bf0Spatrick OptLevel = MF.getFunction().hasOptNone() ? CodeGenOpt::None
9673471bf0Spatrick : MF.getTarget().getOptLevel();
9773471bf0Spatrick
98*d415bd75Srobert GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF);
9973471bf0Spatrick if (OptLevel != CodeGenOpt::None) {
10073471bf0Spatrick PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
10173471bf0Spatrick if (PSI && PSI->hasProfileSummary())
10273471bf0Spatrick BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI();
10373471bf0Spatrick }
10473471bf0Spatrick
10509467b48Spatrick CodeGenCoverage CoverageInfo;
10609467b48Spatrick assert(ISel && "Cannot work without InstructionSelector");
10773471bf0Spatrick ISel->setupMF(MF, KB, CoverageInfo, PSI, BFI);
10809467b48Spatrick
10909467b48Spatrick // An optimization remark emitter. Used to report failures.
11009467b48Spatrick MachineOptimizationRemarkEmitter MORE(MF, /*MBFI=*/nullptr);
11109467b48Spatrick
11209467b48Spatrick // FIXME: There are many other MF/MFI fields we need to initialize.
11309467b48Spatrick
11409467b48Spatrick MachineRegisterInfo &MRI = MF.getRegInfo();
11509467b48Spatrick #ifndef NDEBUG
11609467b48Spatrick // Check that our input is fully legal: we require the function to have the
11709467b48Spatrick // Legalized property, so it should be.
11809467b48Spatrick // FIXME: This should be in the MachineVerifier, as the RegBankSelected
11909467b48Spatrick // property check already is.
12009467b48Spatrick if (!DisableGISelLegalityCheck)
12109467b48Spatrick if (const MachineInstr *MI = machineFunctionIsIllegal(MF)) {
12209467b48Spatrick reportGISelFailure(MF, TPC, MORE, "gisel-select",
12309467b48Spatrick "instruction is not legal", *MI);
12409467b48Spatrick return false;
12509467b48Spatrick }
12609467b48Spatrick // FIXME: We could introduce new blocks and will need to fix the outer loop.
12709467b48Spatrick // Until then, keep track of the number of blocks to assert that we don't.
12809467b48Spatrick const size_t NumBlocks = MF.size();
12909467b48Spatrick #endif
130*d415bd75Srobert // Keep track of selected blocks, so we can delete unreachable ones later.
131*d415bd75Srobert DenseSet<MachineBasicBlock *> SelectedBlocks;
13209467b48Spatrick
13309467b48Spatrick for (MachineBasicBlock *MBB : post_order(&MF)) {
13473471bf0Spatrick ISel->CurMBB = MBB;
135*d415bd75Srobert SelectedBlocks.insert(MBB);
13609467b48Spatrick if (MBB->empty())
13709467b48Spatrick continue;
13809467b48Spatrick
13909467b48Spatrick // Select instructions in reverse block order. We permit erasing so have
14009467b48Spatrick // to resort to manually iterating and recognizing the begin (rend) case.
14109467b48Spatrick bool ReachedBegin = false;
14209467b48Spatrick for (auto MII = std::prev(MBB->end()), Begin = MBB->begin();
14309467b48Spatrick !ReachedBegin;) {
14409467b48Spatrick #ifndef NDEBUG
14509467b48Spatrick // Keep track of the insertion range for debug printing.
14609467b48Spatrick const auto AfterIt = std::next(MII);
14709467b48Spatrick #endif
14809467b48Spatrick // Select this instruction.
14909467b48Spatrick MachineInstr &MI = *MII;
15009467b48Spatrick
15109467b48Spatrick // And have our iterator point to the next instruction, if there is one.
15209467b48Spatrick if (MII == Begin)
15309467b48Spatrick ReachedBegin = true;
15409467b48Spatrick else
15509467b48Spatrick --MII;
15609467b48Spatrick
15709467b48Spatrick LLVM_DEBUG(dbgs() << "Selecting: \n " << MI);
15809467b48Spatrick
15909467b48Spatrick // We could have folded this instruction away already, making it dead.
16009467b48Spatrick // If so, erase it.
16109467b48Spatrick if (isTriviallyDead(MI, MRI)) {
16209467b48Spatrick LLVM_DEBUG(dbgs() << "Is dead; erasing.\n");
163*d415bd75Srobert salvageDebugInfo(MRI, MI);
164*d415bd75Srobert MI.eraseFromParent();
16509467b48Spatrick continue;
16609467b48Spatrick }
16709467b48Spatrick
16873471bf0Spatrick // Eliminate hints.
16973471bf0Spatrick if (isPreISelGenericOptimizationHint(MI.getOpcode())) {
17073471bf0Spatrick Register DstReg = MI.getOperand(0).getReg();
17173471bf0Spatrick Register SrcReg = MI.getOperand(1).getReg();
17273471bf0Spatrick
17373471bf0Spatrick // At this point, the destination register class of the hint may have
17473471bf0Spatrick // been decided.
17573471bf0Spatrick //
17673471bf0Spatrick // Propagate that through to the source register.
17773471bf0Spatrick const TargetRegisterClass *DstRC = MRI.getRegClassOrNull(DstReg);
17873471bf0Spatrick if (DstRC)
17973471bf0Spatrick MRI.setRegClass(SrcReg, DstRC);
18073471bf0Spatrick assert(canReplaceReg(DstReg, SrcReg, MRI) &&
18173471bf0Spatrick "Must be able to replace dst with src!");
18273471bf0Spatrick MI.eraseFromParent();
18373471bf0Spatrick MRI.replaceRegWith(DstReg, SrcReg);
18473471bf0Spatrick continue;
18573471bf0Spatrick }
18673471bf0Spatrick
187*d415bd75Srobert if (MI.getOpcode() == TargetOpcode::G_INVOKE_REGION_START) {
188*d415bd75Srobert MI.eraseFromParent();
189*d415bd75Srobert continue;
190*d415bd75Srobert }
191*d415bd75Srobert
19209467b48Spatrick if (!ISel->select(MI)) {
19309467b48Spatrick // FIXME: It would be nice to dump all inserted instructions. It's
19409467b48Spatrick // not obvious how, esp. considering select() can insert after MI.
19509467b48Spatrick reportGISelFailure(MF, TPC, MORE, "gisel-select", "cannot select", MI);
19609467b48Spatrick return false;
19709467b48Spatrick }
19809467b48Spatrick
19909467b48Spatrick // Dump the range of instructions that MI expanded into.
20009467b48Spatrick LLVM_DEBUG({
20109467b48Spatrick auto InsertedBegin = ReachedBegin ? MBB->begin() : std::next(MII);
20209467b48Spatrick dbgs() << "Into:\n";
20309467b48Spatrick for (auto &InsertedMI : make_range(InsertedBegin, AfterIt))
20409467b48Spatrick dbgs() << " " << InsertedMI;
20509467b48Spatrick dbgs() << '\n';
20609467b48Spatrick });
20709467b48Spatrick }
20809467b48Spatrick }
20909467b48Spatrick
21009467b48Spatrick for (MachineBasicBlock &MBB : MF) {
21109467b48Spatrick if (MBB.empty())
21209467b48Spatrick continue;
21309467b48Spatrick
214*d415bd75Srobert if (!SelectedBlocks.contains(&MBB)) {
215*d415bd75Srobert // This is an unreachable block and therefore hasn't been selected, since
216*d415bd75Srobert // the main selection loop above uses a postorder block traversal.
217*d415bd75Srobert // We delete all the instructions in this block since it's unreachable.
218*d415bd75Srobert MBB.clear();
219*d415bd75Srobert // Don't delete the block in case the block has it's address taken or is
220*d415bd75Srobert // still being referenced by a phi somewhere.
221*d415bd75Srobert continue;
222*d415bd75Srobert }
22309467b48Spatrick // Try to find redundant copies b/w vregs of the same register class.
22409467b48Spatrick bool ReachedBegin = false;
22509467b48Spatrick for (auto MII = std::prev(MBB.end()), Begin = MBB.begin(); !ReachedBegin;) {
22609467b48Spatrick // Select this instruction.
22709467b48Spatrick MachineInstr &MI = *MII;
22809467b48Spatrick
22909467b48Spatrick // And have our iterator point to the next instruction, if there is one.
23009467b48Spatrick if (MII == Begin)
23109467b48Spatrick ReachedBegin = true;
23209467b48Spatrick else
23309467b48Spatrick --MII;
23409467b48Spatrick if (MI.getOpcode() != TargetOpcode::COPY)
23509467b48Spatrick continue;
23609467b48Spatrick Register SrcReg = MI.getOperand(1).getReg();
23709467b48Spatrick Register DstReg = MI.getOperand(0).getReg();
238*d415bd75Srobert if (SrcReg.isVirtual() && DstReg.isVirtual()) {
23909467b48Spatrick auto SrcRC = MRI.getRegClass(SrcReg);
24009467b48Spatrick auto DstRC = MRI.getRegClass(DstReg);
24109467b48Spatrick if (SrcRC == DstRC) {
24209467b48Spatrick MRI.replaceRegWith(DstReg, SrcReg);
243097a140dSpatrick MI.eraseFromParent();
24409467b48Spatrick }
24509467b48Spatrick }
24609467b48Spatrick }
24709467b48Spatrick }
24809467b48Spatrick
24909467b48Spatrick #ifndef NDEBUG
25009467b48Spatrick const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
25109467b48Spatrick // Now that selection is complete, there are no more generic vregs. Verify
25209467b48Spatrick // that the size of the now-constrained vreg is unchanged and that it has a
25309467b48Spatrick // register class.
25409467b48Spatrick for (unsigned I = 0, E = MRI.getNumVirtRegs(); I != E; ++I) {
255*d415bd75Srobert Register VReg = Register::index2VirtReg(I);
25609467b48Spatrick
25709467b48Spatrick MachineInstr *MI = nullptr;
25809467b48Spatrick if (!MRI.def_empty(VReg))
25909467b48Spatrick MI = &*MRI.def_instr_begin(VReg);
260*d415bd75Srobert else if (!MRI.use_empty(VReg)) {
26109467b48Spatrick MI = &*MRI.use_instr_begin(VReg);
262*d415bd75Srobert // Debug value instruction is permitted to use undefined vregs.
263*d415bd75Srobert if (MI->isDebugValue())
264*d415bd75Srobert continue;
265*d415bd75Srobert }
26609467b48Spatrick if (!MI)
26709467b48Spatrick continue;
26809467b48Spatrick
26909467b48Spatrick const TargetRegisterClass *RC = MRI.getRegClassOrNull(VReg);
27009467b48Spatrick if (!RC) {
27109467b48Spatrick reportGISelFailure(MF, TPC, MORE, "gisel-select",
27209467b48Spatrick "VReg has no regclass after selection", *MI);
27309467b48Spatrick return false;
27409467b48Spatrick }
27509467b48Spatrick
27609467b48Spatrick const LLT Ty = MRI.getType(VReg);
27709467b48Spatrick if (Ty.isValid() && Ty.getSizeInBits() > TRI.getRegSizeInBits(*RC)) {
27809467b48Spatrick reportGISelFailure(
27909467b48Spatrick MF, TPC, MORE, "gisel-select",
28009467b48Spatrick "VReg's low-level type and register class have different sizes", *MI);
28109467b48Spatrick return false;
28209467b48Spatrick }
28309467b48Spatrick }
28409467b48Spatrick
28509467b48Spatrick if (MF.size() != NumBlocks) {
28609467b48Spatrick MachineOptimizationRemarkMissed R("gisel-select", "GISelFailure",
28709467b48Spatrick MF.getFunction().getSubprogram(),
28809467b48Spatrick /*MBB=*/nullptr);
28909467b48Spatrick R << "inserting blocks is not supported yet";
29009467b48Spatrick reportGISelFailure(MF, TPC, MORE, R);
29109467b48Spatrick return false;
29209467b48Spatrick }
29309467b48Spatrick #endif
29409467b48Spatrick // Determine if there are any calls in this machine function. Ported from
29509467b48Spatrick // SelectionDAG.
29609467b48Spatrick MachineFrameInfo &MFI = MF.getFrameInfo();
29709467b48Spatrick for (const auto &MBB : MF) {
29809467b48Spatrick if (MFI.hasCalls() && MF.hasInlineAsm())
29909467b48Spatrick break;
30009467b48Spatrick
30109467b48Spatrick for (const auto &MI : MBB) {
30209467b48Spatrick if ((MI.isCall() && !MI.isReturn()) || MI.isStackAligningInlineAsm())
30309467b48Spatrick MFI.setHasCalls(true);
30409467b48Spatrick if (MI.isInlineAsm())
30509467b48Spatrick MF.setHasInlineAsm(true);
30609467b48Spatrick }
30709467b48Spatrick }
30809467b48Spatrick
309097a140dSpatrick // FIXME: FinalizeISel pass calls finalizeLowering, so it's called twice.
310097a140dSpatrick auto &TLI = *MF.getSubtarget().getTargetLowering();
311097a140dSpatrick TLI.finalizeLowering(MF);
31209467b48Spatrick
31309467b48Spatrick LLVM_DEBUG({
31409467b48Spatrick dbgs() << "Rules covered by selecting function: " << MF.getName() << ":";
31509467b48Spatrick for (auto RuleID : CoverageInfo.covered())
31609467b48Spatrick dbgs() << " id" << RuleID;
31709467b48Spatrick dbgs() << "\n\n";
31809467b48Spatrick });
31909467b48Spatrick CoverageInfo.emit(CoveragePrefix,
320097a140dSpatrick TLI.getTargetMachine().getTarget().getBackendName());
32109467b48Spatrick
32209467b48Spatrick // If we successfully selected the function nothing is going to use the vreg
32309467b48Spatrick // types after us (otherwise MIRPrinter would need them). Make sure the types
32409467b48Spatrick // disappear.
32509467b48Spatrick MRI.clearVirtRegTypes();
32609467b48Spatrick
32709467b48Spatrick // FIXME: Should we accurately track changes?
32809467b48Spatrick return true;
32909467b48Spatrick }
330