annotate unittests/CodeGen/MachineOperandTest.cpp @ 137:dc788094b8e4

force SROA and TailRecursionElimination on non optimize mode for code segment
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 06 Mar 2018 08:58:23 +0900
parents 3a76565eade5
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
1 //===- MachineOperandTest.cpp ---------------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
2 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
4 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
7 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
9
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
10 #include "llvm/CodeGen/MachineOperand.h"
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
11 #include "llvm/ADT/ilist_node.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
12 #include "llvm/IR/Constants.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
13 #include "llvm/IR/InstrTypes.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
14 #include "llvm/IR/LLVMContext.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
15 #include "llvm/IR/Module.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
16 #include "llvm/IR/ModuleSlotTracker.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
17 #include "llvm/MC/MCContext.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
18 #include "llvm/MC/MCAsmInfo.h"
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
19 #include "llvm/Support/raw_ostream.h"
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
20 #include "gtest/gtest.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
21
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
22 using namespace llvm;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
23
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
24 namespace {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
25
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
26 TEST(MachineOperandTest, ChangeToTargetIndexTest) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
27 // Creating a MachineOperand to change it to TargetIndex
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
28 MachineOperand MO = MachineOperand::CreateImm(50);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
29
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
30 // Checking some precondition on the newly created
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
31 // MachineOperand.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
32 ASSERT_TRUE(MO.isImm());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
33 ASSERT_TRUE(MO.getImm() == 50);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
34 ASSERT_FALSE(MO.isTargetIndex());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
35
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
36 // Changing to TargetIndex with some arbitrary values
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
37 // for index, offset and flags.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
38 MO.ChangeToTargetIndex(74, 57, 12);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
39
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
40 // Checking that the mutation to TargetIndex happened
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
41 // correctly.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
42 ASSERT_TRUE(MO.isTargetIndex());
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
43 ASSERT_TRUE(MO.getIndex() == 74);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
44 ASSERT_TRUE(MO.getOffset() == 57);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
45 ASSERT_TRUE(MO.getTargetFlags() == 12);
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
46 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
47
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
48 TEST(MachineOperandTest, PrintRegisterMask) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
49 uint32_t Dummy;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
50 MachineOperand MO = MachineOperand::CreateRegMask(&Dummy);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
51
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
52 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
53 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
54 ASSERT_TRUE(MO.isRegMask());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
55 ASSERT_TRUE(MO.getRegMask() == &Dummy);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
56
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
57 // Print a MachineOperand containing a RegMask. Here we check that without a
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
58 // TRI and IntrinsicInfo we still print a less detailed regmask.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
59 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
60 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
61 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
62 ASSERT_TRUE(OS.str() == "<regmask ...>");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
63 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
64
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
65 TEST(MachineOperandTest, PrintSubReg) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
66 // Create a MachineOperand with RegNum=1 and SubReg=5.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
67 MachineOperand MO = MachineOperand::CreateReg(
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
68 /*Reg=*/1, /*isDef=*/false, /*isImp=*/false, /*isKill=*/false,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
69 /*isDead=*/false, /*isUndef=*/false, /*isEarlyClobber=*/false,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
70 /*SubReg=*/5, /*isDebug=*/false, /*isInternalRead=*/false);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
71
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
72 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
73 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
74 ASSERT_TRUE(MO.isReg());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
75 ASSERT_TRUE(MO.getReg() == 1);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
76 ASSERT_TRUE(MO.getSubReg() == 5);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
77
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
78 // Print a MachineOperand containing a SubReg. Here we check that without a
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
79 // TRI and IntrinsicInfo we can still print the subreg index.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
80 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
81 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
82 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
83 ASSERT_TRUE(OS.str() == "$physreg1.subreg5");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
84 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
85
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
86 TEST(MachineOperandTest, PrintCImm) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
87 LLVMContext Context;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
88 APInt Int(128, UINT64_MAX);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
89 ++Int;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
90 ConstantInt *CImm = ConstantInt::get(Context, Int);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
91 // Create a MachineOperand with an Imm=(UINT64_MAX + 1)
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
92 MachineOperand MO = MachineOperand::CreateCImm(CImm);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
93
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
94 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
95 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
96 ASSERT_TRUE(MO.isCImm());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
97 ASSERT_TRUE(MO.getCImm() == CImm);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
98 ASSERT_TRUE(MO.getCImm()->getValue() == Int);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
99
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
100 // Print a MachineOperand containing a SubReg. Here we check that without a
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
101 // TRI and IntrinsicInfo we can still print the subreg index.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
102 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
103 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
104 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
105 ASSERT_TRUE(OS.str() == "i128 18446744073709551616");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
106 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
107
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
108 TEST(MachineOperandTest, PrintSubRegIndex) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
109 // Create a MachineOperand with an immediate and print it as a subreg index.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
110 MachineOperand MO = MachineOperand::CreateImm(3);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
111
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
112 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
113 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
114 ASSERT_TRUE(MO.isImm());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
115 ASSERT_TRUE(MO.getImm() == 3);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
116
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
117 // Print a MachineOperand containing a SubRegIdx. Here we check that without a
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
118 // TRI and IntrinsicInfo we can print the operand as a subreg index.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
119 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
120 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
121 MachineOperand::printSubRegIdx(OS, MO.getImm(), nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
122 ASSERT_TRUE(OS.str() == "%subreg.3");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
123 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
124
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
125 TEST(MachineOperandTest, PrintCPI) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
126 // Create a MachineOperand with a constant pool index and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
127 MachineOperand MO = MachineOperand::CreateCPI(0, 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
128
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
129 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
130 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
131 ASSERT_TRUE(MO.isCPI());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
132 ASSERT_TRUE(MO.getIndex() == 0);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
133 ASSERT_TRUE(MO.getOffset() == 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
135 // Print a MachineOperand containing a constant pool index and a positive
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
136 // offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
137 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
138 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
139 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
140 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
141 ASSERT_TRUE(OS.str() == "%const.0 + 8");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
142 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
143
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
144 str.clear();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
145
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
146 MO.setOffset(-12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
147
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
148 // Print a MachineOperand containing a constant pool index and a negative
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
149 // offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
150 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
151 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
152 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
153 ASSERT_TRUE(OS.str() == "%const.0 - 12");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
154 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
155 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
156
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
157 TEST(MachineOperandTest, PrintTargetIndexName) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
158 // Create a MachineOperand with a target index and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
159 MachineOperand MO = MachineOperand::CreateTargetIndex(0, 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
160
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
161 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
162 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
163 ASSERT_TRUE(MO.isTargetIndex());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
164 ASSERT_TRUE(MO.getIndex() == 0);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
165 ASSERT_TRUE(MO.getOffset() == 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
166
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
167 // Print a MachineOperand containing a target index and a positive offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
168 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
169 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
170 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
171 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
172 ASSERT_TRUE(OS.str() == "target-index(<unknown>) + 8");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
173 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
174
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
175 str.clear();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
176
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
177 MO.setOffset(-12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
178
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
179 // Print a MachineOperand containing a target index and a negative offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
180 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
181 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
182 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
183 ASSERT_TRUE(OS.str() == "target-index(<unknown>) - 12");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
184 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
185 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
186
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
187 TEST(MachineOperandTest, PrintJumpTableIndex) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
188 // Create a MachineOperand with a jump-table index and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
189 MachineOperand MO = MachineOperand::CreateJTI(3);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
190
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
191 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
192 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
193 ASSERT_TRUE(MO.isJTI());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
194 ASSERT_TRUE(MO.getIndex() == 3);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
195
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
196 // Print a MachineOperand containing a jump-table index.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
197 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
198 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
199 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
200 ASSERT_TRUE(OS.str() == "%jump-table.3");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
201 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
202
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
203 TEST(MachineOperandTest, PrintExternalSymbol) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
204 // Create a MachineOperand with an external symbol and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
205 MachineOperand MO = MachineOperand::CreateES("foo");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
206
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
207 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
208 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
209 ASSERT_TRUE(MO.isSymbol());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
210 ASSERT_TRUE(MO.getSymbolName() == StringRef("foo"));
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
211
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
212 // Print a MachineOperand containing an external symbol and no offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
213 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
214 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
215 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
216 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
217 ASSERT_TRUE(OS.str() == "&foo");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
218 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
219
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
220 str.clear();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
221 MO.setOffset(12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
222
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
223 // Print a MachineOperand containing an external symbol and a positive offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
224 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
225 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
226 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
227 ASSERT_TRUE(OS.str() == "&foo + 12");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
228 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
229
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
230 str.clear();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
231 MO.setOffset(-12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
232
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
233 // Print a MachineOperand containing an external symbol and a negative offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
234 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
235 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
236 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
237 ASSERT_TRUE(OS.str() == "&foo - 12");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
238 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
239 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
240
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
241 TEST(MachineOperandTest, PrintGlobalAddress) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
242 LLVMContext Ctx;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
243 Module M("MachineOperandGVTest", Ctx);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
244 M.getOrInsertGlobal("foo", Type::getInt32Ty(Ctx));
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
245
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
246 GlobalValue *GV = M.getNamedValue("foo");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
247
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
248 // Create a MachineOperand with a global address and a positive offset and
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
249 // print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
250 MachineOperand MO = MachineOperand::CreateGA(GV, 12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
251
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
252 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
253 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
254 ASSERT_TRUE(MO.isGlobal());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
255 ASSERT_TRUE(MO.getGlobal() == GV);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
256 ASSERT_TRUE(MO.getOffset() == 12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
257
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
258 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
259 // Print a MachineOperand containing a global address and a positive offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
260 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
261 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
262 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
263 ASSERT_TRUE(OS.str() == "@foo + 12");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
264 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
265
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
266 str.clear();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
267 MO.setOffset(-12);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
268
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
269 // Print a MachineOperand containing a global address and a negative offset.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
270 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
271 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
272 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
273 ASSERT_TRUE(OS.str() == "@foo - 12");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
274 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
275 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
276
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
277 TEST(MachineOperandTest, PrintRegisterLiveOut) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
278 // Create a MachineOperand with a register live out list and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
279 uint32_t Mask = 0;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
280 MachineOperand MO = MachineOperand::CreateRegLiveOut(&Mask);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
281
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
282 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
283 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
284 ASSERT_TRUE(MO.isRegLiveOut());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
285 ASSERT_TRUE(MO.getRegLiveOut() == &Mask);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
286
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
287 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
288 // Print a MachineOperand containing a register live out list without a TRI.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
289 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
290 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
291 ASSERT_TRUE(OS.str() == "liveout(<unknown>)");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
292 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
293
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
294 TEST(MachineOperandTest, PrintMetadata) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
295 LLVMContext Ctx;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
296 Module M("MachineOperandMDNodeTest", Ctx);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
297 NamedMDNode *MD = M.getOrInsertNamedMetadata("namedmd");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
298 ModuleSlotTracker MST(&M);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
299 Metadata *MDS = MDString::get(Ctx, "foo");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
300 MDNode *Node = MDNode::get(Ctx, MDS);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
301 MD->addOperand(Node);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
302
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
303 // Create a MachineOperand with a metadata and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
304 MachineOperand MO = MachineOperand::CreateMetadata(Node);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
305
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
306 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
307 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
308 ASSERT_TRUE(MO.isMetadata());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
309 ASSERT_TRUE(MO.getMetadata() == Node);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
310
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
311 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
312 // Print a MachineOperand containing a metadata node.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
313 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
314 MO.print(OS, MST, LLT{}, /*PrintDef=*/false, /*IsStandalone=*/false,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
315 /*ShouldPrintRegisterTies=*/false, 0, /*TRI=*/nullptr,
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
316 /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
317 ASSERT_TRUE(OS.str() == "!0");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
318 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
319
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
320 TEST(MachineOperandTest, PrintMCSymbol) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
321 MCAsmInfo MAI;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
322 MCContext Ctx(&MAI, /*MRI=*/nullptr, /*MOFI=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
323 MCSymbol *Sym = Ctx.getOrCreateSymbol("foo");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
324
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
325 // Create a MachineOperand with a metadata and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
326 MachineOperand MO = MachineOperand::CreateMCSymbol(Sym);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
327
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
328 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
329 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
330 ASSERT_TRUE(MO.isMCSymbol());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
331 ASSERT_TRUE(MO.getMCSymbol() == Sym);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
332
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
333 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
334 // Print a MachineOperand containing a metadata node.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
335 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
336 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
337 ASSERT_TRUE(OS.str() == "<mcsymbol foo>");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
338 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
339
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
340 TEST(MachineOperandTest, PrintCFI) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
341 // Create a MachineOperand with a CFI index but no function and print it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
342 MachineOperand MO = MachineOperand::CreateCFIIndex(8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
343
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
344 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
345 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
346 ASSERT_TRUE(MO.isCFIIndex());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
347 ASSERT_TRUE(MO.getCFIIndex() == 8);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
348
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
349 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
350 // Print a MachineOperand containing a CFI Index node but no machine function
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
351 // attached to it.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
352 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
353 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
354 ASSERT_TRUE(OS.str() == "<cfi directive>");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
355 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
356
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
357 TEST(MachineOperandTest, PrintIntrinsicID) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
358 // Create a MachineOperand with a generic intrinsic ID.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
359 MachineOperand MO = MachineOperand::CreateIntrinsicID(Intrinsic::bswap);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
360
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
361 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
362 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
363 ASSERT_TRUE(MO.isIntrinsicID());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
364 ASSERT_TRUE(MO.getIntrinsicID() == Intrinsic::bswap);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
365
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
366 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
367 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
368 // Print a MachineOperand containing a generic intrinsic ID.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
369 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
370 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
371 ASSERT_TRUE(OS.str() == "intrinsic(@llvm.bswap)");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
372 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
373
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
374 str.clear();
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
375 // Set a target-specific intrinsic.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
376 MO = MachineOperand::CreateIntrinsicID((Intrinsic::ID)-1);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
377 {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
378 // Print a MachineOperand containing a target-specific intrinsic ID but not
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
379 // IntrinsicInfo.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
380 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
381 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
382 ASSERT_TRUE(OS.str() == "intrinsic(4294967295)");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
383 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
384 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
385
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
386 TEST(MachineOperandTest, PrintPredicate) {
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
387 // Create a MachineOperand with a generic intrinsic ID.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
388 MachineOperand MO = MachineOperand::CreatePredicate(CmpInst::ICMP_EQ);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
389
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
390 // Checking some preconditions on the newly created
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
391 // MachineOperand.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
392 ASSERT_TRUE(MO.isPredicate());
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
393 ASSERT_TRUE(MO.getPredicate() == CmpInst::ICMP_EQ);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
394
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
395 std::string str;
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
396 // Print a MachineOperand containing a int predicate ICMP_EQ.
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
397 raw_string_ostream OS(str);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
398 MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
399 ASSERT_TRUE(OS.str() == "intpred(eq)");
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
400 }
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
401
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
402 } // end namespace