xref: /aosp_15_r20/external/llvm/unittests/IR/ValueTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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