Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions jlm/llvm/TestRvsdgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1419,9 +1419,9 @@ GammaTest::SetupRvsdg()

auto zero = &BitConstantOperation::create(*fct->subregion(), { 32, 0 });
auto biteq = jlm::rvsdg::biteq_op::create(32, fct->GetFunctionArguments()[0], zero);
auto predicate = jlm::rvsdg::match(1, { { 0, 1 } }, 0, 2, biteq);
auto & predicateNode = MatchOperation::CreateNode(*biteq, { { 0, 1 } }, 0, 2);

auto gammanode = jlm::rvsdg::GammaNode::create(predicate, 2);
auto gammanode = GammaNode::create(predicateNode.output(0), 2);
auto p1ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[1]);
auto p2ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[2]);
auto p3ev = gammanode->AddEntryVar(fct->GetFunctionArguments()[3]);
Expand Down Expand Up @@ -1545,10 +1545,10 @@ GammaTest2::SetupRvsdg()

auto zero = &BitConstantOperation::create(*lambda->subregion(), { 32, 0 });
auto bitEq = rvsdg::biteq_op::create(32, cArgument, zero);
auto predicate = rvsdg::match(1, { { 0, 1 } }, 0, 2, bitEq);
auto & predicateNode = MatchOperation::CreateNode(*bitEq, { { 0, 1 } }, 0, 2);

auto [gammaOutputA, gammaOutputMemoryState] =
SetupGamma(predicate, xArgument, yArgument, allocaZResults[0], memoryState);
SetupGamma(predicateNode.output(0), xArgument, yArgument, allocaZResults[0], memoryState);

