14 #ifndef MLIR_INTERFACES_CONTROLFLOWINTERFACES_H
15 #define MLIR_INTERFACES_CONTROLFLOWINTERFACES_H
20 class BranchOpInterface;
21 class RegionBranchOpInterface;
57 return producedOperandCount + forwardedOperands.
size();
70 return index < producedOperandCount;
79 return forwardedOperands[index - producedOperandCount].get();
87 return forwardedOperands;
94 "can't slice operands produced by the operation");
95 return forwardedOperands.
slice(subStart - producedOperandCount, subLen);
100 void erase(
unsigned subStart,
unsigned subLen = 1) {
102 "can't erase operands produced by the operation");
103 forwardedOperands.
erase(subStart - producedOperandCount, subLen);
114 "can't map operand produced by the operation");
117 (blockArgumentIndex - producedOperandCount);
123 unsigned producedOperandCount;
136 std::optional<BlockArgument>
138 unsigned operandIndex, Block *successor);
142 const SuccessorOperands &operands);
170 : region(region), inputs(regionInputs) {}
182 bool isParent()
const {
return region ==
nullptr; }
207 assert(region &&
"Region must not be null");
219 maybeRegion =
nullptr;
226 maybeRegion = ®ion;
231 bool isParent()
const {
return maybeRegion ==
nullptr; }
239 return lhs.maybeRegion == rhs.maybeRegion;
252 return !(lhs == rhs);
263 : lower(lb), upper(ub) {
264 assert((!ub || ub >= lb) &&
"upper bound cannot be less than lower bound");
282 std::optional<unsigned> upper;
308 template <
typename ConcreteType>
311 static_assert(ConcreteType::template hasTrait<IsTerminator>(),
312 "expected operation to be a terminator");
313 static_assert(ConcreteType::template hasTrait<ZeroResults>(),
314 "expected operation to have zero results");
315 static_assert(ConcreteType::template hasTrait<ZeroSuccessors>(),
316 "expected operation to have zero successors");
329 #include "mlir/Interfaces/ControlFlowInterfaces.h.inc"
This class represents upper and lower bounds on the number of times a region of a RegionBranchOpInter...
static InvocationBounds getUnknown()
Returns the unknown invocation bounds, i.e., there is no information on how many times a region may b...
std::optional< unsigned > getUpperBound() const
Return the upper bound.
InvocationBounds(unsigned lb, std::optional< unsigned > ub)
Create invocation bounds.
unsigned getLowerBound() const
Return the lower bound.
This class provides a mutable adaptor for a range of operands.
unsigned size() const
Returns the current size of the range.
MutableOperandRange slice(unsigned subStart, unsigned subLen, std::optional< OperandSegment > segment=std::nullopt) const
Slice this range into a sub range, with the additional operand segment.
void erase(unsigned subStart, unsigned subLen=1)
Erase the operands within the given sub-range.
void append(ValueRange values)
Append the given values to the range.
Helper class for implementing traits.
This class implements the operand iterators for the Operation class.
unsigned getBeginOperandIndex() const
Return the operand index of the first element of this range.
Operation is the basic unit of execution within MLIR.
This class represents a point being branched from in the methods of the RegionBranchOpInterface.
RegionBranchPoint(std::nullptr_t)=delete
Explicitly stops users from constructing with nullptr.
RegionBranchPoint(RegionSuccessor successor)
Constructs a RegionBranchPoint from the the target of a RegionSuccessor instance.
bool isParent() const
Returns true if branching from the parent op.
RegionBranchPoint & operator=(Region ®ion)
Assigns a region being branched from.
static constexpr RegionBranchPoint parent()
Returns an instance of RegionBranchPoint representing the parent operation.
RegionBranchPoint(Region *region)
Creates a RegionBranchPoint that branches from the given region.
friend bool operator==(RegionBranchPoint lhs, RegionBranchPoint rhs)
Returns true if the two branch points are equal.
RegionBranchPoint(Region ®ion)
Region * getRegionOrNull() const
Returns the region if branching from a region.
This class represents a successor of a region.
RegionSuccessor(Region *region, Block::BlockArgListType regionInputs={})
Initialize a successor that branches to another region of the parent operation.
ValueRange getSuccessorInputs() const
Return the inputs to the successor that are remapped by the exit values of the current region.
RegionSuccessor()
Constructor with no arguments.
bool isParent() const
Return true if the successor is the parent operation.
Region * getSuccessor() const
Return the given region successor.
RegionSuccessor(Operation::result_range results)
Initialize a successor that branches back to/out of the parent operation.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
This class implements the result iterators for the Operation class.
This class models how operands are forwarded to block arguments in control flow.
SuccessorOperands(unsigned producedOperandCount, MutableOperandRange forwardedOperands)
Constructs a SuccessorOperands with the given amount of produced operands and forwarded operands.
MutableOperandRange slice(unsigned subStart, unsigned subLen) const
Get a slice of the operands forwarded to the successor.
void erase(unsigned subStart, unsigned subLen=1)
Erase operands forwarded to the successor.
MutableOperandRange getMutableForwardedOperands() const
Get the range of operands that are simply forwarded to the successor.
SuccessorOperands(MutableOperandRange forwardedOperands)
Constructs a SuccessorOperands with no produced operands that simply forwards operands to the success...
Value operator[](unsigned index) const
Returns the Value that is passed to the successors block argument denoted by index.
unsigned getOperandIndex(unsigned blockArgumentIndex) const
Gets the index of the forwarded operand within the operation which maps to the block argument denoted...
bool isOperandProduced(unsigned index) const
Returns true if the successor operand denoted by index is produced by the operation.
unsigned getProducedOperandCount() const
Returns the amount of operands that are produced internally by the operation.
bool empty() const
Returns true if there are no successor operands.
void append(ValueRange valueRange)
Add new operands that are forwarded to the successor.
unsigned size() const
Returns the amount of operands passed to the successor.
OperandRange getForwardedOperands() const
Get the range of operands that are simply forwarded to the successor.
This class provides an abstraction over the different types of ranges over Values.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
std::optional< BlockArgument > getBranchSuccessorArgument(const SuccessorOperands &operands, unsigned operandIndex, Block *successor)
Return the BlockArgument corresponding to operand operandIndex in some successor if operandIndex is w...
LogicalResult verifyBranchSuccessorOperands(Operation *op, unsigned succNo, const SuccessorOperands &operands)
Verify that the given operands match those of the given successor block.
LogicalResult verifyTypesAlongControlFlowEdges(Operation *op)
Verify that types match along control flow edges described the given op.
Include the generated interface declarations.
bool insideMutuallyExclusiveRegions(Operation *a, Operation *b)
Return true if a and b are in mutually exclusive regions as per RegionBranchOpInterface.
Region * getEnclosingRepetitiveRegion(Operation *op)
Return the first enclosing region of the given op that may be executed repetitively as per RegionBran...
bool operator!=(RegionBranchPoint lhs, RegionBranchPoint rhs)
This trait indicates that a terminator operation is "return-like".
static LogicalResult verifyTrait(Operation *op)