xref: /aosp_15_r20/external/llvm/unittests/IR/FunctionTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- FunctionTest.cpp - Function 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/IR/Function.h"
11*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
12*9880d681SAndroid Build Coastguard Worker using namespace llvm;
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker namespace {
15*9880d681SAndroid Build Coastguard Worker 
TEST(FunctionTest,hasLazyArguments)16*9880d681SAndroid Build Coastguard Worker TEST(FunctionTest, hasLazyArguments) {
17*9880d681SAndroid Build Coastguard Worker   LLVMContext C;
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker   Type *ArgTypes[] = {Type::getInt8Ty(C), Type::getInt32Ty(C)};
20*9880d681SAndroid Build Coastguard Worker   FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), ArgTypes, false);
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker   // Functions start out with lazy arguments.
23*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Function> F(
24*9880d681SAndroid Build Coastguard Worker       Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
25*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->hasLazyArguments());
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker   // Checking for empty or size shouldn't force arguments to be instantiated.
28*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F->arg_empty());
29*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->hasLazyArguments());
30*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, F->arg_size());
31*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F->hasLazyArguments());
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker   // The argument list should be populated at first access.
34*9880d681SAndroid Build Coastguard Worker   (void)F->arg_begin();
35*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F->hasLazyArguments());
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker 
TEST(FunctionTest,stealArgumentListFrom)38*9880d681SAndroid Build Coastguard Worker TEST(FunctionTest, stealArgumentListFrom) {
39*9880d681SAndroid Build Coastguard Worker   LLVMContext C;
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker   Type *ArgTypes[] = {Type::getInt8Ty(C), Type::getInt32Ty(C)};
42*9880d681SAndroid Build Coastguard Worker   FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), ArgTypes, false);
43*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Function> F1(
44*9880d681SAndroid Build Coastguard Worker       Function::Create(FTy, GlobalValue::ExternalLinkage, "F1"));
45*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Function> F2(
46*9880d681SAndroid Build Coastguard Worker       Function::Create(FTy, GlobalValue::ExternalLinkage, "F1"));
47*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F1->hasLazyArguments());
48*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F2->hasLazyArguments());
49*9880d681SAndroid Build Coastguard Worker 
50*9880d681SAndroid Build Coastguard Worker   // Steal arguments before they've been accessed.  Nothing should change; both
51*9880d681SAndroid Build Coastguard Worker   // functions should still have lazy arguments.
52*9880d681SAndroid Build Coastguard Worker   //
53*9880d681SAndroid Build Coastguard Worker   //   steal(empty); drop (empty)
54*9880d681SAndroid Build Coastguard Worker   F1->stealArgumentListFrom(*F2);
55*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F1->hasLazyArguments());
56*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F2->hasLazyArguments());
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   // Save arguments from F1 for later assertions.  F1 won't have lazy arguments
59*9880d681SAndroid Build Coastguard Worker   // anymore.
60*9880d681SAndroid Build Coastguard Worker   SmallVector<Argument *, 4> Args;
61*9880d681SAndroid Build Coastguard Worker   for (Argument &A : F1->args())
62*9880d681SAndroid Build Coastguard Worker     Args.push_back(&A);
63*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, Args.size());
64*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F1->hasLazyArguments());
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker   // Steal arguments from F1 to F2.  F1's arguments should be lazy again.
67*9880d681SAndroid Build Coastguard Worker   //
68*9880d681SAndroid Build Coastguard Worker   //   steal(real); drop (empty)
69*9880d681SAndroid Build Coastguard Worker   F2->stealArgumentListFrom(*F1);
70*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F1->hasLazyArguments());
71*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F2->hasLazyArguments());
72*9880d681SAndroid Build Coastguard Worker   unsigned I = 0;
73*9880d681SAndroid Build Coastguard Worker   for (Argument &A : F2->args()) {
74*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Args[I], &A);
75*9880d681SAndroid Build Coastguard Worker     I++;
76*9880d681SAndroid Build Coastguard Worker   }
77*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, I);
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker   // Check that arguments in F1 don't have pointer equality with the saved ones.
80*9880d681SAndroid Build Coastguard Worker   // This also instantiates F1's arguments.
81*9880d681SAndroid Build Coastguard Worker   I = 0;
82*9880d681SAndroid Build Coastguard Worker   for (Argument &A : F1->args()) {
83*9880d681SAndroid Build Coastguard Worker     EXPECT_NE(Args[I], &A);
84*9880d681SAndroid Build Coastguard Worker     I++;
85*9880d681SAndroid Build Coastguard Worker   }
86*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, I);
87*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F1->hasLazyArguments());
88*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F2->hasLazyArguments());
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker   // Steal back from F2.  F2's arguments should be lazy again.
91*9880d681SAndroid Build Coastguard Worker   //
92*9880d681SAndroid Build Coastguard Worker   //   steal(real); drop (real)
93*9880d681SAndroid Build Coastguard Worker   F1->stealArgumentListFrom(*F2);
94*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(F1->hasLazyArguments());
95*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F2->hasLazyArguments());
96*9880d681SAndroid Build Coastguard Worker   I = 0;
97*9880d681SAndroid Build Coastguard Worker   for (Argument &A : F1->args()) {
98*9880d681SAndroid Build Coastguard Worker     EXPECT_EQ(Args[I], &A);
99*9880d681SAndroid Build Coastguard Worker     I++;
100*9880d681SAndroid Build Coastguard Worker   }
101*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(2u, I);
102*9880d681SAndroid Build Coastguard Worker 
103*9880d681SAndroid Build Coastguard Worker   // Steal from F2 a second time.  Now both functions should have lazy
104*9880d681SAndroid Build Coastguard Worker   // arguments.
105*9880d681SAndroid Build Coastguard Worker   //
106*9880d681SAndroid Build Coastguard Worker   //   steal(empty); drop (real)
107*9880d681SAndroid Build Coastguard Worker   F1->stealArgumentListFrom(*F2);
108*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F1->hasLazyArguments());
109*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(F2->hasLazyArguments());
110*9880d681SAndroid Build Coastguard Worker }
111*9880d681SAndroid Build Coastguard Worker 
112*9880d681SAndroid Build Coastguard Worker } // end namespace
113