blob: b8503de36fe4213a15b060104f048e748855334d [file] [log] [blame]
Eugene Zelenko76bf48d2017-06-26 22:44:03 +00001//===- llvm/CodeGen/GlobalISel/InstructionSelector.cpp --------------------===//
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Eugene Zelenko4f81cdd2017-09-29 21:55:49 +00009//
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000010/// \file
11/// This file implements the InstructionSelector class.
Eugene Zelenko4f81cdd2017-09-29 21:55:49 +000012//
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000013//===----------------------------------------------------------------------===//
14
15#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
Quentin Colombetb4e71182016-12-22 21:56:19 +000016#include "llvm/CodeGen/GlobalISel/Utils.h"
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000017#include "llvm/CodeGen/MachineBasicBlock.h"
18#include "llvm/CodeGen/MachineFunction.h"
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000019#include "llvm/CodeGen/MachineInstr.h"
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000020#include "llvm/CodeGen/MachineOperand.h"
Daniel Sandersea8711b2017-10-16 03:36:29 +000021#include "llvm/CodeGen/MachineRegisterInfo.h"
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000022#include "llvm/MC/MCInstrDesc.h"
23#include "llvm/Support/Debug.h"
24#include "llvm/Support/raw_ostream.h"
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000025#include "llvm/Target/TargetRegisterInfo.h"
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000026#include <cassert>
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000027
28#define DEBUG_TYPE "instructionselector"
29
30using namespace llvm;
31
Daniel Sanders6ab0daa2017-07-04 14:35:06 +000032InstructionSelector::MatcherState::MatcherState(unsigned MaxRenderers)
Daniel Sandersdf39cba2017-10-15 18:22:54 +000033 : Renderers(MaxRenderers), MIs() {}
Daniel Sanders6ab0daa2017-07-04 14:35:06 +000034
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000035InstructionSelector::InstructionSelector() = default;
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000036
Daniel Sandersa6e2ceb2017-06-20 12:36:34 +000037bool InstructionSelector::constrainOperandRegToRegClass(
38 MachineInstr &I, unsigned OpIdx, const TargetRegisterClass &RC,
39 const TargetInstrInfo &TII, const TargetRegisterInfo &TRI,
40 const RegisterBankInfo &RBI) const {
41 MachineBasicBlock &MBB = *I.getParent();
42 MachineFunction &MF = *MBB.getParent();
43 MachineRegisterInfo &MRI = MF.getRegInfo();
44
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000045 return
46 constrainRegToClass(MRI, TII, RBI, I, I.getOperand(OpIdx).getReg(), RC);
Daniel Sandersa6e2ceb2017-06-20 12:36:34 +000047}
48
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000049bool InstructionSelector::constrainSelectedInstRegOperands(
50 MachineInstr &I, const TargetInstrInfo &TII, const TargetRegisterInfo &TRI,
51 const RegisterBankInfo &RBI) const {
52 MachineBasicBlock &MBB = *I.getParent();
53 MachineFunction &MF = *MBB.getParent();
54 MachineRegisterInfo &MRI = MF.getRegInfo();
55
56 for (unsigned OpI = 0, OpE = I.getNumExplicitOperands(); OpI != OpE; ++OpI) {
57 MachineOperand &MO = I.getOperand(OpI);
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000058
Tim Northoverbdf16242016-10-10 21:50:00 +000059 // There's nothing to be done on non-register operands.
60 if (!MO.isReg())
Ahmed Bougacha7adfac52016-07-29 16:56:16 +000061 continue;
62
63 DEBUG(dbgs() << "Converting operand: " << MO << '\n');
64 assert(MO.isReg() && "Unsupported non-reg operand");
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000065
Quentin Colombetb4e71182016-12-22 21:56:19 +000066 unsigned Reg = MO.getReg();
Ahmed Bougachae4c03ab2016-08-16 14:37:46 +000067 // Physical registers don't need to be constrained.
Quentin Colombetb4e71182016-12-22 21:56:19 +000068 if (TRI.isPhysicalRegister(Reg))
Ahmed Bougachae4c03ab2016-08-16 14:37:46 +000069 continue;
70
Diana Picus812caee2016-12-16 12:54:46 +000071 // Register operands with a value of 0 (e.g. predicate operands) don't need
72 // to be constrained.
Quentin Colombetb4e71182016-12-22 21:56:19 +000073 if (Reg == 0)
Diana Picus812caee2016-12-16 12:54:46 +000074 continue;
75
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000076 // If the operand is a vreg, we should constrain its regclass, and only
77 // insert COPYs if that's impossible.
Quentin Colombetb4e71182016-12-22 21:56:19 +000078 // constrainOperandRegClass does that for us.
79 MO.setReg(constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, I.getDesc(),
80 Reg, OpI));
Igor Bregerf7359d82017-02-22 12:25:09 +000081
Daniel Sanderse9fdba32017-04-29 17:30:09 +000082 // Tie uses to defs as indicated in MCInstrDesc if this hasn't already been
83 // done.
Igor Bregerf7359d82017-02-22 12:25:09 +000084 if (MO.isUse()) {
85 int DefIdx = I.getDesc().getOperandConstraint(OpI, MCOI::TIED_TO);
Daniel Sanderse9fdba32017-04-29 17:30:09 +000086 if (DefIdx != -1 && !I.isRegTiedToUseOperand(DefIdx))
Igor Bregerf7359d82017-02-22 12:25:09 +000087 I.tieOperands(DefIdx, OpI);
88 }
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000089 }
90 return true;
91}
Ahmed Bougacha7f2d1732017-03-19 16:12:48 +000092
93bool InstructionSelector::isOperandImmEqual(
94 const MachineOperand &MO, int64_t Value,
95 const MachineRegisterInfo &MRI) const {
Daniel Sanders89e93082017-05-18 10:33:36 +000096 if (MO.isReg() && MO.getReg())
Ahmed Bougacha2d29998f2017-03-27 16:35:27 +000097 if (auto VRegVal = getConstantVRegVal(MO.getReg(), MRI))
98 return *VRegVal == Value;
Ahmed Bougacha7f2d1732017-03-19 16:12:48 +000099 return false;
100}
Daniel Sandersbee57392017-04-04 13:25:23 +0000101
Daniel Sandersea8711b2017-10-16 03:36:29 +0000102bool InstructionSelector::isBaseWithConstantOffset(
103 const MachineOperand &Root, const MachineRegisterInfo &MRI) const {
104 if (!Root.isReg())
105 return false;
106
107 MachineInstr *RootI = MRI.getVRegDef(Root.getReg());
108 if (RootI->getOpcode() != TargetOpcode::G_GEP)
109 return false;
110
111 MachineOperand &RHS = RootI->getOperand(2);
112 MachineInstr *RHSI = MRI.getVRegDef(RHS.getReg());
113 if (RHSI->getOpcode() != TargetOpcode::G_CONSTANT)
114 return false;
115
116 return true;
117}
118
Daniel Sanders7e523672017-11-11 03:23:44 +0000119bool InstructionSelector::isObviouslySafeToFold(MachineInstr &MI,
120 MachineInstr &IntoMI) const {
121 // Immediate neighbours are already folded.
122 if (MI.getParent() == IntoMI.getParent() &&
123 std::next(MI.getIterator()) == IntoMI.getIterator())
124 return true;
125
Daniel Sandersbee57392017-04-04 13:25:23 +0000126 return !MI.mayLoadOrStore() && !MI.hasUnmodeledSideEffects() &&
127 MI.implicit_operands().begin() == MI.implicit_operands().end();
128}