17 return "TestStructuralOperation";
20 std::unique_ptr<Operation>
23 return std::make_unique<TestStructuralOperation>(*
this);
41 for (
auto & argument :
subregion(0)->Arguments())
43 if (
const auto input = argument->input())
47 auto newInputVar = node->addInputWithArguments(newOrigin);
48 for (
size_t n = 0; n < oldInputVar.argument.size(); n++)
50 auto oldArgument = oldInputVar.argument[n];
51 auto newArgument = newInputVar.argument[n];
52 smap.
insert(oldArgument, newArgument);
57 auto newInputVar = node->addArguments(argument->Type());
80 for (
auto & result :
subregion(0)->Results())
82 if (
const auto output = result->output())
86 std::vector<Output *> newOrigins;
87 for (
auto oldOutputVarResult : oldOutputVar.result)
89 auto & newOrigin = smap.
lookup(*oldOutputVarResult->origin());
90 newOrigins.push_back(&newOrigin);
92 auto newOutputVar = node->addOutputWithResults(newOrigins);
93 smap.
insert(oldOutputVar.output, newOutputVar.output);
97 std::vector<Output *> newOrigins;
101 JLM_ASSERT(subregionResult->output() ==
nullptr);
102 auto & newOrigin = smap.
lookup(*subregionResult->origin());
103 newOrigins.push_back(&newOrigin);
105 node->addResults(newOrigins);
129 if (argument->input() == inputVar.
input)
131 inputVar.
argument.push_back(argument);
151 if (result->output() == outputVar.
output)
153 outputVar.
result.push_back(result);
171 util::assertedCast<StructuralInput>(inputVar.input),
172 inputVar.input->Type());
173 inputVar.argument.push_back(argument);
183 throw std::out_of_range(
"Invalid input index.");
185 auto in =
input(index);
186 for (
auto & argument : in->arguments)
188 argument.region()->RemoveArguments({ argument.index() });
197 std::vector<RegionArgument *> arguments;
201 arguments.push_back(argument);
204 return {
nullptr, std::move(arguments) };
210 return *
addInput(std::make_unique<StructuralInput>(
this, &origin, origin.
Type()),
true);
216 return *
addOutput(std::make_unique<StructuralOutput>(
this, std::move(
type)));
223 throw util::Error(
"Insufficient number of origins.");
229 const auto origin = origins[n++];
233 util::assertedCast<StructuralOutput>(outputVar.output),
235 outputVar.result.push_back(result);
245 throw std::out_of_range(
"Invalid output index.");
248 for (
auto & result : out->results)
250 result.region()->RemoveResults({ result.index() });
260 throw util::Error(
"Insufficient number of origins.");
263 std::vector<RegionResult *> results;
266 const auto origin = origins[n++];
268 results.push_back(result);
271 return {
nullptr, std::move(results) };
size_t RemoveInputs(const util::HashSet< size_t > &indices)
size_t ninputs() const noexcept
size_t noutputs() const noexcept
size_t RemoveOutputs(const util::HashSet< size_t > &indices)
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
size_t index() const noexcept
static RegionArgument & Create(rvsdg::Region ®ion, StructuralInput *input, std::shared_ptr< const rvsdg::Type > type)
Creates region entry argument.
static RegionResult & Create(rvsdg::Region ®ion, rvsdg::Output &origin, StructuralOutput *output, std::shared_ptr< const rvsdg::Type > type)
Create region exit result.
Represent acyclic RVSDG subgraphs.
RegionResult * result(size_t index) const noexcept
RegionArgumentRange Arguments() noexcept
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
size_t nresults() const noexcept
size_t index() const noexcept
RegionArgument * argument(size_t index) const noexcept
size_t narguments() const noexcept
RegionResultRange Results() noexcept
StructuralInput * addInput(std::unique_ptr< StructuralInput > input, bool notifyRegion)
StructuralOutput * addOutput(std::unique_ptr< StructuralOutput > input)
SubregionIteratorRange Subregions()
size_t nsubregions() const noexcept
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
rvsdg::Region * subregion(size_t index) const noexcept
void insert(const Output *original, Output *substitute)
Output & lookup(const Output &original) const
void removeInputAndArguments(size_t index)
OutputVar addOutputWithResults(const std::vector< Output * > &origins)
InputVar addInputWithArguments(Output &origin)
OutputVar mapOutput(const Output &output) const
~TestStructuralNode() noexcept override
OutputVar addResults(const std::vector< Output * > &origins)
static TestStructuralNode * create(Region *parent, const size_t numSubregions)
InputVar mapInput(const Input &input) const
void removeOutputAndResults(size_t index)
StructuralOutput & addOutputOnly(std::shared_ptr< const Type > type)
InputVar addArguments(const std::shared_ptr< const Type > &type)
TestStructuralNode * copy(Region *region, SubstitutionMap &smap) const override
Copy a node with substitutions.
StructuralInput & addInputOnly(Output &origin)
std::unique_ptr< Operation > copy() const override
~TestStructuralOperation() noexcept override
static std::string type(const Node *n)
A variable routed out of a TestStructuralNode.
std::vector< RegionResult * > result
StructuralOutput * output