beifg: Factorise code to count interference components.
[libfirm] / ir / be / betranshlp.h
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @brief       be transform helper extracted from the ia32 backend.
9  * @author      Matthias Braun, Michael Beck
10  * @date        14.06.2007
11  */
12 #ifndef FIRM_BE_BETRANSHLP_H
13 #define FIRM_BE_BETRANSHLP_H
14
15 #include "be_types.h"
16 #include "firm_types.h"
17
18 /**
19  * A callback to pre-transform some nodes before the transformation starts.
20  */
21 typedef void (arch_pretrans_nodes)(void);
22
23 /**
24  * The type of a transform function.
25  */
26 typedef ir_node *(be_transform_func)(ir_node *node);
27
28 /** pre-transform a node */
29 ir_node *be_pre_transform_node(ir_node *place);
30
31 /**
32  * Calls transformation function for given node and marks it visited.
33  */
34 ir_node *be_transform_node(ir_node *node);
35
36 /**
37  * Creates a new phi (needs some special handling since we can't transform
38  * all predecessors yet).
39  */
40 ir_node *be_transform_phi(ir_node *node, const arch_register_req_t *req);
41
42 /**
43  * Duplicate all dependency edges of a node.
44  */
45 void be_duplicate_deps(ir_node *old_node, ir_node *new_node);
46
47 /**
48  * Duplicate a node during transformation.
49  */
50 ir_node *be_duplicate_node(ir_node *node);
51
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);
55
56 /** register a transform function for a specific node type */
57 void be_set_transform_function(ir_op *op, be_transform_func func);
58
59 /**
60  * Associate an old node with a transformed node. Uses link field.
61  */
62 void be_set_transformed_node(ir_node *old_node, ir_node *new_node);
63
64 /**
65  * returns 1 if the node is already transformed
66  */
67 int be_is_transformed(const ir_node *node);
68
69 /**
70  * enqueue all inputs into the transform queue.
71  */
72 void be_enqueue_preds(ir_node *node);
73
74 /**
75  * Transform a graph. Transformers must be registered first.
76  */
77 void be_transform_graph(ir_graph *irg, arch_pretrans_nodes *func);
78
79 typedef bool (*upper_bits_clean_func)(const ir_node *node, ir_mode *mode);
80
81 /**
82  * register a test function for be_upper_bits_clean for a specific node
83  * type.
84  */
85 void be_set_upper_bits_clean_function(ir_op *op, upper_bits_clean_func func);
86
87 /**
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
91  * numbers.
92  */
93 bool be_upper_bits_clean(const ir_node *node, ir_mode *mode);
94
95 #endif