+/*
+ information associated with the graph. Optimizations invalidate these
+ states. */
+
+/** The states of an ir graph.
+ *
+ * state phase values: phase_building, phase_high, phase_low.
+ *
+ * The graph is in phase_building during construction of the irgraph.
+ * The construction is finished by a call to finalize_cons().
+ *
+ * Finalize_cons() sets the state to phase_high. All Firm nodes are
+ * allowed.
+ *
+ * To get the irgraph into phase_low all Sel nodes must be removed and
+ * replaced by explicit address computations. SymConst size and
+ * type tag nodes must be removed (@@@ really?). Initialization of
+ * memory allocated by Alloc must be explicit. @@@ More conditions?
+ *
+ */
+typedef enum {
+ phase_building,
+ phase_high,
+ phase_low
+} irg_phase_state;
+
+/** returns the phase_state of an IR graph. */
+irg_phase_state get_irg_phase_state (const ir_graph *irg);
+
+/** sets the phase state of an IR graph. */
+void set_irg_phase_low(ir_graph *irg);
+
+/** state: op_pin_state_pinned
+ The graph is "op_pin_state_pinned" if all nodes are associated with a basic block.
+ It is in state "op_pin_state_floats" if nodes are in arbitrary blocks. In state
+ "op_pin_state_floats" the block predecessor is set in all nodes, but this can be an
+ invalid block, i.e., the block is not a dominator of all the uses of
+ the node.
+ The enum op_pin_state is defined in irop.h. */
+op_pin_state get_irg_pinned (const ir_graph *irg);
+
+/** state: outs_state
+ * Outs are the back edges or def-use edges of ir nodes.
+ * Values: outs_none, outs_consistent, outs_inconsistent */
+typedef enum {
+ outs_none, /**< Outs are not computed, no memory is allocated. */
+ outs_consistent, /**< Outs are computed and correct. */
+ outs_inconsistent /**< Outs have been computed, memory is still allocated,
+ but the graph has been changed since. */
+} irg_outs_state;
+irg_outs_state get_irg_outs_state(const ir_graph *irg);
+void set_irg_outs_inconsistent(ir_graph *irg);
+
+/** state: dom_state
+ * Signals the state of the dominator information.
+ */
+typedef enum {
+ dom_none, /**< dominator are not computed, no memory is allocated */
+ dom_consistent, /**< dominator information is computed and correct */
+ dom_inconsistent /**< dominator information is computed but the graph has been changed since */
+} irg_dom_state;
+
+/** returns the dom_state of an IR graph. */
+irg_dom_state get_irg_dom_state(const ir_graph *irg);
+
+/** sets the dom_state of an IR graph. */
+void set_irg_dom_inconsistent(ir_graph *irg);
+
+/** state: loopinfo_state
+ * Loop information describes the loops within the control and
+ * data flow of the procedure.
+ */
+typedef enum {
+ loopinfo_none = 0, /**< No loop information is constructed. Default. */
+ loopinfo_constructed = 1, /**< Some kind of loop information is constructed. */
+ loopinfo_valid = 2, /**< Loop information is valid. */
+ loopinfo_cf = 4, /**< Loop information constructed for control flow only. */
+ loopinfo_inter = 8, /**< Loop information for interprocedural view. */
+
+ loopinfo_for_firmjni = 16, /**< A hack for firmjni: all enums must differ as they
+ are used in a switch. */
+
+ /** IntRAprocedural loop information constructed and valid. */
+ loopinfo_consistent = loopinfo_constructed | loopinfo_for_firmjni | loopinfo_valid,
+ /** IntRAprocedural loop information constructed and invalid. */
+ loopinfo_inconsistent = loopinfo_constructed | loopinfo_for_firmjni,
+
+ /** IntERprocedural loop information constructed and valid. */
+ loopinfo_ip_consistent = loopinfo_constructed | loopinfo_inter | loopinfo_valid,
+ /** IntERprocedural loop information constructed and invalid. */
+ loopinfo_ip_inconsistent = loopinfo_constructed | loopinfo_inter,
+
+ /** IntRAprocedural control loop information constructed and valid. */
+ loopinfo_cf_consistent = loopinfo_constructed | loopinfo_cf | loopinfo_valid,
+ /** IntRAprocedural control loop information constructed and invalid. */
+ loopinfo_cf_inconsistent = loopinfo_constructed | loopinfo_cf,
+
+ /** IntERprocedural control loop information constructed and valid. */
+ loopinfo_cf_ip_consistent = loopinfo_constructed | loopinfo_cf | loopinfo_inter | loopinfo_valid,
+ /** IntERprocedural control loop information constructed and invalid. */
+ loopinfo_cf_ip_inconsistent = loopinfo_constructed | loopinfo_cf | loopinfo_inter
+} irg_loopinfo_state;
+
+/** Return the current loop information state. */
+irg_loopinfo_state get_irg_loopinfo_state(const ir_graph *irg);
+
+/** Sets the current loop information state. */
+void set_irg_loopinfo_state(ir_graph *irg, irg_loopinfo_state s);
+
+/** Sets the loop information state to the appropriate inconsistent state.
+ * If state is 'none' does not change. */
+void set_irg_loopinfo_inconsistent(ir_graph *irg);
+/** Sets the loop information state to the appropriate inconsistent state.
+ * If state is 'none' does not change.
+ * Does this for all irgs. */
+void set_irp_loopinfo_inconsistent(void);
+
+/** state: callee_information_state
+ * Call nodes contain a list of possible callees. This list must be
+ * computed by an analysis.
+ *
+ * It's strange that this state is administered on irg basis, as the
+ * information must be computed for the whole program, or not?
+ */
+typedef enum {
+ irg_callee_info_none,
+ irg_callee_info_consistent,
+ irg_callee_info_inconsistent
+} irg_callee_info_state;
+
+/** returns the callee_info_state of an IR graph. */
+irg_callee_info_state get_irg_callee_info_state(const ir_graph *irg);
+
+/** sets the callee_info_state of an IR graph. */
+void set_irg_callee_info_state(ir_graph *irg, irg_callee_info_state s);
+
+/** property:
+ * Tells how to handle an ir graph in inlineing.
+ */
+typedef enum {
+ irg_inline_any, /**< No restriction on inlineing. Default. */
+ irg_inline_forbidden, /**< The graph may not be inlined. */
+ irg_inline_recomended, /**< The graph should be inlined. */
+ irg_inline_forced /**< The graph must be inlined. */
+} irg_inline_property;
+
+/** Returns the inline property of a graph. */
+irg_inline_property get_irg_inline_property(const ir_graph *irg);
+/** Sets the inline property of a graph. */
+void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
+
+/**
+ * Returns the mask of the additional graph properties.
+ * The properties are automatically inherited from the method type
+ * if they were not set using set_irg_additional_properties() or
+ * set_irg_additional_property().
+ */
+unsigned get_irg_additional_properties(const ir_graph *irg);
+
+/** Sets the mask of the additional graph properties. */
+void set_irg_additional_properties(ir_graph *irg, unsigned property_mask);
+
+/** Sets one additional graph property. */
+void set_irg_additional_property(ir_graph *irg, mtp_additional_property flag);
+
+/** A void * field to link arbitrary information to the node. */
+void set_irg_link (ir_graph *irg, void *thing);
+void *get_irg_link (const ir_graph *irg);
+
+/** Increments visited flag by one.
+ * @see also: get_irn_visited() get_irg_block_visited(). */
+void inc_irg_visited (ir_graph *irg);
+unsigned long get_irg_visited (const ir_graph *irg);
+void set_irg_visited (ir_graph *irg, unsigned long i);
+/** An interprocedural flag valid for all irgs.
+ * @see also: get_irn_visited() get_irg_block_visited(). */
+unsigned long get_max_irg_visited (void);
+void set_max_irg_visited (int val);
+unsigned long inc_max_irg_visited (void);
+
+/** Increments block_visited by one.
+ * @see also: get_irn_visited() get_irg_block_visited(). */
+void inc_irg_block_visited (ir_graph *irg);
+unsigned long get_irg_block_visited (const ir_graph *irg);
+void set_irg_block_visited (ir_graph *irg, unsigned long i);
+
+/** move Proj nodes into the same block as its predecessors */
+void normalize_proj_nodes(ir_graph *irg);
+
+/** set a description for local value n */
+void set_irg_loc_description(ir_graph *irg, int n, void *description);
+
+/** get the description for local value n */
+void *get_irg_loc_description(ir_graph *irg, int n);
+
+/** Returns a estimated node count of the irg. This count is updated
+ * after every irg_walk_graph().
+ */
+unsigned get_irg_estimated_node_cnt(const ir_graph *irg);
+
+/**
+ * Access custom graph data.
+ * The data must have been registered with
+ * register_additional_graph_data() before.
+ * @param graph The graph to get the data from.
+ * @param type The type of the data you registered.
+ * @param off The value returned by register_additional_graph_data().
+ * @return A pointer of type @p type.
+ */
+#define get_irg_data(graph,type,off) \
+ (assert(off > 0 && "Invalid graph data offset"), (type *) ((char *) (graph) - (off)))
+
+/**
+ * Get the pointer to the node some custom data belongs to.
+ * @param data The pointer to the custom data.
+ * @param off The number as returned by register_additional_graph_data().
+ * @return A pointer to the ir node the custom data belongs to.
+ */
+#define get_irg_data_base(data,off) \
+ (assert(off > 0 && "Invalid graph data offset"), (ir_graph *) ((char *) (data) + (off)))
+
+/**
+ * Request additional data to be allocated with an ir graph.
+ * @param size The size of the additional data required.
+ * @return A positive number, if the operation was successful, which
+ * must be passed to the access macro get_irg_data(), 0 if the
+ * registration failed.
+ */
+size_t register_additional_graph_data(size_t size);