Jlm
ThetaTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2022 Magnus Sjalander <work@sjalander.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
9 #include <jlm/hls/ir/hls.hpp>
14 #include <jlm/rvsdg/lambda.hpp>
15 #include <jlm/rvsdg/theta.hpp>
16 #include <jlm/rvsdg/view.hpp>
17 
18 TEST(ThetaConversionTests, TestUnknownBoundaries)
19 {
20  using namespace jlm::llvm;
21  using namespace jlm::hls;
22 
23  // Arrange
24  auto b32 = jlm::rvsdg::BitType::Create(32);
25  auto ft = jlm::rvsdg::FunctionType::Create({ b32, b32, b32 }, { b32, b32, b32 });
26 
27  LlvmRvsdgModule rm(jlm::util::FilePath(""), "", "");
28 
29  auto lambda = jlm::rvsdg::LambdaNode::Create(
30  rm.Rvsdg().GetRootRegion(),
32 
33  auto theta = jlm::rvsdg::ThetaNode::create(lambda->subregion());
34  auto idv = theta->AddLoopVar(lambda->GetFunctionArguments()[0]);
35  auto lvs = theta->AddLoopVar(lambda->GetFunctionArguments()[1]);
36  auto lve = theta->AddLoopVar(lambda->GetFunctionArguments()[2]);
37 
38  auto arm = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitadd_op>({ idv.pre, lvs.pre }, 32).output(0);
39  auto cmp = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitult_op>({ arm, lve.pre }, 32).output(0);
40  auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
41 
42  idv.post->divert_to(arm);
43  theta->set_predicate(matchNode.output(0));
44 
45  auto f = lambda->finalize({ theta->output(0), theta->output(1), theta->output(2) });
47 
48  jlm::rvsdg::view(rm.Rvsdg(), stdout);
49 
50  // Act
52  ThetaNodeConversion::CreateAndRun(rm, statisticsCollector);
53  jlm::rvsdg::view(rm.Rvsdg(), stdout);
54 
55  // Assert
56  auto lambdaRegion = lambda->subregion();
57  EXPECT_TRUE(jlm::rvsdg::Region::ContainsNodeType<LoopNode>(*lambdaRegion, true));
58  EXPECT_TRUE(jlm::rvsdg::Region::ContainsOperation<PredicateBufferOperation>(*lambdaRegion, true));
59  EXPECT_TRUE(
60  jlm::rvsdg::Region::ContainsOperation<jlm::hls::BranchOperation>(*lambdaRegion, true));
61  EXPECT_TRUE(jlm::rvsdg::Region::ContainsOperation<MuxOperation>(*lambdaRegion, true));
62  // Check that two constant buffers are created for the loop invariant variables
63  EXPECT_TRUE(
64  jlm::rvsdg::Region::ContainsOperation<LoopConstantBufferOperation>(*lambdaRegion, true));
65  EXPECT_EQ(lambdaRegion->argument(0)->nusers(), 1);
66  auto & loopNode =
67  jlm::rvsdg::AssertGetOwnerNode<LoopNode>(lambdaRegion->argument(0)->SingleUser());
68  {
69  EXPECT_TRUE(jlm::rvsdg::IsOwnerNodeOperation<LoopConstantBufferOperation>(
70  loopNode.subregion()->argument(3)->SingleUser()));
71  }
72  {
73  EXPECT_TRUE(jlm::rvsdg::IsOwnerNodeOperation<LoopConstantBufferOperation>(
74  loopNode.subregion()->argument(4)->SingleUser()));
75  }
76 }
static jlm::util::StatisticsCollector statisticsCollector
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
Definition: lambda.hpp:84
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
Definition: type.cpp:45
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
static GraphExport & Create(Output &origin, std::string name)
Definition: graph.cpp:62
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition: lambda.cpp:140
static Node & CreateNode(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
Definition: control.hpp:226
static ThetaNode * create(rvsdg::Region *parent)
Definition: theta.hpp:73
TEST(ThetaConversionTests, TestUnknownBoundaries)
Definition: ThetaTests.cpp:18
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142