blob: 09a8fa6001b3bac276b54d3d78dccdc57a766492 [file] [log] [blame]
Quentin Colombet2ad1f852016-02-11 17:44:59 +00001//===-- llvm/CodeGen/GlobalISel/MachineIRBuilder.cpp - MIBuilder--*- C++ -*-==//
2//
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//===----------------------------------------------------------------------===//
9/// \file
10/// This file implements the MachineIRBuidler class.
11//===----------------------------------------------------------------------===//
12#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
13
14#include "llvm/CodeGen/MachineFunction.h"
15#include "llvm/CodeGen/MachineInstr.h"
16#include "llvm/CodeGen/MachineInstrBuilder.h"
17#include "llvm/Target/TargetInstrInfo.h"
Quentin Colombet8fd67182016-02-11 21:16:56 +000018#include "llvm/Target/TargetOpcodes.h"
Quentin Colombet2ad1f852016-02-11 17:44:59 +000019#include "llvm/Target/TargetSubtargetInfo.h"
20
21using namespace llvm;
22
Quentin Colombet000b5802016-03-11 17:27:51 +000023void MachineIRBuilder::setMF(MachineFunction &MF) {
Quentin Colombet2ad1f852016-02-11 17:44:59 +000024 this->MF = &MF;
25 this->MBB = nullptr;
26 this->TII = MF.getSubtarget().getInstrInfo();
27 this->DL = DebugLoc();
28 this->MI = nullptr;
29}
30
Quentin Colombet91ebd712016-03-11 17:27:47 +000031void MachineIRBuilder::setMBB(MachineBasicBlock &MBB, bool Beginning) {
Quentin Colombet2ad1f852016-02-11 17:44:59 +000032 this->MBB = &MBB;
33 Before = Beginning;
34 assert(&getMF() == MBB.getParent() &&
35 "Basic block is in a different function");
36}
37
38void MachineIRBuilder::setInstr(MachineInstr &MI, bool Before) {
39 assert(MI.getParent() && "Instruction is not part of a basic block");
Quentin Colombet91ebd712016-03-11 17:27:47 +000040 setMBB(*MI.getParent());
Quentin Colombet2ad1f852016-02-11 17:44:59 +000041 this->MI = &MI;
42 this->Before = Before;
43}
44
45MachineBasicBlock::iterator MachineIRBuilder::getInsertPt() {
46 if (MI) {
47 if (Before)
48 return MI;
49 if (!MI->getNextNode())
50 return getMBB().end();
51 return MI->getNextNode();
52 }
53 return Before ? getMBB().begin() : getMBB().end();
54}
55
Quentin Colombetf9b49342016-03-11 17:27:58 +000056//------------------------------------------------------------------------------
57// Build instruction variants.
58//------------------------------------------------------------------------------
Tim Northovercc5f7622016-07-26 16:45:26 +000059
Tim Northovera51575f2016-07-29 17:43:52 +000060MachineInstrBuilder MachineIRBuilder::buildInstr(unsigned Opcode,
61 ArrayRef<LLT> Tys) {
62 MachineInstrBuilder MIB = BuildMI(getMF(), DL, getTII().get(Opcode));
Tim Northovercc5f7622016-07-26 16:45:26 +000063 if (Tys.size() > 0) {
Quentin Colombet8fd67182016-02-11 21:16:56 +000064 assert(isPreISelGenericOpcode(Opcode) &&
65 "Only generic instruction can have a type");
Tim Northovercc5f7622016-07-26 16:45:26 +000066 for (unsigned i = 0; i < Tys.size(); ++i)
Tim Northovera51575f2016-07-29 17:43:52 +000067 MIB->setType(Tys[i], i);
Quentin Colombet8fd67182016-02-11 21:16:56 +000068 } else
69 assert(!isPreISelGenericOpcode(Opcode) &&
70 "Generic instruction must have a type");
Tim Northovera51575f2016-07-29 17:43:52 +000071 getMBB().insert(getInsertPt(), MIB);
72 return MIB;
Quentin Colombet74d7d2f2016-02-11 18:53:28 +000073}
74
Tim Northovera51575f2016-07-29 17:43:52 +000075MachineInstrBuilder MachineIRBuilder::buildFrameIndex(LLT Ty, unsigned Res,
76 int Idx) {
77 return buildInstr(TargetOpcode::G_FRAME_INDEX, Ty)
78 .addDef(Res)
79 .addFrameIndex(Idx);
Tim Northoverbd505462016-07-22 16:59:52 +000080}
Tim Northover33b07d62016-07-22 20:03:43 +000081
Tim Northovera51575f2016-07-29 17:43:52 +000082MachineInstrBuilder MachineIRBuilder::buildAdd(LLT Ty, unsigned Res,
83 unsigned Op0, unsigned Op1) {
84 return buildInstr(TargetOpcode::G_ADD, Ty)
85 .addDef(Res)
86 .addUse(Op0)
87 .addUse(Op1);
Tim Northover33b07d62016-07-22 20:03:43 +000088}
89
Tim Northovera51575f2016-07-29 17:43:52 +000090MachineInstrBuilder MachineIRBuilder::buildBr(MachineBasicBlock &Dest) {
91 return buildInstr(TargetOpcode::G_BR, LLT::unsized()).addMBB(&Dest);
Tim Northovercc5f7622016-07-26 16:45:26 +000092}
93
Tim Northovera51575f2016-07-29 17:43:52 +000094MachineInstrBuilder MachineIRBuilder::buildCopy(unsigned Res, unsigned Op) {
95 return buildInstr(TargetOpcode::COPY).addDef(Res).addUse(Op);
Tim Northover756eca32016-07-26 16:45:30 +000096}
97
Tim Northover69c2ba52016-07-29 17:58:00 +000098MachineInstrBuilder MachineIRBuilder::buildBrCond(LLT Ty, unsigned Tst,
99 MachineBasicBlock &Dest) {
100 return buildInstr(TargetOpcode::G_BRCOND, Ty).addUse(Tst).addMBB(&Dest);
101}
102
103
104 MachineInstrBuilder MachineIRBuilder::buildLoad(LLT VTy, LLT PTy, unsigned Res,
Tim Northovera51575f2016-07-29 17:43:52 +0000105 unsigned Addr,
106 MachineMemOperand &MMO) {
107 return buildInstr(TargetOpcode::G_LOAD, {VTy, PTy})
108 .addDef(Res)
109 .addUse(Addr)
110 .addMemOperand(&MMO);
Tim Northoverad2b7172016-07-26 20:23:26 +0000111}
112
Tim Northovera51575f2016-07-29 17:43:52 +0000113MachineInstrBuilder MachineIRBuilder::buildStore(LLT VTy, LLT PTy,
114 unsigned Val, unsigned Addr,
115 MachineMemOperand &MMO) {
116 return buildInstr(TargetOpcode::G_STORE, {VTy, PTy})
117 .addUse(Val)
118 .addUse(Addr)
119 .addMemOperand(&MMO);
Tim Northoverad2b7172016-07-26 20:23:26 +0000120}
121
Tim Northover32335812016-08-04 18:35:11 +0000122MachineInstrBuilder MachineIRBuilder::buildAnyExtend(LLT Ty, unsigned Res,
123 unsigned Op) {
124 return buildInstr(TargetOpcode::G_ANYEXTEND, Ty).addDef(Res).addUse(Op);
125}
126
Tim Northovera51575f2016-07-29 17:43:52 +0000127MachineInstrBuilder
128MachineIRBuilder::buildExtract(LLT Ty, ArrayRef<unsigned> Results, unsigned Src,
129 ArrayRef<unsigned> Indexes) {
Tim Northover33b07d62016-07-22 20:03:43 +0000130 assert(Results.size() == Indexes.size() && "inconsistent number of regs");
131
Tim Northovera51575f2016-07-29 17:43:52 +0000132 MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_EXTRACT, Ty);
Tim Northover33b07d62016-07-22 20:03:43 +0000133 for (auto Res : Results)
Tim Northovera51575f2016-07-29 17:43:52 +0000134 MIB.addDef(Res);
Tim Northover33b07d62016-07-22 20:03:43 +0000135
Tim Northovera51575f2016-07-29 17:43:52 +0000136 MIB.addUse(Src);
Tim Northover33b07d62016-07-22 20:03:43 +0000137
138 for (auto Idx : Indexes)
139 MIB.addImm(Idx);
Tim Northovera51575f2016-07-29 17:43:52 +0000140 return MIB;
Tim Northover33b07d62016-07-22 20:03:43 +0000141}
142
Tim Northovera51575f2016-07-29 17:43:52 +0000143MachineInstrBuilder MachineIRBuilder::buildSequence(LLT Ty, unsigned Res,
Tim Northover33b07d62016-07-22 20:03:43 +0000144 ArrayRef<unsigned> Ops) {
Tim Northovera51575f2016-07-29 17:43:52 +0000145 MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_SEQUENCE, Ty);
146 MIB.addDef(Res);
Tim Northover33b07d62016-07-22 20:03:43 +0000147 for (auto Op : Ops)
Tim Northovera51575f2016-07-29 17:43:52 +0000148 MIB.addUse(Op);
149 return MIB;
Tim Northover33b07d62016-07-22 20:03:43 +0000150}
Tim Northover5fb414d2016-07-29 22:32:36 +0000151
152MachineInstrBuilder MachineIRBuilder::buildIntrinsic(ArrayRef<LLT> Tys,
153 Intrinsic::ID ID,
154 unsigned Res,
155 bool HasSideEffects) {
156 auto MIB =
157 buildInstr(HasSideEffects ? TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS
158 : TargetOpcode::G_INTRINSIC,
159 Tys);
160 if (Res)
161 MIB.addDef(Res);
162 MIB.addIntrinsicID(ID);
163 return MIB;
164}
Tim Northover32335812016-08-04 18:35:11 +0000165
166MachineInstrBuilder MachineIRBuilder::buildTrunc(LLT Ty, unsigned Res,
167 unsigned Op) {
168 return buildInstr(TargetOpcode::G_TRUNC, Ty).addDef(Res).addUse(Op);
169}