auto loadZResults = LoadNonVolatileOperation::Create(
allocaZResults[0],
Expand Down Expand Up @@ -1686,11 +1686,11 @@ ThetaTest::SetupRvsdg()
auto one = &BitConstantOperation::create(*thetanode->subregion(), { 32, 1 });
auto sum = jlm::rvsdg::bitadd_op::create(32, n.pre, one);
auto cmp = jlm::rvsdg::bitult_op::create(32, sum, l.pre);
auto predicate = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & predicateNode = MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

n.post->divert_to(sum);
s.post->divert_to(store[0]);
thetanode->set_predicate(predicate);
thetanode->set_predicate(predicateNode.output(0));

fct->finalize({ s.output });
GraphExport::Create(*fct->output(), "f");
Expand Down Expand Up @@ -2171,9 +2171,9 @@ PhiTest1::SetupRvsdg()

auto two = &BitConstantOperation::create(*lambda->subregion(), { 64, 2 });
auto bitult = jlm::rvsdg::bitult_op::create(64, valueArgument, two);
auto predicate = jlm::rvsdg::match(1, { { 0, 1 } }, 0, 2, bitult);
auto & predicateNode = MatchOperation::CreateNode(*bitult, { { 0, 1 } }, 0, 2);

auto gammaNode = jlm::rvsdg::GammaNode::create(predicate, 2);
auto gammaNode = GammaNode::create(predicateNode.output(0), 2);
auto nev = gammaNode->AddEntryVar(valueArgument);
auto resultev = gammaNode->AddEntryVar(pointerArgument);
auto fibev = gammaNode->AddEntryVar(ctxVarFib);
Expand Down
31 changes: 22 additions & 9 deletions jlm/llvm/opt/LoadChainSeparation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ LoadChainSeparation::separateReferenceChains(rvsdg::Output & startOutput)
for (auto & modRefChain : summary.modRefChains)
{
const auto refSubchains = extractReferenceSubchains(modRefChain);
for (const auto & [_, links] : refSubchains)
for (const auto & [links] : refSubchains)
{
// Divert the operands of the respective inputs for each encountered reference node and
// collect join operands
Expand Down Expand Up @@ -356,6 +356,7 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
ModRefChain currentModRefChain;
rvsdg::Output * currentOutput = &startOutput;
bool doneTracing = false;
bool hasModRefChainLinkAboveInRegion = false;
do
{
if (rvsdg::TryGetOwnerRegion(*currentOutput))
Expand All @@ -374,19 +375,23 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
// operations in the gamma on all branches are and which memory state exit variable maps
// to which memory state entry variable. We need some more machinery for it first before
// we can do that.
hasModRefChainLinkAboveInRegion = true;
currentModRefChain.add({ currentOutput, ModRefChainLink::Type::Modification });
for (auto [entryVarInput, _] : gammaNode.GetEntryVars())
{
if (is<MemoryStateType>(entryVarInput->Type()))
{
traceModRefChains(*entryVarInput->origin(), summary);
hasModRefChainLinkAboveInRegion |=
traceModRefChains(*entryVarInput->origin(), summary);
}
}
doneTracing = true;
},
[&](const rvsdg::ThetaNode &)
{
const auto modRefChainLinkType = Context_->getModRefChainLinkType(*currentOutput);
hasModRefChainLinkAboveInRegion |=
modRefChainLinkType == ModRefChainLink::Type::Modification;
currentModRefChain.add({ currentOutput, modRefChainLinkType });
currentOutput = mapMemoryStateOutputToInput(*currentOutput).origin();
},
Expand All @@ -402,12 +407,14 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
},
[&](const StoreOperation &)
{
hasModRefChainLinkAboveInRegion = true;
currentModRefChain.add({ currentOutput, ModRefChainLink::Type::Modification });
currentOutput =
StoreOperation::MapMemoryStateOutputToInput(*currentOutput).origin();
},
[&](const FreeOperation &)
{
hasModRefChainLinkAboveInRegion = true;
currentModRefChain.add({ currentOutput, ModRefChainLink::Type::Modification });
currentOutput = FreeOperation::mapMemoryStateOutputToInput(*currentOutput).origin();
},
Expand All @@ -416,6 +423,7 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
// FIXME: We really would like to know here which memory state belongs to the source
// and which to the dst address. This would allow us to be more precise in the
// separation.
hasModRefChainLinkAboveInRegion = true;
currentModRefChain.add({ currentOutput, ModRefChainLink::Type::Modification });
currentOutput =
MemCpyOperation::mapMemoryStateOutputToInput(*currentOutput).origin();
Expand All @@ -431,7 +439,8 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
{
for (auto & nodeInput : node.Inputs())
{
traceModRefChains(*nodeInput.origin(), summary);
hasModRefChainLinkAboveInRegion |=
traceModRefChains(*nodeInput.origin(), summary);
}
doneTracing = true;
},
Expand All @@ -446,30 +455,34 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
{
// FIXME: I really would like that state edges through calls would be recognized as
// either modifying or just referencing.
traceModRefChains(*node.input(0)->origin(), summary);
hasModRefChainLinkAboveInRegion |=
traceModRefChains(*node.input(0)->origin(), summary);
doneTracing = true;
},
[&](const CallEntryMemoryStateMergeOperation &)
{
for (auto & nodeInput : node.Inputs())
{
traceModRefChains(*nodeInput.origin(), summary);
hasModRefChainLinkAboveInRegion |=
traceModRefChains(*nodeInput.origin(), summary);
}
doneTracing = true;
},
[&](const MemoryStateJoinOperation &)
{
for (auto & nodeInput : node.Inputs())
{
traceModRefChains(*nodeInput.origin(), summary);
hasModRefChainLinkAboveInRegion |=
traceModRefChains(*nodeInput.origin(), summary);
}
doneTracing = true;
},
[&](const MemoryStateMergeOperation &)
{
for (auto & nodeInput : node.Inputs())
{
traceModRefChains(*nodeInput.origin(), summary);
hasModRefChainLinkAboveInRegion |=
traceModRefChains(*nodeInput.origin(), summary);
}
doneTracing = true;
},
Expand Down Expand Up @@ -498,8 +511,8 @@ LoadChainSeparation::traceModRefChains(rvsdg::Output & startOutput, ModRefChainS
} while (!doneTracing);

summary.add(std::move(currentModRefChain));
Context_->addModRefChainInformation(startOutput, { summary.hasModificationChainLink });
return summary.hasModificationChainLink;
Context_->addModRefChainInformation(startOutput, { hasModRefChainLinkAboveInRegion });
return hasModRefChainLinkAboveInRegion;
}

}
5 changes: 0 additions & 5 deletions jlm/llvm/opt/LoadChainSeparation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,9 @@ class LoadChainSeparation final : public rvsdg::Transformation
void
add(ModRefChainLink modRefChainLink)
{
hasModificationChainLink |= modRefChainLink.type == ModRefChainLink::Type::Modification;
links.push_back(std::move(modRefChainLink));
}

bool hasModificationChainLink = false;
std::vector<ModRefChainLink> links{};
};

Expand All @@ -126,11 +124,8 @@ class LoadChainSeparation final : public rvsdg::Transformation
{
modRefChains.push_back(std::move(modRefChain));
}

hasModificationChainLink |= modRefChain.hasModificationChainLink;
}

bool hasModificationChainLink = false;
std::vector<ModRefChain> modRefChains{};
};

