1 //===- MachineOperandTest.cpp ---------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/CodeGen/MachineOperand.h"
11 #include "llvm/ADT/ilist_node.h"
12 #include "llvm/IR/Constants.h"
13 #include "llvm/IR/InstrTypes.h"
14 #include "llvm/IR/LLVMContext.h"
15 #include "llvm/IR/Module.h"
16 #include "llvm/IR/ModuleSlotTracker.h"
17 #include "llvm/MC/MCContext.h"
18 #include "llvm/MC/MCAsmInfo.h"
19 #include "llvm/Support/raw_ostream.h"
20 #include "gtest/gtest.h"
26 TEST(MachineOperandTest
, ChangeToTargetIndexTest
) {
27 // Creating a MachineOperand to change it to TargetIndex
28 MachineOperand MO
= MachineOperand::CreateImm(50);
30 // Checking some precondition on the newly created
32 ASSERT_TRUE(MO
.isImm());
33 ASSERT_TRUE(MO
.getImm() == 50);
34 ASSERT_FALSE(MO
.isTargetIndex());
36 // Changing to TargetIndex with some arbitrary values
37 // for index, offset and flags.
38 MO
.ChangeToTargetIndex(74, 57, 12);
40 // Checking that the mutation to TargetIndex happened
42 ASSERT_TRUE(MO
.isTargetIndex());
43 ASSERT_TRUE(MO
.getIndex() == 74);
44 ASSERT_TRUE(MO
.getOffset() == 57);
45 ASSERT_TRUE(MO
.getTargetFlags() == 12);
48 TEST(MachineOperandTest
, PrintRegisterMask
) {
50 MachineOperand MO
= MachineOperand::CreateRegMask(&Dummy
);
52 // Checking some preconditions on the newly created
54 ASSERT_TRUE(MO
.isRegMask());
55 ASSERT_TRUE(MO
.getRegMask() == &Dummy
);
57 // Print a MachineOperand containing a RegMask. Here we check that without a
58 // TRI and IntrinsicInfo we still print a less detailed regmask.
60 raw_string_ostream
OS(str
);
61 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
62 ASSERT_TRUE(OS
.str() == "<regmask ...>");
65 TEST(MachineOperandTest
, PrintSubReg
) {
66 // Create a MachineOperand with RegNum=1 and SubReg=5.
67 MachineOperand MO
= MachineOperand::CreateReg(
68 /*Reg=*/1, /*isDef=*/false, /*isImp=*/false, /*isKill=*/false,
69 /*isDead=*/false, /*isUndef=*/false, /*isEarlyClobber=*/false,
70 /*SubReg=*/5, /*isDebug=*/false, /*isInternalRead=*/false);
72 // Checking some preconditions on the newly created
74 ASSERT_TRUE(MO
.isReg());
75 ASSERT_TRUE(MO
.getReg() == 1);
76 ASSERT_TRUE(MO
.getSubReg() == 5);
78 // Print a MachineOperand containing a SubReg. Here we check that without a
79 // TRI and IntrinsicInfo we can still print the subreg index.
81 raw_string_ostream
OS(str
);
82 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
83 ASSERT_TRUE(OS
.str() == "$physreg1.subreg5");
86 TEST(MachineOperandTest
, PrintCImm
) {
88 APInt
Int(128, UINT64_MAX
);
90 ConstantInt
*CImm
= ConstantInt::get(Context
, Int
);
91 // Create a MachineOperand with an Imm=(UINT64_MAX + 1)
92 MachineOperand MO
= MachineOperand::CreateCImm(CImm
);
94 // Checking some preconditions on the newly created
96 ASSERT_TRUE(MO
.isCImm());
97 ASSERT_TRUE(MO
.getCImm() == CImm
);
98 ASSERT_TRUE(MO
.getCImm()->getValue() == Int
);
100 // Print a MachineOperand containing a SubReg. Here we check that without a
101 // TRI and IntrinsicInfo we can still print the subreg index.
103 raw_string_ostream
OS(str
);
104 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
105 ASSERT_TRUE(OS
.str() == "i128 18446744073709551616");
108 TEST(MachineOperandTest
, PrintSubRegIndex
) {
109 // Create a MachineOperand with an immediate and print it as a subreg index.
110 MachineOperand MO
= MachineOperand::CreateImm(3);
112 // Checking some preconditions on the newly created
114 ASSERT_TRUE(MO
.isImm());
115 ASSERT_TRUE(MO
.getImm() == 3);
117 // Print a MachineOperand containing a SubRegIdx. Here we check that without a
118 // TRI and IntrinsicInfo we can print the operand as a subreg index.
120 raw_string_ostream
OS(str
);
121 MachineOperand::printSubRegIdx(OS
, MO
.getImm(), nullptr);
122 ASSERT_TRUE(OS
.str() == "%subreg.3");
125 TEST(MachineOperandTest
, PrintCPI
) {
126 // Create a MachineOperand with a constant pool index and print it.
127 MachineOperand MO
= MachineOperand::CreateCPI(0, 8);
129 // Checking some preconditions on the newly created
131 ASSERT_TRUE(MO
.isCPI());
132 ASSERT_TRUE(MO
.getIndex() == 0);
133 ASSERT_TRUE(MO
.getOffset() == 8);
135 // Print a MachineOperand containing a constant pool index and a positive
139 raw_string_ostream
OS(str
);
140 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
141 ASSERT_TRUE(OS
.str() == "%const.0 + 8");
148 // Print a MachineOperand containing a constant pool index and a negative
151 raw_string_ostream
OS(str
);
152 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
153 ASSERT_TRUE(OS
.str() == "%const.0 - 12");
157 TEST(MachineOperandTest
, PrintTargetIndexName
) {
158 // Create a MachineOperand with a target index and print it.
159 MachineOperand MO
= MachineOperand::CreateTargetIndex(0, 8);
161 // Checking some preconditions on the newly created
163 ASSERT_TRUE(MO
.isTargetIndex());
164 ASSERT_TRUE(MO
.getIndex() == 0);
165 ASSERT_TRUE(MO
.getOffset() == 8);
167 // Print a MachineOperand containing a target index and a positive offset.
170 raw_string_ostream
OS(str
);
171 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
172 ASSERT_TRUE(OS
.str() == "target-index(<unknown>) + 8");
179 // Print a MachineOperand containing a target index and a negative offset.
181 raw_string_ostream
OS(str
);
182 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
183 ASSERT_TRUE(OS
.str() == "target-index(<unknown>) - 12");
187 TEST(MachineOperandTest
, PrintJumpTableIndex
) {
188 // Create a MachineOperand with a jump-table index and print it.
189 MachineOperand MO
= MachineOperand::CreateJTI(3);
191 // Checking some preconditions on the newly created
193 ASSERT_TRUE(MO
.isJTI());
194 ASSERT_TRUE(MO
.getIndex() == 3);
196 // Print a MachineOperand containing a jump-table index.
198 raw_string_ostream
OS(str
);
199 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
200 ASSERT_TRUE(OS
.str() == "%jump-table.3");
203 TEST(MachineOperandTest
, PrintExternalSymbol
) {
204 // Create a MachineOperand with an external symbol and print it.
205 MachineOperand MO
= MachineOperand::CreateES("foo");
207 // Checking some preconditions on the newly created
209 ASSERT_TRUE(MO
.isSymbol());
210 ASSERT_TRUE(MO
.getSymbolName() == StringRef("foo"));
212 // Print a MachineOperand containing an external symbol and no offset.
215 raw_string_ostream
OS(str
);
216 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
217 ASSERT_TRUE(OS
.str() == "&foo");
223 // Print a MachineOperand containing an external symbol and a positive offset.
225 raw_string_ostream
OS(str
);
226 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
227 ASSERT_TRUE(OS
.str() == "&foo + 12");
233 // Print a MachineOperand containing an external symbol and a negative offset.
235 raw_string_ostream
OS(str
);
236 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
237 ASSERT_TRUE(OS
.str() == "&foo - 12");
241 TEST(MachineOperandTest
, PrintGlobalAddress
) {
243 Module
M("MachineOperandGVTest", Ctx
);
244 M
.getOrInsertGlobal("foo", Type::getInt32Ty(Ctx
));
246 GlobalValue
*GV
= M
.getNamedValue("foo");
248 // Create a MachineOperand with a global address and a positive offset and
250 MachineOperand MO
= MachineOperand::CreateGA(GV
, 12);
252 // Checking some preconditions on the newly created
254 ASSERT_TRUE(MO
.isGlobal());
255 ASSERT_TRUE(MO
.getGlobal() == GV
);
256 ASSERT_TRUE(MO
.getOffset() == 12);
259 // Print a MachineOperand containing a global address and a positive offset.
261 raw_string_ostream
OS(str
);
262 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
263 ASSERT_TRUE(OS
.str() == "@foo + 12");
269 // Print a MachineOperand containing a global address and a negative offset.
271 raw_string_ostream
OS(str
);
272 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
273 ASSERT_TRUE(OS
.str() == "@foo - 12");
277 TEST(MachineOperandTest
, PrintRegisterLiveOut
) {
278 // Create a MachineOperand with a register live out list and print it.
280 MachineOperand MO
= MachineOperand::CreateRegLiveOut(&Mask
);
282 // Checking some preconditions on the newly created
284 ASSERT_TRUE(MO
.isRegLiveOut());
285 ASSERT_TRUE(MO
.getRegLiveOut() == &Mask
);
288 // Print a MachineOperand containing a register live out list without a TRI.
289 raw_string_ostream
OS(str
);
290 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
291 ASSERT_TRUE(OS
.str() == "liveout(<unknown>)");
294 TEST(MachineOperandTest
, PrintMetadata
) {
296 Module
M("MachineOperandMDNodeTest", Ctx
);
297 NamedMDNode
*MD
= M
.getOrInsertNamedMetadata("namedmd");
298 ModuleSlotTracker
MST(&M
);
299 Metadata
*MDS
= MDString::get(Ctx
, "foo");
300 MDNode
*Node
= MDNode::get(Ctx
, MDS
);
301 MD
->addOperand(Node
);
303 // Create a MachineOperand with a metadata and print it.
304 MachineOperand MO
= MachineOperand::CreateMetadata(Node
);
306 // Checking some preconditions on the newly created
308 ASSERT_TRUE(MO
.isMetadata());
309 ASSERT_TRUE(MO
.getMetadata() == Node
);
312 // Print a MachineOperand containing a metadata node.
313 raw_string_ostream
OS(str
);
314 MO
.print(OS
, MST
, LLT
{}, /*PrintDef=*/false, /*IsStandalone=*/false,
315 /*ShouldPrintRegisterTies=*/false, 0, /*TRI=*/nullptr,
316 /*IntrinsicInfo=*/nullptr);
317 ASSERT_TRUE(OS
.str() == "!0");
320 TEST(MachineOperandTest
, PrintMCSymbol
) {
322 MCContext
Ctx(&MAI
, /*MRI=*/nullptr, /*MOFI=*/nullptr);
323 MCSymbol
*Sym
= Ctx
.getOrCreateSymbol("foo");
325 // Create a MachineOperand with a metadata and print it.
326 MachineOperand MO
= MachineOperand::CreateMCSymbol(Sym
);
328 // Checking some preconditions on the newly created
330 ASSERT_TRUE(MO
.isMCSymbol());
331 ASSERT_TRUE(MO
.getMCSymbol() == Sym
);
334 // Print a MachineOperand containing a metadata node.
335 raw_string_ostream
OS(str
);
336 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
337 ASSERT_TRUE(OS
.str() == "<mcsymbol foo>");
340 TEST(MachineOperandTest
, PrintCFI
) {
341 // Create a MachineOperand with a CFI index but no function and print it.
342 MachineOperand MO
= MachineOperand::CreateCFIIndex(8);
344 // Checking some preconditions on the newly created
346 ASSERT_TRUE(MO
.isCFIIndex());
347 ASSERT_TRUE(MO
.getCFIIndex() == 8);
350 // Print a MachineOperand containing a CFI Index node but no machine function
352 raw_string_ostream
OS(str
);
353 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
354 ASSERT_TRUE(OS
.str() == "<cfi directive>");
357 TEST(MachineOperandTest
, PrintIntrinsicID
) {
358 // Create a MachineOperand with a generic intrinsic ID.
359 MachineOperand MO
= MachineOperand::CreateIntrinsicID(Intrinsic::bswap
);
361 // Checking some preconditions on the newly created
363 ASSERT_TRUE(MO
.isIntrinsicID());
364 ASSERT_TRUE(MO
.getIntrinsicID() == Intrinsic::bswap
);
368 // Print a MachineOperand containing a generic intrinsic ID.
369 raw_string_ostream
OS(str
);
370 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
371 ASSERT_TRUE(OS
.str() == "intrinsic(@llvm.bswap)");
375 // Set a target-specific intrinsic.
376 MO
= MachineOperand::CreateIntrinsicID((Intrinsic::ID
)-1);
378 // Print a MachineOperand containing a target-specific intrinsic ID but not
380 raw_string_ostream
OS(str
);
381 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
382 ASSERT_TRUE(OS
.str() == "intrinsic(4294967295)");
386 TEST(MachineOperandTest
, PrintPredicate
) {
387 // Create a MachineOperand with a generic intrinsic ID.
388 MachineOperand MO
= MachineOperand::CreatePredicate(CmpInst::ICMP_EQ
);
390 // Checking some preconditions on the newly created
392 ASSERT_TRUE(MO
.isPredicate());
393 ASSERT_TRUE(MO
.getPredicate() == CmpInst::ICMP_EQ
);
396 // Print a MachineOperand containing a int predicate ICMP_EQ.
397 raw_string_ostream
OS(str
);
398 MO
.print(OS
, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
399 ASSERT_TRUE(OS
.str() == "intpred(eq)");