2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @brief be transform helper extracted from the ia32 backend.
9 * @author Matthias Braun, Michael Beck
12 #ifndef FIRM_BE_BETRANSHLP_H
13 #define FIRM_BE_BETRANSHLP_H
16 #include "firm_types.h"
19 * A callback to pre-transform some nodes before the transformation starts.
21 typedef void (arch_pretrans_nodes)(void);
24 * The type of a transform function.
26 typedef ir_node *(be_transform_func)(ir_node *node);
28 /** pre-transform a node */
29 ir_node *be_pre_transform_node(ir_node *place);
32 * Calls transformation function for given node and marks it visited.
34 ir_node *be_transform_node(ir_node *node);
37 * Creates a new phi (needs some special handling since we can't transform
38 * all predecessors yet).
40 ir_node *be_transform_phi(ir_node *node, const arch_register_req_t *req);
43 * Duplicate all dependency edges of a node.
45 void be_duplicate_deps(ir_node *old_node, ir_node *new_node);
48 * Duplicate a node during transformation.
50 ir_node *be_duplicate_node(ir_node *node);
52 /** clear transform functions and sets some virtual nodes like
53 * Start, Sync, Pin to the duplication transformer */
54 void be_start_transform_setup(void);
56 /** register a transform function for a specific node type */
57 void be_set_transform_function(ir_op *op, be_transform_func func);
60 * Associate an old node with a transformed node. Uses link field.
62 void be_set_transformed_node(ir_node *old_node, ir_node *new_node);
65 * returns 1 if the node is already transformed
67 int be_is_transformed(const ir_node *node);
70 * enqueue all inputs into the transform queue.
72 void be_enqueue_preds(ir_node *node);
75 * Transform a graph. Transformers must be registered first.
77 void be_transform_graph(ir_graph *irg, arch_pretrans_nodes *func);
79 typedef bool (*upper_bits_clean_func)(const ir_node *node, ir_mode *mode);
82 * register a test function for be_upper_bits_clean for a specific node
85 void be_set_upper_bits_clean_function(ir_op *op, upper_bits_clean_func func);
88 * returns true if it is assured, that the upper bits of a node are "clean"
89 * which means for a 16 or 8 bit value, that the upper bits in the register
90 * are 0 for unsigned and a copy of the last significant bit for signed
93 bool be_upper_bits_clean(const ir_node *node, ir_mode *mode);