Jlm
Loading...
Searching...
No Matches
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
18TEST(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
28
30 rm.Rvsdg().GetRootRegion(),
31 LlvmLambdaOperation::Create(ft, "f", Linkage::externalLinkage));
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(), 1u);
66 auto & loopNode =
67 jlm::rvsdg::AssertGetOwnerNode<LoopNode>(lambdaRegion->argument(0)->SingleUser());
68 {
70 loopNode.subregion()->argument(3)->SingleUser()));
71 }
72 {
74 loopNode.subregion()->argument(4)->SingleUser()));
75 }
76}
static jlm::util::StatisticsCollector statisticsCollector
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:141
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:220
static ThetaNode * create(rvsdg::Region *parent)
Definition theta.hpp:73
TEST(ThetaConversionTests, TestUnknownBoundaries)
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition view.cpp:142
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Definition node.hpp:872