2#define REDUCT_RVSDG_H 1
11struct reduct_rvsdg_origin;
12struct reduct_rvsdg_user;
13struct reduct_rvsdg_edge;
105typedef struct reduct_rvsdg_origin
109 struct reduct_rvsdg_node*
node;
115 struct reduct_rvsdg_origin*
next;
122typedef struct reduct_rvsdg_user
126 struct reduct_rvsdg_node*
node;
130 struct reduct_rvsdg_edge*
edge;
131 struct reduct_rvsdg_user*
next;
138typedef struct reduct_rvsdg_edge
141 struct reduct_rvsdg_user*
user;
142 struct reduct_rvsdg_edge*
next;
143 struct reduct_rvsdg_edge*
prev;
150#define REDUCT_RVSDG_NODE_TYPE_INVALID 0
151#define REDUCT_RVSDG_NODE_TYPE_SIMPLE_OPCODE 1
152#define REDUCT_RVSDG_NODE_TYPE_SIMPLE_CONST 2
153#define REDUCT_RVSDG_NODE_TYPE_GAMMA 3
154#define REDUCT_RVSDG_NODE_TYPE_LAMBDA 4
155#define REDUCT_RVSDG_NODE_TYPE_PHI 5
161#define REDUCT_RVSDG_NODE_FLAGS_NONE 0
162#define REDUCT_RVSDG_NODE_FLAGS_LAMBDA_VARIADIC (1 << 0)
168typedef struct reduct_rvsdg_node_info
187typedef struct reduct_rvsdg_node
193 uint8_t _reserved[4];
198 struct reduct_rvsdg_node*
next;
209typedef struct reduct_rvsdg_region
212 uint8_t _reserved[6];
218 struct reduct_rvsdg_region*
next;
300 struct reduct_rvsdg_origin* right);
315 struct reduct_rvsdg_origin* c);
344 uint8_t regionCount);
380 struct reduct_rvsdg_origin* newOrigin);
445 uint16_t inputIndex, uint16_t* outArgIndex);
457 uint16_t argIndex, uint16_t* outInputIndex);
575 struct reduct_rvsdg_node* node);
reduct_opcode_t
Opcode enumeration.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_call(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_rvsdg_origin_t *callable)
Create a CALL opcode node and connect a callable as its first input.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_simple_ternary(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_opcode_t opcode, struct reduct_rvsdg_origin *a, struct reduct_rvsdg_origin *b, struct reduct_rvsdg_origin *c)
Create a simple ternary opcode node.
REDUCT_API reduct_rvsdg_origin_t * reduct_rvsdg_region_lift_origin(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_rvsdg_origin_t *outerValue)
Lift an origin from an outer region to an inner region, creating a new argument in the inner region a...
REDUCT_API struct reduct_rvsdg_origin * reduct_rvsdg_region_get_argument(reduct_rvsdg_region_t *region, uint16_t index)
Get an argument port of a region by index.
REDUCT_API reduct_rvsdg_region_t * reduct_rvsdg_node_add_region(struct reduct *reduct, reduct_rvsdg_node_t *node)
Add a new region to a node.
REDUCT_API void reduct_rvsdg_node_delete(struct reduct *reduct, reduct_rvsdg_node_t *node)
Removes from the region and disconnects from any connections a node and any nodes connected to its in...
REDUCT_API void reduct_rvsdg_region_remove_node(reduct_rvsdg_node_t *node)
Removes a node from its region.
REDUCT_API bool reduct_rvsdg_node_is_inside_phi(reduct_rvsdg_node_t *node)
Check if a nodes grandparent is a phi node.
REDUCT_API reduct_rvsdg_user_t * reduct_rvsdg_node_add_input(struct reduct *reduct, reduct_rvsdg_node_t *node)
Add a new input port to a node.
REDUCT_API reduct_rvsdg_origin_t * reduct_rvsdg_origin_new(struct reduct *reduct)
Allocate a new IR origin port.
REDUCT_API const reduct_rvsdg_node_info_t * reduct_rvsdg_node_get_info(reduct_rvsdg_node_type_t type)
Get information about a node type.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new(struct reduct *reduct)
Allocate a new IR node.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_simple_unary(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_opcode_t opcode, struct reduct_rvsdg_origin *input)
Create a simple unary opcode node.
uint8_t reduct_rvsdg_node_flags_t
Node flags.
REDUCT_API reduct_rvsdg_user_t * reduct_rvsdg_user_new(struct reduct *reduct)
Allocate a new IR user port.
REDUCT_API reduct_rvsdg_origin_t * reduct_rvsdg_region_add_argument(struct reduct *reduct, reduct_rvsdg_region_t *region)
Add a new argument port to a region.
REDUCT_API bool reduct_rvsdg_node_map_input_to_argument(reduct_rvsdg_node_t *node, struct reduct_rvsdg_region *region, uint16_t inputIndex, uint16_t *outArgIndex)
Map a node input index to a region argument index.
REDUCT_API struct reduct_rvsdg_node * reduct_rvsdg_node_get_input_node(reduct_rvsdg_node_t *node, uint16_t index)
Get the node connected to an input node of a node by index.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_simple_opcode(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_opcode_t opcode)
Create a simple opcode node.
REDUCT_API void reduct_rvsdg_node_phi_wrap_lambda(struct reduct *reduct, reduct_rvsdg_node_t *lambda)
Wrap a lambda node in a phi node for recursive calls.
REDUCT_API void reduct_rvsdg_region_add_node(reduct_rvsdg_region_t *region, reduct_rvsdg_node_t *node)
Adds a node to a region.
reduct_rvsdg_owner_kind_t
Owner of a data dependency origin or user.
REDUCT_API void reduct_rvsdg_edge_connect(struct reduct *reduct, reduct_rvsdg_origin_t *origin, reduct_rvsdg_user_t *user)
Connects an origin to a user via an edge.
REDUCT_API void reduct_rvsdg_origin_redirect_users(struct reduct_rvsdg_origin *origin, struct reduct_rvsdg_origin *newOrigin)
Redirect all users of a origin to a new origin.
REDUCT_API reduct_rvsdg_region_t * reduct_rvsdg_region_new(struct reduct *reduct)
Allocate a new IR region.
REDUCT_API struct reduct_rvsdg_user * reduct_rvsdg_node_get_input(reduct_rvsdg_node_t *node, uint16_t index)
Get an input port of a node by index.
REDUCT_API bool reduct_rvsdg_node_is_identical(struct reduct *reduct, reduct_rvsdg_node_t *nodeA, reduct_rvsdg_node_t *nodeB)
Check if two nodes are structurally identical.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_simple_binary(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_opcode_t opcode, struct reduct_rvsdg_origin *left, struct reduct_rvsdg_origin *right)
Create a simple binary opcode node.
REDUCT_API bool reduct_rvsdg_region_is_ancestor_or_same(reduct_rvsdg_region_t *region, reduct_rvsdg_region_t *ancestor)
Check if a region is an ancestor of another, or if they are the same.
REDUCT_API void reduct_rvsdg_edge_redirect(reduct_rvsdg_edge_t *edge, reduct_rvsdg_origin_t *newOrigin)
Redirect an existing edge from its current origin to a new origin.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_simple_constant(struct reduct *reduct, reduct_rvsdg_region_t *region, reduct_handle_t constant)
Create a simple constant node.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_lambda(struct reduct *reduct, reduct_rvsdg_region_t *region)
Create a lambda node.
REDUCT_API bool reduct_rvsdg_node_map_argument_to_input(reduct_rvsdg_node_t *node, struct reduct_rvsdg_region *region, uint16_t argIndex, uint16_t *outInputIndex)
Map a region argument index to an input index of the parent node.
REDUCT_API struct reduct_rvsdg_node * reduct_rvsdg_node_copy(struct reduct *reduct, reduct_rvsdg_region_t *region, struct reduct_rvsdg_node *node)
Recursively copy a node.
REDUCT_API struct reduct_rvsdg_origin * reduct_rvsdg_node_get_input_origin(reduct_rvsdg_node_t *node, uint16_t index)
Get the output of the node connected to an input node of a node by index.
REDUCT_API void reduct_rvsdg_edge_disconnect(reduct_rvsdg_edge_t *edge)
Disconnect an edge from its origin and user.
uint8_t reduct_rvsdg_node_type_t
Node type.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_gamma(struct reduct *reduct, reduct_rvsdg_region_t *region, uint8_t regionCount)
Create a gamma node.
REDUCT_API reduct_rvsdg_edge_t * reduct_rvsdg_edge_new(struct reduct *reduct)
Allocate a new IR edge.
REDUCT_API reduct_rvsdg_node_t * reduct_rvsdg_node_new_phi(struct reduct *reduct, reduct_rvsdg_region_t *region)
Create a phi node.
REDUCT_API bool reduct_rvsdg_node_is_recur_origin(reduct_rvsdg_node_t *node, struct reduct_rvsdg_origin *origin)
Check if an origin is a recursion target for a given phi node.
@ REDUCT_RVSDG_OWNER_NODE
@ REDUCT_RVSDG_OWNER_REGION
Bytecode instruction format.
Edge structure representing a data dependency.
struct reduct_rvsdg_edge * next
The next edge in the list.
struct reduct_rvsdg_edge * prev
The previous edge in the list.
struct reduct_rvsdg_origin * origin
The node where the edge originates.
struct reduct_rvsdg_user * user
The node where the edge ends.
Information about a node type.
const char * color
The color of the node type for visualization.
const char * name
The name of the node type.
uint8_t dataInputOffset
The index where data inputs begin (skipping control inputs).
struct reduct_rvsdg_user * firstInput
List of input ports.
struct reduct_rvsdg_region * parent
The region this node belongs to.
reduct_rvsdg_node_type_t type
The type of the node.
uint8_t inputCount
Number of input edges.
uint8_t regionCount
Number of regions in the node.
reduct_handle_t constant
The constant value associated with the node.
reduct_rvsdg_node_flags_t flags
Node flags, interpretation depends on node type.
struct reduct_rvsdg_node * next
Next node in the region's list.
struct reduct_rvsdg_region * firstRegion
List of regions in the node.
reduct_opcode_t opcode
The opcode associated with the node.
struct reduct_rvsdg_origin * output
The output port.
Origin of a data dependency edge.
struct reduct_rvsdg_region * region
The region this origin belongs to.
uint16_t useCount
Length of the uses list.
struct reduct_rvsdg_origin * next
Next origin in the node/region list.
struct reduct_rvsdg_edge * edges
List of edges originating from this output/argument.
uint16_t index
The index for the associated output/argument.
struct reduct_rvsdg_node * node
The node this origin belongs to.
reduct_rvsdg_owner_kind_t ownerKind
The kind of owner (node or region).
struct reduct_rvsdg_region * next
Next region in the parent node's list.
uint16_t argumentCount
Number of arguments to the region.
reduct_rvsdg_origin_t * firstArgument
List of argument ports.
reduct_rvsdg_user_t * result
The result port.
struct reduct_rvsdg_node * parent
The node that owns this region.
struct reduct_rvsdg_node * firstNode
First node in the region.
struct reduct_rvsdg_node * lastNode
Last node in the region.
User of a data dependency edge.
uint16_t index
The index for the associated input/result.
struct reduct_rvsdg_node * node
The node this user belongs to.
struct reduct_rvsdg_region * region
The region this user belongs to.
reduct_rvsdg_owner_kind_t ownerKind
The kind of owner (node or region).
struct reduct_rvsdg_user * next
Next user in the node/region list.
struct reduct_rvsdg_edge * edge
The single edge connecting to this input's/result's origin.