Expand Down
12 changes: 6 additions & 6 deletions jlm/llvm/opt/unroll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,9 +347,9 @@ create_unrolled_gamma_predicate(const LoopUnrollInfo & ui, size_t factor)
rvsdg::SimpleNode::Create(*region, ui.armoperation().copy(), { ui.init(), mul }).output(0);
/* FIXME: order of operands */
auto cmp = rvsdg::SimpleNode::Create(*region, ui.cmpoperation().copy(), { arm, end }).output(0);
auto pred = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & predNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

return pred;
return predNode.output(0);
}

static jlm::rvsdg::Output *
Expand Down Expand Up @@ -379,9 +379,9 @@ create_unrolled_theta_predicate(
/* FIXME: order of operands */
auto cmp =
SimpleNode::Create(*region, ui.cmpoperation().copy(), { arm, iend->origin() }).output(0);
auto pred = match(1, { { 1, 1 } }, 0, 2, cmp);
auto & predNode = MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

return pred;
return predNode.output(0);
}

static jlm::rvsdg::Output *
Expand All @@ -393,9 +393,9 @@ create_residual_gamma_predicate(const rvsdg::SubstitutionMap & smap, const LoopU

/* FIXME: order of operands */
auto cmp = rvsdg::SimpleNode::Create(*region, ui.cmpoperation().copy(), { idv, end }).output(0);
auto pred = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & predNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

return pred;
return predNode.output(0);
}

static void
Expand Down
17 changes: 0 additions & 17 deletions jlm/rvsdg/control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,21 +175,4 @@ MatchOperation::copy() const
return std::make_unique<MatchOperation>(*this);
}

jlm::rvsdg::Output *
match(
size_t nbits,
const std::unordered_map<uint64_t, uint64_t> & mapping,
uint64_t default_alternative,
size_t nalternatives,
jlm::rvsdg::Output * operand)
{
return CreateOpNode<MatchOperation>(
{ operand },
nbits,
mapping,
default_alternative,
nalternatives)
.output(0);
}

}
8 changes: 0 additions & 8 deletions jlm/rvsdg/control.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,14 +264,6 @@ class MatchOperation final : public UnaryOperation
std::unordered_map<uint64_t, uint64_t> mapping_;
};

jlm::rvsdg::Output *
match(
size_t nbits,
const std::unordered_map<uint64_t, uint64_t> & mapping,
uint64_t default_alternative,
size_t nalternatives,
jlm::rvsdg::Output * operand);

}

#endif
4 changes: 2 additions & 2 deletions jlm/rvsdg/gamma.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ perform_control_constant_reduction(std::unordered_set<jlm::rvsdg::Output *> & ou
}

auto origin = matchNode->input(0)->origin();
auto m = match(matchOperation->nbits(), new_mapping, defalt, nalternatives, origin);
xv.output->divert_users(m);
auto & matchNode = MatchOperation::CreateNode(*origin, new_mapping, defalt, nalternatives);
xv.output->divert_users(matchNode.output(0));
}
}

Expand Down
8 changes: 4 additions & 4 deletions tests/jlm/hls/backend/rvsdg2rhls/MemoryConverterTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,9 @@ TEST(MemoryConverterTests, TestThetaLoad)
auto lve = theta->AddLoopVar(lambda->GetFunctionArguments()[2]);
auto arm = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitadd_op>({ idv.pre, lvs.pre }, 32).output(0);
auto cmp = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitult_op>({ arm, lve.pre }, 32).output(0);
auto match = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
idv.post->divert_to(arm);
theta->set_predicate(match);
theta->set_predicate(matchNode.output(0));

// Load node
auto loadAddress = theta->AddLoopVar(lambda->GetFunctionArguments()[3]);
Expand Down Expand Up @@ -441,9 +441,9 @@ TEST(MemoryConverterTests, TestThetaStore)
auto lve = theta->AddLoopVar(lambda->GetFunctionArguments()[2]);
auto arm = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitadd_op>({ idv.pre, lvs.pre }, 32).output(0);
auto cmp = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitult_op>({ arm, lve.pre }, 32).output(0);
auto match = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
idv.post->divert_to(arm);
theta->set_predicate(match);
theta->set_predicate(matchNode.output(0));

// Store node
auto storeAddress = theta->AddLoopVar(lambda->GetFunctionArguments()[3]);
Expand Down
12 changes: 6 additions & 6 deletions tests/jlm/hls/backend/rvsdg2rhls/MemoryQueueTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ TEST(MemoryQueueTests, TestSingleLoad)
// Theta
auto theta = jlm::rvsdg::ThetaNode::create(lambda->subregion());
auto constant = &jlm::rvsdg::BitConstantOperation::create(*theta->subregion(), { 1, 1 });
auto match = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, constant);
theta->set_predicate(match);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*constant, { { 1, 1 } }, 0, 2);
theta->set_predicate(matchNode.output(0));

