176bf48d9SEugene Zelenko //===- llvm/CodeGen/GlobalISel/InstructionSelector.cpp --------------------===//
26756a2c9SAhmed Bougacha //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66756a2c9SAhmed Bougacha //
76756a2c9SAhmed Bougacha //===----------------------------------------------------------------------===//
84f81cdd8SEugene Zelenko //
96756a2c9SAhmed Bougacha /// \file
106756a2c9SAhmed Bougacha /// This file implements the InstructionSelector class.
114f81cdd8SEugene Zelenko //
126756a2c9SAhmed Bougacha //===----------------------------------------------------------------------===//
136756a2c9SAhmed Bougacha 
146756a2c9SAhmed Bougacha #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
15b4e71185SQuentin Colombet #include "llvm/CodeGen/GlobalISel/Utils.h"
166756a2c9SAhmed Bougacha #include "llvm/CodeGen/MachineInstr.h"
1776bf48d9SEugene Zelenko #include "llvm/CodeGen/MachineOperand.h"
18ea8711b8SDaniel Sanders #include "llvm/CodeGen/MachineRegisterInfo.h"
196756a2c9SAhmed Bougacha 
206756a2c9SAhmed Bougacha #define DEBUG_TYPE "instructionselector"
216756a2c9SAhmed Bougacha 
226756a2c9SAhmed Bougacha using namespace llvm;
236756a2c9SAhmed Bougacha 
MatcherState(unsigned MaxRenderers)246ab0daadSDaniel Sanders InstructionSelector::MatcherState::MatcherState(unsigned MaxRenderers)
25b932bdf5SKazu Hirata     : Renderers(MaxRenderers) {}
266ab0daadSDaniel Sanders 
2776bf48d9SEugene Zelenko InstructionSelector::InstructionSelector() = default;
286756a2c9SAhmed Bougacha 
isOperandImmEqual(const MachineOperand & MO,int64_t Value,const MachineRegisterInfo & MRI) const297f2d1733SAhmed Bougacha bool InstructionSelector::isOperandImmEqual(
307f2d1733SAhmed Bougacha     const MachineOperand &MO, int64_t Value,
317f2d1733SAhmed Bougacha     const MachineRegisterInfo &MRI) const {
3289e93086SDaniel Sanders   if (MO.isReg() && MO.getReg())
33d477a7c2SPetar Avramovic     if (auto VRegVal = getIConstantVRegValWithLookThrough(MO.getReg(), MRI))
34581d13f8SMatt Arsenault       return VRegVal->Value.getSExtValue() == Value;
357f2d1733SAhmed Bougacha   return false;
367f2d1733SAhmed Bougacha }
37bee5739aSDaniel Sanders 
isBaseWithConstantOffset(const MachineOperand & Root,const MachineRegisterInfo & MRI) const38ea8711b8SDaniel Sanders bool InstructionSelector::isBaseWithConstantOffset(
39ea8711b8SDaniel Sanders     const MachineOperand &Root, const MachineRegisterInfo &MRI) const {
40ea8711b8SDaniel Sanders   if (!Root.isReg())
41ea8711b8SDaniel Sanders     return false;
42ea8711b8SDaniel Sanders 
43ea8711b8SDaniel Sanders   MachineInstr *RootI = MRI.getVRegDef(Root.getReg());
44e74c5b96SDaniel Sanders   if (RootI->getOpcode() != TargetOpcode::G_PTR_ADD)
45ea8711b8SDaniel Sanders     return false;
46ea8711b8SDaniel Sanders 
47ea8711b8SDaniel Sanders   MachineOperand &RHS = RootI->getOperand(2);
48ea8711b8SDaniel Sanders   MachineInstr *RHSI = MRI.getVRegDef(RHS.getReg());
49ea8711b8SDaniel Sanders   if (RHSI->getOpcode() != TargetOpcode::G_CONSTANT)
50ea8711b8SDaniel Sanders     return false;
51ea8711b8SDaniel Sanders 
52ea8711b8SDaniel Sanders   return true;
53ea8711b8SDaniel Sanders }
54ea8711b8SDaniel Sanders 
isObviouslySafeToFold(MachineInstr & MI,MachineInstr & IntoMI) const557e523673SDaniel Sanders bool InstructionSelector::isObviouslySafeToFold(MachineInstr &MI,
567e523673SDaniel Sanders                                                 MachineInstr &IntoMI) const {
577e523673SDaniel Sanders   // Immediate neighbours are already folded.
587e523673SDaniel Sanders   if (MI.getParent() == IntoMI.getParent() &&
597e523673SDaniel Sanders       std::next(MI.getIterator()) == IntoMI.getIterator())
607e523673SDaniel Sanders     return true;
617e523673SDaniel Sanders 
62*f4145ddfSQuentin Colombet   // Convergent instructions cannot be moved in the CFG.
63*f4145ddfSQuentin Colombet   if (MI.isConvergent() && MI.getParent() != IntoMI.getParent())
64*f4145ddfSQuentin Colombet     return false;
65*f4145ddfSQuentin Colombet 
666c5d5ce5SUlrich Weigand   return !MI.mayLoadOrStore() && !MI.mayRaiseFPException() &&
67fdaa7421SJordan Rose          !MI.hasUnmodeledSideEffects() && MI.implicit_operands().empty();
68bee5739aSDaniel Sanders }
69