003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
lib
/
CodeGen
/
GlobalISel
/
📁
..
📄
CSEInfo.cpp
(12.25 KB)
📄
CSEMIRBuilder.cpp
(8.85 KB)
📄
CallLowering.cpp
(19.93 KB)
📄
Combiner.cpp
(5.58 KB)
📄
CombinerHelper.cpp
(62.81 KB)
📄
GISelChangeObserver.cpp
(1.69 KB)
📄
GISelKnownBits.cpp
(18.45 KB)
📄
GlobalISel.cpp
(901 B)
📄
IRTranslator.cpp
(90.61 KB)
📄
InlineAsmLowering.cpp
(24.72 KB)
📄
InstructionSelect.cpp
(9.31 KB)
📄
InstructionSelector.cpp
(2.88 KB)
📄
LegalityPredicates.cpp
(6.61 KB)
📄
LegalizeMutations.cpp
(2.68 KB)
📄
Legalizer.cpp
(14.52 KB)
📄
LegalizerHelper.cpp
(185.18 KB)
📄
LegalizerInfo.cpp
(27.83 KB)
📄
Localizer.cpp
(7.14 KB)
📄
LostDebugLocObserver.cpp
(3.38 KB)
📄
MachineIRBuilder.cpp
(45.42 KB)
📄
RegBankSelect.cpp
(41.82 KB)
📄
RegisterBank.cpp
(3.96 KB)
📄
RegisterBankInfo.cpp
(30.26 KB)
📄
Utils.cpp
(19.66 KB)
Editing: InstructionSelector.cpp
//===- llvm/CodeGen/GlobalISel/InstructionSelector.cpp --------------------===// // // 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 // //===----------------------------------------------------------------------===// // /// \file /// This file implements the InstructionSelector class. // //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" #include "llvm/CodeGen/GlobalISel/Utils.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/MC/MCInstrDesc.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include <cassert> #define DEBUG_TYPE "instructionselector" using namespace llvm; InstructionSelector::MatcherState::MatcherState(unsigned MaxRenderers) : Renderers(MaxRenderers), MIs() {} InstructionSelector::InstructionSelector() = default; bool InstructionSelector::constrainOperandRegToRegClass( MachineInstr &I, unsigned OpIdx, const TargetRegisterClass &RC, const TargetInstrInfo &TII, const TargetRegisterInfo &TRI, const RegisterBankInfo &RBI) const { MachineBasicBlock &MBB = *I.getParent(); MachineFunction &MF = *MBB.getParent(); MachineRegisterInfo &MRI = MF.getRegInfo(); return constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, RC, I.getOperand(OpIdx)); } bool InstructionSelector::isOperandImmEqual( const MachineOperand &MO, int64_t Value, const MachineRegisterInfo &MRI) const { if (MO.isReg() && MO.getReg()) if (auto VRegVal = getConstantVRegValWithLookThrough(MO.getReg(), MRI)) return VRegVal->Value == Value; return false; } bool InstructionSelector::isBaseWithConstantOffset( const MachineOperand &Root, const MachineRegisterInfo &MRI) const { if (!Root.isReg()) return false; MachineInstr *RootI = MRI.getVRegDef(Root.getReg()); if (RootI->getOpcode() != TargetOpcode::G_PTR_ADD) return false; MachineOperand &RHS = RootI->getOperand(2); MachineInstr *RHSI = MRI.getVRegDef(RHS.getReg()); if (RHSI->getOpcode() != TargetOpcode::G_CONSTANT) return false; return true; } bool InstructionSelector::isObviouslySafeToFold(MachineInstr &MI, MachineInstr &IntoMI) const { // Immediate neighbours are already folded. if (MI.getParent() == IntoMI.getParent() && std::next(MI.getIterator()) == IntoMI.getIterator()) return true; return !MI.mayLoadOrStore() && !MI.mayRaiseFPException() && !MI.hasUnmodeledSideEffects() && MI.implicit_operands().empty(); }
Upload File
Create Folder