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