blob: e4ee2bb7cf480b40c10ff25b2c161877835d809a [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"
21#include "llvm/MC/MCInstrDesc.h"
22#include "llvm/Support/Debug.h"
23#include "llvm/Support/raw_ostream.h"
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000024#include "llvm/Target/TargetRegisterInfo.h"
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000025#include <cassert>
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000026
27#define DEBUG_TYPE "instructionselector"
28
29using namespace llvm;
30
Daniel Sanders6ab0daa2017-07-04 14:35:06 +000031InstructionSelector::MatcherState::MatcherState(unsigned MaxRenderers)
Daniel Sandersdf39cba2017-10-15 18:22:54 +000032 : Renderers(MaxRenderers), MIs() {}
Daniel Sanders6ab0daa2017-07-04 14:35:06 +000033
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000034InstructionSelector::InstructionSelector() = default;
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000035
Daniel Sandersa6e2ceb2017-06-20 12:36:34 +000036bool InstructionSelector::constrainOperandRegToRegClass(
37 MachineInstr &I, unsigned OpIdx, const TargetRegisterClass &RC,
38 const TargetInstrInfo &TII, const TargetRegisterInfo &TRI,
39 const RegisterBankInfo &RBI) const {
40 MachineBasicBlock &MBB = *I.getParent();
41 MachineFunction &MF = *MBB.getParent();
42 MachineRegisterInfo &MRI = MF.getRegInfo();
43
Eugene Zelenko76bf48d2017-06-26 22:44:03 +000044 return
45 constrainRegToClass(MRI, TII, RBI, I, I.getOperand(OpIdx).getReg(), RC);
Daniel Sandersa6e2ceb2017-06-20 12:36:34 +000046}
47
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000048bool InstructionSelector::constrainSelectedInstRegOperands(
49 MachineInstr &I, const TargetInstrInfo &TII, const TargetRegisterInfo &TRI,
50 const RegisterBankInfo &RBI) const {
51 MachineBasicBlock &MBB = *I.getParent();
52 MachineFunction &MF = *MBB.getParent();
53 MachineRegisterInfo &MRI = MF.getRegInfo();
54
55 for (unsigned OpI = 0, OpE = I.getNumExplicitOperands(); OpI != OpE; ++OpI) {
56 MachineOperand &MO = I.getOperand(OpI);
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000057
Tim Northoverbdf16242016-10-10 21:50:00 +000058 // There's nothing to be done on non-register operands.
59 if (!MO.isReg())
Ahmed Bougacha7adfac52016-07-29 16:56:16 +000060 continue;
61
62 DEBUG(dbgs() << "Converting operand: " << MO << '\n');
63 assert(MO.isReg() && "Unsupported non-reg operand");
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000064
Quentin Colombetb4e71182016-12-22 21:56:19 +000065 unsigned Reg = MO.getReg();
Ahmed Bougachae4c03ab2016-08-16 14:37:46 +000066 // Physical registers don't need to be constrained.
Quentin Colombetb4e71182016-12-22 21:56:19 +000067 if (TRI.isPhysicalRegister(Reg))
Ahmed Bougachae4c03ab2016-08-16 14:37:46 +000068 continue;
69
Diana Picus812caee2016-12-16 12:54:46 +000070 // Register operands with a value of 0 (e.g. predicate operands) don't need
71 // to be constrained.
Quentin Colombetb4e71182016-12-22 21:56:19 +000072 if (Reg == 0)
Diana Picus812caee2016-12-16 12:54:46 +000073 continue;
74
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000075 // If the operand is a vreg, we should constrain its regclass, and only
76 // insert COPYs if that's impossible.
Quentin Colombetb4e71182016-12-22 21:56:19 +000077 // constrainOperandRegClass does that for us.
78 MO.setReg(constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, I.getDesc(),
79 Reg, OpI));
Igor Bregerf7359d82017-02-22 12:25:09 +000080
Daniel Sanderse9fdba32017-04-29 17:30:09 +000081 // Tie uses to defs as indicated in MCInstrDesc if this hasn't already been
82 // done.
Igor Bregerf7359d82017-02-22 12:25:09 +000083 if (MO.isUse()) {
84 int DefIdx = I.getDesc().getOperandConstraint(OpI, MCOI::TIED_TO);
Daniel Sanderse9fdba32017-04-29 17:30:09 +000085 if (DefIdx != -1 && !I.isRegTiedToUseOperand(DefIdx))
Igor Bregerf7359d82017-02-22 12:25:09 +000086 I.tieOperands(DefIdx, OpI);
87 }
Ahmed Bougacha6756a2c2016-07-27 14:31:55 +000088 }
89 return true;
90}
Ahmed Bougacha7f2d1732017-03-19 16:12:48 +000091
92bool InstructionSelector::isOperandImmEqual(
93 const MachineOperand &MO, int64_t Value,
94 const MachineRegisterInfo &MRI) const {
Daniel Sanders89e93082017-05-18 10:33:36 +000095 if (MO.isReg() && MO.getReg())
Ahmed Bougacha2d29998f2017-03-27 16:35:27 +000096 if (auto VRegVal = getConstantVRegVal(MO.getReg(), MRI))
97 return *VRegVal == Value;
Ahmed Bougacha7f2d1732017-03-19 16:12:48 +000098 return false;
99}
Daniel Sandersbee57392017-04-04 13:25:23 +0000100
101bool InstructionSelector::isObviouslySafeToFold(MachineInstr &MI) const {
102 return !MI.mayLoadOrStore() && !MI.hasUnmodeledSideEffects() &&
103 MI.implicit_operands().begin() == MI.implicit_operands().end();
104}