1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/IR/ValueTest.cpp - Value unit tests ------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/AsmParser/Parser.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ModuleSlotTracker.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Value.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
17*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker namespace {
21*9880d681SAndroid Build Coastguard Worker
TEST(ValueTest,UsedInBasicBlock)22*9880d681SAndroid Build Coastguard Worker TEST(ValueTest, UsedInBasicBlock) {
23*9880d681SAndroid Build Coastguard Worker LLVMContext C;
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker const char *ModuleString = "define void @f(i32 %x, i32 %y) {\n"
26*9880d681SAndroid Build Coastguard Worker "bb0:\n"
27*9880d681SAndroid Build Coastguard Worker " %y1 = add i32 %y, 1\n"
28*9880d681SAndroid Build Coastguard Worker " %y2 = add i32 %y, 1\n"
29*9880d681SAndroid Build Coastguard Worker " %y3 = add i32 %y, 1\n"
30*9880d681SAndroid Build Coastguard Worker " %y4 = add i32 %y, 1\n"
31*9880d681SAndroid Build Coastguard Worker " %y5 = add i32 %y, 1\n"
32*9880d681SAndroid Build Coastguard Worker " %y6 = add i32 %y, 1\n"
33*9880d681SAndroid Build Coastguard Worker " %y7 = add i32 %y, 1\n"
34*9880d681SAndroid Build Coastguard Worker " %y8 = add i32 %x, 1\n"
35*9880d681SAndroid Build Coastguard Worker " ret void\n"
36*9880d681SAndroid Build Coastguard Worker "}\n";
37*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
38*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker Function *F = M->getFunction("f");
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(F->isUsedInBasicBlock(&F->front()));
43*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((++F->arg_begin())->isUsedInBasicBlock(&F->front()));
44*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(F->arg_begin()->isUsedInBasicBlock(&F->front()));
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker
TEST(GlobalTest,CreateAddressSpace)47*9880d681SAndroid Build Coastguard Worker TEST(GlobalTest, CreateAddressSpace) {
48*9880d681SAndroid Build Coastguard Worker LLVMContext Ctx;
49*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("TestModule", Ctx));
50*9880d681SAndroid Build Coastguard Worker Type *Int8Ty = Type::getInt8Ty(Ctx);
51*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(Ctx);
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker GlobalVariable *Dummy0
54*9880d681SAndroid Build Coastguard Worker = new GlobalVariable(*M,
55*9880d681SAndroid Build Coastguard Worker Int32Ty,
56*9880d681SAndroid Build Coastguard Worker true,
57*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage,
58*9880d681SAndroid Build Coastguard Worker Constant::getAllOnesValue(Int32Ty),
59*9880d681SAndroid Build Coastguard Worker "dummy",
60*9880d681SAndroid Build Coastguard Worker nullptr,
61*9880d681SAndroid Build Coastguard Worker GlobalVariable::NotThreadLocal,
62*9880d681SAndroid Build Coastguard Worker 1);
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Value::MaximumAlignment == 536870912U);
65*9880d681SAndroid Build Coastguard Worker Dummy0->setAlignment(536870912U);
66*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Dummy0->getAlignment(), 536870912U);
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker // Make sure the address space isn't dropped when returning this.
69*9880d681SAndroid Build Coastguard Worker Constant *Dummy1 = M->getOrInsertGlobal("dummy", Int32Ty);
70*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Dummy0, Dummy1);
71*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, Dummy1->getType()->getPointerAddressSpace());
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker // This one requires a bitcast, but the address space must also stay the same.
75*9880d681SAndroid Build Coastguard Worker GlobalVariable *DummyCast0
76*9880d681SAndroid Build Coastguard Worker = new GlobalVariable(*M,
77*9880d681SAndroid Build Coastguard Worker Int32Ty,
78*9880d681SAndroid Build Coastguard Worker true,
79*9880d681SAndroid Build Coastguard Worker GlobalValue::ExternalLinkage,
80*9880d681SAndroid Build Coastguard Worker Constant::getAllOnesValue(Int32Ty),
81*9880d681SAndroid Build Coastguard Worker "dummy_cast",
82*9880d681SAndroid Build Coastguard Worker nullptr,
83*9880d681SAndroid Build Coastguard Worker GlobalVariable::NotThreadLocal,
84*9880d681SAndroid Build Coastguard Worker 1);
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker // Make sure the address space isn't dropped when returning this.
87*9880d681SAndroid Build Coastguard Worker Constant *DummyCast1 = M->getOrInsertGlobal("dummy_cast", Int8Ty);
88*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1u, DummyCast1->getType()->getPointerAddressSpace());
89*9880d681SAndroid Build Coastguard Worker EXPECT_NE(DummyCast0, DummyCast1) << *DummyCast1;
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker #ifdef GTEST_HAS_DEATH_TEST
93*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
TEST(GlobalTest,AlignDeath)94*9880d681SAndroid Build Coastguard Worker TEST(GlobalTest, AlignDeath) {
95*9880d681SAndroid Build Coastguard Worker LLVMContext Ctx;
96*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M(new Module("TestModule", Ctx));
97*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(Ctx);
98*9880d681SAndroid Build Coastguard Worker GlobalVariable *Var =
99*9880d681SAndroid Build Coastguard Worker new GlobalVariable(*M, Int32Ty, true, GlobalValue::ExternalLinkage,
100*9880d681SAndroid Build Coastguard Worker Constant::getAllOnesValue(Int32Ty), "var", nullptr,
101*9880d681SAndroid Build Coastguard Worker GlobalVariable::NotThreadLocal, 1);
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker EXPECT_DEATH(Var->setAlignment(536870913U), "Alignment is not a power of 2");
104*9880d681SAndroid Build Coastguard Worker EXPECT_DEATH(Var->setAlignment(1073741824U),
105*9880d681SAndroid Build Coastguard Worker "Alignment is greater than MaximumAlignment");
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker #endif
108*9880d681SAndroid Build Coastguard Worker #endif
109*9880d681SAndroid Build Coastguard Worker
TEST(ValueTest,printSlots)110*9880d681SAndroid Build Coastguard Worker TEST(ValueTest, printSlots) {
111*9880d681SAndroid Build Coastguard Worker // Check that Value::print() and Value::printAsOperand() work with and
112*9880d681SAndroid Build Coastguard Worker // without a slot tracker.
113*9880d681SAndroid Build Coastguard Worker LLVMContext C;
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker const char *ModuleString = "define void @f(i32 %x, i32 %y) {\n"
116*9880d681SAndroid Build Coastguard Worker "entry:\n"
117*9880d681SAndroid Build Coastguard Worker " %0 = add i32 %y, 1\n"
118*9880d681SAndroid Build Coastguard Worker " %1 = add i32 %y, 1\n"
119*9880d681SAndroid Build Coastguard Worker " ret void\n"
120*9880d681SAndroid Build Coastguard Worker "}\n";
121*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
122*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker Function *F = M->getFunction("f");
125*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(F);
126*9880d681SAndroid Build Coastguard Worker ASSERT_FALSE(F->empty());
127*9880d681SAndroid Build Coastguard Worker BasicBlock &BB = F->getEntryBlock();
128*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(3u, BB.size());
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker Instruction *I0 = &*BB.begin();
131*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I0);
132*9880d681SAndroid Build Coastguard Worker Instruction *I1 = &*++BB.begin();
133*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I1);
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker ModuleSlotTracker MST(M.get());
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker #define CHECK_PRINT(INST, STR) \
138*9880d681SAndroid Build Coastguard Worker do { \
139*9880d681SAndroid Build Coastguard Worker { \
140*9880d681SAndroid Build Coastguard Worker std::string S; \
141*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(S); \
142*9880d681SAndroid Build Coastguard Worker INST->print(OS); \
143*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(STR, OS.str()); \
144*9880d681SAndroid Build Coastguard Worker } \
145*9880d681SAndroid Build Coastguard Worker { \
146*9880d681SAndroid Build Coastguard Worker std::string S; \
147*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(S); \
148*9880d681SAndroid Build Coastguard Worker INST->print(OS, MST); \
149*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(STR, OS.str()); \
150*9880d681SAndroid Build Coastguard Worker } \
151*9880d681SAndroid Build Coastguard Worker } while (false)
152*9880d681SAndroid Build Coastguard Worker CHECK_PRINT(I0, " %0 = add i32 %y, 1");
153*9880d681SAndroid Build Coastguard Worker CHECK_PRINT(I1, " %1 = add i32 %y, 1");
154*9880d681SAndroid Build Coastguard Worker #undef CHECK_PRINT
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker #define CHECK_PRINT_AS_OPERAND(INST, TYPE, STR) \
157*9880d681SAndroid Build Coastguard Worker do { \
158*9880d681SAndroid Build Coastguard Worker { \
159*9880d681SAndroid Build Coastguard Worker std::string S; \
160*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(S); \
161*9880d681SAndroid Build Coastguard Worker INST->printAsOperand(OS, TYPE); \
162*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(StringRef(STR), StringRef(OS.str())); \
163*9880d681SAndroid Build Coastguard Worker } \
164*9880d681SAndroid Build Coastguard Worker { \
165*9880d681SAndroid Build Coastguard Worker std::string S; \
166*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(S); \
167*9880d681SAndroid Build Coastguard Worker INST->printAsOperand(OS, TYPE, MST); \
168*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(StringRef(STR), StringRef(OS.str())); \
169*9880d681SAndroid Build Coastguard Worker } \
170*9880d681SAndroid Build Coastguard Worker } while (false)
171*9880d681SAndroid Build Coastguard Worker CHECK_PRINT_AS_OPERAND(I0, false, "%0");
172*9880d681SAndroid Build Coastguard Worker CHECK_PRINT_AS_OPERAND(I1, false, "%1");
173*9880d681SAndroid Build Coastguard Worker CHECK_PRINT_AS_OPERAND(I0, true, "i32 %0");
174*9880d681SAndroid Build Coastguard Worker CHECK_PRINT_AS_OPERAND(I1, true, "i32 %1");
175*9880d681SAndroid Build Coastguard Worker #undef CHECK_PRINT_AS_OPERAND
176*9880d681SAndroid Build Coastguard Worker }
177*9880d681SAndroid Build Coastguard Worker
TEST(ValueTest,getLocalSlots)178*9880d681SAndroid Build Coastguard Worker TEST(ValueTest, getLocalSlots) {
179*9880d681SAndroid Build Coastguard Worker // Verify that the getLocalSlot method returns the correct slot numbers.
180*9880d681SAndroid Build Coastguard Worker LLVMContext C;
181*9880d681SAndroid Build Coastguard Worker const char *ModuleString = "define void @f(i32 %x, i32 %y) {\n"
182*9880d681SAndroid Build Coastguard Worker "entry:\n"
183*9880d681SAndroid Build Coastguard Worker " %0 = add i32 %y, 1\n"
184*9880d681SAndroid Build Coastguard Worker " %1 = add i32 %y, 1\n"
185*9880d681SAndroid Build Coastguard Worker " br label %2\n"
186*9880d681SAndroid Build Coastguard Worker "\n"
187*9880d681SAndroid Build Coastguard Worker " ret void\n"
188*9880d681SAndroid Build Coastguard Worker "}\n";
189*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
190*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker Function *F = M->getFunction("f");
193*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(F);
194*9880d681SAndroid Build Coastguard Worker ASSERT_FALSE(F->empty());
195*9880d681SAndroid Build Coastguard Worker BasicBlock &EntryBB = F->getEntryBlock();
196*9880d681SAndroid Build Coastguard Worker ASSERT_EQ(3u, EntryBB.size());
197*9880d681SAndroid Build Coastguard Worker BasicBlock *BB2 = &*++F->begin();
198*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(BB2);
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker Instruction *I0 = &*EntryBB.begin();
201*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I0);
202*9880d681SAndroid Build Coastguard Worker Instruction *I1 = &*++EntryBB.begin();
203*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(I1);
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker ModuleSlotTracker MST(M.get());
206*9880d681SAndroid Build Coastguard Worker MST.incorporateFunction(*F);
207*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MST.getLocalSlot(I0), 0);
208*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MST.getLocalSlot(I1), 1);
209*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MST.getLocalSlot(&EntryBB), -1);
210*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(MST.getLocalSlot(BB2), 2);
211*9880d681SAndroid Build Coastguard Worker }
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST) && !defined(NDEBUG)
TEST(ValueTest,getLocalSlotDeath)214*9880d681SAndroid Build Coastguard Worker TEST(ValueTest, getLocalSlotDeath) {
215*9880d681SAndroid Build Coastguard Worker LLVMContext C;
216*9880d681SAndroid Build Coastguard Worker const char *ModuleString = "define void @f(i32 %x, i32 %y) {\n"
217*9880d681SAndroid Build Coastguard Worker "entry:\n"
218*9880d681SAndroid Build Coastguard Worker " %0 = add i32 %y, 1\n"
219*9880d681SAndroid Build Coastguard Worker " %1 = add i32 %y, 1\n"
220*9880d681SAndroid Build Coastguard Worker " br label %2\n"
221*9880d681SAndroid Build Coastguard Worker "\n"
222*9880d681SAndroid Build Coastguard Worker " ret void\n"
223*9880d681SAndroid Build Coastguard Worker "}\n";
224*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
225*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker Function *F = M->getFunction("f");
228*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(F);
229*9880d681SAndroid Build Coastguard Worker ASSERT_FALSE(F->empty());
230*9880d681SAndroid Build Coastguard Worker BasicBlock *BB2 = &*++F->begin();
231*9880d681SAndroid Build Coastguard Worker ASSERT_TRUE(BB2);
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker ModuleSlotTracker MST(M.get());
234*9880d681SAndroid Build Coastguard Worker EXPECT_DEATH(MST.getLocalSlot(BB2), "No function incorporated");
235*9880d681SAndroid Build Coastguard Worker }
236*9880d681SAndroid Build Coastguard Worker #endif
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
239