blob: 82e635d9c62f5209799669d7020cfd24af51d837 [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"
Francis Visoiu Mistrihb41dbbe2017-12-13 10:30:59 +000017#include "llvm/CodeGen/MachineJumpTableInfo.h"
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000018#include "llvm/CodeGen/MachineRegisterInfo.h"
Francis Visoiu Mistrihb3a0d512017-12-13 10:30:51 +000019#include "llvm/CodeGen/TargetInstrInfo.h"
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000020#include "llvm/CodeGen/TargetRegisterInfo.h"
21#include "llvm/IR/Constants.h"
22#include "llvm/IR/ModuleSlotTracker.h"
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +000023#include "llvm/Target/TargetIntrinsicInfo.h"
24#include "llvm/Target/TargetMachine.h"
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000025
26using namespace llvm;
27
28static cl::opt<int>
29 PrintRegMaskNumRegs("print-regmask-num-regs",
30 cl::desc("Number of registers to limit to when "
31 "printing regmask operands in IR dumps. "
32 "unlimited = -1"),
33 cl::init(32), cl::Hidden);
34
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000035static const MachineFunction *getMFIfAvailable(const MachineOperand &MO) {
36 if (const MachineInstr *MI = MO.getParent())
37 if (const MachineBasicBlock *MBB = MI->getParent())
38 if (const MachineFunction *MF = MBB->getParent())
39 return MF;
40 return nullptr;
41}
42static MachineFunction *getMFIfAvailable(MachineOperand &MO) {
43 return const_cast<MachineFunction *>(
44 getMFIfAvailable(const_cast<const MachineOperand &>(MO)));
45}
46
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000047void MachineOperand::setReg(unsigned Reg) {
48 if (getReg() == Reg)
49 return; // No change.
50
51 // Otherwise, we have to change the register. If this operand is embedded
52 // into a machine function, we need to update the old and new register's
53 // use/def lists.
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000054 if (MachineFunction *MF = getMFIfAvailable(*this)) {
55 MachineRegisterInfo &MRI = MF->getRegInfo();
56 MRI.removeRegOperandFromUseList(this);
57 SmallContents.RegNo = Reg;
58 MRI.addRegOperandToUseList(this);
59 return;
Francis Visoiu Mistrihc2641d62017-12-06 11:57:53 +000060 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000061
62 // Otherwise, just change the register, no problem. :)
63 SmallContents.RegNo = Reg;
64}
65
66void MachineOperand::substVirtReg(unsigned Reg, unsigned SubIdx,
67 const TargetRegisterInfo &TRI) {
68 assert(TargetRegisterInfo::isVirtualRegister(Reg));
69 if (SubIdx && getSubReg())
70 SubIdx = TRI.composeSubRegIndices(SubIdx, getSubReg());
71 setReg(Reg);
72 if (SubIdx)
73 setSubReg(SubIdx);
74}
75
76void MachineOperand::substPhysReg(unsigned Reg, const TargetRegisterInfo &TRI) {
77 assert(TargetRegisterInfo::isPhysicalRegister(Reg));
78 if (getSubReg()) {
79 Reg = TRI.getSubReg(Reg, getSubReg());
80 // Note that getSubReg() may return 0 if the sub-register doesn't exist.
81 // That won't happen in legal code.
82 setSubReg(0);
83 if (isDef())
84 setIsUndef(false);
85 }
86 setReg(Reg);
87}
88
89/// Change a def to a use, or a use to a def.
90void MachineOperand::setIsDef(bool Val) {
91 assert(isReg() && "Wrong MachineOperand accessor");
92 assert((!Val || !isDebug()) && "Marking a debug operation as def");
93 if (IsDef == Val)
94 return;
Geoff Berry60c43102017-12-12 17:53:59 +000095 assert(!IsDeadOrKill && "Changing def/use with dead/kill set not supported");
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000096 // MRI may keep uses and defs in different list positions.
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000097 if (MachineFunction *MF = getMFIfAvailable(*this)) {
98 MachineRegisterInfo &MRI = MF->getRegInfo();
99 MRI.removeRegOperandFromUseList(this);
100 IsDef = Val;
101 MRI.addRegOperandToUseList(this);
102 return;
103 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000104 IsDef = Val;
105}
106
Geoff Berry60c43102017-12-12 17:53:59 +0000107bool MachineOperand::isRenamable() const {
108 assert(isReg() && "Wrong MachineOperand accessor");
109 assert(TargetRegisterInfo::isPhysicalRegister(getReg()) &&
110 "isRenamable should only be checked on physical registers");
111 return IsRenamable;
112}
113
114void MachineOperand::setIsRenamable(bool Val) {
115 assert(isReg() && "Wrong MachineOperand accessor");
116 assert(TargetRegisterInfo::isPhysicalRegister(getReg()) &&
117 "setIsRenamable should only be called on physical registers");
118 if (const MachineInstr *MI = getParent())
119 if ((isDef() && MI->hasExtraDefRegAllocReq()) ||
120 (isUse() && MI->hasExtraSrcRegAllocReq()))
121 assert(!Val && "isRenamable should be false for "
122 "hasExtraDefRegAllocReq/hasExtraSrcRegAllocReq opcodes");
123 IsRenamable = Val;
124}
125
126void MachineOperand::setIsRenamableIfNoExtraRegAllocReq() {
127 if (const MachineInstr *MI = getParent())
128 if ((isDef() && MI->hasExtraDefRegAllocReq()) ||
129 (isUse() && MI->hasExtraSrcRegAllocReq()))
130 return;
131
132 setIsRenamable(true);
133}
134
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000135// If this operand is currently a register operand, and if this is in a
136// function, deregister the operand from the register's use/def list.
137void MachineOperand::removeRegFromUses() {
138 if (!isReg() || !isOnRegUseList())
139 return;
140
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000141 if (MachineFunction *MF = getMFIfAvailable(*this))
142 MF->getRegInfo().removeRegOperandFromUseList(this);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000143}
144
145/// ChangeToImmediate - Replace this operand with a new immediate operand of
146/// the specified value. If an operand is known to be an immediate already,
147/// the setImm method should be used.
148void MachineOperand::ChangeToImmediate(int64_t ImmVal) {
149 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
150
151 removeRegFromUses();
152
153 OpKind = MO_Immediate;
154 Contents.ImmVal = ImmVal;
155}
156
157void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) {
158 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
159
160 removeRegFromUses();
161
162 OpKind = MO_FPImmediate;
163 Contents.CFP = FPImm;
164}
165
166void MachineOperand::ChangeToES(const char *SymName,
167 unsigned char TargetFlags) {
168 assert((!isReg() || !isTied()) &&
169 "Cannot change a tied operand into an external symbol");
170
171 removeRegFromUses();
172
173 OpKind = MO_ExternalSymbol;
174 Contents.OffsetedInfo.Val.SymbolName = SymName;
175 setOffset(0); // Offset is always 0.
176 setTargetFlags(TargetFlags);
177}
178
179void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) {
180 assert((!isReg() || !isTied()) &&
181 "Cannot change a tied operand into an MCSymbol");
182
183 removeRegFromUses();
184
185 OpKind = MO_MCSymbol;
186 Contents.Sym = Sym;
187}
188
189void MachineOperand::ChangeToFrameIndex(int Idx) {
190 assert((!isReg() || !isTied()) &&
191 "Cannot change a tied operand into a FrameIndex");
192
193 removeRegFromUses();
194
195 OpKind = MO_FrameIndex;
196 setIndex(Idx);
197}
198
199void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset,
200 unsigned char TargetFlags) {
201 assert((!isReg() || !isTied()) &&
202 "Cannot change a tied operand into a FrameIndex");
203
204 removeRegFromUses();
205
206 OpKind = MO_TargetIndex;
207 setIndex(Idx);
208 setOffset(Offset);
209 setTargetFlags(TargetFlags);
210}
211
212/// ChangeToRegister - Replace this operand with a new register operand of
213/// the specified value. If an operand is known to be an register already,
214/// the setReg method should be used.
215void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp,
216 bool isKill, bool isDead, bool isUndef,
217 bool isDebug) {
218 MachineRegisterInfo *RegInfo = nullptr;
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000219 if (MachineFunction *MF = getMFIfAvailable(*this))
220 RegInfo = &MF->getRegInfo();
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000221 // If this operand is already a register operand, remove it from the
222 // register's use/def lists.
223 bool WasReg = isReg();
224 if (RegInfo && WasReg)
225 RegInfo->removeRegOperandFromUseList(this);
226
227 // Change this to a register and set the reg#.
Geoff Berry60c43102017-12-12 17:53:59 +0000228 assert(!(isDead && !isDef) && "Dead flag on non-def");
229 assert(!(isKill && isDef) && "Kill flag on def");
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000230 OpKind = MO_Register;
231 SmallContents.RegNo = Reg;
232 SubReg_TargetFlags = 0;
233 IsDef = isDef;
234 IsImp = isImp;
Geoff Berry60c43102017-12-12 17:53:59 +0000235 IsDeadOrKill = isKill | isDead;
236 IsRenamable = false;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000237 IsUndef = isUndef;
238 IsInternalRead = false;
239 IsEarlyClobber = false;
240 IsDebug = isDebug;
241 // Ensure isOnRegUseList() returns false.
242 Contents.Reg.Prev = nullptr;
243 // Preserve the tie when the operand was already a register.
244 if (!WasReg)
245 TiedTo = 0;
246
247 // If this operand is embedded in a function, add the operand to the
248 // register's use/def list.
249 if (RegInfo)
250 RegInfo->addRegOperandToUseList(this);
251}
252
253/// isIdenticalTo - Return true if this operand is identical to the specified
254/// operand. Note that this should stay in sync with the hash_value overload
255/// below.
256bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
257 if (getType() != Other.getType() ||
258 getTargetFlags() != Other.getTargetFlags())
259 return false;
260
261 switch (getType()) {
262 case MachineOperand::MO_Register:
263 return getReg() == Other.getReg() && isDef() == Other.isDef() &&
264 getSubReg() == Other.getSubReg();
265 case MachineOperand::MO_Immediate:
266 return getImm() == Other.getImm();
267 case MachineOperand::MO_CImmediate:
268 return getCImm() == Other.getCImm();
269 case MachineOperand::MO_FPImmediate:
270 return getFPImm() == Other.getFPImm();
271 case MachineOperand::MO_MachineBasicBlock:
272 return getMBB() == Other.getMBB();
273 case MachineOperand::MO_FrameIndex:
274 return getIndex() == Other.getIndex();
275 case MachineOperand::MO_ConstantPoolIndex:
276 case MachineOperand::MO_TargetIndex:
277 return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
278 case MachineOperand::MO_JumpTableIndex:
279 return getIndex() == Other.getIndex();
280 case MachineOperand::MO_GlobalAddress:
281 return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();
282 case MachineOperand::MO_ExternalSymbol:
283 return strcmp(getSymbolName(), Other.getSymbolName()) == 0 &&
284 getOffset() == Other.getOffset();
285 case MachineOperand::MO_BlockAddress:
286 return getBlockAddress() == Other.getBlockAddress() &&
287 getOffset() == Other.getOffset();
288 case MachineOperand::MO_RegisterMask:
289 case MachineOperand::MO_RegisterLiveOut: {
290 // Shallow compare of the two RegMasks
291 const uint32_t *RegMask = getRegMask();
292 const uint32_t *OtherRegMask = Other.getRegMask();
293 if (RegMask == OtherRegMask)
294 return true;
295
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000296 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
297 // Calculate the size of the RegMask
298 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
299 unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000300
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000301 // Deep compare of the two RegMasks
302 return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask);
303 }
304 // We don't know the size of the RegMask, so we can't deep compare the two
305 // reg masks.
306 return false;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000307 }
308 case MachineOperand::MO_MCSymbol:
309 return getMCSymbol() == Other.getMCSymbol();
310 case MachineOperand::MO_CFIIndex:
311 return getCFIIndex() == Other.getCFIIndex();
312 case MachineOperand::MO_Metadata:
313 return getMetadata() == Other.getMetadata();
314 case MachineOperand::MO_IntrinsicID:
315 return getIntrinsicID() == Other.getIntrinsicID();
316 case MachineOperand::MO_Predicate:
317 return getPredicate() == Other.getPredicate();
318 }
319 llvm_unreachable("Invalid machine operand type");
320}
321
322// Note: this must stay exactly in sync with isIdenticalTo above.
323hash_code llvm::hash_value(const MachineOperand &MO) {
324 switch (MO.getType()) {
325 case MachineOperand::MO_Register:
326 // Register operands don't have target flags.
327 return hash_combine(MO.getType(), MO.getReg(), MO.getSubReg(), MO.isDef());
328 case MachineOperand::MO_Immediate:
329 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm());
330 case MachineOperand::MO_CImmediate:
331 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm());
332 case MachineOperand::MO_FPImmediate:
333 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm());
334 case MachineOperand::MO_MachineBasicBlock:
335 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB());
336 case MachineOperand::MO_FrameIndex:
337 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
338 case MachineOperand::MO_ConstantPoolIndex:
339 case MachineOperand::MO_TargetIndex:
340 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(),
341 MO.getOffset());
342 case MachineOperand::MO_JumpTableIndex:
343 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
344 case MachineOperand::MO_ExternalSymbol:
345 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(),
346 MO.getSymbolName());
347 case MachineOperand::MO_GlobalAddress:
348 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(),
349 MO.getOffset());
350 case MachineOperand::MO_BlockAddress:
351 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(),
352 MO.getOffset());
353 case MachineOperand::MO_RegisterMask:
354 case MachineOperand::MO_RegisterLiveOut:
355 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getRegMask());
356 case MachineOperand::MO_Metadata:
357 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata());
358 case MachineOperand::MO_MCSymbol:
359 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol());
360 case MachineOperand::MO_CFIIndex:
361 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex());
362 case MachineOperand::MO_IntrinsicID:
363 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID());
364 case MachineOperand::MO_Predicate:
365 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate());
366 }
367 llvm_unreachable("Invalid machine operand type");
368}
369
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000370// Try to crawl up to the machine function and get TRI and IntrinsicInfo from
371// it.
372static void tryToGetTargetInfo(const MachineOperand &MO,
373 const TargetRegisterInfo *&TRI,
374 const TargetIntrinsicInfo *&IntrinsicInfo) {
Francis Visoiu Mistrih567611e2017-12-07 14:32:15 +0000375 if (const MachineFunction *MF = getMFIfAvailable(MO)) {
376 TRI = MF->getSubtarget().getRegisterInfo();
377 IntrinsicInfo = MF->getTarget().getIntrinsicInfo();
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000378 }
379}
380
Francis Visoiu Mistrih26ae8a62017-12-13 10:30:45 +0000381static void printOffset(raw_ostream &OS, int64_t Offset) {
382 if (Offset == 0)
383 return;
384 if (Offset < 0) {
385 OS << " - " << -Offset;
386 return;
387 }
388 OS << " + " << Offset;
389}
390
Francis Visoiu Mistrihb3a0d512017-12-13 10:30:51 +0000391static const char *getTargetIndexName(const MachineFunction &MF, int Index) {
392 const auto *TII = MF.getSubtarget().getInstrInfo();
393 assert(TII && "expected instruction info");
394 auto Indices = TII->getSerializableTargetIndices();
395 auto Found = find_if(Indices, [&](const std::pair<int, const char *> &I) {
396 return I.first == Index;
397 });
398 if (Found != Indices.end())
399 return Found->second;
400 return nullptr;
401}
402
Francis Visoiu Mistrih440f69c2017-12-08 22:53:21 +0000403void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index,
404 const TargetRegisterInfo *TRI) {
405 OS << "%subreg.";
406 if (TRI)
407 OS << TRI->getSubRegIndexName(Index);
408 else
409 OS << Index;
410}
411
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000412void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI,
413 const TargetIntrinsicInfo *IntrinsicInfo) const {
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000414 tryToGetTargetInfo(*this, TRI, IntrinsicInfo);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000415 ModuleSlotTracker DummyMST(nullptr);
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000416 print(OS, DummyMST, LLT{}, /*PrintDef=*/false,
417 /*ShouldPrintRegisterTies=*/true,
418 /*TiedOperandIdx=*/0, TRI, IntrinsicInfo);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000419}
420
421void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000422 LLT TypeToPrint, bool PrintDef,
423 bool ShouldPrintRegisterTies,
424 unsigned TiedOperandIdx,
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000425 const TargetRegisterInfo *TRI,
426 const TargetIntrinsicInfo *IntrinsicInfo) const {
427 switch (getType()) {
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000428 case MachineOperand::MO_Register: {
429 unsigned Reg = getReg();
430 if (isImplicit())
431 OS << (isDef() ? "implicit-def " : "implicit ");
432 else if (PrintDef && isDef())
433 // Print the 'def' flag only when the operand is defined after '='.
434 OS << "def ";
435 if (isInternalRead())
436 OS << "internal ";
437 if (isDead())
438 OS << "dead ";
439 if (isKill())
440 OS << "killed ";
441 if (isUndef())
442 OS << "undef ";
443 if (isEarlyClobber())
444 OS << "early-clobber ";
445 if (isDebug())
446 OS << "debug-use ";
Geoff Berry60c43102017-12-12 17:53:59 +0000447 if (TargetRegisterInfo::isPhysicalRegister(getReg()) && isRenamable())
448 OS << "renamable ";
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000449 OS << printReg(Reg, TRI);
450 // Print the sub register.
451 if (unsigned SubReg = getSubReg()) {
452 if (TRI)
453 OS << '.' << TRI->getSubRegIndexName(SubReg);
454 else
455 OS << ".subreg" << SubReg;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000456 }
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000457 // Print the register class / bank.
458 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
Francis Visoiu Mistrih567611e2017-12-07 14:32:15 +0000459 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
460 const MachineRegisterInfo &MRI = MF->getRegInfo();
461 if (!PrintDef || MRI.def_empty(Reg)) {
462 OS << ':';
463 OS << printRegClassOrBank(Reg, MRI, TRI);
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000464 }
465 }
466 }
467 // Print ties.
468 if (ShouldPrintRegisterTies && isTied() && !isDef())
469 OS << "(tied-def " << TiedOperandIdx << ")";
470 // Print types.
471 if (TypeToPrint.isValid())
472 OS << '(' << TypeToPrint << ')';
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000473 break;
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000474 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000475 case MachineOperand::MO_Immediate:
476 OS << getImm();
477 break;
478 case MachineOperand::MO_CImmediate:
Francis Visoiu Mistrih6c4ca712017-12-08 11:40:06 +0000479 getCImm()->printAsOperand(OS, /*PrintType=*/true, MST);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000480 break;
481 case MachineOperand::MO_FPImmediate:
482 if (getFPImm()->getType()->isFloatTy()) {
483 OS << getFPImm()->getValueAPF().convertToFloat();
484 } else if (getFPImm()->getType()->isHalfTy()) {
485 APFloat APF = getFPImm()->getValueAPF();
486 bool Unused;
487 APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Unused);
488 OS << "half " << APF.convertToFloat();
489 } else if (getFPImm()->getType()->isFP128Ty()) {
490 APFloat APF = getFPImm()->getValueAPF();
491 SmallString<16> Str;
492 getFPImm()->getValueAPF().toString(Str);
493 OS << "quad " << Str;
494 } else if (getFPImm()->getType()->isX86_FP80Ty()) {
495 APFloat APF = getFPImm()->getValueAPF();
496 OS << "x86_fp80 0xK";
497 APInt API = APF.bitcastToAPInt();
498 OS << format_hex_no_prefix(API.getHiBits(16).getZExtValue(), 4,
499 /*Upper=*/true);
500 OS << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,
501 /*Upper=*/true);
502 } else {
503 OS << getFPImm()->getValueAPF().convertToDouble();
504 }
505 break;
506 case MachineOperand::MO_MachineBasicBlock:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000507 OS << printMBBReference(*getMBB());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000508 break;
509 case MachineOperand::MO_FrameIndex:
510 OS << "<fi#" << getIndex() << '>';
511 break;
512 case MachineOperand::MO_ConstantPoolIndex:
Francis Visoiu Mistrih26ae8a62017-12-13 10:30:45 +0000513 OS << "%const." << getIndex();
514 printOffset(OS, getOffset());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000515 break;
Francis Visoiu Mistrihb3a0d512017-12-13 10:30:51 +0000516 case MachineOperand::MO_TargetIndex: {
517 OS << "target-index(";
518 const char *Name = "<unknown>";
519 if (const MachineFunction *MF = getMFIfAvailable(*this))
520 if (const auto *TargetIndexName = getTargetIndexName(*MF, getIndex()))
521 Name = TargetIndexName;
522 OS << Name << ')';
523 printOffset(OS, getOffset());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000524 break;
Francis Visoiu Mistrihb3a0d512017-12-13 10:30:51 +0000525 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000526 case MachineOperand::MO_JumpTableIndex:
Francis Visoiu Mistrihb41dbbe2017-12-13 10:30:59 +0000527 OS << printJumpTableEntryReference(getIndex());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000528 break;
529 case MachineOperand::MO_GlobalAddress:
530 OS << "<ga:";
531 getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST);
532 if (getOffset())
533 OS << "+" << getOffset();
534 OS << '>';
535 break;
536 case MachineOperand::MO_ExternalSymbol:
537 OS << "<es:" << getSymbolName();
538 if (getOffset())
539 OS << "+" << getOffset();
540 OS << '>';
541 break;
542 case MachineOperand::MO_BlockAddress:
543 OS << '<';
544 getBlockAddress()->printAsOperand(OS, /*PrintType=*/false, MST);
545 if (getOffset())
546 OS << "+" << getOffset();
547 OS << '>';
548 break;
549 case MachineOperand::MO_RegisterMask: {
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000550 OS << "<regmask";
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000551 if (TRI) {
552 unsigned NumRegsInMask = 0;
553 unsigned NumRegsEmitted = 0;
554 for (unsigned i = 0; i < TRI->getNumRegs(); ++i) {
555 unsigned MaskWord = i / 32;
556 unsigned MaskBit = i % 32;
557 if (getRegMask()[MaskWord] & (1 << MaskBit)) {
558 if (PrintRegMaskNumRegs < 0 ||
559 NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) {
560 OS << " " << printReg(i, TRI);
561 NumRegsEmitted++;
562 }
563 NumRegsInMask++;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000564 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000565 }
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000566 if (NumRegsEmitted != NumRegsInMask)
567 OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more...";
568 } else {
569 OS << " ...";
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000570 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000571 OS << ">";
572 break;
573 }
574 case MachineOperand::MO_RegisterLiveOut:
575 OS << "<regliveout>";
576 break;
577 case MachineOperand::MO_Metadata:
578 OS << '<';
579 getMetadata()->printAsOperand(OS, MST);
580 OS << '>';
581 break;
582 case MachineOperand::MO_MCSymbol:
583 OS << "<MCSym=" << *getMCSymbol() << '>';
584 break;
585 case MachineOperand::MO_CFIIndex:
586 OS << "<call frame instruction>";
587 break;
588 case MachineOperand::MO_IntrinsicID: {
589 Intrinsic::ID ID = getIntrinsicID();
590 if (ID < Intrinsic::num_intrinsics)
591 OS << "<intrinsic:@" << Intrinsic::getName(ID, None) << '>';
592 else if (IntrinsicInfo)
593 OS << "<intrinsic:@" << IntrinsicInfo->getName(ID) << '>';
594 else
595 OS << "<intrinsic:" << ID << '>';
596 break;
597 }
598 case MachineOperand::MO_Predicate: {
599 auto Pred = static_cast<CmpInst::Predicate>(getPredicate());
600 OS << '<' << (CmpInst::isIntPredicate(Pred) ? "intpred" : "floatpred")
601 << CmpInst::getPredicateName(Pred) << '>';
602 break;
603 }
604 }
605 if (unsigned TF = getTargetFlags())
606 OS << "[TF=" << TF << ']';
607}
608
609#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
610LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; }
611#endif
612
613//===----------------------------------------------------------------------===//
614// MachineMemOperand Implementation
615//===----------------------------------------------------------------------===//
616
617/// getAddrSpace - Return the LLVM IR address space number that this pointer
618/// points into.
Yaxun Liu49477042017-12-02 22:13:22 +0000619unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000620
621/// isDereferenceable - Return true if V is always dereferenceable for
622/// Offset + Size byte.
623bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C,
624 const DataLayout &DL) const {
625 if (!V.is<const Value *>())
626 return false;
627
628 const Value *BasePtr = V.get<const Value *>();
629 if (BasePtr == nullptr)
630 return false;
631
632 return isDereferenceableAndAlignedPointer(
633 BasePtr, 1, APInt(DL.getPointerSizeInBits(), Offset + Size), DL);
634}
635
636/// getConstantPool - Return a MachinePointerInfo record that refers to the
637/// constant pool.
638MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) {
639 return MachinePointerInfo(MF.getPSVManager().getConstantPool());
640}
641
642/// getFixedStack - Return a MachinePointerInfo record that refers to the
643/// the specified FrameIndex.
644MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF,
645 int FI, int64_t Offset) {
646 return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset);
647}
648
649MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) {
650 return MachinePointerInfo(MF.getPSVManager().getJumpTable());
651}
652
653MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) {
654 return MachinePointerInfo(MF.getPSVManager().getGOT());
655}
656
657MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF,
658 int64_t Offset, uint8_t ID) {
659 return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID);
660}
661
Yaxun Liu49477042017-12-02 22:13:22 +0000662MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) {
663 return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace());
664}
665
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000666MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f,
667 uint64_t s, unsigned int a,
668 const AAMDNodes &AAInfo,
669 const MDNode *Ranges, SyncScope::ID SSID,
670 AtomicOrdering Ordering,
671 AtomicOrdering FailureOrdering)
672 : PtrInfo(ptrinfo), Size(s), FlagVals(f), BaseAlignLog2(Log2_32(a) + 1),
673 AAInfo(AAInfo), Ranges(Ranges) {
674 assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue *>() ||
675 isa<PointerType>(PtrInfo.V.get<const Value *>()->getType())) &&
676 "invalid pointer value");
677 assert(getBaseAlignment() == a && "Alignment is not a power of 2!");
678 assert((isLoad() || isStore()) && "Not a load/store!");
679
680 AtomicInfo.SSID = static_cast<unsigned>(SSID);
681 assert(getSyncScopeID() == SSID && "Value truncated");
682 AtomicInfo.Ordering = static_cast<unsigned>(Ordering);
683 assert(getOrdering() == Ordering && "Value truncated");
684 AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering);
685 assert(getFailureOrdering() == FailureOrdering && "Value truncated");
686}
687
688/// Profile - Gather unique data for the object.
689///
690void MachineMemOperand::Profile(FoldingSetNodeID &ID) const {
691 ID.AddInteger(getOffset());
692 ID.AddInteger(Size);
693 ID.AddPointer(getOpaqueValue());
694 ID.AddInteger(getFlags());
695 ID.AddInteger(getBaseAlignment());
696}
697
698void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) {
699 // The Value and Offset may differ due to CSE. But the flags and size
700 // should be the same.
701 assert(MMO->getFlags() == getFlags() && "Flags mismatch!");
702 assert(MMO->getSize() == getSize() && "Size mismatch!");
703
704 if (MMO->getBaseAlignment() >= getBaseAlignment()) {
705 // Update the alignment value.
706 BaseAlignLog2 = Log2_32(MMO->getBaseAlignment()) + 1;
707 // Also update the base and offset, because the new alignment may
708 // not be applicable with the old ones.
709 PtrInfo = MMO->PtrInfo;
710 }
711}
712
713/// getAlignment - Return the minimum known alignment in bytes of the
714/// actual memory reference.
715uint64_t MachineMemOperand::getAlignment() const {
716 return MinAlign(getBaseAlignment(), getOffset());
717}
718
719void MachineMemOperand::print(raw_ostream &OS) const {
720 ModuleSlotTracker DummyMST(nullptr);
721 print(OS, DummyMST);
722}
723void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
724 assert((isLoad() || isStore()) && "SV has to be a load, store or both.");
725
726 if (isVolatile())
727 OS << "Volatile ";
728
729 if (isLoad())
730 OS << "LD";
731 if (isStore())
732 OS << "ST";
733 OS << getSize();
734
735 // Print the address information.
736 OS << "[";
737 if (const Value *V = getValue())
738 V->printAsOperand(OS, /*PrintType=*/false, MST);
739 else if (const PseudoSourceValue *PSV = getPseudoValue())
740 PSV->printCustom(OS);
741 else
742 OS << "<unknown>";
743
744 unsigned AS = getAddrSpace();
745 if (AS != 0)
746 OS << "(addrspace=" << AS << ')';
747
748 // If the alignment of the memory reference itself differs from the alignment
749 // of the base pointer, print the base alignment explicitly, next to the base
750 // pointer.
751 if (getBaseAlignment() != getAlignment())
752 OS << "(align=" << getBaseAlignment() << ")";
753
754 if (getOffset() != 0)
755 OS << "+" << getOffset();
756 OS << "]";
757
758 // Print the alignment of the reference.
759 if (getBaseAlignment() != getAlignment() || getBaseAlignment() != getSize())
760 OS << "(align=" << getAlignment() << ")";
761
762 // Print TBAA info.
763 if (const MDNode *TBAAInfo = getAAInfo().TBAA) {
764 OS << "(tbaa=";
765 if (TBAAInfo->getNumOperands() > 0)
766 TBAAInfo->getOperand(0)->printAsOperand(OS, MST);
767 else
768 OS << "<unknown>";
769 OS << ")";
770 }
771
772 // Print AA scope info.
773 if (const MDNode *ScopeInfo = getAAInfo().Scope) {
774 OS << "(alias.scope=";
775 if (ScopeInfo->getNumOperands() > 0)
776 for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) {
777 ScopeInfo->getOperand(i)->printAsOperand(OS, MST);
778 if (i != ie - 1)
779 OS << ",";
780 }
781 else
782 OS << "<unknown>";
783 OS << ")";
784 }
785
786 // Print AA noalias scope info.
787 if (const MDNode *NoAliasInfo = getAAInfo().NoAlias) {
788 OS << "(noalias=";
789 if (NoAliasInfo->getNumOperands() > 0)
790 for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) {
791 NoAliasInfo->getOperand(i)->printAsOperand(OS, MST);
792 if (i != ie - 1)
793 OS << ",";
794 }
795 else
796 OS << "<unknown>";
797 OS << ")";
798 }
799
800 if (const MDNode *Ranges = getRanges()) {
801 unsigned NumRanges = Ranges->getNumOperands();
802 if (NumRanges != 0) {
803 OS << "(ranges=";
804
805 for (unsigned I = 0; I != NumRanges; ++I) {
806 Ranges->getOperand(I)->printAsOperand(OS, MST);
807 if (I != NumRanges - 1)
808 OS << ',';
809 }
810
811 OS << ')';
812 }
813 }
814
815 if (isNonTemporal())
816 OS << "(nontemporal)";
817 if (isDereferenceable())
818 OS << "(dereferenceable)";
819 if (isInvariant())
820 OS << "(invariant)";
821 if (getFlags() & MOTargetFlag1)
822 OS << "(flag1)";
823 if (getFlags() & MOTargetFlag2)
824 OS << "(flag2)";
825 if (getFlags() & MOTargetFlag3)
826 OS << "(flag3)";
827}