llvm-project/llvm/unittests/ADT/SetVectorTest.cpp
Sameer Sahasrabuddhe 98286a04ef [llvm][CycleInfo] Quick look-up for block in cycle.
Use a SetVector to store blocks in a cycle to ensure a quick loop-up when
querying whether the cycle contains a given block. This is along the same lines
as the SmallPtrSet in LoopBase, introduced by commit
be640b28c0cb81b77015baaef20ca2941fc61dea.

To make this work, we also enhance SetVector to support vector operations with
pointers and set operations with const pointers in the same container.

Reviewed By: foad

Differential Revision: https://reviews.llvm.org/D146136
2023-03-29 12:07:44 +05:30

89 lines
2.1 KiB
C++

//===- llvm/unittest/ADT/SetVector.cpp ------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// SetVector unit tests.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "gtest/gtest.h"
using namespace llvm;
TEST(SetVector, EraseTest) {
SetVector<int> S;
S.insert(0);
S.insert(1);
S.insert(2);
auto I = S.erase(std::next(S.begin()));
// Test that the returned iterator is the expected one-after-erase
// and the size/contents is the expected sequence {0, 2}.
EXPECT_EQ(std::next(S.begin()), I);
EXPECT_EQ(2u, S.size());
EXPECT_EQ(0, *S.begin());
EXPECT_EQ(2, *std::next(S.begin()));
}
TEST(SetVector, ContainsTest) {
SetVector<int> S;
S.insert(0);
S.insert(1);
S.insert(2);
EXPECT_TRUE(S.contains(0));
EXPECT_TRUE(S.contains(1));
EXPECT_TRUE(S.contains(2));
EXPECT_FALSE(S.contains(-1));
S.insert(2);
EXPECT_TRUE(S.contains(2));
S.remove(2);
EXPECT_FALSE(S.contains(2));
}
TEST(SetVector, ConstPtrKeyTest) {
SetVector<int *, SmallVector<int *, 8>, SmallPtrSet<const int *, 8>> S, T;
int i, j, k, m, n;
S.insert(&i);
S.insert(&j);
S.insert(&k);
EXPECT_TRUE(S.contains(&i));
EXPECT_TRUE(S.contains(&j));
EXPECT_TRUE(S.contains(&k));
EXPECT_TRUE(S.contains((const int *)&i));
EXPECT_TRUE(S.contains((const int *)&j));
EXPECT_TRUE(S.contains((const int *)&k));
EXPECT_TRUE(S.contains(S[0]));
EXPECT_TRUE(S.contains(S[1]));
EXPECT_TRUE(S.contains(S[2]));
S.remove(&k);
EXPECT_FALSE(S.contains(&k));
EXPECT_FALSE(S.contains((const int *)&k));
T.insert(&j);
T.insert(&m);
T.insert(&n);
EXPECT_TRUE(S.set_union(T));
EXPECT_TRUE(S.contains(&m));
EXPECT_TRUE(S.contains((const int *)&m));
S.set_subtract(T);
EXPECT_FALSE(S.contains(&j));
EXPECT_FALSE(S.contains((const int *)&j));
}