xref: /llvm-project/mlir/unittests/Conversion/PDLToPDLInterp/RootOrderingTest.cpp (revision abc362a1077b9cb4186e3e53a616589c7fed4387)
16df7cc7fSStanislav Funiak //===- RootOrderingTest.cpp - unit tests for optimal branching ------------===//
26df7cc7fSStanislav Funiak //
36df7cc7fSStanislav Funiak // Part of the LLVM Project, under the Apache License v[1].0 with LLVM
46df7cc7fSStanislav Funiak // Exceptions. See https://llvm.org/LICENSE.txt for license information.
56df7cc7fSStanislav Funiak // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66df7cc7fSStanislav Funiak //
76df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
86df7cc7fSStanislav Funiak 
96df7cc7fSStanislav Funiak #include "../lib/Conversion/PDLToPDLInterp/RootOrdering.h"
10*abc362a1SJakub Kuderski #include "mlir/Dialect/Arith/IR/Arith.h"
116df7cc7fSStanislav Funiak #include "mlir/IR/Builders.h"
126df7cc7fSStanislav Funiak #include "mlir/IR/MLIRContext.h"
136df7cc7fSStanislav Funiak #include "gtest/gtest.h"
146df7cc7fSStanislav Funiak 
156df7cc7fSStanislav Funiak using namespace mlir;
16810b2849SStanislav Funiak using namespace mlir::arith;
176df7cc7fSStanislav Funiak using namespace mlir::pdl_to_pdl_interp;
186df7cc7fSStanislav Funiak 
196df7cc7fSStanislav Funiak namespace {
206df7cc7fSStanislav Funiak 
216df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
226df7cc7fSStanislav Funiak // Test Fixture
236df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
246df7cc7fSStanislav Funiak 
256df7cc7fSStanislav Funiak /// The test fixture for constructing root ordering tests and verifying results.
266df7cc7fSStanislav Funiak /// This fixture constructs the test values v. The test populates the graph
27810b2849SStanislav Funiak /// with the desired costs and then calls check(), passing the expected optimal
286df7cc7fSStanislav Funiak /// cost and the list of edges in the preorder traversal of the optimal
296df7cc7fSStanislav Funiak /// branching.
306df7cc7fSStanislav Funiak class RootOrderingTest : public ::testing::Test {
316df7cc7fSStanislav Funiak protected:
RootOrderingTest()326df7cc7fSStanislav Funiak   RootOrderingTest() {
33*abc362a1SJakub Kuderski     context.loadDialect<ArithDialect>();
346df7cc7fSStanislav Funiak     createValues();
356df7cc7fSStanislav Funiak   }
366df7cc7fSStanislav Funiak 
37810b2849SStanislav Funiak   /// Creates the test values. These values simply act as vertices / vertex IDs
38810b2849SStanislav Funiak   /// in the cost graph, rather than being a part of an IR.
createValues()396df7cc7fSStanislav Funiak   void createValues() {
406df7cc7fSStanislav Funiak     OpBuilder builder(&context);
41810b2849SStanislav Funiak     builder.setInsertionPointToStart(&block);
426df7cc7fSStanislav Funiak     for (int i = 0; i < 4; ++i)
43810b2849SStanislav Funiak       // Ops will be deleted when `block` is destroyed.
44810b2849SStanislav Funiak       v[i] = builder.create<ConstantIntOp>(builder.getUnknownLoc(), i, 32);
456df7cc7fSStanislav Funiak   }
466df7cc7fSStanislav Funiak 
476df7cc7fSStanislav Funiak   /// Checks that optimal branching on graph has the given cost and
486df7cc7fSStanislav Funiak   /// its preorder traversal results in the specified edges.
check(unsigned cost,const OptimalBranching::EdgeList & edges)491fc096afSMehdi Amini   void check(unsigned cost, const OptimalBranching::EdgeList &edges) {
506df7cc7fSStanislav Funiak     OptimalBranching opt(graph, v[0]);
516df7cc7fSStanislav Funiak     EXPECT_EQ(opt.solve(), cost);
526df7cc7fSStanislav Funiak     EXPECT_EQ(opt.preOrderTraversal({v, v + edges.size()}), edges);
536df7cc7fSStanislav Funiak     for (std::pair<Value, Value> edge : edges)
546df7cc7fSStanislav Funiak       EXPECT_EQ(opt.getRootOrderingParents().lookup(edge.first), edge.second);
556df7cc7fSStanislav Funiak   }
566df7cc7fSStanislav Funiak 
576df7cc7fSStanislav Funiak protected:
586df7cc7fSStanislav Funiak   /// The context for creating the values.
596df7cc7fSStanislav Funiak   MLIRContext context;
606df7cc7fSStanislav Funiak 
61810b2849SStanislav Funiak   /// Block holding all the operations.
62810b2849SStanislav Funiak   Block block;
63810b2849SStanislav Funiak 
646df7cc7fSStanislav Funiak   /// Values used in the graph definition. We always use leading `n` values.
656df7cc7fSStanislav Funiak   Value v[4];
666df7cc7fSStanislav Funiak 
676df7cc7fSStanislav Funiak   /// The graph being tested on.
686df7cc7fSStanislav Funiak   RootOrderingGraph graph;
696df7cc7fSStanislav Funiak };
706df7cc7fSStanislav Funiak 
716df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
726df7cc7fSStanislav Funiak // Simple 3-node graphs
736df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
746df7cc7fSStanislav Funiak 
TEST_F(RootOrderingTest,simpleA)756df7cc7fSStanislav Funiak TEST_F(RootOrderingTest, simpleA) {
766df7cc7fSStanislav Funiak   graph[v[1]][v[0]].cost = {1, 10};
776df7cc7fSStanislav Funiak   graph[v[2]][v[0]].cost = {1, 11};
786df7cc7fSStanislav Funiak   graph[v[1]][v[2]].cost = {2, 12};
796df7cc7fSStanislav Funiak   graph[v[2]][v[1]].cost = {2, 13};
806df7cc7fSStanislav Funiak   check(2, {{v[0], {}}, {v[1], v[0]}, {v[2], v[0]}});
816df7cc7fSStanislav Funiak }
826df7cc7fSStanislav Funiak 
TEST_F(RootOrderingTest,simpleB)836df7cc7fSStanislav Funiak TEST_F(RootOrderingTest, simpleB) {
846df7cc7fSStanislav Funiak   graph[v[1]][v[0]].cost = {1, 10};
856df7cc7fSStanislav Funiak   graph[v[2]][v[0]].cost = {2, 11};
866df7cc7fSStanislav Funiak   graph[v[1]][v[2]].cost = {1, 12};
876df7cc7fSStanislav Funiak   graph[v[2]][v[1]].cost = {1, 13};
886df7cc7fSStanislav Funiak   check(2, {{v[0], {}}, {v[1], v[0]}, {v[2], v[1]}});
896df7cc7fSStanislav Funiak }
906df7cc7fSStanislav Funiak 
TEST_F(RootOrderingTest,simpleC)916df7cc7fSStanislav Funiak TEST_F(RootOrderingTest, simpleC) {
926df7cc7fSStanislav Funiak   graph[v[1]][v[0]].cost = {2, 10};
936df7cc7fSStanislav Funiak   graph[v[2]][v[0]].cost = {2, 11};
946df7cc7fSStanislav Funiak   graph[v[1]][v[2]].cost = {1, 12};
956df7cc7fSStanislav Funiak   graph[v[2]][v[1]].cost = {1, 13};
966df7cc7fSStanislav Funiak   check(3, {{v[0], {}}, {v[1], v[0]}, {v[2], v[1]}});
976df7cc7fSStanislav Funiak }
986df7cc7fSStanislav Funiak 
996df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
1006df7cc7fSStanislav Funiak // Graph for testing contraction
1016df7cc7fSStanislav Funiak //===----------------------------------------------------------------------===//
1026df7cc7fSStanislav Funiak 
TEST_F(RootOrderingTest,contraction)1036df7cc7fSStanislav Funiak TEST_F(RootOrderingTest, contraction) {
1046df7cc7fSStanislav Funiak   graph[v[1]][v[0]].cost = {10, 0};
1056df7cc7fSStanislav Funiak   graph[v[2]][v[0]].cost = {5, 0};
1066df7cc7fSStanislav Funiak   graph[v[2]][v[1]].cost = {1, 0};
1076df7cc7fSStanislav Funiak   graph[v[3]][v[2]].cost = {2, 0};
1086df7cc7fSStanislav Funiak   graph[v[1]][v[3]].cost = {3, 0};
1096df7cc7fSStanislav Funiak   check(10, {{v[0], {}}, {v[2], v[0]}, {v[3], v[2]}, {v[1], v[3]}});
1106df7cc7fSStanislav Funiak }
1116df7cc7fSStanislav Funiak 
112be0a7e9fSMehdi Amini } // namespace
113