Jlm
Loading...
Searching...
No Matches
ControlOperations.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2026 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
9
10namespace jlm::llvm
11{
12
13std::optional<std::vector<rvsdg::Output *>>
15 const rvsdg::MatchOperation & matchOperation,
16 const std::vector<rvsdg::Output *> & operands)
17{
18 JLM_ASSERT(operands.size() == 1);
19 auto & operand = *operands[0];
20
21 const auto & tracedOperand = llvm::traceOutput(operand);
22 auto [constantNode, constantOperation] =
24 if (!constantOperation)
25 return std::nullopt;
26
27 const auto controlAlternative =
28 matchOperation.alternative(constantOperation->Representation().to_uint());
29
30 auto & controlConstantResult = rvsdg::ControlConstantOperation::create(
31 *operand.region(),
32 matchOperation.nalternatives(),
33 controlAlternative);
34
35 return std::vector({ &controlConstantResult });
36}
37
38}
static Output & create(Region &region, ControlValueRepresentation value)
Definition control.hpp:122
uint64_t alternative(uint64_t value) const noexcept
Definition control.hpp:186
uint64_t nalternatives() const noexcept
Definition control.hpp:180
#define JLM_ASSERT(x)
Definition common.hpp:16
Global memory state passed between functions.
rvsdg::Output & traceOutput(rvsdg::Output &output, const rvsdg::Region *withinRegion)
Definition Trace.cpp:62
std::optional< std::vector< rvsdg::Output * > > foldMatchOperationWithConstant(const rvsdg::MatchOperation &matchOperation, const std::vector< rvsdg::Output * > &operands)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Definition node.hpp:872