blob: 69ce503398297e7a6e1026ddc38f99bde2bd3857 [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"
Tim Northover0f140c72016-09-09 11:46:34 +000017#include "llvm/CodeGen/MachineRegisterInfo.h"
Quentin Colombet2ad1f852016-02-11 17:44:59 +000018#include "llvm/Target/TargetInstrInfo.h"
Quentin Colombet8fd67182016-02-11 21:16:56 +000019#include "llvm/Target/TargetOpcodes.h"
Quentin Colombet2ad1f852016-02-11 17:44:59 +000020#include "llvm/Target/TargetSubtargetInfo.h"
21
22using namespace llvm;
23
Quentin Colombet000b5802016-03-11 17:27:51 +000024void MachineIRBuilder::setMF(MachineFunction &MF) {
Quentin Colombet2ad1f852016-02-11 17:44:59 +000025 this->MF = &MF;
26 this->MBB = nullptr;
Tim Northover0f140c72016-09-09 11:46:34 +000027 this->MRI = &MF.getRegInfo();
Quentin Colombet2ad1f852016-02-11 17:44:59 +000028 this->TII = MF.getSubtarget().getInstrInfo();
29 this->DL = DebugLoc();
30 this->MI = nullptr;
Tim Northover438c77c2016-08-25 17:37:32 +000031 this->InsertedInstr = nullptr;
Quentin Colombet2ad1f852016-02-11 17:44:59 +000032}
33
Quentin Colombet91ebd712016-03-11 17:27:47 +000034void MachineIRBuilder::setMBB(MachineBasicBlock &MBB, bool Beginning) {
Quentin Colombet2ad1f852016-02-11 17:44:59 +000035 this->MBB = &MBB;
Tim Northoverb18ea162016-09-20 15:20:36 +000036 this->MI = nullptr;
Quentin Colombet2ad1f852016-02-11 17:44:59 +000037 Before = Beginning;
38 assert(&getMF() == MBB.getParent() &&
39 "Basic block is in a different function");
40}
41
42void MachineIRBuilder::setInstr(MachineInstr &MI, bool Before) {
43 assert(MI.getParent() && "Instruction is not part of a basic block");
Quentin Colombet91ebd712016-03-11 17:27:47 +000044 setMBB(*MI.getParent());
Quentin Colombet2ad1f852016-02-11 17:44:59 +000045 this->MI = &MI;
46 this->Before = Before;
47}
48
49MachineBasicBlock::iterator MachineIRBuilder::getInsertPt() {
50 if (MI) {
51 if (Before)
52 return MI;
53 if (!MI->getNextNode())
54 return getMBB().end();
55 return MI->getNextNode();
56 }
57 return Before ? getMBB().begin() : getMBB().end();
58}
59
Tim Northover438c77c2016-08-25 17:37:32 +000060void MachineIRBuilder::recordInsertions(
61 std::function<void(MachineInstr *)> Inserted) {
62 InsertedInstr = Inserted;
63}
64
65void MachineIRBuilder::stopRecordingInsertions() {
66 InsertedInstr = nullptr;
67}
68
Quentin Colombetf9b49342016-03-11 17:27:58 +000069//------------------------------------------------------------------------------
70// Build instruction variants.
71//------------------------------------------------------------------------------
Tim Northovercc5f7622016-07-26 16:45:26 +000072
Tim Northover0f140c72016-09-09 11:46:34 +000073MachineInstrBuilder MachineIRBuilder::buildInstr(unsigned Opcode) {
Tim Northovera5e38fa2016-09-22 13:49:25 +000074 return insertInstr(buildInstrNoInsert(Opcode));
75}
76
77MachineInstrBuilder MachineIRBuilder::buildInstrNoInsert(unsigned Opcode) {
Tim Northovera51575f2016-07-29 17:43:52 +000078 MachineInstrBuilder MIB = BuildMI(getMF(), DL, getTII().get(Opcode));
Tim Northovera5e38fa2016-09-22 13:49:25 +000079 return MIB;
80}
81
82
83MachineInstrBuilder MachineIRBuilder::insertInstr(MachineInstrBuilder MIB) {
Tim Northovera51575f2016-07-29 17:43:52 +000084 getMBB().insert(getInsertPt(), MIB);
Tim Northover438c77c2016-08-25 17:37:32 +000085 if (InsertedInstr)
86 InsertedInstr(MIB);
Tim Northovera51575f2016-07-29 17:43:52 +000087 return MIB;
Quentin Colombet74d7d2f2016-02-11 18:53:28 +000088}
89
Tim Northover0f140c72016-09-09 11:46:34 +000090MachineInstrBuilder MachineIRBuilder::buildFrameIndex(unsigned Res, int Idx) {
Tim Northover1f8b1db2016-09-09 11:46:58 +000091 assert(MRI->getType(Res).isPointer() && "invalid operand type");
Tim Northover0f140c72016-09-09 11:46:34 +000092 return buildInstr(TargetOpcode::G_FRAME_INDEX)
Tim Northovera51575f2016-07-29 17:43:52 +000093 .addDef(Res)
94 .addFrameIndex(Idx);
Tim Northoverbd505462016-07-22 16:59:52 +000095}
Tim Northover33b07d62016-07-22 20:03:43 +000096
Tim Northover032548f2016-09-12 12:10:41 +000097MachineInstrBuilder MachineIRBuilder::buildGlobalValue(unsigned Res,
98 const GlobalValue *GV) {
99 assert(MRI->getType(Res).isPointer() && "invalid operand type");
100 assert(MRI->getType(Res).getAddressSpace() ==
101 GV->getType()->getAddressSpace() &&
102 "address space mismatch");
103
104 return buildInstr(TargetOpcode::G_GLOBAL_VALUE)
105 .addDef(Res)
106 .addGlobalAddress(GV);
107}
108
Tim Northover0f140c72016-09-09 11:46:34 +0000109MachineInstrBuilder MachineIRBuilder::buildAdd(unsigned Res, unsigned Op0,
110 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000111 assert((MRI->getType(Res).isScalar() || MRI->getType(Res).isVector()) &&
112 "invalid operand type");
113 assert(MRI->getType(Res) == MRI->getType(Op0) &&
114 MRI->getType(Res) == MRI->getType(Op1) && "type mismatch");
115
Tim Northover0f140c72016-09-09 11:46:34 +0000116 return buildInstr(TargetOpcode::G_ADD)
Tim Northovera51575f2016-07-29 17:43:52 +0000117 .addDef(Res)
118 .addUse(Op0)
119 .addUse(Op1);
Tim Northover33b07d62016-07-22 20:03:43 +0000120}
121
Tim Northovera7653b32016-09-12 11:20:22 +0000122MachineInstrBuilder MachineIRBuilder::buildGEP(unsigned Res, unsigned Op0,
123 unsigned Op1) {
124 assert(MRI->getType(Res).isPointer() &&
125 MRI->getType(Res) == MRI->getType(Op0) && "type mismatch");
126 assert(MRI->getType(Op1).isScalar() && "invalid offset type");
127
128 return buildInstr(TargetOpcode::G_GEP)
129 .addDef(Res)
130 .addUse(Op0)
131 .addUse(Op1);
132}
133
Tim Northover0f140c72016-09-09 11:46:34 +0000134MachineInstrBuilder MachineIRBuilder::buildSub(unsigned Res, unsigned Op0,
135 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000136 assert((MRI->getType(Res).isScalar() || MRI->getType(Res).isVector()) &&
137 "invalid operand type");
138 assert(MRI->getType(Res) == MRI->getType(Op0) &&
139 MRI->getType(Res) == MRI->getType(Op1) && "type mismatch");
140
Tim Northover0f140c72016-09-09 11:46:34 +0000141 return buildInstr(TargetOpcode::G_SUB)
Tim Northovercecee562016-08-26 17:46:13 +0000142 .addDef(Res)
143 .addUse(Op0)
144 .addUse(Op1);
145}
146
Tim Northover0f140c72016-09-09 11:46:34 +0000147MachineInstrBuilder MachineIRBuilder::buildMul(unsigned Res, unsigned Op0,
148 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000149 assert((MRI->getType(Res).isScalar() || MRI->getType(Res).isVector()) &&
150 "invalid operand type");
151 assert(MRI->getType(Res) == MRI->getType(Op0) &&
152 MRI->getType(Res) == MRI->getType(Op1) && "type mismatch");
153
Tim Northover0f140c72016-09-09 11:46:34 +0000154 return buildInstr(TargetOpcode::G_MUL)
Tim Northovercecee562016-08-26 17:46:13 +0000155 .addDef(Res)
156 .addUse(Op0)
157 .addUse(Op1);
158}
159
Tim Northovera51575f2016-07-29 17:43:52 +0000160MachineInstrBuilder MachineIRBuilder::buildBr(MachineBasicBlock &Dest) {
Tim Northover0f140c72016-09-09 11:46:34 +0000161 return buildInstr(TargetOpcode::G_BR).addMBB(&Dest);
Tim Northovercc5f7622016-07-26 16:45:26 +0000162}
163
Tim Northovera51575f2016-07-29 17:43:52 +0000164MachineInstrBuilder MachineIRBuilder::buildCopy(unsigned Res, unsigned Op) {
165 return buildInstr(TargetOpcode::COPY).addDef(Res).addUse(Op);
Tim Northover756eca32016-07-26 16:45:30 +0000166}
167
Tim Northover9267ac52016-12-05 21:47:07 +0000168MachineInstrBuilder MachineIRBuilder::buildConstant(unsigned Res,
169 const ConstantInt &Val) {
170 LLT Ty = MRI->getType(Res);
Tim Northover1f8b1db2016-09-09 11:46:58 +0000171
Sam McCall03435f52016-12-06 10:14:36 +0000172 assert((Ty.isScalar() || Ty.isPointer()) && "invalid operand type");
Tim Northover9267ac52016-12-05 21:47:07 +0000173
174 const ConstantInt *NewVal = &Val;
175 if (Ty.getSizeInBits() != Val.getBitWidth())
176 NewVal = ConstantInt::get(MF->getFunction()->getContext(),
177 Val.getValue().sextOrTrunc(Ty.getSizeInBits()));
178
179 return buildInstr(TargetOpcode::G_CONSTANT).addDef(Res).addCImm(NewVal);
180}
181
182MachineInstrBuilder MachineIRBuilder::buildConstant(unsigned Res,
183 int64_t Val) {
184 auto IntN = IntegerType::get(MF->getFunction()->getContext(),
185 MRI->getType(Res).getSizeInBits());
186 ConstantInt *CI = ConstantInt::get(IntN, Val, true);
187 return buildConstant(Res, *CI);
Tim Northover9656f142016-08-04 20:54:13 +0000188}
189
Tim Northover0f140c72016-09-09 11:46:34 +0000190MachineInstrBuilder MachineIRBuilder::buildFConstant(unsigned Res,
191 const ConstantFP &Val) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000192 assert(MRI->getType(Res).isScalar() && "invalid operand type");
193
Tim Northover0f140c72016-09-09 11:46:34 +0000194 return buildInstr(TargetOpcode::G_FCONSTANT).addDef(Res).addFPImm(&Val);
Tim Northoverb16734f2016-08-19 20:09:15 +0000195}
196
Tim Northover0f140c72016-09-09 11:46:34 +0000197MachineInstrBuilder MachineIRBuilder::buildBrCond(unsigned Tst,
Tim Northover69c2ba52016-07-29 17:58:00 +0000198 MachineBasicBlock &Dest) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000199 assert(MRI->getType(Tst).isScalar() && "invalid operand type");
200
Tim Northover0f140c72016-09-09 11:46:34 +0000201 return buildInstr(TargetOpcode::G_BRCOND).addUse(Tst).addMBB(&Dest);
Tim Northover69c2ba52016-07-29 17:58:00 +0000202}
203
Tim Northover0f140c72016-09-09 11:46:34 +0000204MachineInstrBuilder MachineIRBuilder::buildLoad(unsigned Res, unsigned Addr,
205 MachineMemOperand &MMO) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000206 assert(MRI->getType(Res).isValid() && "invalid operand type");
207 assert(MRI->getType(Addr).isPointer() && "invalid operand type");
208
Tim Northover0f140c72016-09-09 11:46:34 +0000209 return buildInstr(TargetOpcode::G_LOAD)
Tim Northovera51575f2016-07-29 17:43:52 +0000210 .addDef(Res)
211 .addUse(Addr)
212 .addMemOperand(&MMO);
Tim Northoverad2b7172016-07-26 20:23:26 +0000213}
214
Tim Northover0f140c72016-09-09 11:46:34 +0000215MachineInstrBuilder MachineIRBuilder::buildStore(unsigned Val, unsigned Addr,
216 MachineMemOperand &MMO) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000217 assert(MRI->getType(Val).isValid() && "invalid operand type");
218 assert(MRI->getType(Addr).isPointer() && "invalid operand type");
219
Tim Northover0f140c72016-09-09 11:46:34 +0000220 return buildInstr(TargetOpcode::G_STORE)
Tim Northovera51575f2016-07-29 17:43:52 +0000221 .addUse(Val)
222 .addUse(Addr)
223 .addMemOperand(&MMO);
Tim Northoverad2b7172016-07-26 20:23:26 +0000224}
225
Tim Northover0f140c72016-09-09 11:46:34 +0000226MachineInstrBuilder MachineIRBuilder::buildUAdde(unsigned Res,
227 unsigned CarryOut,
228 unsigned Op0, unsigned Op1,
229 unsigned CarryIn) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000230 assert(MRI->getType(Res).isScalar() && "invalid operand type");
231 assert(MRI->getType(Res) == MRI->getType(Op0) &&
232 MRI->getType(Res) == MRI->getType(Op1) && "type mismatch");
233 assert(MRI->getType(CarryOut).isScalar() && "invalid operand type");
234 assert(MRI->getType(CarryOut) == MRI->getType(CarryIn) && "type mismatch");
235
Tim Northover0f140c72016-09-09 11:46:34 +0000236 return buildInstr(TargetOpcode::G_UADDE)
Tim Northover9656f142016-08-04 20:54:13 +0000237 .addDef(Res)
238 .addDef(CarryOut)
239 .addUse(Op0)
240 .addUse(Op1)
241 .addUse(CarryIn);
242}
243
Tim Northover0f140c72016-09-09 11:46:34 +0000244MachineInstrBuilder MachineIRBuilder::buildAnyExt(unsigned Res, unsigned Op) {
245 validateTruncExt(Res, Op, true);
246 return buildInstr(TargetOpcode::G_ANYEXT).addDef(Res).addUse(Op);
Tim Northover32335812016-08-04 18:35:11 +0000247}
248
Tim Northover0f140c72016-09-09 11:46:34 +0000249MachineInstrBuilder MachineIRBuilder::buildSExt(unsigned Res, unsigned Op) {
250 validateTruncExt(Res, Op, true);
251 return buildInstr(TargetOpcode::G_SEXT).addDef(Res).addUse(Op);
Tim Northover6cd4b232016-08-23 21:01:26 +0000252}
253
Tim Northover0f140c72016-09-09 11:46:34 +0000254MachineInstrBuilder MachineIRBuilder::buildZExt(unsigned Res, unsigned Op) {
255 validateTruncExt(Res, Op, true);
256 return buildInstr(TargetOpcode::G_ZEXT).addDef(Res).addUse(Op);
Tim Northover6cd4b232016-08-23 21:01:26 +0000257}
258
Tim Northovera7653b32016-09-12 11:20:22 +0000259MachineInstrBuilder MachineIRBuilder::buildSExtOrTrunc(unsigned Res,
260 unsigned Op) {
261 unsigned Opcode = TargetOpcode::COPY;
262 if (MRI->getType(Res).getSizeInBits() > MRI->getType(Op).getSizeInBits())
263 Opcode = TargetOpcode::G_SEXT;
264 else if (MRI->getType(Res).getSizeInBits() < MRI->getType(Op).getSizeInBits())
265 Opcode = TargetOpcode::G_TRUNC;
266
267 return buildInstr(Opcode).addDef(Res).addUse(Op);
268}
269
Tim Northover0f140c72016-09-09 11:46:34 +0000270MachineInstrBuilder MachineIRBuilder::buildExtract(ArrayRef<unsigned> Results,
Tim Northover26b76f22016-08-19 18:32:14 +0000271 ArrayRef<uint64_t> Indices,
Tim Northover0f140c72016-09-09 11:46:34 +0000272 unsigned Src) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000273#ifndef NDEBUG
Tim Northover0f140c72016-09-09 11:46:34 +0000274 assert(Results.size() == Indices.size() && "inconsistent number of regs");
Tim Northover26b76f22016-08-19 18:32:14 +0000275 assert(!Results.empty() && "invalid trivial extract");
Tim Northover991b12b2016-08-30 20:51:25 +0000276 assert(std::is_sorted(Indices.begin(), Indices.end()) &&
277 "extract offsets must be in ascending order");
Tim Northover33b07d62016-07-22 20:03:43 +0000278
Tim Northover1f8b1db2016-09-09 11:46:58 +0000279 assert(MRI->getType(Src).isValid() && "invalid operand type");
280 for (auto Res : Results)
281 assert(MRI->getType(Res).isValid() && "invalid operand type");
282#endif
283
Tim Northover26b76f22016-08-19 18:32:14 +0000284 auto MIB = BuildMI(getMF(), DL, getTII().get(TargetOpcode::G_EXTRACT));
Tim Northover33b07d62016-07-22 20:03:43 +0000285 for (auto Res : Results)
Tim Northovera51575f2016-07-29 17:43:52 +0000286 MIB.addDef(Res);
Tim Northover33b07d62016-07-22 20:03:43 +0000287
Tim Northovera51575f2016-07-29 17:43:52 +0000288 MIB.addUse(Src);
Tim Northover33b07d62016-07-22 20:03:43 +0000289
Tim Northover26b76f22016-08-19 18:32:14 +0000290 for (auto Idx : Indices)
Tim Northover33b07d62016-07-22 20:03:43 +0000291 MIB.addImm(Idx);
Tim Northover26b76f22016-08-19 18:32:14 +0000292
293 getMBB().insert(getInsertPt(), MIB);
Tim Northover438c77c2016-08-25 17:37:32 +0000294 if (InsertedInstr)
295 InsertedInstr(MIB);
Tim Northover26b76f22016-08-19 18:32:14 +0000296
Tim Northovera51575f2016-07-29 17:43:52 +0000297 return MIB;
Tim Northover33b07d62016-07-22 20:03:43 +0000298}
299
Tim Northover91c81732016-08-19 17:17:06 +0000300MachineInstrBuilder
Tim Northover0f140c72016-09-09 11:46:34 +0000301MachineIRBuilder::buildSequence(unsigned Res,
Tim Northover91c81732016-08-19 17:17:06 +0000302 ArrayRef<unsigned> Ops,
Tim Northoverb18ea162016-09-20 15:20:36 +0000303 ArrayRef<uint64_t> Indices) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000304#ifndef NDEBUG
Tim Northover0f140c72016-09-09 11:46:34 +0000305 assert(Ops.size() == Indices.size() && "incompatible args");
Tim Northover26b76f22016-08-19 18:32:14 +0000306 assert(!Ops.empty() && "invalid trivial sequence");
Tim Northover991b12b2016-08-30 20:51:25 +0000307 assert(std::is_sorted(Indices.begin(), Indices.end()) &&
308 "sequence offsets must be in ascending order");
Tim Northover91c81732016-08-19 17:17:06 +0000309
Tim Northover1f8b1db2016-09-09 11:46:58 +0000310 assert(MRI->getType(Res).isValid() && "invalid operand type");
311 for (auto Op : Ops)
312 assert(MRI->getType(Op).isValid() && "invalid operand type");
313#endif
314
Tim Northover0f140c72016-09-09 11:46:34 +0000315 MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_SEQUENCE);
Tim Northovera51575f2016-07-29 17:43:52 +0000316 MIB.addDef(Res);
Tim Northover91c81732016-08-19 17:17:06 +0000317 for (unsigned i = 0; i < Ops.size(); ++i) {
318 MIB.addUse(Ops[i]);
Tim Northover26b76f22016-08-19 18:32:14 +0000319 MIB.addImm(Indices[i]);
Tim Northover91c81732016-08-19 17:17:06 +0000320 }
Tim Northovera51575f2016-07-29 17:43:52 +0000321 return MIB;
Tim Northover33b07d62016-07-22 20:03:43 +0000322}
Tim Northover5fb414d2016-07-29 22:32:36 +0000323
Tim Northover0f140c72016-09-09 11:46:34 +0000324MachineInstrBuilder MachineIRBuilder::buildIntrinsic(Intrinsic::ID ID,
Tim Northover5fb414d2016-07-29 22:32:36 +0000325 unsigned Res,
326 bool HasSideEffects) {
327 auto MIB =
328 buildInstr(HasSideEffects ? TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS
Tim Northover0f140c72016-09-09 11:46:34 +0000329 : TargetOpcode::G_INTRINSIC);
Tim Northover5fb414d2016-07-29 22:32:36 +0000330 if (Res)
331 MIB.addDef(Res);
332 MIB.addIntrinsicID(ID);
333 return MIB;
334}
Tim Northover32335812016-08-04 18:35:11 +0000335
Tim Northover0f140c72016-09-09 11:46:34 +0000336MachineInstrBuilder MachineIRBuilder::buildTrunc(unsigned Res, unsigned Op) {
337 validateTruncExt(Res, Op, false);
338 return buildInstr(TargetOpcode::G_TRUNC).addDef(Res).addUse(Op);
Tim Northover32335812016-08-04 18:35:11 +0000339}
Tim Northoverde3aea0412016-08-17 20:25:25 +0000340
Tim Northover0f140c72016-09-09 11:46:34 +0000341MachineInstrBuilder MachineIRBuilder::buildFPTrunc(unsigned Res, unsigned Op) {
342 validateTruncExt(Res, Op, false);
343 return buildInstr(TargetOpcode::G_FPTRUNC).addDef(Res).addUse(Op);
Tim Northovera11be042016-08-19 22:40:08 +0000344}
345
Tim Northover0f140c72016-09-09 11:46:34 +0000346MachineInstrBuilder MachineIRBuilder::buildICmp(CmpInst::Predicate Pred,
Tim Northoverde3aea0412016-08-17 20:25:25 +0000347 unsigned Res, unsigned Op0,
348 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000349#ifndef NDEBUG
Tim Northover1f8b1db2016-09-09 11:46:58 +0000350 assert(MRI->getType(Op0) == MRI->getType(Op0) && "type mismatch");
351 assert(CmpInst::isIntPredicate(Pred) && "invalid predicate");
Tim Northover4cf0a482016-09-15 10:40:38 +0000352 if (MRI->getType(Op0).isScalar() || MRI->getType(Op0).isPointer())
Tim Northover1f8b1db2016-09-09 11:46:58 +0000353 assert(MRI->getType(Res).isScalar() && "type mismatch");
354 else
355 assert(MRI->getType(Res).isVector() &&
356 MRI->getType(Res).getNumElements() ==
357 MRI->getType(Op0).getNumElements() &&
358 "type mismatch");
359#endif
360
Tim Northover0f140c72016-09-09 11:46:34 +0000361 return buildInstr(TargetOpcode::G_ICMP)
Tim Northoverde3aea0412016-08-17 20:25:25 +0000362 .addDef(Res)
363 .addPredicate(Pred)
364 .addUse(Op0)
365 .addUse(Op1);
366}
Tim Northover5a28c362016-08-19 20:09:07 +0000367
Tim Northover0f140c72016-09-09 11:46:34 +0000368MachineInstrBuilder MachineIRBuilder::buildFCmp(CmpInst::Predicate Pred,
Tim Northoverd5c23bc2016-08-19 20:48:16 +0000369 unsigned Res, unsigned Op0,
370 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000371#ifndef NDEBUG
372 assert((MRI->getType(Op0).isScalar() || MRI->getType(Op0).isVector()) &&
373 "invalid operand type");
374 assert(MRI->getType(Op0) == MRI->getType(Op1) && "type mismatch");
375 assert(CmpInst::isFPPredicate(Pred) && "invalid predicate");
376 if (MRI->getType(Op0).isScalar())
377 assert(MRI->getType(Res).isScalar() && "type mismatch");
378 else
379 assert(MRI->getType(Res).isVector() &&
380 MRI->getType(Res).getNumElements() ==
381 MRI->getType(Op0).getNumElements() &&
382 "type mismatch");
383#endif
384
Tim Northover0f140c72016-09-09 11:46:34 +0000385 return buildInstr(TargetOpcode::G_FCMP)
Tim Northoverd5c23bc2016-08-19 20:48:16 +0000386 .addDef(Res)
387 .addPredicate(Pred)
388 .addUse(Op0)
389 .addUse(Op1);
390}
391
Tim Northover0f140c72016-09-09 11:46:34 +0000392MachineInstrBuilder MachineIRBuilder::buildSelect(unsigned Res, unsigned Tst,
Tim Northover5a28c362016-08-19 20:09:07 +0000393 unsigned Op0, unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000394#ifndef NDEBUG
395 assert((MRI->getType(Res).isScalar() || MRI->getType(Res).isVector()) &&
396 "invalid operand type");
397 assert(MRI->getType(Res) == MRI->getType(Op0) &&
398 MRI->getType(Res) == MRI->getType(Op1) && "type mismatch");
399 if (MRI->getType(Res).isScalar())
400 assert(MRI->getType(Tst).isScalar() && "type mismatch");
401 else
402 assert(MRI->getType(Tst).isVector() &&
403 MRI->getType(Tst).getNumElements() ==
404 MRI->getType(Op0).getNumElements() &&
405 "type mismatch");
406#endif
407
Tim Northover0f140c72016-09-09 11:46:34 +0000408 return buildInstr(TargetOpcode::G_SELECT)
Tim Northover5a28c362016-08-19 20:09:07 +0000409 .addDef(Res)
410 .addUse(Tst)
411 .addUse(Op0)
412 .addUse(Op1);
413}
Tim Northoverbdf67c92016-08-23 21:01:33 +0000414
Tim Northover0f140c72016-09-09 11:46:34 +0000415void MachineIRBuilder::validateTruncExt(unsigned Dst, unsigned Src,
416 bool IsExtend) {
Richard Smith418237b2016-08-23 22:14:15 +0000417#ifndef NDEBUG
Tim Northover0f140c72016-09-09 11:46:34 +0000418 LLT SrcTy = MRI->getType(Src);
419 LLT DstTy = MRI->getType(Dst);
Tim Northoverbdf67c92016-08-23 21:01:33 +0000420
421 if (DstTy.isVector()) {
422 assert(SrcTy.isVector() && "mismatched cast between vecot and non-vector");
423 assert(SrcTy.getNumElements() == DstTy.getNumElements() &&
424 "different number of elements in a trunc/ext");
425 } else
426 assert(DstTy.isScalar() && SrcTy.isScalar() && "invalid extend/trunc");
427
428 if (IsExtend)
429 assert(DstTy.getSizeInBits() > SrcTy.getSizeInBits() &&
430 "invalid narrowing extend");
431 else
432 assert(DstTy.getSizeInBits() < SrcTy.getSizeInBits() &&
433 "invalid widening trunc");
Richard Smith418237b2016-08-23 22:14:15 +0000434#endif
Tim Northoverbdf67c92016-08-23 21:01:33 +0000435}