X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeutil.h;h=5a0c4f08a56b2047ad647951435eeeb30ccf7072;hb=df2faee01a5832057bb3ca0ba5f67e979c916e19;hp=8df13b838c79613c4672acfa864f83f38691e64e;hpb=3c255183287cde25567f714737019fa7266c5708;p=libfirm diff --git a/ir/be/beutil.h b/ir/be/beutil.h index 8df13b838..5a0c4f08a 100644 --- a/ir/be/beutil.h +++ b/ir/be/beutil.h @@ -1,16 +1,31 @@ +/* + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ -#ifndef _BEUTIL_H -#define _BEUTIL_H - -#include "firm_config.h" - -#include - -#include "irnode.h" -#include "bearch.h" +/** + * @file + * @brief Contains some useful function for the backend. + * @author Sebastian Hack + */ +#ifndef FIRM_BE_BEUTIL_H +#define FIRM_BE_BEUTIL_H -/** Undefine this to disable debugging mode. */ -#define BE_DEBUG 1 +#include "firm_types.h" /** * Convenient block getter. @@ -19,78 +34,38 @@ * @return The block of the node, or the node itself, if the node is a * block. */ -static INLINE const ir_node *get_block(const ir_node *irn) +static inline ir_node *get_block(ir_node *irn) { return is_Block(irn) ? irn : get_nodes_block(irn); } -static INLINE int is_firm_be_mode(const ir_mode *mode) +static inline const ir_node *get_block_const(const ir_node *irn) { - return mode_is_data(mode); + return is_Block(irn) ? irn : get_nodes_block(irn); } /** - * Check, if a node produces or consumes a data value. - * If it does, it is significant for scheduling and register allocation. - * A node produces/consumes a data value, if one of its operands is of - * mode datab, or his retuning mode is of mode datab. - * @param irn The node to check for. - * @return 1, if the node is a data node, 0 if not. + * Clears the link fields of all nodes of the given graph. + * @param irg The graph. */ -static INLINE int is_data_node(const ir_node *irn) -{ - int i, n; - - /* If the node produces a data value, return immediately. */ - if(is_firm_be_mode(get_irn_mode(irn))) - return 1; - - /* else check, if it takes a data value, if that is so, return */ - for(i = 0, n = get_irn_arity(irn); i < n; ++i) { - ir_node *op = get_irn_n(irn, i); - if(is_firm_be_mode(get_irn_mode(op))) - return 1; - } - - /* Else the node does not produce/consume a data value */ - return 0; -} +void be_clear_links(ir_graph *irg); /** - * Make each constant local to its use. - * This duplicates all constants in order to simulate a realistic - * register pressure. - * @param irg The graph. + * Gets the Proj with number pn from irn. */ -void localize_consts(ir_graph *irg); +ir_node *be_get_Proj_for_pn(const ir_node *irn, long pn); /** - * Dump a vcg graph containing the controlflow graph, the schedule and - * allocated registers. - * @param irg The irg. Note that scheduling, register allocation must - * have been performed. + * Returns an array (an ARR_F) of the programs blocks in reverse postorder + * (note: caller has to free the memory with DEL_ARR_F after use; + * of course you can use ARR_LEN on the array too.) */ -void dump_allocated_irg(arch_env_t *env, ir_graph *irg, char *suffix); - -void be_clear_links(ir_graph *irg); - -static INLINE FILE *ffopen(const char *base, const char *ext, const char *mode) { - FILE *out; - char buf[1024]; - - snprintf(buf, sizeof(buf), "%s.%s", base, ext); - if (! (out = fopen(buf, mode))) { - fprintf(stderr, "Cannot open file %s in mode %s\n", buf, mode); - return NULL; - } - return out; -} +ir_node **be_get_cfgpostorder(ir_graph *irg); /** - * Dump a graph with schedule edges. - * @param irg The graph. - * @param suffix A suffix to its file name. + * convenience function to return the first successor block + * (it is often known that there is exactly 1 successor anyway) */ -void dump_ir_block_graph_sched(ir_graph *irg, const char *suffix); +ir_node *get_first_block_succ(const ir_node *block); #endif