blob: 2a2f8f29c48d7b5e02693c2e61f1091282c43380 [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;
Geoff Berry60c43102017-12-12 17:53:59 +000093 assert(!IsDeadOrKill && "Changing def/use with dead/kill set not supported");
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +000094 // MRI may keep uses and defs in different list positions.
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +000095 if (MachineFunction *MF = getMFIfAvailable(*this)) {
96 MachineRegisterInfo &MRI = MF->getRegInfo();
97 MRI.removeRegOperandFromUseList(this);
98 IsDef = Val;
99 MRI.addRegOperandToUseList(this);
100 return;
101 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000102 IsDef = Val;
103}
104
Geoff Berry60c43102017-12-12 17:53:59 +0000105bool MachineOperand::isRenamable() const {
106 assert(isReg() && "Wrong MachineOperand accessor");
107 assert(TargetRegisterInfo::isPhysicalRegister(getReg()) &&
108 "isRenamable should only be checked on physical registers");
109 return IsRenamable;
110}
111
112void MachineOperand::setIsRenamable(bool Val) {
113 assert(isReg() && "Wrong MachineOperand accessor");
114 assert(TargetRegisterInfo::isPhysicalRegister(getReg()) &&
115 "setIsRenamable should only be called on physical registers");
116 if (const MachineInstr *MI = getParent())
117 if ((isDef() && MI->hasExtraDefRegAllocReq()) ||
118 (isUse() && MI->hasExtraSrcRegAllocReq()))
119 assert(!Val && "isRenamable should be false for "
120 "hasExtraDefRegAllocReq/hasExtraSrcRegAllocReq opcodes");
121 IsRenamable = Val;
122}
123
124void MachineOperand::setIsRenamableIfNoExtraRegAllocReq() {
125 if (const MachineInstr *MI = getParent())
126 if ((isDef() && MI->hasExtraDefRegAllocReq()) ||
127 (isUse() && MI->hasExtraSrcRegAllocReq()))
128 return;
129
130 setIsRenamable(true);
131}
132
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000133// If this operand is currently a register operand, and if this is in a
134// function, deregister the operand from the register's use/def list.
135void MachineOperand::removeRegFromUses() {
136 if (!isReg() || !isOnRegUseList())
137 return;
138
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000139 if (MachineFunction *MF = getMFIfAvailable(*this))
140 MF->getRegInfo().removeRegOperandFromUseList(this);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000141}
142
143/// ChangeToImmediate - Replace this operand with a new immediate operand of
144/// the specified value. If an operand is known to be an immediate already,
145/// the setImm method should be used.
146void MachineOperand::ChangeToImmediate(int64_t ImmVal) {
147 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
148
149 removeRegFromUses();
150
151 OpKind = MO_Immediate;
152 Contents.ImmVal = ImmVal;
153}
154
155void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) {
156 assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
157
158 removeRegFromUses();
159
160 OpKind = MO_FPImmediate;
161 Contents.CFP = FPImm;
162}
163
164void MachineOperand::ChangeToES(const char *SymName,
165 unsigned char TargetFlags) {
166 assert((!isReg() || !isTied()) &&
167 "Cannot change a tied operand into an external symbol");
168
169 removeRegFromUses();
170
171 OpKind = MO_ExternalSymbol;
172 Contents.OffsetedInfo.Val.SymbolName = SymName;
173 setOffset(0); // Offset is always 0.
174 setTargetFlags(TargetFlags);
175}
176
177void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) {
178 assert((!isReg() || !isTied()) &&
179 "Cannot change a tied operand into an MCSymbol");
180
181 removeRegFromUses();
182
183 OpKind = MO_MCSymbol;
184 Contents.Sym = Sym;
185}
186
187void MachineOperand::ChangeToFrameIndex(int Idx) {
188 assert((!isReg() || !isTied()) &&
189 "Cannot change a tied operand into a FrameIndex");
190
191 removeRegFromUses();
192
193 OpKind = MO_FrameIndex;
194 setIndex(Idx);
195}
196
197void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset,
198 unsigned char TargetFlags) {
199 assert((!isReg() || !isTied()) &&
200 "Cannot change a tied operand into a FrameIndex");
201
202 removeRegFromUses();
203
204 OpKind = MO_TargetIndex;
205 setIndex(Idx);
206 setOffset(Offset);
207 setTargetFlags(TargetFlags);
208}
209
210/// ChangeToRegister - Replace this operand with a new register operand of
211/// the specified value. If an operand is known to be an register already,
212/// the setReg method should be used.
213void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp,
214 bool isKill, bool isDead, bool isUndef,
215 bool isDebug) {
216 MachineRegisterInfo *RegInfo = nullptr;
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000217 if (MachineFunction *MF = getMFIfAvailable(*this))
218 RegInfo = &MF->getRegInfo();
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000219 // If this operand is already a register operand, remove it from the
220 // register's use/def lists.
221 bool WasReg = isReg();
222 if (RegInfo && WasReg)
223 RegInfo->removeRegOperandFromUseList(this);
224
225 // Change this to a register and set the reg#.
Geoff Berry60c43102017-12-12 17:53:59 +0000226 assert(!(isDead && !isDef) && "Dead flag on non-def");
227 assert(!(isKill && isDef) && "Kill flag on def");
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000228 OpKind = MO_Register;
229 SmallContents.RegNo = Reg;
230 SubReg_TargetFlags = 0;
231 IsDef = isDef;
232 IsImp = isImp;
Geoff Berry60c43102017-12-12 17:53:59 +0000233 IsDeadOrKill = isKill | isDead;
234 IsRenamable = false;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000235 IsUndef = isUndef;
236 IsInternalRead = false;
237 IsEarlyClobber = false;
238 IsDebug = isDebug;
239 // Ensure isOnRegUseList() returns false.
240 Contents.Reg.Prev = nullptr;
241 // Preserve the tie when the operand was already a register.
242 if (!WasReg)
243 TiedTo = 0;
244
245 // If this operand is embedded in a function, add the operand to the
246 // register's use/def list.
247 if (RegInfo)
248 RegInfo->addRegOperandToUseList(this);
249}
250
251/// isIdenticalTo - Return true if this operand is identical to the specified
252/// operand. Note that this should stay in sync with the hash_value overload
253/// below.
254bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
255 if (getType() != Other.getType() ||
256 getTargetFlags() != Other.getTargetFlags())
257 return false;
258
259 switch (getType()) {
260 case MachineOperand::MO_Register:
261 return getReg() == Other.getReg() && isDef() == Other.isDef() &&
262 getSubReg() == Other.getSubReg();
263 case MachineOperand::MO_Immediate:
264 return getImm() == Other.getImm();
265 case MachineOperand::MO_CImmediate:
266 return getCImm() == Other.getCImm();
267 case MachineOperand::MO_FPImmediate:
268 return getFPImm() == Other.getFPImm();
269 case MachineOperand::MO_MachineBasicBlock:
270 return getMBB() == Other.getMBB();
271 case MachineOperand::MO_FrameIndex:
272 return getIndex() == Other.getIndex();
273 case MachineOperand::MO_ConstantPoolIndex:
274 case MachineOperand::MO_TargetIndex:
275 return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
276 case MachineOperand::MO_JumpTableIndex:
277 return getIndex() == Other.getIndex();
278 case MachineOperand::MO_GlobalAddress:
279 return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();
280 case MachineOperand::MO_ExternalSymbol:
281 return strcmp(getSymbolName(), Other.getSymbolName()) == 0 &&
282 getOffset() == Other.getOffset();
283 case MachineOperand::MO_BlockAddress:
284 return getBlockAddress() == Other.getBlockAddress() &&
285 getOffset() == Other.getOffset();
286 case MachineOperand::MO_RegisterMask:
287 case MachineOperand::MO_RegisterLiveOut: {
288 // Shallow compare of the two RegMasks
289 const uint32_t *RegMask = getRegMask();
290 const uint32_t *OtherRegMask = Other.getRegMask();
291 if (RegMask == OtherRegMask)
292 return true;
293
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000294 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
295 // Calculate the size of the RegMask
296 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
297 unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000298
Francis Visoiu Mistrih95a05912017-12-06 11:55:42 +0000299 // Deep compare of the two RegMasks
300 return std::equal(RegMask, RegMask + RegMaskSize, OtherRegMask);
301 }
302 // We don't know the size of the RegMask, so we can't deep compare the two
303 // reg masks.
304 return false;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000305 }
306 case MachineOperand::MO_MCSymbol:
307 return getMCSymbol() == Other.getMCSymbol();
308 case MachineOperand::MO_CFIIndex:
309 return getCFIIndex() == Other.getCFIIndex();
310 case MachineOperand::MO_Metadata:
311 return getMetadata() == Other.getMetadata();
312 case MachineOperand::MO_IntrinsicID:
313 return getIntrinsicID() == Other.getIntrinsicID();
314 case MachineOperand::MO_Predicate:
315 return getPredicate() == Other.getPredicate();
316 }
317 llvm_unreachable("Invalid machine operand type");
318}
319
320// Note: this must stay exactly in sync with isIdenticalTo above.
321hash_code llvm::hash_value(const MachineOperand &MO) {
322 switch (MO.getType()) {
323 case MachineOperand::MO_Register:
324 // Register operands don't have target flags.
325 return hash_combine(MO.getType(), MO.getReg(), MO.getSubReg(), MO.isDef());
326 case MachineOperand::MO_Immediate:
327 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getImm());
328 case MachineOperand::MO_CImmediate:
329 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCImm());
330 case MachineOperand::MO_FPImmediate:
331 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getFPImm());
332 case MachineOperand::MO_MachineBasicBlock:
333 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMBB());
334 case MachineOperand::MO_FrameIndex:
335 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
336 case MachineOperand::MO_ConstantPoolIndex:
337 case MachineOperand::MO_TargetIndex:
338 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex(),
339 MO.getOffset());
340 case MachineOperand::MO_JumpTableIndex:
341 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIndex());
342 case MachineOperand::MO_ExternalSymbol:
343 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getOffset(),
344 MO.getSymbolName());
345 case MachineOperand::MO_GlobalAddress:
346 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getGlobal(),
347 MO.getOffset());
348 case MachineOperand::MO_BlockAddress:
349 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getBlockAddress(),
350 MO.getOffset());
351 case MachineOperand::MO_RegisterMask:
352 case MachineOperand::MO_RegisterLiveOut:
353 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getRegMask());
354 case MachineOperand::MO_Metadata:
355 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata());
356 case MachineOperand::MO_MCSymbol:
357 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol());
358 case MachineOperand::MO_CFIIndex:
359 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex());
360 case MachineOperand::MO_IntrinsicID:
361 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID());
362 case MachineOperand::MO_Predicate:
363 return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getPredicate());
364 }
365 llvm_unreachable("Invalid machine operand type");
366}
367
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000368// Try to crawl up to the machine function and get TRI and IntrinsicInfo from
369// it.
370static void tryToGetTargetInfo(const MachineOperand &MO,
371 const TargetRegisterInfo *&TRI,
372 const TargetIntrinsicInfo *&IntrinsicInfo) {
Francis Visoiu Mistrih567611e2017-12-07 14:32:15 +0000373 if (const MachineFunction *MF = getMFIfAvailable(MO)) {
374 TRI = MF->getSubtarget().getRegisterInfo();
375 IntrinsicInfo = MF->getTarget().getIntrinsicInfo();
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000376 }
377}
378
Francis Visoiu Mistrih26ae8a62017-12-13 10:30:45 +0000379static void printOffset(raw_ostream &OS, int64_t Offset) {
380 if (Offset == 0)
381 return;
382 if (Offset < 0) {
383 OS << " - " << -Offset;
384 return;
385 }
386 OS << " + " << Offset;
387}
388
Francis Visoiu Mistrih440f69c2017-12-08 22:53:21 +0000389void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index,
390 const TargetRegisterInfo *TRI) {
391 OS << "%subreg.";
392 if (TRI)
393 OS << TRI->getSubRegIndexName(Index);
394 else
395 OS << Index;
396}
397
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000398void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI,
399 const TargetIntrinsicInfo *IntrinsicInfo) const {
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000400 tryToGetTargetInfo(*this, TRI, IntrinsicInfo);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000401 ModuleSlotTracker DummyMST(nullptr);
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000402 print(OS, DummyMST, LLT{}, /*PrintDef=*/false,
403 /*ShouldPrintRegisterTies=*/true,
404 /*TiedOperandIdx=*/0, TRI, IntrinsicInfo);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000405}
406
407void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000408 LLT TypeToPrint, bool PrintDef,
409 bool ShouldPrintRegisterTies,
410 unsigned TiedOperandIdx,
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000411 const TargetRegisterInfo *TRI,
412 const TargetIntrinsicInfo *IntrinsicInfo) const {
413 switch (getType()) {
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000414 case MachineOperand::MO_Register: {
415 unsigned Reg = getReg();
416 if (isImplicit())
417 OS << (isDef() ? "implicit-def " : "implicit ");
418 else if (PrintDef && isDef())
419 // Print the 'def' flag only when the operand is defined after '='.
420 OS << "def ";
421 if (isInternalRead())
422 OS << "internal ";
423 if (isDead())
424 OS << "dead ";
425 if (isKill())
426 OS << "killed ";
427 if (isUndef())
428 OS << "undef ";
429 if (isEarlyClobber())
430 OS << "early-clobber ";
431 if (isDebug())
432 OS << "debug-use ";
Geoff Berry60c43102017-12-12 17:53:59 +0000433 if (TargetRegisterInfo::isPhysicalRegister(getReg()) && isRenamable())
434 OS << "renamable ";
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000435 OS << printReg(Reg, TRI);
436 // Print the sub register.
437 if (unsigned SubReg = getSubReg()) {
438 if (TRI)
439 OS << '.' << TRI->getSubRegIndexName(SubReg);
440 else
441 OS << ".subreg" << SubReg;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000442 }
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000443 // Print the register class / bank.
444 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
Francis Visoiu Mistrih567611e2017-12-07 14:32:15 +0000445 if (const MachineFunction *MF = getMFIfAvailable(*this)) {
446 const MachineRegisterInfo &MRI = MF->getRegInfo();
447 if (!PrintDef || MRI.def_empty(Reg)) {
448 OS << ':';
449 OS << printRegClassOrBank(Reg, MRI, TRI);
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000450 }
451 }
452 }
453 // Print ties.
454 if (ShouldPrintRegisterTies && isTied() && !isDef())
455 OS << "(tied-def " << TiedOperandIdx << ")";
456 // Print types.
457 if (TypeToPrint.isValid())
458 OS << '(' << TypeToPrint << ')';
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000459 break;
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000460 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000461 case MachineOperand::MO_Immediate:
462 OS << getImm();
463 break;
464 case MachineOperand::MO_CImmediate:
Francis Visoiu Mistrih6c4ca712017-12-08 11:40:06 +0000465 getCImm()->printAsOperand(OS, /*PrintType=*/true, MST);
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000466 break;
467 case MachineOperand::MO_FPImmediate:
468 if (getFPImm()->getType()->isFloatTy()) {
469 OS << getFPImm()->getValueAPF().convertToFloat();
470 } else if (getFPImm()->getType()->isHalfTy()) {
471 APFloat APF = getFPImm()->getValueAPF();
472 bool Unused;
473 APF.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &Unused);
474 OS << "half " << APF.convertToFloat();
475 } else if (getFPImm()->getType()->isFP128Ty()) {
476 APFloat APF = getFPImm()->getValueAPF();
477 SmallString<16> Str;
478 getFPImm()->getValueAPF().toString(Str);
479 OS << "quad " << Str;
480 } else if (getFPImm()->getType()->isX86_FP80Ty()) {
481 APFloat APF = getFPImm()->getValueAPF();
482 OS << "x86_fp80 0xK";
483 APInt API = APF.bitcastToAPInt();
484 OS << format_hex_no_prefix(API.getHiBits(16).getZExtValue(), 4,
485 /*Upper=*/true);
486 OS << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,
487 /*Upper=*/true);
488 } else {
489 OS << getFPImm()->getValueAPF().convertToDouble();
490 }
491 break;
492 case MachineOperand::MO_MachineBasicBlock:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000493 OS << printMBBReference(*getMBB());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000494 break;
495 case MachineOperand::MO_FrameIndex:
496 OS << "<fi#" << getIndex() << '>';
497 break;
498 case MachineOperand::MO_ConstantPoolIndex:
Francis Visoiu Mistrih26ae8a62017-12-13 10:30:45 +0000499 OS << "%const." << getIndex();
500 printOffset(OS, getOffset());
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000501 break;
502 case MachineOperand::MO_TargetIndex:
503 OS << "<ti#" << getIndex();
504 if (getOffset())
505 OS << "+" << getOffset();
506 OS << '>';
507 break;
508 case MachineOperand::MO_JumpTableIndex:
509 OS << "<jt#" << getIndex() << '>';
510 break;
511 case MachineOperand::MO_GlobalAddress:
512 OS << "<ga:";
513 getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST);
514 if (getOffset())
515 OS << "+" << getOffset();
516 OS << '>';
517 break;
518 case MachineOperand::MO_ExternalSymbol:
519 OS << "<es:" << getSymbolName();
520 if (getOffset())
521 OS << "+" << getOffset();
522 OS << '>';
523 break;
524 case MachineOperand::MO_BlockAddress:
525 OS << '<';
526 getBlockAddress()->printAsOperand(OS, /*PrintType=*/false, MST);
527 if (getOffset())
528 OS << "+" << getOffset();
529 OS << '>';
530 break;
531 case MachineOperand::MO_RegisterMask: {
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000532 OS << "<regmask";
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000533 if (TRI) {
534 unsigned NumRegsInMask = 0;
535 unsigned NumRegsEmitted = 0;
536 for (unsigned i = 0; i < TRI->getNumRegs(); ++i) {
537 unsigned MaskWord = i / 32;
538 unsigned MaskBit = i % 32;
539 if (getRegMask()[MaskWord] & (1 << MaskBit)) {
540 if (PrintRegMaskNumRegs < 0 ||
541 NumRegsEmitted <= static_cast<unsigned>(PrintRegMaskNumRegs)) {
542 OS << " " << printReg(i, TRI);
543 NumRegsEmitted++;
544 }
545 NumRegsInMask++;
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000546 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000547 }
Francis Visoiu Mistriha8a83d12017-12-07 10:40:31 +0000548 if (NumRegsEmitted != NumRegsInMask)
549 OS << " and " << (NumRegsInMask - NumRegsEmitted) << " more...";
550 } else {
551 OS << " ...";
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000552 }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000553 OS << ">";
554 break;
555 }
556 case MachineOperand::MO_RegisterLiveOut:
557 OS << "<regliveout>";
558 break;
559 case MachineOperand::MO_Metadata:
560 OS << '<';
561 getMetadata()->printAsOperand(OS, MST);
562 OS << '>';
563 break;
564 case MachineOperand::MO_MCSymbol:
565 OS << "<MCSym=" << *getMCSymbol() << '>';
566 break;
567 case MachineOperand::MO_CFIIndex:
568 OS << "<call frame instruction>";
569 break;
570 case MachineOperand::MO_IntrinsicID: {
571 Intrinsic::ID ID = getIntrinsicID();
572 if (ID < Intrinsic::num_intrinsics)
573 OS << "<intrinsic:@" << Intrinsic::getName(ID, None) << '>';
574 else if (IntrinsicInfo)
575 OS << "<intrinsic:@" << IntrinsicInfo->getName(ID) << '>';
576 else
577 OS << "<intrinsic:" << ID << '>';
578 break;
579 }
580 case MachineOperand::MO_Predicate: {
581 auto Pred = static_cast<CmpInst::Predicate>(getPredicate());
582 OS << '<' << (CmpInst::isIntPredicate(Pred) ? "intpred" : "floatpred")
583 << CmpInst::getPredicateName(Pred) << '>';
584 break;
585 }
586 }
587 if (unsigned TF = getTargetFlags())
588 OS << "[TF=" << TF << ']';
589}
590
591#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
592LLVM_DUMP_METHOD void MachineOperand::dump() const { dbgs() << *this << '\n'; }
593#endif
594
595//===----------------------------------------------------------------------===//
596// MachineMemOperand Implementation
597//===----------------------------------------------------------------------===//
598
599/// getAddrSpace - Return the LLVM IR address space number that this pointer
600/// points into.
Yaxun Liu49477042017-12-02 22:13:22 +0000601unsigned MachinePointerInfo::getAddrSpace() const { return AddrSpace; }
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000602
603/// isDereferenceable - Return true if V is always dereferenceable for
604/// Offset + Size byte.
605bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C,
606 const DataLayout &DL) const {
607 if (!V.is<const Value *>())
608 return false;
609
610 const Value *BasePtr = V.get<const Value *>();
611 if (BasePtr == nullptr)
612 return false;
613
614 return isDereferenceableAndAlignedPointer(
615 BasePtr, 1, APInt(DL.getPointerSizeInBits(), Offset + Size), DL);
616}
617
618/// getConstantPool - Return a MachinePointerInfo record that refers to the
619/// constant pool.
620MachinePointerInfo MachinePointerInfo::getConstantPool(MachineFunction &MF) {
621 return MachinePointerInfo(MF.getPSVManager().getConstantPool());
622}
623
624/// getFixedStack - Return a MachinePointerInfo record that refers to the
625/// the specified FrameIndex.
626MachinePointerInfo MachinePointerInfo::getFixedStack(MachineFunction &MF,
627 int FI, int64_t Offset) {
628 return MachinePointerInfo(MF.getPSVManager().getFixedStack(FI), Offset);
629}
630
631MachinePointerInfo MachinePointerInfo::getJumpTable(MachineFunction &MF) {
632 return MachinePointerInfo(MF.getPSVManager().getJumpTable());
633}
634
635MachinePointerInfo MachinePointerInfo::getGOT(MachineFunction &MF) {
636 return MachinePointerInfo(MF.getPSVManager().getGOT());
637}
638
639MachinePointerInfo MachinePointerInfo::getStack(MachineFunction &MF,
640 int64_t Offset, uint8_t ID) {
641 return MachinePointerInfo(MF.getPSVManager().getStack(), Offset, ID);
642}
643
Yaxun Liu49477042017-12-02 22:13:22 +0000644MachinePointerInfo MachinePointerInfo::getUnknownStack(MachineFunction &MF) {
645 return MachinePointerInfo(MF.getDataLayout().getAllocaAddrSpace());
646}
647
Francis Visoiu Mistrihaa739692017-11-28 17:58:43 +0000648MachineMemOperand::MachineMemOperand(MachinePointerInfo ptrinfo, Flags f,
649 uint64_t s, unsigned int a,
650 const AAMDNodes &AAInfo,
651 const MDNode *Ranges, SyncScope::ID SSID,
652 AtomicOrdering Ordering,
653 AtomicOrdering FailureOrdering)
654 : PtrInfo(ptrinfo), Size(s), FlagVals(f), BaseAlignLog2(Log2_32(a) + 1),
655 AAInfo(AAInfo), Ranges(Ranges) {
656 assert((PtrInfo.V.isNull() || PtrInfo.V.is<const PseudoSourceValue *>() ||
657 isa<PointerType>(PtrInfo.V.get<const Value *>()->getType())) &&
658 "invalid pointer value");
659 assert(getBaseAlignment() == a && "Alignment is not a power of 2!");
660 assert((isLoad() || isStore()) && "Not a load/store!");
661
662 AtomicInfo.SSID = static_cast<unsigned>(SSID);
663 assert(getSyncScopeID() == SSID && "Value truncated");
664 AtomicInfo.Ordering = static_cast<unsigned>(Ordering);
665 assert(getOrdering() == Ordering && "Value truncated");
666 AtomicInfo.FailureOrdering = static_cast<unsigned>(FailureOrdering);
667 assert(getFailureOrdering() == FailureOrdering && "Value truncated");
668}
669
670/// Profile - Gather unique data for the object.
671///
672void MachineMemOperand::Profile(FoldingSetNodeID &ID) const {
673 ID.AddInteger(getOffset());
674 ID.AddInteger(Size);
675 ID.AddPointer(getOpaqueValue());
676 ID.AddInteger(getFlags());
677 ID.AddInteger(getBaseAlignment());
678}
679
680void MachineMemOperand::refineAlignment(const MachineMemOperand *MMO) {
681 // The Value and Offset may differ due to CSE. But the flags and size
682 // should be the same.
683 assert(MMO->getFlags() == getFlags() && "Flags mismatch!");
684 assert(MMO->getSize() == getSize() && "Size mismatch!");
685
686 if (MMO->getBaseAlignment() >= getBaseAlignment()) {
687 // Update the alignment value.
688 BaseAlignLog2 = Log2_32(MMO->getBaseAlignment()) + 1;
689 // Also update the base and offset, because the new alignment may
690 // not be applicable with the old ones.
691 PtrInfo = MMO->PtrInfo;
692 }
693}
694
695/// getAlignment - Return the minimum known alignment in bytes of the
696/// actual memory reference.
697uint64_t MachineMemOperand::getAlignment() const {
698 return MinAlign(getBaseAlignment(), getOffset());
699}
700
701void MachineMemOperand::print(raw_ostream &OS) const {
702 ModuleSlotTracker DummyMST(nullptr);
703 print(OS, DummyMST);
704}
705void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
706 assert((isLoad() || isStore()) && "SV has to be a load, store or both.");
707
708 if (isVolatile())
709 OS << "Volatile ";
710
711 if (isLoad())
712 OS << "LD";
713 if (isStore())
714 OS << "ST";
715 OS << getSize();
716
717 // Print the address information.
718 OS << "[";
719 if (const Value *V = getValue())
720 V->printAsOperand(OS, /*PrintType=*/false, MST);
721 else if (const PseudoSourceValue *PSV = getPseudoValue())
722 PSV->printCustom(OS);
723 else
724 OS << "<unknown>";
725
726 unsigned AS = getAddrSpace();
727 if (AS != 0)
728 OS << "(addrspace=" << AS << ')';
729
730 // If the alignment of the memory reference itself differs from the alignment
731 // of the base pointer, print the base alignment explicitly, next to the base
732 // pointer.
733 if (getBaseAlignment() != getAlignment())
734 OS << "(align=" << getBaseAlignment() << ")";
735
736 if (getOffset() != 0)
737 OS << "+" << getOffset();
738 OS << "]";
739
740 // Print the alignment of the reference.
741 if (getBaseAlignment() != getAlignment() || getBaseAlignment() != getSize())
742 OS << "(align=" << getAlignment() << ")";
743
744 // Print TBAA info.
745 if (const MDNode *TBAAInfo = getAAInfo().TBAA) {
746 OS << "(tbaa=";
747 if (TBAAInfo->getNumOperands() > 0)
748 TBAAInfo->getOperand(0)->printAsOperand(OS, MST);
749 else
750 OS << "<unknown>";
751 OS << ")";
752 }
753
754 // Print AA scope info.
755 if (const MDNode *ScopeInfo = getAAInfo().Scope) {
756 OS << "(alias.scope=";
757 if (ScopeInfo->getNumOperands() > 0)
758 for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) {
759 ScopeInfo->getOperand(i)->printAsOperand(OS, MST);
760 if (i != ie - 1)
761 OS << ",";
762 }
763 else
764 OS << "<unknown>";
765 OS << ")";
766 }
767
768 // Print AA noalias scope info.
769 if (const MDNode *NoAliasInfo = getAAInfo().NoAlias) {
770 OS << "(noalias=";
771 if (NoAliasInfo->getNumOperands() > 0)
772 for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) {
773 NoAliasInfo->getOperand(i)->printAsOperand(OS, MST);
774 if (i != ie - 1)
775 OS << ",";
776 }
777 else
778 OS << "<unknown>";
779 OS << ")";
780 }
781
782 if (const MDNode *Ranges = getRanges()) {
783 unsigned NumRanges = Ranges->getNumOperands();
784 if (NumRanges != 0) {
785 OS << "(ranges=";
786
787 for (unsigned I = 0; I != NumRanges; ++I) {
788 Ranges->getOperand(I)->printAsOperand(OS, MST);
789 if (I != NumRanges - 1)
790 OS << ',';
791 }
792
793 OS << ')';
794 }
795 }
796
797 if (isNonTemporal())
798 OS << "(nontemporal)";
799 if (isDereferenceable())
800 OS << "(dereferenceable)";
801 if (isInvariant())
802 OS << "(invariant)";
803 if (getFlags() & MOTargetFlag1)
804 OS << "(flag1)";
805 if (getFlags() & MOTargetFlag2)
806 OS << "(flag2)";
807 if (getFlags() & MOTargetFlag3)
808 OS << "(flag3)";
809}