blob: 273044bad757d17bad787e8a95de307848046a38 [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"
David Blaikie3f833ed2017-11-08 01:01:31 +000018#include "llvm/CodeGen/TargetInstrInfo.h"
David Blaikieb3bde2e2017-11-17 01:07:10 +000019#include "llvm/CodeGen/TargetOpcodes.h"
20#include "llvm/CodeGen/TargetSubtargetInfo.h"
Tim Northover09aac4a2017-01-26 23:39:14 +000021#include "llvm/IR/DebugInfo.h"
Quentin Colombet2ad1f852016-02-11 17:44:59 +000022
23using namespace llvm;
24
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000025void MachineIRBuilderBase::setMF(MachineFunction &MF) {
26 State.MF = &MF;
27 State.MBB = nullptr;
28 State.MRI = &MF.getRegInfo();
29 State.TII = MF.getSubtarget().getInstrInfo();
30 State.DL = DebugLoc();
31 State.II = MachineBasicBlock::iterator();
32 State.InsertedInstr = nullptr;
Quentin Colombet2ad1f852016-02-11 17:44:59 +000033}
34
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000035void MachineIRBuilderBase::setMBB(MachineBasicBlock &MBB) {
36 State.MBB = &MBB;
37 State.II = MBB.end();
Quentin Colombet2ad1f852016-02-11 17:44:59 +000038 assert(&getMF() == MBB.getParent() &&
39 "Basic block is in a different function");
40}
41
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000042void MachineIRBuilderBase::setInstr(MachineInstr &MI) {
Quentin Colombet2ad1f852016-02-11 17:44:59 +000043 assert(MI.getParent() && "Instruction is not part of a basic block");
Quentin Colombet91ebd712016-03-11 17:27:47 +000044 setMBB(*MI.getParent());
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000045 State.II = MI.getIterator();
Quentin Colombet2ad1f852016-02-11 17:44:59 +000046}
47
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000048void MachineIRBuilderBase::setInsertPt(MachineBasicBlock &MBB,
49 MachineBasicBlock::iterator II) {
Tim Northover05cc4852016-12-07 21:05:38 +000050 assert(MBB.getParent() == &getMF() &&
51 "Basic block is in a different function");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000052 State.MBB = &MBB;
53 State.II = II;
Quentin Colombet2ad1f852016-02-11 17:44:59 +000054}
55
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000056void MachineIRBuilderBase::recordInsertions(
Tim Northover438c77c2016-08-25 17:37:32 +000057 std::function<void(MachineInstr *)> Inserted) {
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000058 State.InsertedInstr = std::move(Inserted);
Tim Northover438c77c2016-08-25 17:37:32 +000059}
60
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000061void MachineIRBuilderBase::stopRecordingInsertions() {
62 State.InsertedInstr = nullptr;
Tim Northover438c77c2016-08-25 17:37:32 +000063}
64
Quentin Colombetf9b49342016-03-11 17:27:58 +000065//------------------------------------------------------------------------------
66// Build instruction variants.
67//------------------------------------------------------------------------------
Tim Northovercc5f7622016-07-26 16:45:26 +000068
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000069MachineInstrBuilder MachineIRBuilderBase::buildInstr(unsigned Opcode) {
Tim Northovera5e38fa2016-09-22 13:49:25 +000070 return insertInstr(buildInstrNoInsert(Opcode));
71}
72
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000073MachineInstrBuilder MachineIRBuilderBase::buildInstrNoInsert(unsigned Opcode) {
74 MachineInstrBuilder MIB = BuildMI(getMF(), getDL(), getTII().get(Opcode));
Tim Northovera5e38fa2016-09-22 13:49:25 +000075 return MIB;
76}
77
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000078MachineInstrBuilder MachineIRBuilderBase::insertInstr(MachineInstrBuilder MIB) {
Tim Northovera51575f2016-07-29 17:43:52 +000079 getMBB().insert(getInsertPt(), MIB);
Roman Tereshin27bba442018-05-09 01:43:12 +000080 if (State.InsertedInstr)
81 State.InsertedInstr(MIB);
Tim Northovera51575f2016-07-29 17:43:52 +000082 return MIB;
Quentin Colombet74d7d2f2016-02-11 18:53:28 +000083}
84
Adrian Prantlaac78ce2017-08-01 22:37:35 +000085MachineInstrBuilder
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000086MachineIRBuilderBase::buildDirectDbgValue(unsigned Reg, const MDNode *Variable,
87 const MDNode *Expr) {
Tim Northover09aac4a2017-01-26 23:39:14 +000088 assert(isa<DILocalVariable>(Variable) && "not a variable");
89 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000090 assert(
91 cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(getDL()) &&
92 "Expected inlined-at fields to agree");
93 return insertInstr(BuildMI(getMF(), getDL(),
94 getTII().get(TargetOpcode::DBG_VALUE),
Adrian Prantlaac78ce2017-08-01 22:37:35 +000095 /*IsIndirect*/ false, Reg, Variable, Expr));
Tim Northover09aac4a2017-01-26 23:39:14 +000096}
97
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +000098MachineInstrBuilder MachineIRBuilderBase::buildIndirectDbgValue(
99 unsigned Reg, const MDNode *Variable, const MDNode *Expr) {
Tim Northover09aac4a2017-01-26 23:39:14 +0000100 assert(isa<DILocalVariable>(Variable) && "not a variable");
101 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000102 assert(
103 cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(getDL()) &&
104 "Expected inlined-at fields to agree");
105 return insertInstr(BuildMI(getMF(), getDL(),
106 getTII().get(TargetOpcode::DBG_VALUE),
Adrian Prantlaac78ce2017-08-01 22:37:35 +0000107 /*IsIndirect*/ true, Reg, Variable, Expr));
Tim Northover09aac4a2017-01-26 23:39:14 +0000108}
109
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000110MachineInstrBuilder
111MachineIRBuilderBase::buildFIDbgValue(int FI, const MDNode *Variable,
112 const MDNode *Expr) {
Tim Northover09aac4a2017-01-26 23:39:14 +0000113 assert(isa<DILocalVariable>(Variable) && "not a variable");
114 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000115 assert(
116 cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(getDL()) &&
117 "Expected inlined-at fields to agree");
Tim Northover09aac4a2017-01-26 23:39:14 +0000118 return buildInstr(TargetOpcode::DBG_VALUE)
119 .addFrameIndex(FI)
120 .addImm(0)
121 .addMetadata(Variable)
122 .addMetadata(Expr);
123}
124
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000125MachineInstrBuilder MachineIRBuilderBase::buildConstDbgValue(
126 const Constant &C, const MDNode *Variable, const MDNode *Expr) {
Tim Northover09aac4a2017-01-26 23:39:14 +0000127 assert(isa<DILocalVariable>(Variable) && "not a variable");
128 assert(cast<DIExpression>(Expr)->isValid() && "not an expression");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000129 assert(
130 cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(getDL()) &&
131 "Expected inlined-at fields to agree");
Tim Northover09aac4a2017-01-26 23:39:14 +0000132 auto MIB = buildInstr(TargetOpcode::DBG_VALUE);
133 if (auto *CI = dyn_cast<ConstantInt>(&C)) {
134 if (CI->getBitWidth() > 64)
135 MIB.addCImm(CI);
136 else
137 MIB.addImm(CI->getZExtValue());
Ahmed Bougacha4826bae2017-03-07 20:34:20 +0000138 } else if (auto *CFP = dyn_cast<ConstantFP>(&C)) {
Ahmed Bougachaadce3ee2017-03-07 20:52:57 +0000139 MIB.addFPImm(CFP);
Ahmed Bougacha4826bae2017-03-07 20:34:20 +0000140 } else {
141 // Insert %noreg if we didn't find a usable constant and had to drop it.
142 MIB.addReg(0U);
143 }
Tim Northover09aac4a2017-01-26 23:39:14 +0000144
Adrian Prantld92ac5a2017-07-28 22:46:20 +0000145 return MIB.addImm(0).addMetadata(Variable).addMetadata(Expr);
Tim Northover09aac4a2017-01-26 23:39:14 +0000146}
147
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000148MachineInstrBuilder MachineIRBuilderBase::buildFrameIndex(unsigned Res,
149 int Idx) {
150 assert(getMRI()->getType(Res).isPointer() && "invalid operand type");
Tim Northover0f140c72016-09-09 11:46:34 +0000151 return buildInstr(TargetOpcode::G_FRAME_INDEX)
Tim Northovera51575f2016-07-29 17:43:52 +0000152 .addDef(Res)
153 .addFrameIndex(Idx);
Tim Northoverbd505462016-07-22 16:59:52 +0000154}
Tim Northover33b07d62016-07-22 20:03:43 +0000155
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000156MachineInstrBuilder
157MachineIRBuilderBase::buildGlobalValue(unsigned Res, const GlobalValue *GV) {
158 assert(getMRI()->getType(Res).isPointer() && "invalid operand type");
159 assert(getMRI()->getType(Res).getAddressSpace() ==
Tim Northover032548f2016-09-12 12:10:41 +0000160 GV->getType()->getAddressSpace() &&
161 "address space mismatch");
162
163 return buildInstr(TargetOpcode::G_GLOBAL_VALUE)
164 .addDef(Res)
165 .addGlobalAddress(GV);
166}
167
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000168void MachineIRBuilderBase::validateBinaryOp(unsigned Res, unsigned Op0,
169 unsigned Op1) {
170 assert((getMRI()->getType(Res).isScalar() ||
171 getMRI()->getType(Res).isVector()) &&
Tim Northover1f8b1db2016-09-09 11:46:58 +0000172 "invalid operand type");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000173 assert(getMRI()->getType(Res) == getMRI()->getType(Op0) &&
174 getMRI()->getType(Res) == getMRI()->getType(Op1) && "type mismatch");
Tim Northover33b07d62016-07-22 20:03:43 +0000175}
176
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000177MachineInstrBuilder MachineIRBuilderBase::buildGEP(unsigned Res, unsigned Op0,
178 unsigned Op1) {
179 assert(getMRI()->getType(Res).isPointer() &&
180 getMRI()->getType(Res) == getMRI()->getType(Op0) && "type mismatch");
181 assert(getMRI()->getType(Op1).isScalar() && "invalid offset type");
Tim Northovera7653b32016-09-12 11:20:22 +0000182
183 return buildInstr(TargetOpcode::G_GEP)
184 .addDef(Res)
185 .addUse(Op0)
186 .addUse(Op1);
187}
188
Daniel Sanders4e523662017-06-13 23:42:32 +0000189Optional<MachineInstrBuilder>
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000190MachineIRBuilderBase::materializeGEP(unsigned &Res, unsigned Op0,
191 const LLT &ValueTy, uint64_t Value) {
Daniel Sanders4e523662017-06-13 23:42:32 +0000192 assert(Res == 0 && "Res is a result argument");
193 assert(ValueTy.isScalar() && "invalid offset type");
194
195 if (Value == 0) {
196 Res = Op0;
197 return None;
198 }
199
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000200 Res = getMRI()->createGenericVirtualRegister(getMRI()->getType(Op0));
201 unsigned TmpReg = getMRI()->createGenericVirtualRegister(ValueTy);
Daniel Sanders4e523662017-06-13 23:42:32 +0000202
203 buildConstant(TmpReg, Value);
204 return buildGEP(Res, Op0, TmpReg);
205}
206
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000207MachineInstrBuilder MachineIRBuilderBase::buildPtrMask(unsigned Res,
208 unsigned Op0,
209 uint32_t NumBits) {
210 assert(getMRI()->getType(Res).isPointer() &&
211 getMRI()->getType(Res) == getMRI()->getType(Op0) && "type mismatch");
Tim Northoverc2f89562017-02-14 20:56:18 +0000212
213 return buildInstr(TargetOpcode::G_PTR_MASK)
214 .addDef(Res)
215 .addUse(Op0)
216 .addImm(NumBits);
217}
218
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000219MachineInstrBuilder MachineIRBuilderBase::buildBr(MachineBasicBlock &Dest) {
Tim Northover0f140c72016-09-09 11:46:34 +0000220 return buildInstr(TargetOpcode::G_BR).addMBB(&Dest);
Tim Northovercc5f7622016-07-26 16:45:26 +0000221}
222
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000223MachineInstrBuilder MachineIRBuilderBase::buildBrIndirect(unsigned Tgt) {
224 assert(getMRI()->getType(Tgt).isPointer() && "invalid branch destination");
Kristof Beyls65a12c02017-01-30 09:13:18 +0000225 return buildInstr(TargetOpcode::G_BRINDIRECT).addUse(Tgt);
226}
227
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000228MachineInstrBuilder MachineIRBuilderBase::buildCopy(unsigned Res, unsigned Op) {
229 assert(getMRI()->getType(Res) == LLT() || getMRI()->getType(Op) == LLT() ||
230 getMRI()->getType(Res) == getMRI()->getType(Op));
Tim Northovera51575f2016-07-29 17:43:52 +0000231 return buildInstr(TargetOpcode::COPY).addDef(Res).addUse(Op);
Tim Northover756eca32016-07-26 16:45:30 +0000232}
233
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000234MachineInstrBuilder
235MachineIRBuilderBase::buildConstant(unsigned Res, const ConstantInt &Val) {
236 LLT Ty = getMRI()->getType(Res);
Tim Northover1f8b1db2016-09-09 11:46:58 +0000237
Sam McCall03435f52016-12-06 10:14:36 +0000238 assert((Ty.isScalar() || Ty.isPointer()) && "invalid operand type");
Tim Northover9267ac52016-12-05 21:47:07 +0000239
240 const ConstantInt *NewVal = &Val;
241 if (Ty.getSizeInBits() != Val.getBitWidth())
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000242 NewVal = ConstantInt::get(getMF().getFunction().getContext(),
Tim Northover9267ac52016-12-05 21:47:07 +0000243 Val.getValue().sextOrTrunc(Ty.getSizeInBits()));
244
245 return buildInstr(TargetOpcode::G_CONSTANT).addDef(Res).addCImm(NewVal);
246}
247
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000248MachineInstrBuilder MachineIRBuilderBase::buildConstant(unsigned Res,
249 int64_t Val) {
250 auto IntN = IntegerType::get(getMF().getFunction().getContext(),
251 getMRI()->getType(Res).getSizeInBits());
Tim Northover9267ac52016-12-05 21:47:07 +0000252 ConstantInt *CI = ConstantInt::get(IntN, Val, true);
253 return buildConstant(Res, *CI);
Tim Northover9656f142016-08-04 20:54:13 +0000254}
255
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000256MachineInstrBuilder
257MachineIRBuilderBase::buildFConstant(unsigned Res, const ConstantFP &Val) {
258 assert(getMRI()->getType(Res).isScalar() && "invalid operand type");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000259
Tim Northover0f140c72016-09-09 11:46:34 +0000260 return buildInstr(TargetOpcode::G_FCONSTANT).addDef(Res).addFPImm(&Val);
Tim Northoverb16734f2016-08-19 20:09:15 +0000261}
262
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000263MachineInstrBuilder MachineIRBuilderBase::buildFConstant(unsigned Res,
264 double Val) {
265 LLT DstTy = getMRI()->getType(Res);
266 auto &Ctx = getMF().getFunction().getContext();
Aditya Nandakumar91fc4e02018-03-09 17:31:51 +0000267 auto *CFP =
268 ConstantFP::get(Ctx, getAPFloatFromSize(Val, DstTy.getSizeInBits()));
269 return buildFConstant(Res, *CFP);
270}
271
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000272MachineInstrBuilder MachineIRBuilderBase::buildBrCond(unsigned Tst,
273 MachineBasicBlock &Dest) {
274 assert(getMRI()->getType(Tst).isScalar() && "invalid operand type");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000275
Tim Northover0f140c72016-09-09 11:46:34 +0000276 return buildInstr(TargetOpcode::G_BRCOND).addUse(Tst).addMBB(&Dest);
Tim Northover69c2ba52016-07-29 17:58:00 +0000277}
278
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000279MachineInstrBuilder MachineIRBuilderBase::buildLoad(unsigned Res, unsigned Addr,
280 MachineMemOperand &MMO) {
Daniel Sanders5eb9f582018-04-28 18:14:50 +0000281 return buildLoadInstr(TargetOpcode::G_LOAD, Res, Addr, MMO);
282}
283
284MachineInstrBuilder
285MachineIRBuilderBase::buildLoadInstr(unsigned Opcode, unsigned Res,
286 unsigned Addr, MachineMemOperand &MMO) {
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000287 assert(getMRI()->getType(Res).isValid() && "invalid operand type");
288 assert(getMRI()->getType(Addr).isPointer() && "invalid operand type");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000289
Daniel Sanders5eb9f582018-04-28 18:14:50 +0000290 return buildInstr(Opcode)
Tim Northovera51575f2016-07-29 17:43:52 +0000291 .addDef(Res)
292 .addUse(Addr)
293 .addMemOperand(&MMO);
Tim Northoverad2b7172016-07-26 20:23:26 +0000294}
295
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000296MachineInstrBuilder MachineIRBuilderBase::buildStore(unsigned Val,
297 unsigned Addr,
298 MachineMemOperand &MMO) {
299 assert(getMRI()->getType(Val).isValid() && "invalid operand type");
300 assert(getMRI()->getType(Addr).isPointer() && "invalid operand type");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000301
Tim Northover0f140c72016-09-09 11:46:34 +0000302 return buildInstr(TargetOpcode::G_STORE)
Tim Northovera51575f2016-07-29 17:43:52 +0000303 .addUse(Val)
304 .addUse(Addr)
305 .addMemOperand(&MMO);
Tim Northoverad2b7172016-07-26 20:23:26 +0000306}
307
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000308MachineInstrBuilder MachineIRBuilderBase::buildUAdde(unsigned Res,
309 unsigned CarryOut,
310 unsigned Op0, unsigned Op1,
311 unsigned CarryIn) {
312 assert(getMRI()->getType(Res).isScalar() && "invalid operand type");
313 assert(getMRI()->getType(Res) == getMRI()->getType(Op0) &&
314 getMRI()->getType(Res) == getMRI()->getType(Op1) && "type mismatch");
315 assert(getMRI()->getType(CarryOut).isScalar() && "invalid operand type");
316 assert(getMRI()->getType(CarryOut) == getMRI()->getType(CarryIn) &&
317 "type mismatch");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000318
Tim Northover0f140c72016-09-09 11:46:34 +0000319 return buildInstr(TargetOpcode::G_UADDE)
Tim Northover9656f142016-08-04 20:54:13 +0000320 .addDef(Res)
321 .addDef(CarryOut)
322 .addUse(Op0)
323 .addUse(Op1)
324 .addUse(CarryIn);
325}
326
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000327MachineInstrBuilder MachineIRBuilderBase::buildAnyExt(unsigned Res,
328 unsigned Op) {
Tim Northover0f140c72016-09-09 11:46:34 +0000329 validateTruncExt(Res, Op, true);
330 return buildInstr(TargetOpcode::G_ANYEXT).addDef(Res).addUse(Op);
Tim Northover32335812016-08-04 18:35:11 +0000331}
332
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000333MachineInstrBuilder MachineIRBuilderBase::buildSExt(unsigned Res, unsigned Op) {
Tim Northover0f140c72016-09-09 11:46:34 +0000334 validateTruncExt(Res, Op, true);
335 return buildInstr(TargetOpcode::G_SEXT).addDef(Res).addUse(Op);
Tim Northover6cd4b232016-08-23 21:01:26 +0000336}
337
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000338MachineInstrBuilder MachineIRBuilderBase::buildZExt(unsigned Res, unsigned Op) {
Tim Northover0f140c72016-09-09 11:46:34 +0000339 validateTruncExt(Res, Op, true);
340 return buildInstr(TargetOpcode::G_ZEXT).addDef(Res).addUse(Op);
Tim Northover6cd4b232016-08-23 21:01:26 +0000341}
342
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000343MachineInstrBuilder MachineIRBuilderBase::buildExtOrTrunc(unsigned ExtOpc,
344 unsigned Res,
345 unsigned Op) {
Aditya Nandakumar892979e2017-08-25 04:57:27 +0000346 assert((TargetOpcode::G_ANYEXT == ExtOpc || TargetOpcode::G_ZEXT == ExtOpc ||
347 TargetOpcode::G_SEXT == ExtOpc) &&
348 "Expecting Extending Opc");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000349 assert(getMRI()->getType(Res).isScalar() ||
350 getMRI()->getType(Res).isVector());
351 assert(getMRI()->getType(Res).isScalar() == getMRI()->getType(Op).isScalar());
Tim Northoverc9902362017-06-27 22:45:35 +0000352
Tim Northovera7653b32016-09-12 11:20:22 +0000353 unsigned Opcode = TargetOpcode::COPY;
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000354 if (getMRI()->getType(Res).getSizeInBits() >
355 getMRI()->getType(Op).getSizeInBits())
Aditya Nandakumar892979e2017-08-25 04:57:27 +0000356 Opcode = ExtOpc;
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000357 else if (getMRI()->getType(Res).getSizeInBits() <
358 getMRI()->getType(Op).getSizeInBits())
Tim Northovera7653b32016-09-12 11:20:22 +0000359 Opcode = TargetOpcode::G_TRUNC;
Tim Northoverc9902362017-06-27 22:45:35 +0000360 else
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000361 assert(getMRI()->getType(Res) == getMRI()->getType(Op));
Tim Northovera7653b32016-09-12 11:20:22 +0000362
363 return buildInstr(Opcode).addDef(Res).addUse(Op);
364}
365
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000366MachineInstrBuilder MachineIRBuilderBase::buildSExtOrTrunc(unsigned Res,
367 unsigned Op) {
Aditya Nandakumar892979e2017-08-25 04:57:27 +0000368 return buildExtOrTrunc(TargetOpcode::G_SEXT, Res, Op);
369}
370
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000371MachineInstrBuilder MachineIRBuilderBase::buildZExtOrTrunc(unsigned Res,
372 unsigned Op) {
Aditya Nandakumar892979e2017-08-25 04:57:27 +0000373 return buildExtOrTrunc(TargetOpcode::G_ZEXT, Res, Op);
374}
Tim Northoverc9902362017-06-27 22:45:35 +0000375
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000376MachineInstrBuilder MachineIRBuilderBase::buildAnyExtOrTrunc(unsigned Res,
377 unsigned Op) {
Aditya Nandakumar892979e2017-08-25 04:57:27 +0000378 return buildExtOrTrunc(TargetOpcode::G_ANYEXT, Res, Op);
Tim Northoverc3e3f592017-02-03 18:22:45 +0000379}
380
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000381MachineInstrBuilder MachineIRBuilderBase::buildCast(unsigned Dst,
382 unsigned Src) {
383 LLT SrcTy = getMRI()->getType(Src);
384 LLT DstTy = getMRI()->getType(Dst);
Tim Northover95b6d5f2017-03-06 19:04:17 +0000385 if (SrcTy == DstTy)
386 return buildCopy(Dst, Src);
387
388 unsigned Opcode;
389 if (SrcTy.isPointer() && DstTy.isScalar())
390 Opcode = TargetOpcode::G_PTRTOINT;
391 else if (DstTy.isPointer() && SrcTy.isScalar())
392 Opcode = TargetOpcode::G_INTTOPTR;
393 else {
394 assert(!SrcTy.isPointer() && !DstTy.isPointer() && "n G_ADDRCAST yet");
395 Opcode = TargetOpcode::G_BITCAST;
396 }
397
398 return buildInstr(Opcode).addDef(Dst).addUse(Src);
399}
400
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000401MachineInstrBuilder
402MachineIRBuilderBase::buildExtract(unsigned Res, unsigned Src, uint64_t Index) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000403#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000404 assert(getMRI()->getType(Src).isValid() && "invalid operand type");
405 assert(getMRI()->getType(Res).isValid() && "invalid operand type");
406 assert(Index + getMRI()->getType(Res).getSizeInBits() <=
407 getMRI()->getType(Src).getSizeInBits() &&
Tim Northoverc2c545b2017-03-06 23:50:28 +0000408 "extracting off end of register");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000409#endif
410
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000411 if (getMRI()->getType(Res).getSizeInBits() ==
412 getMRI()->getType(Src).getSizeInBits()) {
Tim Northoverc2c545b2017-03-06 23:50:28 +0000413 assert(Index == 0 && "insertion past the end of a register");
414 return buildCast(Res, Src);
415 }
Tim Northover33b07d62016-07-22 20:03:43 +0000416
Tim Northoverc2c545b2017-03-06 23:50:28 +0000417 return buildInstr(TargetOpcode::G_EXTRACT)
418 .addDef(Res)
419 .addUse(Src)
420 .addImm(Index);
Tim Northover33b07d62016-07-22 20:03:43 +0000421}
422
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000423void MachineIRBuilderBase::buildSequence(unsigned Res, ArrayRef<unsigned> Ops,
424 ArrayRef<uint64_t> Indices) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000425#ifndef NDEBUG
Tim Northover0f140c72016-09-09 11:46:34 +0000426 assert(Ops.size() == Indices.size() && "incompatible args");
Tim Northover26b76f22016-08-19 18:32:14 +0000427 assert(!Ops.empty() && "invalid trivial sequence");
Tim Northover991b12b2016-08-30 20:51:25 +0000428 assert(std::is_sorted(Indices.begin(), Indices.end()) &&
429 "sequence offsets must be in ascending order");
Tim Northover91c81732016-08-19 17:17:06 +0000430
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000431 assert(getMRI()->getType(Res).isValid() && "invalid operand type");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000432 for (auto Op : Ops)
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000433 assert(getMRI()->getType(Op).isValid() && "invalid operand type");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000434#endif
435
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000436 LLT ResTy = getMRI()->getType(Res);
437 LLT OpTy = getMRI()->getType(Ops[0]);
Tim Northoverb57bf2a2017-06-23 16:15:37 +0000438 unsigned OpSize = OpTy.getSizeInBits();
439 bool MaybeMerge = true;
Tim Northover91c81732016-08-19 17:17:06 +0000440 for (unsigned i = 0; i < Ops.size(); ++i) {
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000441 if (getMRI()->getType(Ops[i]) != OpTy || Indices[i] != i * OpSize) {
Tim Northoverb57bf2a2017-06-23 16:15:37 +0000442 MaybeMerge = false;
443 break;
444 }
Tim Northover91c81732016-08-19 17:17:06 +0000445 }
Tim Northoverb57bf2a2017-06-23 16:15:37 +0000446
447 if (MaybeMerge && Ops.size() * OpSize == ResTy.getSizeInBits()) {
448 buildMerge(Res, Ops);
449 return;
450 }
451
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000452 unsigned ResIn = getMRI()->createGenericVirtualRegister(ResTy);
Tim Northoverb57bf2a2017-06-23 16:15:37 +0000453 buildUndef(ResIn);
454
455 for (unsigned i = 0; i < Ops.size(); ++i) {
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000456 unsigned ResOut = i + 1 == Ops.size()
457 ? Res
458 : getMRI()->createGenericVirtualRegister(ResTy);
Tim Northoverb57bf2a2017-06-23 16:15:37 +0000459 buildInsert(ResOut, ResIn, Ops[i], Indices[i]);
460 ResIn = ResOut;
461 }
Tim Northover33b07d62016-07-22 20:03:43 +0000462}
Tim Northover5fb414d2016-07-29 22:32:36 +0000463
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000464MachineInstrBuilder MachineIRBuilderBase::buildUndef(unsigned Res) {
Tim Northoverff5e7e12017-06-30 20:27:36 +0000465 return buildInstr(TargetOpcode::G_IMPLICIT_DEF).addDef(Res);
Tim Northover81dafc12017-03-06 18:36:40 +0000466}
467
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000468MachineInstrBuilder MachineIRBuilderBase::buildMerge(unsigned Res,
469 ArrayRef<unsigned> Ops) {
Tim Northoverbf017292017-03-03 22:46:09 +0000470
471#ifndef NDEBUG
472 assert(!Ops.empty() && "invalid trivial sequence");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000473 LLT Ty = getMRI()->getType(Ops[0]);
Tim Northoverbf017292017-03-03 22:46:09 +0000474 for (auto Reg : Ops)
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000475 assert(getMRI()->getType(Reg) == Ty && "type mismatch in input list");
476 assert(Ops.size() * getMRI()->getType(Ops[0]).getSizeInBits() ==
477 getMRI()->getType(Res).getSizeInBits() &&
Tim Northoverbf017292017-03-03 22:46:09 +0000478 "input operands do not cover output register");
479#endif
480
Tim Northoverc2d5e6d2017-06-26 20:34:13 +0000481 if (Ops.size() == 1)
Tim Northover849fcca2017-06-27 21:41:40 +0000482 return buildCast(Res, Ops[0]);
Tim Northoverc2d5e6d2017-06-26 20:34:13 +0000483
Tim Northoverbf017292017-03-03 22:46:09 +0000484 MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_MERGE_VALUES);
485 MIB.addDef(Res);
486 for (unsigned i = 0; i < Ops.size(); ++i)
487 MIB.addUse(Ops[i]);
488 return MIB;
489}
490
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000491MachineInstrBuilder MachineIRBuilderBase::buildUnmerge(ArrayRef<unsigned> Res,
492 unsigned Op) {
Tim Northoverbf017292017-03-03 22:46:09 +0000493
494#ifndef NDEBUG
495 assert(!Res.empty() && "invalid trivial sequence");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000496 LLT Ty = getMRI()->getType(Res[0]);
Tim Northoverbf017292017-03-03 22:46:09 +0000497 for (auto Reg : Res)
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000498 assert(getMRI()->getType(Reg) == Ty && "type mismatch in input list");
499 assert(Res.size() * getMRI()->getType(Res[0]).getSizeInBits() ==
500 getMRI()->getType(Op).getSizeInBits() &&
Tim Northoverbf017292017-03-03 22:46:09 +0000501 "input operands do not cover output register");
502#endif
503
504 MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_UNMERGE_VALUES);
505 for (unsigned i = 0; i < Res.size(); ++i)
506 MIB.addDef(Res[i]);
507 MIB.addUse(Op);
508 return MIB;
509}
510
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000511MachineInstrBuilder MachineIRBuilderBase::buildInsert(unsigned Res,
512 unsigned Src, unsigned Op,
513 unsigned Index) {
514 assert(Index + getMRI()->getType(Op).getSizeInBits() <=
515 getMRI()->getType(Res).getSizeInBits() &&
Tim Northoverc9902362017-06-27 22:45:35 +0000516 "insertion past the end of a register");
517
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000518 if (getMRI()->getType(Res).getSizeInBits() ==
519 getMRI()->getType(Op).getSizeInBits()) {
Tim Northover95b6d5f2017-03-06 19:04:17 +0000520 return buildCast(Res, Op);
521 }
522
Tim Northover3e6a7af2017-03-03 23:05:47 +0000523 return buildInstr(TargetOpcode::G_INSERT)
524 .addDef(Res)
525 .addUse(Src)
526 .addUse(Op)
527 .addImm(Index);
528}
529
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000530MachineInstrBuilder MachineIRBuilderBase::buildIntrinsic(Intrinsic::ID ID,
531 unsigned Res,
532 bool HasSideEffects) {
Tim Northover5fb414d2016-07-29 22:32:36 +0000533 auto MIB =
534 buildInstr(HasSideEffects ? TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS
Tim Northover0f140c72016-09-09 11:46:34 +0000535 : TargetOpcode::G_INTRINSIC);
Tim Northover5fb414d2016-07-29 22:32:36 +0000536 if (Res)
537 MIB.addDef(Res);
538 MIB.addIntrinsicID(ID);
539 return MIB;
540}
Tim Northover32335812016-08-04 18:35:11 +0000541
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000542MachineInstrBuilder MachineIRBuilderBase::buildTrunc(unsigned Res,
543 unsigned Op) {
Tim Northover0f140c72016-09-09 11:46:34 +0000544 validateTruncExt(Res, Op, false);
545 return buildInstr(TargetOpcode::G_TRUNC).addDef(Res).addUse(Op);
Tim Northover32335812016-08-04 18:35:11 +0000546}
Tim Northoverde3aea0412016-08-17 20:25:25 +0000547
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000548MachineInstrBuilder MachineIRBuilderBase::buildFPTrunc(unsigned Res,
549 unsigned Op) {
Tim Northover0f140c72016-09-09 11:46:34 +0000550 validateTruncExt(Res, Op, false);
551 return buildInstr(TargetOpcode::G_FPTRUNC).addDef(Res).addUse(Op);
Tim Northovera11be042016-08-19 22:40:08 +0000552}
553
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000554MachineInstrBuilder MachineIRBuilderBase::buildICmp(CmpInst::Predicate Pred,
555 unsigned Res, unsigned Op0,
556 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000557#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000558 assert(getMRI()->getType(Op0) == getMRI()->getType(Op0) && "type mismatch");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000559 assert(CmpInst::isIntPredicate(Pred) && "invalid predicate");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000560 if (getMRI()->getType(Op0).isScalar() || getMRI()->getType(Op0).isPointer())
561 assert(getMRI()->getType(Res).isScalar() && "type mismatch");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000562 else
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000563 assert(getMRI()->getType(Res).isVector() &&
564 getMRI()->getType(Res).getNumElements() ==
565 getMRI()->getType(Op0).getNumElements() &&
Tim Northover1f8b1db2016-09-09 11:46:58 +0000566 "type mismatch");
567#endif
568
Tim Northover0f140c72016-09-09 11:46:34 +0000569 return buildInstr(TargetOpcode::G_ICMP)
Tim Northoverde3aea0412016-08-17 20:25:25 +0000570 .addDef(Res)
571 .addPredicate(Pred)
572 .addUse(Op0)
573 .addUse(Op1);
574}
Tim Northover5a28c362016-08-19 20:09:07 +0000575
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000576MachineInstrBuilder MachineIRBuilderBase::buildFCmp(CmpInst::Predicate Pred,
577 unsigned Res, unsigned Op0,
578 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000579#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000580 assert((getMRI()->getType(Op0).isScalar() ||
581 getMRI()->getType(Op0).isVector()) &&
Tim Northover1f8b1db2016-09-09 11:46:58 +0000582 "invalid operand type");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000583 assert(getMRI()->getType(Op0) == getMRI()->getType(Op1) && "type mismatch");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000584 assert(CmpInst::isFPPredicate(Pred) && "invalid predicate");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000585 if (getMRI()->getType(Op0).isScalar())
586 assert(getMRI()->getType(Res).isScalar() && "type mismatch");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000587 else
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000588 assert(getMRI()->getType(Res).isVector() &&
589 getMRI()->getType(Res).getNumElements() ==
590 getMRI()->getType(Op0).getNumElements() &&
Tim Northover1f8b1db2016-09-09 11:46:58 +0000591 "type mismatch");
592#endif
593
Tim Northover0f140c72016-09-09 11:46:34 +0000594 return buildInstr(TargetOpcode::G_FCMP)
Tim Northoverd5c23bc2016-08-19 20:48:16 +0000595 .addDef(Res)
596 .addPredicate(Pred)
597 .addUse(Op0)
598 .addUse(Op1);
599}
600
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000601MachineInstrBuilder MachineIRBuilderBase::buildSelect(unsigned Res,
602 unsigned Tst,
603 unsigned Op0,
604 unsigned Op1) {
Tim Northover1f8b1db2016-09-09 11:46:58 +0000605#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000606 LLT ResTy = getMRI()->getType(Res);
Tim Northoverf50f2f32016-12-06 18:38:34 +0000607 assert((ResTy.isScalar() || ResTy.isVector() || ResTy.isPointer()) &&
Tim Northover1f8b1db2016-09-09 11:46:58 +0000608 "invalid operand type");
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000609 assert(ResTy == getMRI()->getType(Op0) && ResTy == getMRI()->getType(Op1) &&
Tim Northoverf50f2f32016-12-06 18:38:34 +0000610 "type mismatch");
611 if (ResTy.isScalar() || ResTy.isPointer())
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000612 assert(getMRI()->getType(Tst).isScalar() && "type mismatch");
Tim Northover1f8b1db2016-09-09 11:46:58 +0000613 else
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000614 assert((getMRI()->getType(Tst).isScalar() ||
615 (getMRI()->getType(Tst).isVector() &&
616 getMRI()->getType(Tst).getNumElements() ==
617 getMRI()->getType(Op0).getNumElements())) &&
Tim Northover1f8b1db2016-09-09 11:46:58 +0000618 "type mismatch");
619#endif
620
Tim Northover0f140c72016-09-09 11:46:34 +0000621 return buildInstr(TargetOpcode::G_SELECT)
Tim Northover5a28c362016-08-19 20:09:07 +0000622 .addDef(Res)
623 .addUse(Tst)
624 .addUse(Op0)
625 .addUse(Op1);
626}
Tim Northoverbdf67c92016-08-23 21:01:33 +0000627
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000628MachineInstrBuilder
629MachineIRBuilderBase::buildInsertVectorElement(unsigned Res, unsigned Val,
630 unsigned Elt, unsigned Idx) {
Volkan Keles04cb08c2017-03-10 19:08:28 +0000631#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000632 LLT ResTy = getMRI()->getType(Res);
633 LLT ValTy = getMRI()->getType(Val);
634 LLT EltTy = getMRI()->getType(Elt);
635 LLT IdxTy = getMRI()->getType(Idx);
Volkan Keles04cb08c2017-03-10 19:08:28 +0000636 assert(ResTy.isVector() && ValTy.isVector() && "invalid operand type");
Kristof Beyls0f36e682017-04-19 07:23:57 +0000637 assert(IdxTy.isScalar() && "invalid operand type");
Volkan Keles04cb08c2017-03-10 19:08:28 +0000638 assert(ResTy.getNumElements() == ValTy.getNumElements() && "type mismatch");
639 assert(ResTy.getElementType() == EltTy && "type mismatch");
640#endif
641
642 return buildInstr(TargetOpcode::G_INSERT_VECTOR_ELT)
643 .addDef(Res)
644 .addUse(Val)
645 .addUse(Elt)
646 .addUse(Idx);
647}
648
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000649MachineInstrBuilder
650MachineIRBuilderBase::buildExtractVectorElement(unsigned Res, unsigned Val,
651 unsigned Idx) {
Volkan Keles04cb08c2017-03-10 19:08:28 +0000652#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000653 LLT ResTy = getMRI()->getType(Res);
654 LLT ValTy = getMRI()->getType(Val);
655 LLT IdxTy = getMRI()->getType(Idx);
Volkan Keles04cb08c2017-03-10 19:08:28 +0000656 assert(ValTy.isVector() && "invalid operand type");
Kristof Beyls0f36e682017-04-19 07:23:57 +0000657 assert((ResTy.isScalar() || ResTy.isPointer()) && "invalid operand type");
658 assert(IdxTy.isScalar() && "invalid operand type");
Volkan Keles04cb08c2017-03-10 19:08:28 +0000659 assert(ValTy.getElementType() == ResTy && "type mismatch");
660#endif
661
662 return buildInstr(TargetOpcode::G_EXTRACT_VECTOR_ELT)
663 .addDef(Res)
664 .addUse(Val)
665 .addUse(Idx);
666}
667
Daniel Sandersaef1dfc2017-11-30 20:11:42 +0000668MachineInstrBuilder
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000669MachineIRBuilderBase::buildAtomicCmpXchg(unsigned OldValRes, unsigned Addr,
670 unsigned CmpVal, unsigned NewVal,
671 MachineMemOperand &MMO) {
Daniel Sandersaef1dfc2017-11-30 20:11:42 +0000672#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000673 LLT OldValResTy = getMRI()->getType(OldValRes);
674 LLT AddrTy = getMRI()->getType(Addr);
675 LLT CmpValTy = getMRI()->getType(CmpVal);
676 LLT NewValTy = getMRI()->getType(NewVal);
Daniel Sandersaef1dfc2017-11-30 20:11:42 +0000677 assert(OldValResTy.isScalar() && "invalid operand type");
678 assert(AddrTy.isPointer() && "invalid operand type");
679 assert(CmpValTy.isValid() && "invalid operand type");
680 assert(NewValTy.isValid() && "invalid operand type");
681 assert(OldValResTy == CmpValTy && "type mismatch");
682 assert(OldValResTy == NewValTy && "type mismatch");
683#endif
684
685 return buildInstr(TargetOpcode::G_ATOMIC_CMPXCHG)
686 .addDef(OldValRes)
687 .addUse(Addr)
688 .addUse(CmpVal)
689 .addUse(NewVal)
690 .addMemOperand(&MMO);
691}
692
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000693void MachineIRBuilderBase::validateTruncExt(unsigned Dst, unsigned Src,
694 bool IsExtend) {
Richard Smith418237b2016-08-23 22:14:15 +0000695#ifndef NDEBUG
Aditya Nandakumarb1c467d2018-04-09 17:30:56 +0000696 LLT SrcTy = getMRI()->getType(Src);
697 LLT DstTy = getMRI()->getType(Dst);
Tim Northoverbdf67c92016-08-23 21:01:33 +0000698
699 if (DstTy.isVector()) {
700 assert(SrcTy.isVector() && "mismatched cast between vecot and non-vector");
701 assert(SrcTy.getNumElements() == DstTy.getNumElements() &&
702 "different number of elements in a trunc/ext");
703 } else
704 assert(DstTy.isScalar() && SrcTy.isScalar() && "invalid extend/trunc");
705
706 if (IsExtend)
707 assert(DstTy.getSizeInBits() > SrcTy.getSizeInBits() &&
708 "invalid narrowing extend");
709 else
710 assert(DstTy.getSizeInBits() < SrcTy.getSizeInBits() &&
711 "invalid widening trunc");
Richard Smith418237b2016-08-23 22:14:15 +0000712#endif
Tim Northoverbdf67c92016-08-23 21:01:33 +0000713}