6 #include <gtest/gtest.h>
27 auto [allocaNode, allocaOperation] =
28 jlm::rvsdg::TryGetSimpleNodeAndOptionalOp<AllocaOperation>(output);
29 EXPECT_TRUE(allocaNode && allocaOperation);
30 EXPECT_EQ(*allocaOperation->allocatedType(), type);
33 TEST(AggregateAllocaSplittingTests, getElementPtrTest)
40 auto bit32Type = BitType::Create(32);
41 auto bit64Type = BitType::Create(64);
45 const auto functionType = FunctionType::Create({}, { memoryStateType });
48 auto & rvsdg = rvsdgModule.Rvsdg();
50 auto lambdaNode = LambdaNode::Create(
51 rvsdg.GetRootRegion(),
60 *allocaNode.output(0),
61 { zero32Node.output(0), zero32Node.output(0) },
65 *zero32Node.output(0),
66 { &AllocaOperation::getMemoryStateOutput(allocaNode) },
70 *allocaNode.output(0),
71 { zero32Node.output(0), one32Node.output(0) },
75 *zero64Node.output(0),
76 { storeGepXNode.output(0) },
79 auto lambdaOutput = lambdaNode->finalize({ storeGepYNode.output(0) });
80 GraphExport::Create(*lambdaOutput,
"f");
90 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 8u);
97 auto [memoryMergeNode, memoryMergeOperation] =
98 TryGetSimpleNodeAndOptionalOp<MemoryStateMergeOperation>(
100 EXPECT_TRUE(memoryMergeNode && memoryMergeOperation);
102 EXPECT_EQ(memoryMergeNode->ninputs(), 2u);
108 TEST(AggregateAllocaSplittingTests, gammaTest)
115 auto bit16Type = BitType::Create(16);
116 auto bit32Type = BitType::Create(32);
117 auto bit64Type = BitType::Create(64);
118 const auto controlType = ControlType::Create(2);
122 const auto functionType = FunctionType::Create({ controlType }, { memoryStateType });
125 auto & rvsdg = rvsdgModule.Rvsdg();
127 auto lambdaNode = LambdaNode::Create(
128 rvsdg.GetRootRegion(),
130 auto controlArgument = lambdaNode->GetFunctionArguments()[0];
137 auto gammaNode = GammaNode::create(controlArgument, 2);
139 auto memoryStateEntryVar =
142 Node *storeGep0Node =
nullptr, *storeGep1Node =
nullptr;
149 *baseAddressEntryVar.branchArgument[0],
150 { zero32Node.output(0), zero32Node.output(0) },
154 *zero16Node.output(0),
155 { memoryStateEntryVar.branchArgument[0] },
165 *baseAddressEntryVar.branchArgument[1],
166 { zero32Node.output(0), one32Node.output(0) },
170 *zero32Node.output(0),
171 { memoryStateEntryVar.branchArgument[1] },
174 auto baseAddressExitVar = gammaNode->AddExitVar(baseAddressEntryVar.branchArgument);
175 auto memoryStateExitVar =
176 gammaNode->AddExitVar({ storeGep0Node->
output(0), storeGep1Node->output(0) });
179 *baseAddressExitVar.output,
180 { zero.output(0), two.output(0) },
186 *zero64Node.output(0),
187 { memoryStateExitVar.output },
190 auto lambdaOutput = lambdaNode->finalize({ storeGep2Node.output(0) });
191 GraphExport::Create(*lambdaOutput,
"f");
220 auto [memoryMergeNode, memoryMergeOperation] =
221 TryGetSimpleNodeAndOptionalOp<MemoryStateMergeOperation>(
222 *memoryStateEntryVar.input->origin());
223 EXPECT_TRUE(memoryMergeNode && memoryMergeOperation);
225 EXPECT_EQ(memoryMergeNode->ninputs(), 3u);
232 TEST(AggregateAllocaSplittingTests, thetaTest)
239 auto bit16Type = BitType::Create(16);
240 auto bit32Type = BitType::Create(32);
244 const auto functionType = FunctionType::Create({}, { memoryStateType });
247 auto & rvsdg = rvsdgModule.Rvsdg();
249 auto lambdaNode = LambdaNode::Create(
250 rvsdg.GetRootRegion(),
256 Node * storeGep0Node =
nullptr;
257 auto thetaNode = ThetaNode::create(lambdaNode->subregion());
259 auto memoryStateLoopVar =
266 { zero32Node.output(0), zero32Node.output(0) },
271 *zero16Node.output(0),
272 { memoryStateLoopVar.pre },
275 memoryStateLoopVar.post->divert_to(storeGep0Node->
output(0));
280 *addressLoopVar.output,
281 { zero32Node.output(0), one.output(0) },
285 *zero32Node.output(0),
286 { memoryStateLoopVar.output },
289 auto lambdaOutput = lambdaNode->finalize({ storeGep1Node.output(0) });
290 GraphExport::Create(*lambdaOutput,
"f");
312 auto [memoryMergeNode, memoryMergeOperation] =
313 TryGetSimpleNodeAndOptionalOp<MemoryStateMergeOperation>(
314 *memoryStateLoopVar.input->origin());
315 EXPECT_TRUE(memoryMergeNode && memoryMergeOperation);
317 EXPECT_EQ(memoryMergeNode->ninputs(), 2u);
TEST(AggregateAllocaSplittingTests, getElementPtrTest)
static void assertAllocaWithType(const jlm::rvsdg::Output &output, const jlm::rvsdg::Type &type)
static jlm::util::StatisticsCollector statisticsCollector
Aggregate Alloca Splitting Transformation.
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static rvsdg::SimpleNode & createNode(std::shared_ptr< const rvsdg::Type > allocatedType, rvsdg::Output &count, const size_t alignment)
static rvsdg::Output & getMemoryStateOutput(rvsdg::Node &node)
static rvsdg::Output & getPointerOutput(rvsdg::Node &node)
static rvsdg::SimpleNode & createNode(rvsdg::Output &baseAddress, const std::vector< rvsdg::Output * > &indices, std::shared_ptr< const rvsdg::Type > pointeeType)
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
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)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
static rvsdg::SimpleNode & CreateNode(rvsdg::Output &address, rvsdg::Output &value, const std::vector< rvsdg::Output * > &memoryStates, size_t alignment)
static rvsdg::Node::InputIteratorRange getMemoryStateInputs(const rvsdg::Node &node) noexcept
static rvsdg::Input & AddressInput(const rvsdg::Node &node) noexcept
static std::shared_ptr< const StructType > CreateIdentified(const std::string &name, std::vector< std::shared_ptr< const Type >> types, bool isPacked)
NodeOutput * output(size_t index) const noexcept
Global memory state passed between functions.
rvsdg::Output & traceOutput(rvsdg::Output &output, const rvsdg::Region *withinRegion)