1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/IR/UserTest.cpp - User 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/Instructions.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/User.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(UserTest,ValueOpIteration)22*9880d681SAndroid Build Coastguard Worker TEST(UserTest, ValueOpIteration) {
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 "entry:\n"
27*9880d681SAndroid Build Coastguard Worker " switch i32 undef, label %s0\n"
28*9880d681SAndroid Build Coastguard Worker " [ i32 1, label %s1\n"
29*9880d681SAndroid Build Coastguard Worker " i32 2, label %s2\n"
30*9880d681SAndroid Build Coastguard Worker " i32 3, label %s3\n"
31*9880d681SAndroid Build Coastguard Worker " i32 4, label %s4\n"
32*9880d681SAndroid Build Coastguard Worker " i32 5, label %s5\n"
33*9880d681SAndroid Build Coastguard Worker " i32 6, label %s6\n"
34*9880d681SAndroid Build Coastguard Worker " i32 7, label %s7\n"
35*9880d681SAndroid Build Coastguard Worker " i32 8, label %s8\n"
36*9880d681SAndroid Build Coastguard Worker " i32 9, label %s9 ]\n"
37*9880d681SAndroid Build Coastguard Worker "\n"
38*9880d681SAndroid Build Coastguard Worker "s0:\n"
39*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
40*9880d681SAndroid Build Coastguard Worker "s1:\n"
41*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
42*9880d681SAndroid Build Coastguard Worker "s2:\n"
43*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
44*9880d681SAndroid Build Coastguard Worker "s3:\n"
45*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
46*9880d681SAndroid Build Coastguard Worker "s4:\n"
47*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
48*9880d681SAndroid Build Coastguard Worker "s5:\n"
49*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
50*9880d681SAndroid Build Coastguard Worker "s6:\n"
51*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
52*9880d681SAndroid Build Coastguard Worker "s7:\n"
53*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
54*9880d681SAndroid Build Coastguard Worker "s8:\n"
55*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
56*9880d681SAndroid Build Coastguard Worker "s9:\n"
57*9880d681SAndroid Build Coastguard Worker " br label %exit\n"
58*9880d681SAndroid Build Coastguard Worker "\n"
59*9880d681SAndroid Build Coastguard Worker "exit:\n"
60*9880d681SAndroid Build Coastguard Worker " %phi = phi i32 [ 0, %s0 ], [ 1, %s1 ],\n"
61*9880d681SAndroid Build Coastguard Worker " [ 2, %s2 ], [ 3, %s3 ],\n"
62*9880d681SAndroid Build Coastguard Worker " [ 4, %s4 ], [ 5, %s5 ],\n"
63*9880d681SAndroid Build Coastguard Worker " [ 6, %s6 ], [ 7, %s7 ],\n"
64*9880d681SAndroid Build Coastguard Worker " [ 8, %s8 ], [ 9, %s9 ]\n"
65*9880d681SAndroid Build Coastguard Worker " ret void\n"
66*9880d681SAndroid Build Coastguard Worker "}\n";
67*9880d681SAndroid Build Coastguard Worker SMDiagnostic Err;
68*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M = parseAssemblyString(ModuleString, Err, C);
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker Function *F = M->getFunction("f");
71*9880d681SAndroid Build Coastguard Worker BasicBlock &ExitBB = F->back();
72*9880d681SAndroid Build Coastguard Worker PHINode &P = cast<PHINode>(ExitBB.front());
73*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(P.value_op_begin() == P.value_op_begin());
74*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(P.value_op_begin() == P.value_op_end());
75*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(P.value_op_begin() != P.value_op_end());
76*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(P.value_op_end() != P.value_op_end());
77*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(P.value_op_begin() < P.value_op_end());
78*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(P.value_op_begin() < P.value_op_begin());
79*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(P.value_op_end() > P.value_op_begin());
80*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(P.value_op_begin() > P.value_op_begin());
81*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(P.value_op_begin() <= P.value_op_begin());
82*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(P.value_op_end() <= P.value_op_begin());
83*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(P.value_op_begin() >= P.value_op_begin());
84*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(P.value_op_begin() >= P.value_op_end());
85*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(10, std::distance(P.value_op_begin(), P.value_op_end()));
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker User::value_op_iterator I = P.value_op_begin();
88*9880d681SAndroid Build Coastguard Worker I += 3;
89*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(std::next(P.value_op_begin(), 3), I);
90*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(P.getOperand(3), *I);
91*9880d681SAndroid Build Coastguard Worker I++;
92*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(P.getOperand(6), I[2]);
93*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(P.value_op_end(), (I - 2) + 8);
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker
TEST(UserTest,PersonalityUser)96*9880d681SAndroid Build Coastguard Worker TEST(UserTest, PersonalityUser) {
97*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
98*9880d681SAndroid Build Coastguard Worker Module M("", Context);
99*9880d681SAndroid Build Coastguard Worker FunctionType *RetVoidTy = FunctionType::get(Type::getVoidTy(Context), false);
100*9880d681SAndroid Build Coastguard Worker Function *PersonalityF = Function::Create(
101*9880d681SAndroid Build Coastguard Worker RetVoidTy, GlobalValue::ExternalLinkage, "PersonalityFn", &M);
102*9880d681SAndroid Build Coastguard Worker Function *TestF =
103*9880d681SAndroid Build Coastguard Worker Function::Create(RetVoidTy, GlobalValue::ExternalLinkage, "TestFn", &M);
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker // Set up the personality function
106*9880d681SAndroid Build Coastguard Worker TestF->setPersonalityFn(PersonalityF);
107*9880d681SAndroid Build Coastguard Worker auto PersonalityUsers = PersonalityF->user_begin();
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker // One user and that user is the Test function
110*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(*PersonalityUsers, TestF);
111*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(++PersonalityUsers, PersonalityF->user_end());
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker // Reset the personality function
114*9880d681SAndroid Build Coastguard Worker TestF->setPersonalityFn(nullptr);
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker // No users should remain
117*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(TestF->user_empty());
118*9880d681SAndroid Build Coastguard Worker }
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
121