Jlm
LambdaMemoryState.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2018 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
8 
9 namespace jlm::llvm
10 {
11 
12 rvsdg::Output &
13 GetMemoryStateRegionArgument(const rvsdg::LambdaNode & lambdaNode) noexcept
14 {
15  JLM_ASSERT(is<llvm::LlvmLambdaOperation>(&lambdaNode));
16  const auto argument = lambdaNode.GetFunctionArguments().back();
17  JLM_ASSERT(is<MemoryStateType>(argument->Type()));
18  return *argument;
19 }
20 
22 GetMemoryStateRegionResult(const rvsdg::LambdaNode & lambdaNode) noexcept
23 {
24  JLM_ASSERT(is<llvm::LlvmLambdaOperation>(&lambdaNode));
25  const auto result = lambdaNode.GetFunctionResults().back();
26  JLM_ASSERT(is<MemoryStateType>(result->Type()));
27  return *result;
28 }
29 
31 tryGetMemoryStateExitMerge(const rvsdg::LambdaNode & lambdaNode) noexcept
32 {
33  auto & result = GetMemoryStateRegionResult(lambdaNode);
34 
35  const auto node = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*result.origin());
36  return is<LambdaExitMemoryStateMergeOperation>(node) ? node : nullptr;
37 }
38 
40 tryGetMemoryStateEntrySplit(const rvsdg::LambdaNode & lambdaNode) noexcept
41 {
42  auto & argument = GetMemoryStateRegionArgument(lambdaNode);
43 
44  // If a memory state entry split node is present, then we would expect the node to be the only
45  // user of the memory state argument.
46  if (argument.nusers() != 1)
47  return nullptr;
48 
49  const auto node = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(argument.SingleUser());
50  return is<LambdaEntryMemoryStateSplitOperation>(node) ? dynamic_cast<rvsdg::SimpleNode *>(node)
51  : nullptr;
52 }
53 
54 }
Lambda node.
Definition: lambda.hpp:83
#define JLM_ASSERT(x)
Definition: common.hpp:16
Global memory state passed between functions.
rvsdg::SimpleNode * tryGetMemoryStateEntrySplit(const rvsdg::LambdaNode &lambdaNode) noexcept
rvsdg::Input & GetMemoryStateRegionResult(const rvsdg::LambdaNode &lambdaNode) noexcept
rvsdg::SimpleNode * tryGetMemoryStateExitMerge(const rvsdg::LambdaNode &lambdaNode) noexcept
rvsdg::Output & GetMemoryStateRegionArgument(const rvsdg::LambdaNode &lambdaNode) noexcept