| //===- PostOrderIteratorTest.cpp - PostOrderIterator unit tests -----------===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| #include "llvm/ADT/PostOrderIterator.h" |
| #include "llvm/IR/BasicBlock.h" |
| #include "llvm/IR/CFG.h" |
| #include "gtest/gtest.h" |
| #include "TestGraph.h" |
| |
| #include <array> |
| #include <iterator> |
| #include <type_traits> |
| |
| #include <cstddef> |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| // Whether we're able to compile |
| TEST(PostOrderIteratorTest, Compiles) { |
| Graph<6> G; |
| using NodeType = Graph<6>::NodeType; |
| NodeType *NullNode = nullptr; |
| |
| auto PI = post_order(G); |
| PI.insertEdge(std::optional<NodeType *>(), NullNode); |
| |
| using ExtSetTy = SmallPtrSet<void *, 4>; |
| ExtSetTy Ext; |
| auto PIExt = post_order_ext(G, Ext); |
| PIExt.insertEdge(std::optional<NodeType *>(), NullNode); |
| } |
| |
| static_assert(std::is_convertible_v< |
| decltype(*post_order(std::declval<Graph<3>>()).begin()), |
| PostOrderTraversal<Graph<3>>::iterator::reference>); |
| |
| // Test post-order and reverse post-order traversals for simple graph type. |
| TEST(PostOrderIteratorTest, PostOrderAndReversePostOrderTraverrsal) { |
| Graph<6> G; |
| G.AddEdge(0, 1); |
| G.AddEdge(0, 2); |
| G.AddEdge(0, 3); |
| G.AddEdge(1, 4); |
| G.AddEdge(2, 5); |
| G.AddEdge(5, 2); |
| G.AddEdge(2, 4); |
| G.AddEdge(1, 4); |
| |
| SmallVector<int> FromIterator; |
| for (auto N : post_order(G)) |
| FromIterator.push_back(N->first); |
| EXPECT_EQ(6u, FromIterator.size()); |
| EXPECT_EQ(4, FromIterator[0]); |
| EXPECT_EQ(1, FromIterator[1]); |
| EXPECT_EQ(5, FromIterator[2]); |
| EXPECT_EQ(2, FromIterator[3]); |
| EXPECT_EQ(3, FromIterator[4]); |
| EXPECT_EQ(0, FromIterator[5]); |
| FromIterator.clear(); |
| |
| ReversePostOrderTraversal<Graph<6>> RPOT(G); |
| for (auto N : RPOT) |
| FromIterator.push_back(N->first); |
| EXPECT_EQ(6u, FromIterator.size()); |
| EXPECT_EQ(0, FromIterator[0]); |
| EXPECT_EQ(3, FromIterator[1]); |
| EXPECT_EQ(2, FromIterator[2]); |
| EXPECT_EQ(5, FromIterator[3]); |
| EXPECT_EQ(1, FromIterator[4]); |
| EXPECT_EQ(4, FromIterator[5]); |
| } |
| } |