blob: 0cbcb65a99a27bbb243dbc75d8c620145c5137f2 [file] [log] [blame]
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +00001//===- lib/CodeGen/MachineOperand.cpp -------------------------------------===//
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//
Francis Visoiu Mistrih3aa8eaa2017-11-28 19:23:39 +000010/// \file Methods common to all machine operands.
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000011//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/CodeGen/MachineOperand.h"
15#include "llvm/Analysis/Loads.h"
16#include "llvm/CodeGen/MIRPrinter.h"
17#include "llvm/CodeGen/MachineRegisterInfo.h"
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000018#include "llvm/CodeGen/TargetRegisterInfo.h"
19#include "llvm/IR/Constants.h"
20#include "llvm/IR/ModuleSlotTracker.h"
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000021#include "llvm/Target/TargetIntrinsicInfo.h"
22#include "llvm/Target/TargetMachine.h"
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000023
24using namespace llvm;
25
26static cl::opt<int>
27 PrintRegMaskNumRegs("print-regmask-num-regs",
28 cl::desc("Number of registers to limit to when "
29 "printing regmask operands in IR dumps. "
30 "unlimited = -1"),
31 cl::init(32), cl::Hidden);
32
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000033static const MachineFunction *getMFIfAvailable(const MachineOperand &MO) {
34 if (const MachineInstr *MI = MO.getParent())
35 if (const MachineBasicBlock *MBB = MI->getParent())
36 if (const MachineFunction *MF = MBB->getParent())
37 return MF;
38 return nullptr;
39}
40static MachineFunction *getMFIfAvailable(MachineOperand &MO) {
41 return const_cast<MachineFunction *>(
42 getMFIfAvailable(const_cast<const MachineOperand &>(MO)));
43}
44
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000045void MachineOperand::setReg(unsigned Reg) {
46 if (getReg() == Reg)
47 return; // No change.
48
49 // Otherwise, we have to change the register. If this operand is embedded
50 // into a machine function, we need to update the old and new register's
51 // use/def lists.
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000052 if (MachineFunction *MF = getMFIfAvailable(*this)) {
53 MachineRegisterInfo &MRI = MF->getRegInfo();
54 MRI.removeRegOperandFromUseList(this);
55 SmallContents.RegNo = Reg;
56 MRI.addRegOperandToUseList(this);
57 return;
Francis Visoiu Mistrihc2641d62017-12-06 11:57:53 +000058 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000059
60 // Otherwise, just change the register, no problem. :)
61 SmallContents.RegNo = Reg;
62}
63
64void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx,
65 const TargetRegisterInfo &TRI) {
66 assert(TargetRegisterInfo::isVirtualRegister(Reg));
67 if (SubIdx && getSubReg())
68 SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg());
69 setReg(Reg);
70 if (SubIdx)
71 setSubReg(SubIdx);
72}
73
74void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) {
75 assert(TargetRegisterInfo::isPhysicalRegister(Reg));
76 if (getSubReg()) {
77 Reg = TRI.getSubReg(Reg, getSubReg());
78 // Note that getSubReg() may return 0 if the sub-register doesn't exist.
79 // That won't happen in legal code.
80 setSubReg(0);
81 if (isDef())
82 setIsUndef(false);
83 }
84 setReg(Reg);
85}
86
87/// Change a def to a use, or a use to a def.
88void MachineOperand::setIsDef(bool Val) {
89 assert(isReg() && "Wrong MachineOperand accessor");
90 assert((!Val || !isDebug()) && "Marking a debug operation as def");
91 if (IsDef == Val)
92 return;
93 // MRI may keep uses and defs in different list positions.
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000094 if (MachineFunction *MF = getMFIfAvailable(*this)) {
95 MachineRegisterInfo &MRI = MF->getRegInfo();
96 MRI.removeRegOperandFromUseList(this);
97 IsDef = Val;
98 MRI.addRegOperandToUseList(this);
99 return;
100 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000101 IsDef = Val;
102}
103
104// If this operand is currently a register operand, and if this is in a
105// function, deregister the operand from the register's use/def list.
106void MachineOperand::removeRegFromUses() {
107 if (!isReg() || !isOnRegUseList())
108 return;
109
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000110 if (MachineFunction *MF = getMFIfAvailable(*this))
111 MF->getRegInfo().removeRegOperandFromUseList(this);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000112}
113
114/// ChangeToImmediate - Replace this operand with a new immediate operand of
115/// the specified value. If an operand is known to be an immediate already,
116/// the setImm method should be used.
117void MachineOperand::ChangeToImmediate(int64_t ImmVal) {
118 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
119
120 removeRegFromUses();
121
122 OpKind = MO_Immediate;
123 Contents.ImmVal = ImmVal;
124}
125
126void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) {
127 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
128
129 removeRegFromUses();
130
131 OpKind = MO_FPImmediate;
132 Contents.CFP = FPImm;
133}
134
135void MachineOperand::ChangeToES(const char *SymName,
136 unsigned char TargetFlags) {
137 assert((!isReg() || !isTied()) &&
138 "Cannot change a tied operand into an external symbol");
139
140 removeRegFromUses();
141
142 OpKind = MO_ExternalSymbol;
143 Contents.OffsetedInfo.Val.SymbolName = SymName;
144 setOffset(0); // Offset is always 0.
145 setTargetFlags(TargetFlags);
146}
147
148void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) {
149 assert((!isReg() || !isTied()) &&
150 "Cannot change a tied operand into an MCSymbol");
151
152 removeRegFromUses();
153
154 OpKind = MO_MCSymbol;
155 Contents.Sym = Sym;
156}
157
158void MachineOperand::ChangeToFrameIndex(int Idx) {
159 assert((!isReg() || !isTied()) &&
160 "Cannot change a tied operand into a FrameIndex");
161
162 removeRegFromUses();
163
164 OpKind = MO_FrameIndex;
165 setIndex(Idx);
166}
167
168void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset,
169 unsigned char TargetFlags) {
170 assert((!isReg() || !isTied()) &&
171 "Cannot change a tied operand into a FrameIndex");
172
173 removeRegFromUses();
174
175 OpKind = MO_TargetIndex;
176 setIndex(Idx);
177 setOffset(Offset);
178 setTargetFlags(TargetFlags);
179}
180
181/// ChangeToRegister - Replace this operand with a new register operand of
182/// the specified value. If an operand is known to be an register already,
183/// the setReg method should be used.
184void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp,
185 bool isKill, bool isDead, bool isUndef,
186 bool isDebug) {
187 MachineRegisterInfo *RegInfo = nullptr;
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000188 if (MachineFunction *MF = getMFIfAvailable(*this))
189 RegInfo = &MF->getRegInfo();
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000190 // If this operand is already a register operand, remove it from the
191 // register's use/def lists.
192 bool WasReg = isReg();
193 if (RegInfo && WasReg)
194 RegInfo->removeRegOperandFromUseList(this);
195
196 // Change this to a register and set the reg#.
197 OpKind = MO_Register;
198 SmallContents.RegNo = Reg;
199 SubReg_TargetFlags = 0;
200 IsDef = isDef;
201 IsImp = isImp;
202 IsKill = isKill;
203 IsDead = isDead;
204 IsUndef = isUndef;
205 IsInternalRead = false;
206 IsEarlyClobber = false;
207 IsDebug = isDebug;
208 // Ensure isOnRegUseList() returns false.
209 Contents.Reg.Prev = nullptr;
210 // Preserve the tie when the operand was already a register.
211 if (!WasReg)
212 TiedTo = 0;
213
214 // If this operand is embedded in a function, add the operand to the
215 // register's use/def list.
216 if (RegInfo)
217 RegInfo->addRegOperandToUseList(this);
218}
219
220/// isIdenticalTo - Return true if this operand is identical to the specified
221/// operand. Note that this should stay in sync with the hash_value overload
222/// below.
223bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
224 if (getType() != Other.getType() ||
225 getTargetFlags() != Other.getTargetFlags())
226 return false;
227
228 switch (getType()) {
229 case MachineOperand::MO_Register:
230 return getReg() == Other.getReg() && isDef() == Other.isDef() &&
231 getSubReg() == Other.getSubReg();
232 case MachineOperand::MO_Immediate:
233 return getImm() == Other.getImm();
234 case MachineOperand::MO_CImmediate:
235 return getCImm() == Other.getCImm();
236 case MachineOperand::MO_FPImmediate:
237 return getFPImm() == Other.getFPImm();
238 case MachineOperand::MO_MachineBasicBlock:
239 return getMBB() == Other.getMBB();
240 case MachineOperand::MO_FrameIndex:
241 return getIndex() == Other.getIndex();
242 case MachineOperand::MO_ConstantPoolIndex:
243 case MachineOperand::MO_TargetIndex:
244 return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
245 case MachineOperand::MO_JumpTableIndex:
246 return getIndex() == Other.getIndex();
247 case MachineOperand::MO_GlobalAddress:
248 return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();
249 case MachineOperand::MO_ExternalSymbol:
250 return strcmp(getSymbolName(), Other.getSymbolName()) == 0 &&
251 getOffset() == Other.getOffset();
252 case MachineOperand::MO_BlockAddress:
253 return getBlockAddress() == Other.getBlockAddress() &&
254 getOffset() == Other.getOffset();
255 case MachineOperand::MO_RegisterMask:
256 case MachineOperand::MO_RegisterLiveOut: {
257 // Shallow compare of the two RegMasks
258 const uint32_t *RegMask = getRegMask();
259 const uint32_t *OtherRegMask = Other.getRegMask();
260 if (RegMask == OtherRegMask)
261 return true;
262
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000263 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
264 // Calculate the size of the RegMask
265 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
266 unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000267
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000268 // Deep compare of the two RegMasks
269 return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask);
270 }
271 // We don't know the size of the RegMask, so we can't deep compare the two
272 // reg masks.
273 return false;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000274 }
275 case MachineOperand::MO_MCSymbol:
276 return getMCSymbol() == Other.getMCSymbol();
277 case MachineOperand::MO_CFIIndex:
278 return getCFIIndex() == Other.getCFIIndex();
279 case MachineOperand::MO_Metadata:
280 return getMetadata() == Other.getMetadata();
281 case MachineOperand::MO_IntrinsicID:
282 return getIntrinsicID() == Other.getIntrinsicID();
283 case MachineOperand::MO_Predicate:
284 return getPredicate() == Other.getPredicate();
285 }
286 llvm_unreachable("Invalid machine operand type");
287}
288
289// Note: this must stay exactly in sync with isIdenticalTo above.
290hash_code llvm::hash_value(const MachineOperand &MO) {
291 switch (MO.getType()) {
292 case MachineOperand::MO_Register:
293 // Register operands don't have target flags.
294 return hash_combine(MO.getType(), MO.getReg(), MO.getSubReg(), MO.isDef());
295 case MachineOperand::MO_Immediate:
296 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm());
297 case MachineOperand::MO_CImmediate:
298 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm());
299 case MachineOperand::MO_FPImmediate:
300 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm());
301 case MachineOperand::MO_MachineBasicBlock:
302 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB());
303 case MachineOperand::MO_FrameIndex:
304 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
305 case MachineOperand::MO_ConstantPoolIndex:
306 case MachineOperand::MO_TargetIndex:
307 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(),
308 MO.getOffset());
309 case MachineOperand::MO_JumpTableIndex:
310 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
311 case MachineOperand::MO_ExternalSymbol:
312 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(),
313 MO.getSymbolName());
314 case MachineOperand::MO_GlobalAddress:
315 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(),
316 MO.getOffset());
317 case MachineOperand::MO_BlockAddress:
318 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(),
319 MO.getOffset());
320 case MachineOperand::MO_RegisterMask:
321 case MachineOperand::MO_RegisterLiveOut:
322 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getRegMask());
323 case MachineOperand::MO_Metadata:
324 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata());
325 case MachineOperand::MO_MCSymbol:
326 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol());
327 case MachineOperand::MO_CFIIndex:
328 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex());
329 case MachineOperand::MO_IntrinsicID:
330 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID());
331 case MachineOperand::MO_Predicate:
332 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate());
333 }
334 llvm_unreachable("Invalid machine operand type");
335}
336
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000337// Try to crawl up to the machine function and get TRI and IntrinsicInfo from
338// it.
339static void tryToGetTargetInfo(const MachineOperand &MO,
340 const TargetRegisterInfo *&TRI,
341 const TargetIntrinsicInfo *&IntrinsicInfo) {
Francis Visoiu Mistrih567611e2017-12-07 14:32:15 +0000342 if (const MachineFunction *MF = getMFIfAvailable(MO)) {
343 TRI = MF->getSubtarget().getRegisterInfo();
344 IntrinsicInfo = MF->getTarget().getIntrinsicInfo();
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000345 }
346}
347
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000348void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI,
349 const TargetIntrinsicInfo *IntrinsicInfo) const {
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000350 tryToGetTargetInfo(*this, TRI, IntrinsicInfo);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000351 ModuleSlotTracker DummyMST(nullptr);
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000352 print(OS, DummyMST, LLT{}, /*PrintDef=*/false,
353 /*ShouldPrintRegisterTies=*/true,
354 /*TiedOperandIdx=*/0, TRI, IntrinsicInfo);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000355}
356
357void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000358 LLT TypeToPrint, bool PrintDef,
359 bool ShouldPrintRegisterTies,
360 unsigned TiedOperandIdx,
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000361 const TargetRegisterInfo *TRI,
362 const TargetIntrinsicInfo *IntrinsicInfo) const {
363 switch (getType()) {
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000364 case MachineOperand::MO_Register: {
365 unsigned Reg = getReg();
366 if (isImplicit())
367 OS << (isDef() ? "implicit-def " : "implicit ");
368 else if (PrintDef && isDef())
369 // Print the 'def' flag only when the operand is defined after '='.
370 OS << "def ";
371 if (isInternalRead())
372 OS << "internal ";
373 if (isDead())
374 OS << "dead ";
375 if (isKill())
376 OS << "killed ";
377 if (isUndef())
378 OS << "undef ";
379 if (isEarlyClobber())
380 OS << "early-clobber ";
381 if (isDebug())
382 OS << "debug-use ";
383 OS << printReg(Reg, TRI);
384 // Print the sub register.
385 if (unsigned SubReg = getSubReg()) {
386 if (TRI)
387 OS << '.' << TRI->getSubRegIndexName(SubReg);
388 else
389 OS << ".subreg" << SubReg;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000390 }
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000391 // Print the register class / bank.
392 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
Francis Visoiu Mistrih567611e2017-12-07 14:32:15 +0000393 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
394 const MachineRegisterInfo &MRI = MF->getRegInfo();
395 if (!PrintDef || MRI.def_empty(Reg)) {
396 OS << ':';
397 OS << printRegClassOrBank(Reg, MRI, TRI);
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000398 }
399 }
400 }
401 // Print ties.
402 if (ShouldPrintRegisterTies && isTied() && !isDef())
403 OS << "(tied-def " << TiedOperandIdx << ")";
404 // Print types.
405 if (TypeToPrint.isValid())
406 OS << '(' << TypeToPrint << ')';
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000407 break;
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000408 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000409 case MachineOperand::MO_Immediate:
410 OS << getImm();
411 break;
412 case MachineOperand::MO_CImmediate:
Francis Visoiu Mistrih6c4ca712017-12-08 11:40:06 +0000413 getCImm()->printAsOperand(OS, /*PrintType=*/true, MST);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000414 break;
415 case MachineOperand::MO_FPImmediate:
416 if (getFPImm()->getType()->isFloatTy()) {
417 OS << getFPImm()->getValueAPF().convertToFloat();
418 } else if (getFPImm()->getType()->isHalfTy()) {
419 APFloat APF = getFPImm()->getValueAPF();
420 bool Unused;
421 APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Unused);
422 OS << "half " << APF.convertToFloat();
423 } else if (getFPImm()->getType()->isFP128Ty()) {
424 APFloat APF = getFPImm()->getValueAPF();
425 SmallString<16> Str;
426 getFPImm()->getValueAPF().toString(Str);
427 OS << "quad " << Str;
428 } else if (getFPImm()->getType()->isX86_FP80Ty()) {
429 APFloat APF = getFPImm()->getValueAPF();
430 OS << "x86_fp80 0xK";
431 APInt API = APF.bitcastToAPInt();
432 OS << format_hex_no_prefix(API.getHiBits(16).getZExtValue(), 4,
433 /*Upper=*/true);
434 OS << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,
435 /*Upper=*/true);
436 } else {
437 OS << getFPImm()->getValueAPF().convertToDouble();
438 }
439 break;
440 case MachineOperand::MO_MachineBasicBlock:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000441 OS << printMBBReference(*getMBB());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000442 break;
443 case MachineOperand::MO_FrameIndex:
444 OS << "<fi#" << getIndex() << '>';
445 break;
446 case MachineOperand::MO_ConstantPoolIndex:
447 OS << "<cp#" << getIndex();
448 if (getOffset())
449 OS << "+" << getOffset();
450 OS << '>';
451 break;
452 case MachineOperand::MO_TargetIndex:
453 OS << "<ti#" << getIndex();
454 if (getOffset())
455 OS << "+" << getOffset();
456 OS << '>';
457 break;
458 case MachineOperand::MO_JumpTableIndex:
459 OS << "<jt#" << getIndex() << '>';
460 break;
461 case MachineOperand::MO_GlobalAddress:
462 OS << "<ga:";
463 getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST);
464 if (getOffset())
465 OS << "+" << getOffset();
466 OS << '>';
467 break;
468 case MachineOperand::MO_ExternalSymbol:
469 OS << "<es:" << getSymbolName();
470 if (getOffset())
471 OS << "+" << getOffset();
472 OS << '>';
473 break;
474 case MachineOperand::MO_BlockAddress:
475 OS << '<';
476 getBlockAddress()->printAsOperand(OS, /*PrintType=*/false, MST);
477 if (getOffset())
478 OS << "+" << getOffset();
479 OS << '>';
480 break;
481 case MachineOperand::MO_RegisterMask: {
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000482 OS << "<regmask";
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000483 if (TRI) {
484 unsigned NumRegsInMask = 0;
485 unsigned NumRegsEmitted = 0;
486 for (unsigned i = 0; i < TRI->getNumRegs(); ++i) {
487 unsigned MaskWord = i / 32;
488 unsigned MaskBit = i % 32;
489 if (getRegMask()[MaskWord] & (1 << MaskBit)) {
490 if (PrintRegMaskNumRegs < 0 ||
491 NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) {
492 OS << " " << printReg(i, TRI);
493 NumRegsEmitted++;
494 }
495 NumRegsInMask++;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000496 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000497 }
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000498 if (NumRegsEmitted != NumRegsInMask)
499 OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more...";
500 } else {
501 OS << " ...";
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000502 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000503 OS << ">";
504 break;
505 }
506 case MachineOperand::MO_RegisterLiveOut:
507 OS << "<regliveout>";
508 break;
509 case MachineOperand::MO_Metadata:
510 OS << '<';
511 getMetadata()->printAsOperand(OS, MST);
512 OS << '>';
513 break;
514 case MachineOperand::MO_MCSymbol:
515 OS << "<MCSym=" << *getMCSymbol() << '>';
516 break;
517 case MachineOperand::MO_CFIIndex:
518 OS << "<call frame instruction>";
519 break;
520 case MachineOperand::MO_IntrinsicID: {
521 Intrinsic::ID ID = getIntrinsicID();
522 if (ID < Intrinsic::num_intrinsics)
523 OS << "<intrinsic:@" << Intrinsic::getName(ID, None) << '>';
524 else if (IntrinsicInfo)
525 OS << "<intrinsic:@" << IntrinsicInfo->getName(ID) << '>';
526 else
527 OS << "<intrinsic:" << ID << '>';
528 break;
529 }
530 case MachineOperand::MO_Predicate: {
531 auto Pred = static_cast<CmpInst::Predicate>(getPredicate());
532 OS << '<' << (CmpInst::isIntPredicate(Pred) ? "intpred" : "floatpred")
533 << CmpInst::getPredicateName(Pred) << '>';
534 break;
535 }
536 }
537 if (unsigned TF = getTargetFlags())
538 OS << "[TF=" << TF << ']';
539}
540
541#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
542LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; }
543#endif
544
545//===----------------------------------------------------------------------===//
546// MachineMemOperand Implementation
547//===----------------------------------------------------------------------===//
548
549/// getAddrSpace - Return the LLVM IR address space number that this pointer
550/// points into.
Yaxun Liu49477042017-12-02 22:13:22 +0000551unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000552
553/// isDereferenceable - Return true if V is always dereferenceable for
554/// Offset + Size byte.
555bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C,
556 const DataLayout &DL) const {
557 if (!V.is<const Value *>())
558 return false;
559
560 const Value *BasePtr = V.get<const Value *>();
561 if (BasePtr == nullptr)
562 return false;
563
564 return isDereferenceableAndAlignedPointer(
565 BasePtr, 1, APInt(DL.getPointerSizeInBits(), Offset + Size), DL);
566}
567
568/// getConstantPool - Return a MachinePointerInfo record that refers to the
569/// constant pool.
570MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) {
571 return MachinePointerInfo(MF.getPSVManager().getConstantPool());
572}
573
574/// getFixedStack - Return a MachinePointerInfo record that refers to the
575/// the specified FrameIndex.
576MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF,
577 int FI, int64_t Offset) {
578 return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset);
579}
580
581MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) {
582 return MachinePointerInfo(MF.getPSVManager().getJumpTable());
583}
584
585MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) {
586 return MachinePointerInfo(MF.getPSVManager().getGOT());
587}
588
589MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF,
590 int64_t Offset, uint8_t ID) {
591 return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID);
592}
593
Yaxun Liu49477042017-12-02 22:13:22 +0000594MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) {
595 return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace());
596}
597
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000598MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f,
599 uint64_t s, unsigned int a,
600 const AAMDNodes &AAInfo,
601 const MDNode *Ranges, SyncScope::ID SSID,
602 AtomicOrdering Ordering,
603 AtomicOrdering FailureOrdering)
604 : PtrInfo(ptrinfo), Size(s), FlagVals(f), BaseAlignLog2(Log2_32(a) + 1),
605 AAInfo(AAInfo), Ranges(Ranges) {
606 assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue *>() ||
607 isa<PointerType>(PtrInfo.V.get<const Value *>()->getType())) &&
608 "invalid pointer value");
609 assert(getBaseAlignment() == a && "Alignment is not a power of 2!");
610 assert((isLoad() || isStore()) && "Not a load/store!");
611
612 AtomicInfo.SSID = static_cast<unsigned>(SSID);
613 assert(getSyncScopeID() == SSID && "Value truncated");
614 AtomicInfo.Ordering = static_cast<unsigned>(Ordering);
615 assert(getOrdering() == Ordering && "Value truncated");
616 AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering);
617 assert(getFailureOrdering() == FailureOrdering && "Value truncated");
618}
619
620/// Profile - Gather unique data for the object.
621///
622void MachineMemOperand::Profile(FoldingSetNodeID &ID) const {
623 ID.AddInteger(getOffset());
624 ID.AddInteger(Size);
625 ID.AddPointer(getOpaqueValue());
626 ID.AddInteger(getFlags());
627 ID.AddInteger(getBaseAlignment());
628}
629
630void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) {
631 // The Value and Offset may differ due to CSE. But the flags and size
632 // should be the same.
633 assert(MMO->getFlags() == getFlags() && "Flags mismatch!");
634 assert(MMO->getSize() == getSize() && "Size mismatch!");
635
636 if (MMO->getBaseAlignment() >= getBaseAlignment()) {
637 // Update the alignment value.
638 BaseAlignLog2 = Log2_32(MMO->getBaseAlignment()) + 1;
639 // Also update the base and offset, because the new alignment may
640 // not be applicable with the old ones.
641 PtrInfo = MMO->PtrInfo;
642 }
643}
644
645/// getAlignment - Return the minimum known alignment in bytes of the
646/// actual memory reference.
647uint64_t MachineMemOperand::getAlignment() const {
648 return MinAlign(getBaseAlignment(), getOffset());
649}
650
651void MachineMemOperand::print(raw_ostream &OS) const {
652 ModuleSlotTracker DummyMST(nullptr);
653 print(OS, DummyMST);
654}
655void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
656 assert((isLoad() || isStore()) && "SV has to be a load, store or both.");
657
658 if (isVolatile())
659 OS << "Volatile ";
660
661 if (isLoad())
662 OS << "LD";
663 if (isStore())
664 OS << "ST";
665 OS << getSize();
666
667 // Print the address information.
668 OS << "[";
669 if (const Value *V = getValue())
670 V->printAsOperand(OS, /*PrintType=*/false, MST);
671 else if (const PseudoSourceValue *PSV = getPseudoValue())
672 PSV->printCustom(OS);
673 else
674 OS << "<unknown>";
675
676 unsigned AS = getAddrSpace();
677 if (AS != 0)
678 OS << "(addrspace=" << AS << ')';
679
680 // If the alignment of the memory reference itself differs from the alignment
681 // of the base pointer, print the base alignment explicitly, next to the base
682 // pointer.
683 if (getBaseAlignment() != getAlignment())
684 OS << "(align=" << getBaseAlignment() << ")";
685
686 if (getOffset() != 0)
687 OS << "+" << getOffset();
688 OS << "]";
689
690 // Print the alignment of the reference.
691 if (getBaseAlignment() != getAlignment() || getBaseAlignment() != getSize())
692 OS << "(align=" << getAlignment() << ")";
693
694 // Print TBAA info.
695 if (const MDNode *TBAAInfo = getAAInfo().TBAA) {
696 OS << "(tbaa=";
697 if (TBAAInfo->getNumOperands() > 0)
698 TBAAInfo->getOperand(0)->printAsOperand(OS, MST);
699 else
700 OS << "<unknown>";
701 OS << ")";
702 }
703
704 // Print AA scope info.
705 if (const MDNode *ScopeInfo = getAAInfo().Scope) {
706 OS << "(alias.scope=";
707 if (ScopeInfo->getNumOperands() > 0)
708 for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) {
709 ScopeInfo->getOperand(i)->printAsOperand(OS, MST);
710 if (i != ie - 1)
711 OS << ",";
712 }
713 else
714 OS << "<unknown>";
715 OS << ")";
716 }
717
718 // Print AA noalias scope info.
719 if (const MDNode *NoAliasInfo = getAAInfo().NoAlias) {
720 OS << "(noalias=";
721 if (NoAliasInfo->getNumOperands() > 0)
722 for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) {
723 NoAliasInfo->getOperand(i)->printAsOperand(OS, MST);
724 if (i != ie - 1)
725 OS << ",";
726 }
727 else
728 OS << "<unknown>";
729 OS << ")";
730 }
731
732 if (const MDNode *Ranges = getRanges()) {
733 unsigned NumRanges = Ranges->getNumOperands();
734 if (NumRanges != 0) {
735 OS << "(ranges=";
736
737 for (unsigned I = 0; I != NumRanges; ++I) {
738 Ranges->getOperand(I)->printAsOperand(OS, MST);
739 if (I != NumRanges - 1)
740 OS << ',';
741 }
742
743 OS << ')';
744 }
745 }
746
747 if (isNonTemporal())
748 OS << "(nontemporal)";
749 if (isDereferenceable())
750 OS << "(dereferenceable)";
751 if (isInvariant())
752 OS << "(invariant)";
753 if (getFlags() & MOTargetFlag1)
754 OS << "(flag1)";
755 if (getFlags() & MOTargetFlag2)
756 OS << "(flag2)";
757 if (getFlags() & MOTargetFlag3)
758 OS << "(flag3)";
759}