// Load node
auto functionArguments = lambda->GetFunctionArguments();
Expand Down Expand Up @@ -109,8 +109,8 @@ TEST(MemoryQueueTests, TestLoadStore)
// Theta
auto theta = jlm::rvsdg::ThetaNode::create(lambda->subregion());
auto constant = &jlm::rvsdg::BitConstantOperation::create(*theta->subregion(), { 1, 1 });
auto match = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, constant);
theta->set_predicate(match);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*constant, { { 1, 1 } }, 0, 2);
theta->set_predicate(matchNode.output(0));

// Load node
auto functionArguments = lambda->GetFunctionArguments();
Expand Down Expand Up @@ -188,8 +188,8 @@ TEST(MemoryQueueTests, TestAddrQueue)
// Theta
auto theta = jlm::rvsdg::ThetaNode::create(lambda->subregion());
auto constant = &jlm::rvsdg::BitConstantOperation::create(*theta->subregion(), { 1, 1 });
auto match = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, constant);
theta->set_predicate(match);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*constant, { { 1, 1 } }, 0, 2);
theta->set_predicate(matchNode.output(0));

// Load node
auto functionArguments = lambda->GetFunctionArguments();
Expand Down
8 changes: 4 additions & 4 deletions tests/jlm/hls/backend/rvsdg2rhls/TestFork.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ TEST(ForkInsertionTests, ForkInsertion)

auto arm = rvsdg::CreateOpNode<rvsdg::bitadd_op>({ idvBuffer, lvsBuffer }, 32).output(0);
auto cmp = rvsdg::CreateOpNode<rvsdg::bitult_op>({ arm, lveBuffer }, 32).output(0);
auto match = rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & matchNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

loop->set_predicate(match);
loop->set_predicate(matchNode.output(0));

auto lambdaOutput = lambda->finalize({ loop->output(0), loop->output(1), loop->output(2) });
rvsdg::GraphExport::Create(*lambdaOutput, "");
Expand Down Expand Up @@ -97,9 +97,9 @@ TEST(SinkInsertionTests, ConstantForkInsertion)

auto arm = rvsdg::CreateOpNode<rvsdg::bitadd_op>({ idvBuffer, bitConstant1 }, 32).output(0);
auto cmp = rvsdg::CreateOpNode<rvsdg::bitult_op>({ arm, bitConstant1 }, 32).output(0);
auto match = rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & matchNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

loop->set_predicate(match);
loop->set_predicate(matchNode.output(0));

auto lambdaOutput = lambda->finalize({ loop->output(0) });
rvsdg::GraphExport::Create(*lambdaOutput, "");
Expand Down
8 changes: 6 additions & 2 deletions tests/jlm/hls/backend/rvsdg2rhls/TestGamma.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@ TEST(GammaConversionTests, TestWithMatch)
rm.Rvsdg().GetRootRegion(),
LlvmLambdaOperation::Create(ft, "f", Linkage::externalLinkage));

auto match = jlm::rvsdg::match(1, { { 0, 0 } }, 1, 2, lambda->GetFunctionArguments()[0]);
auto gamma = jlm::rvsdg::GammaNode::create(match, 2);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(
*lambda->GetFunctionArguments()[0],
{ { 0, 0 } },
1,
2);
auto gamma = jlm::rvsdg::GammaNode::create(matchNode.output(0), 2);
auto ev1 = gamma->AddEntryVar(lambda->GetFunctionArguments()[1]);
auto ev2 = gamma->AddEntryVar(lambda->GetFunctionArguments()[2]);
auto ex = gamma->AddExitVar({ ev1.branchArgument[0], ev2.branchArgument[1] });
Expand Down
4 changes: 2 additions & 2 deletions tests/jlm/hls/backend/rvsdg2rhls/TestTheta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ TEST(ThetaConversionTests, TestUnknownBoundaries)

auto arm = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitadd_op>({ idv.pre, lvs.pre }, 32).output(0);
auto cmp = jlm::rvsdg::CreateOpNode<jlm::rvsdg::bitult_op>({ arm, lve.pre }, 32).output(0);
auto match = jlm::rvsdg::match(1, { { 1, 1 } }, 0, 2, cmp);
auto & matchNode = jlm::rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);

idv.post->divert_to(arm);
theta->set_predicate(match);
theta->set_predicate(matchNode.output(0));

auto f = lambda->finalize({ theta->output(0), theta->output(1), theta->output(2) });
jlm::rvsdg::GraphExport::Create(*f, "");
Expand Down
Loading
Loading