21TEST(LoadOperationTests, OperationEquality)
29 auto pointerType = PointerType::Create();
35 TestOperation operation5({ PointerType::Create() }, { PointerType::Create() });
38 EXPECT_EQ(operation1, operation1);
39 EXPECT_NE(operation1, operation2);
40 EXPECT_NE(operation1, operation3);
41 EXPECT_NE(operation1, operation4);
42 EXPECT_NE(operation1, operation5);
45TEST(LoadOperationTests, TestCopy)
50 auto memoryType = MemoryStateType::Create();
52 auto pointerType = PointerType::Create();
61 auto loadResults = LoadNonVolatileOperation::Create(address1, { memoryState1 }, valueType, 4);
65 EXPECT_TRUE(is<LoadNonVolatileOperation>(node));
66 auto copiedNode = node->copy(&graph.
GetRootRegion(), { address2, memoryState2 });
71 jlm::util::assertedCast<jlm::rvsdg::SimpleNode>(copiedNode)->GetOperation());
74TEST(LoadOperationTests, TestLoadAllocaReduction)
79 auto mt = MemoryStateType::Create();
85 auto alloca1 = AllocaOperation::create(bt, size, 4);
86 auto alloca2 = AllocaOperation::create(bt, size, 4);
87 auto mux = MemoryStateMergeOperation::Create({ alloca1[1] });
89 LoadNonVolatileOperation::CreateNode(*alloca1[0], { alloca1[1], alloca2[1], mux }, bt, 4);
97 LoadNonVolatileOperation::NormalizeLoadAlloca,
105 EXPECT_TRUE(is<LoadNonVolatileOperation>(node));
106 EXPECT_EQ(node->ninputs(), 3u);
107 EXPECT_EQ(node->input(1)->origin(), alloca1[1]);
108 EXPECT_EQ(node->input(2)->origin(), mux);
111TEST(LoadOperationTests, TestDuplicateStateReduction)
116 const auto memoryType = MemoryStateType::Create();
118 const auto pointerType = PointerType::Create();
126 auto & loadNode = LoadNonVolatileOperation::CreateNode(*a, { s1, s2, s1, s2, s3 }, valueType, 4);
139 LoadNonVolatileOperation::NormalizeDuplicateStates,
145 EXPECT_TRUE(success);
147 EXPECT_TRUE(is<LoadNonVolatileOperation>(node));
148 EXPECT_EQ(node->ninputs(), 4u);
149 EXPECT_EQ(node->noutputs(), 4u);
151 EXPECT_EQ(exA.origin(), node->output(0));
152 EXPECT_EQ(exS1.origin(), node->output(1));
153 EXPECT_EQ(exS2.origin(), node->output(2));
154 EXPECT_EQ(exS3.origin(), node->output(1));
155 EXPECT_EQ(exS4.origin(), node->output(2));
156 EXPECT_EQ(exS5.origin(), node->output(3));
159TEST(LoadOperationTests, TestLoadStoreStateReduction)
169 auto alloca1 = AllocaOperation::create(bt, size, 4);
170 auto alloca2 = AllocaOperation::create(bt, size, 4);
171 auto store1 = StoreNonVolatileOperation::Create(alloca1[0], size, { alloca1[1] }, 4);
172 auto store2 = StoreNonVolatileOperation::Create(alloca2[0], size, { alloca2[1] }, 4);
175 LoadNonVolatileOperation::CreateNode(*alloca1[0], { store1[0], store2[0] }, bt, 4);
176 auto & loadNode2 = LoadNonVolatileOperation::CreateNode(*alloca1[0], { store1[0] }, bt, 8);
185 LoadNonVolatileOperation::NormalizeLoadStoreState,
188 LoadNonVolatileOperation::NormalizeLoadStoreState,
195 EXPECT_TRUE(success1);
197 EXPECT_TRUE(is<LoadNonVolatileOperation>(node));
198 EXPECT_EQ(node->ninputs(), 2u);
200 EXPECT_FALSE(success2);
202 EXPECT_TRUE(is<LoadNonVolatileOperation>(node));
203 EXPECT_EQ(node->ninputs(), 2u);
206TEST(LoadOperationTests, TestLoadStoreReduction_Success)
212 auto pt = PointerType::Create();
213 auto mt = MemoryStateType::Create();
220 auto s1 = StoreNonVolatileOperation::Create(a, v, { s }, 4)[0];
221 auto & loadNode = LoadNonVolatileOperation::CreateNode(*a, { s1 },
vt, 4);
230 LoadNonVolatileOperation::NormalizeLoadStore,
236 EXPECT_TRUE(success);
238 EXPECT_EQ(x1.origin(), v);
239 EXPECT_EQ(x2.origin(), s1);
246TEST(LoadOperationTests, LoadStoreReduction_DifferentValueOperandType)
251 const auto pointerType = PointerType::Create();
252 const auto memoryStateType = MemoryStateType::Create();
259 auto & storeNode = StoreNonVolatileOperation::CreateNode(address, value, { memoryState }, 4);
260 auto & loadNode = LoadNonVolatileOperation::CreateNode(
273 LoadNonVolatileOperation::NormalizeLoadStore,
280 EXPECT_FALSE(success);
282 const auto expectedLoadNode =
284 EXPECT_EQ(expectedLoadNode, &loadNode);
285 EXPECT_EQ(expectedLoadNode->ninputs(), 2u);
287 const auto expectedStoreNode =
289 EXPECT_EQ(expectedStoreNode, &storeNode);
292TEST(LoadOperationTests, normalizeIOBarrierAddress)
297 const auto pointerType = PointerType::Create();
298 const auto memoryStateType = MemoryStateType::Create();
300 const auto ioStateType = IOStateType::Create();
308 auto allocaResults = AllocaOperation::create(bit32Type, sizeImport, 4);
310 { allocaResults[0], ioStateImport },
313 auto & loadNode1 = LoadNonVolatileOperation::CreateNode(
314 *ioBarrierNode.output(0),
315 { allocaResults[1] },
320 LoadNonVolatileOperation::CreateNode(*addressImport, { memoryStateImport }, bit32Type, 4);
329 LoadNonVolatileOperation::normalizeIOBarrierAddress,
333 LoadNonVolatileOperation::normalizeIOBarrierAddress,
340 EXPECT_TRUE(successLoadNode1);
347 EXPECT_FALSE(successLoadNode2);
353TEST(LoadOperationTests, normalizeIOBarrierAddress_Gamma)
359 const auto pointerType = PointerType::Create();
360 const auto memoryStateType = MemoryStateType::Create();
362 const auto ioStateType = IOStateType::Create();
363 const auto controlType = ControlType::Create(2);
371 auto allocaResults = AllocaOperation::create(bit32Type, sizeImport, 4);
373 auto gammaNode = GammaNode::create(controlImport, 2);
374 auto addressEntryVar = gammaNode->AddEntryVar(allocaResults[0]);
375 auto memoryStateEntryVar = gammaNode->AddEntryVar(allocaResults[1]);
376 auto ioStateEntryVar = gammaNode->AddEntryVar(ioStateImport);
377 auto valueEntryVar = gammaNode->AddEntryVar(valueImport);
380 { addressEntryVar.branchArgument[0], ioStateEntryVar.branchArgument[0] },
383 auto & loadNode = LoadNonVolatileOperation::CreateNode(
384 *ioBarrierNode.output(0),
385 { memoryStateEntryVar.branchArgument[0] },
389 auto exitVar = gammaNode->AddExitVar({ loadNode.output(0), valueEntryVar.branchArgument[1] });
391 GraphExport::Create(*exitVar.output,
"load1");
397 LoadNonVolatileOperation::normalizeIOBarrierAddress,
405 EXPECT_TRUE(successLoadNode);
408 EXPECT_EQ(gammaNode->subregion(0)->numNodes(), 1u);
413 addressEntryVar.branchArgument[0]);
416TEST(LoadOperationTests, normalizeIOBarrierAddress_GEP)
421 const auto pointerType = PointerType::Create();
422 const auto memoryStateType = MemoryStateType::Create();
424 const auto ioStateType = IOStateType::Create();
425 const auto arrayType = ArrayType::Create(bit32Type, 10);
431 auto & zeroNode = IntegerConstantOperation::Create(graph.
GetRootRegion(), 32, 0);
432 auto & twoNode = IntegerConstantOperation::Create(graph.
GetRootRegion(), 32, 2);
433 auto & tenNode = IntegerConstantOperation::Create(graph.
GetRootRegion(), 32, 10);
435 auto allocaResults = AllocaOperation::create(arrayType, sizeImport, 4);
437 auto & gepNode1 = GetElementPtrOperation::createNode(
439 { zeroNode.output(0), twoNode.output(0) },
442 { gepNode1.output(0), ioStateImport },
444 auto & loadNode1 = LoadNonVolatileOperation::CreateNode(
445 *ioBarrierNode1.output(0),
446 { allocaResults[1] },
450 auto & gepNode2 = GetElementPtrOperation::createNode(
452 { zeroNode.output(0), tenNode.output(0) },
455 { gepNode2.output(0), ioStateImport },
457 auto & loadNode2 = LoadNonVolatileOperation::CreateNode(
458 *ioBarrierNode2.output(0),
459 { allocaResults[1] },
470 LoadNonVolatileOperation::normalizeIOBarrierAddress,
474 LoadNonVolatileOperation::normalizeIOBarrierAddress,
482 EXPECT_TRUE(successLoadNode1);
491 EXPECT_FALSE(successLoadNode2);
494 ioBarrierNode2.output(0));
498TEST(LoadOperationTests, LoadVolatileOperationEquality)
506 auto pointerType = PointerType::Create();
512 TestOperation operation5({ PointerType::Create() }, { PointerType::Create() });
515 EXPECT_EQ(operation1, operation1);
516 EXPECT_NE(operation1, operation2);
517 EXPECT_NE(operation1, operation3);
518 EXPECT_NE(operation1, operation4);
519 EXPECT_NE(operation1, operation5);
561TEST(LoadOperationTests, NodeCopy)
568 auto pointerType = PointerType::Create();
569 auto iOStateType = IOStateType::Create();
570 auto memoryType = MemoryStateType::Create();
571 auto valueType = TestType::createValueType();
583 { &address1, &iOState1, &memoryState1 },
589 auto copiedNode = loadNode.copy(&graph.
GetRootRegion(), { &address2, &iOState2, &memoryState2 });
593 &jlm::util::assertedCast<SimpleNode>(copiedNode)->GetOperation());
594 EXPECT_NE(copiedOperation,
nullptr);
595 EXPECT_EQ(LoadOperation::AddressInput(*copiedNode).origin(), &address2);
596 EXPECT_EQ(LoadVolatileOperation::IOStateInput(*copiedNode).origin(), &iOState2);
597 EXPECT_EQ(*copiedOperation->GetLoadedType(), *valueType);