xref: /aosp_15_r20/external/llvm/unittests/Support/ArrayRecyclerTest.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===--- unittest/Support/ArrayRecyclerTest.cpp ---------------------------===//
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/Support/ArrayRecycler.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Allocator.h"
12*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
13*9880d681SAndroid Build Coastguard Worker #include <cstdlib>
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker namespace {
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker struct Object {
20*9880d681SAndroid Build Coastguard Worker   int Num;
21*9880d681SAndroid Build Coastguard Worker   Object *Other;
22*9880d681SAndroid Build Coastguard Worker };
23*9880d681SAndroid Build Coastguard Worker typedef ArrayRecycler<Object> ARO;
24*9880d681SAndroid Build Coastguard Worker 
TEST(ArrayRecyclerTest,Capacity)25*9880d681SAndroid Build Coastguard Worker TEST(ArrayRecyclerTest, Capacity) {
26*9880d681SAndroid Build Coastguard Worker   // Capacity size should never be 0.
27*9880d681SAndroid Build Coastguard Worker   ARO::Capacity Cap = ARO::Capacity::get(0);
28*9880d681SAndroid Build Coastguard Worker   EXPECT_LT(0u, Cap.getSize());
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker   size_t PrevSize = Cap.getSize();
31*9880d681SAndroid Build Coastguard Worker   for (unsigned N = 1; N != 100; ++N) {
32*9880d681SAndroid Build Coastguard Worker     Cap = ARO::Capacity::get(N);
33*9880d681SAndroid Build Coastguard Worker     EXPECT_LE(N, Cap.getSize());
34*9880d681SAndroid Build Coastguard Worker     if (PrevSize >= N)
35*9880d681SAndroid Build Coastguard Worker       EXPECT_EQ(PrevSize, Cap.getSize());
36*9880d681SAndroid Build Coastguard Worker     else
37*9880d681SAndroid Build Coastguard Worker       EXPECT_LT(PrevSize, Cap.getSize());
38*9880d681SAndroid Build Coastguard Worker     PrevSize = Cap.getSize();
39*9880d681SAndroid Build Coastguard Worker   }
40*9880d681SAndroid Build Coastguard Worker 
41*9880d681SAndroid Build Coastguard Worker   // Check that the buckets are monotonically increasing.
42*9880d681SAndroid Build Coastguard Worker   Cap = ARO::Capacity::get(0);
43*9880d681SAndroid Build Coastguard Worker   PrevSize = Cap.getSize();
44*9880d681SAndroid Build Coastguard Worker   for (unsigned N = 0; N != 20; ++N) {
45*9880d681SAndroid Build Coastguard Worker     Cap = Cap.getNext();
46*9880d681SAndroid Build Coastguard Worker     EXPECT_LT(PrevSize, Cap.getSize());
47*9880d681SAndroid Build Coastguard Worker     PrevSize = Cap.getSize();
48*9880d681SAndroid Build Coastguard Worker   }
49*9880d681SAndroid Build Coastguard Worker }
50*9880d681SAndroid Build Coastguard Worker 
TEST(ArrayRecyclerTest,Basics)51*9880d681SAndroid Build Coastguard Worker TEST(ArrayRecyclerTest, Basics) {
52*9880d681SAndroid Build Coastguard Worker   BumpPtrAllocator Allocator;
53*9880d681SAndroid Build Coastguard Worker   ArrayRecycler<Object> DUT;
54*9880d681SAndroid Build Coastguard Worker 
55*9880d681SAndroid Build Coastguard Worker   ARO::Capacity Cap = ARO::Capacity::get(8);
56*9880d681SAndroid Build Coastguard Worker   Object *A1 = DUT.allocate(Cap, Allocator);
57*9880d681SAndroid Build Coastguard Worker   A1[0].Num = 21;
58*9880d681SAndroid Build Coastguard Worker   A1[7].Num = 17;
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker   Object *A2 = DUT.allocate(Cap, Allocator);
61*9880d681SAndroid Build Coastguard Worker   A2[0].Num = 121;
62*9880d681SAndroid Build Coastguard Worker   A2[7].Num = 117;
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker   Object *A3 = DUT.allocate(Cap, Allocator);
65*9880d681SAndroid Build Coastguard Worker   A3[0].Num = 221;
66*9880d681SAndroid Build Coastguard Worker   A3[7].Num = 217;
67*9880d681SAndroid Build Coastguard Worker 
68*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(21, A1[0].Num);
69*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(17, A1[7].Num);
70*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(121, A2[0].Num);
71*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(117, A2[7].Num);
72*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(221, A3[0].Num);
73*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(217, A3[7].Num);
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker   DUT.deallocate(Cap, A2);
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker   // Check that deallocation didn't clobber anything.
78*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(21, A1[0].Num);
79*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(17, A1[7].Num);
80*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(221, A3[0].Num);
81*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(217, A3[7].Num);
82*9880d681SAndroid Build Coastguard Worker 
83*9880d681SAndroid Build Coastguard Worker   // Verify recycling.
84*9880d681SAndroid Build Coastguard Worker   Object *A2x = DUT.allocate(Cap, Allocator);
85*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(A2, A2x);
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker   DUT.deallocate(Cap, A2x);
88*9880d681SAndroid Build Coastguard Worker   DUT.deallocate(Cap, A1);
89*9880d681SAndroid Build Coastguard Worker   DUT.deallocate(Cap, A3);
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker   // Objects are not required to be recycled in reverse deallocation order, but
92*9880d681SAndroid Build Coastguard Worker   // that is what the current implementation does.
93*9880d681SAndroid Build Coastguard Worker   Object *A3x = DUT.allocate(Cap, Allocator);
94*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(A3, A3x);
95*9880d681SAndroid Build Coastguard Worker   Object *A1x = DUT.allocate(Cap, Allocator);
96*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(A1, A1x);
97*9880d681SAndroid Build Coastguard Worker   Object *A2y = DUT.allocate(Cap, Allocator);
98*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(A2, A2y);
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker   // Back to allocation from the BumpPtrAllocator.
101*9880d681SAndroid Build Coastguard Worker   Object *A4 = DUT.allocate(Cap, Allocator);
102*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(A1, A4);
103*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(A2, A4);
104*9880d681SAndroid Build Coastguard Worker   EXPECT_NE(A3, A4);
105*9880d681SAndroid Build Coastguard Worker 
106*9880d681SAndroid Build Coastguard Worker   DUT.clear(Allocator);
107*9880d681SAndroid Build Coastguard Worker }
108*9880d681SAndroid Build Coastguard Worker 
109*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
110