1d6a81614SMichael Ilseman //===- PostOrderIteratorTest.cpp - PostOrderIterator unit tests -----------===//
2d6a81614SMichael Ilseman //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d6a81614SMichael Ilseman //
7d6a81614SMichael Ilseman //===----------------------------------------------------------------------===//
8d6a81614SMichael Ilseman #include "llvm/ADT/PostOrderIterator.h"
9d6a81614SMichael Ilseman #include "llvm/IR/BasicBlock.h"
10d6a81614SMichael Ilseman #include "llvm/IR/CFG.h"
119a67b073SChandler Carruth #include "gtest/gtest.h"
12*d91f864cSFlorian Hahn #include "TestGraph.h"
13*d91f864cSFlorian Hahn
14d6a81614SMichael Ilseman using namespace llvm;
15d6a81614SMichael Ilseman
16d6a81614SMichael Ilseman namespace {
17d6a81614SMichael Ilseman
18d6a81614SMichael Ilseman // Whether we're able to compile
TEST(PostOrderIteratorTest,Compiles)19d6a81614SMichael Ilseman TEST(PostOrderIteratorTest, Compiles) {
20d6a81614SMichael Ilseman typedef SmallPtrSet<void *, 4> ExtSetTy;
21d6a81614SMichael Ilseman
22d6a81614SMichael Ilseman // Tests that template specializations are kept up to date
23d6a81614SMichael Ilseman void *Null = nullptr;
24d6a81614SMichael Ilseman po_iterator_storage<std::set<void *>, false> PIS;
25e0793db4STim Shen PIS.insertEdge(Optional<void *>(), Null);
26d6a81614SMichael Ilseman ExtSetTy Ext;
27d6a81614SMichael Ilseman po_iterator_storage<ExtSetTy, true> PISExt(Ext);
28e0793db4STim Shen PIS.insertEdge(Optional<void *>(), Null);
29d6a81614SMichael Ilseman
30d6a81614SMichael Ilseman // Test above, but going through po_iterator (which inherits from template
31d6a81614SMichael Ilseman // base)
32d6a81614SMichael Ilseman BasicBlock *NullBB = nullptr;
33d6a81614SMichael Ilseman auto PI = po_end(NullBB);
34e0793db4STim Shen PI.insertEdge(Optional<BasicBlock *>(), NullBB);
35d6a81614SMichael Ilseman auto PIExt = po_ext_end(NullBB, Ext);
36e0793db4STim Shen PIExt.insertEdge(Optional<BasicBlock *>(), NullBB);
37d6a81614SMichael Ilseman }
38*d91f864cSFlorian Hahn
39*d91f864cSFlorian Hahn // Test post-order and reverse post-order traversals for simple graph type.
TEST(PostOrderIteratorTest,PostOrderAndReversePostOrderTraverrsal)40*d91f864cSFlorian Hahn TEST(PostOrderIteratorTest, PostOrderAndReversePostOrderTraverrsal) {
41*d91f864cSFlorian Hahn Graph<6> G;
42*d91f864cSFlorian Hahn G.AddEdge(0, 1);
43*d91f864cSFlorian Hahn G.AddEdge(0, 2);
44*d91f864cSFlorian Hahn G.AddEdge(0, 3);
45*d91f864cSFlorian Hahn G.AddEdge(1, 4);
46*d91f864cSFlorian Hahn G.AddEdge(2, 5);
47*d91f864cSFlorian Hahn G.AddEdge(5, 2);
48*d91f864cSFlorian Hahn G.AddEdge(2, 4);
49*d91f864cSFlorian Hahn G.AddEdge(1, 4);
50*d91f864cSFlorian Hahn
51*d91f864cSFlorian Hahn SmallVector<int> FromIterator;
52*d91f864cSFlorian Hahn for (auto N : post_order(G))
53*d91f864cSFlorian Hahn FromIterator.push_back(N->first);
54*d91f864cSFlorian Hahn EXPECT_EQ(6u, FromIterator.size());
55*d91f864cSFlorian Hahn EXPECT_EQ(4, FromIterator[0]);
56*d91f864cSFlorian Hahn EXPECT_EQ(1, FromIterator[1]);
57*d91f864cSFlorian Hahn EXPECT_EQ(5, FromIterator[2]);
58*d91f864cSFlorian Hahn EXPECT_EQ(2, FromIterator[3]);
59*d91f864cSFlorian Hahn EXPECT_EQ(3, FromIterator[4]);
60*d91f864cSFlorian Hahn EXPECT_EQ(0, FromIterator[5]);
61*d91f864cSFlorian Hahn FromIterator.clear();
62*d91f864cSFlorian Hahn
63*d91f864cSFlorian Hahn ReversePostOrderTraversal<Graph<6>> RPOT(G);
64*d91f864cSFlorian Hahn for (auto N : RPOT)
65*d91f864cSFlorian Hahn FromIterator.push_back(N->first);
66*d91f864cSFlorian Hahn EXPECT_EQ(6u, FromIterator.size());
67*d91f864cSFlorian Hahn EXPECT_EQ(0, FromIterator[0]);
68*d91f864cSFlorian Hahn EXPECT_EQ(3, FromIterator[1]);
69*d91f864cSFlorian Hahn EXPECT_EQ(2, FromIterator[2]);
70*d91f864cSFlorian Hahn EXPECT_EQ(5, FromIterator[3]);
71*d91f864cSFlorian Hahn EXPECT_EQ(1, FromIterator[4]);
72*d91f864cSFlorian Hahn EXPECT_EQ(4, FromIterator[5]);
73*d91f864cSFlorian Hahn }
74d6a81614SMichael Ilseman }
75