From f3916633f8d269dcef7bf962d2752ec2004668df Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=B6tz=20Lindenmaier?= Date: Mon, 27 Jun 2005 11:05:24 +0000 Subject: [PATCH] an accessor function returning predecessor blocks [r6123] --- ir/ir/irnode.c | 5 +++++ ir/ir/irnode.h | 12 ++++++++++++ ir/ir/irnode_t.h | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index 2a1b14895..5ec403c73 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -625,6 +625,11 @@ set_Block_cfgpred (ir_node *node, int pos, ir_node *pred) { set_irn_n(node, pos, pred); } +ir_node * +(get_Block_cfgpred_block)(ir_node *node, int pos) { + return _get_Block_cfgpred_block(node, pos); +} + bool get_Block_matured (ir_node *node) { assert (node->op == op_Block); diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index 6df3c1d84..eea1e29f1 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -259,6 +259,18 @@ ir_node **get_Block_cfgpred_arr (ir_node *node); int get_Block_n_cfgpreds (ir_node *node); ir_node *get_Block_cfgpred (ir_node *node, int pos); void set_Block_cfgpred (ir_node *node, int pos, ir_node *pred); +/** Get the predecessor block. + * + * Returns the block corresonding to the predecessor pos of block. + * + * There are several ambiguities we resolve with this function: + * - The direct predecessor can be a Proj, which is not pinned. + * We walk from the predecessor to the next pinned node + * (skip_Proj) and return the block that node is in. + * - If we encounter the Bad node, this function does not return + * Start, but the Bad node. + */ +ir_node *get_Block_cfgpred_block(ir_node *node, int pos); bool get_Block_matured (ir_node *node); void set_Block_matured (ir_node *node, bool matured); diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 6599ead57..391bf015a 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -578,6 +578,25 @@ _get_Block_cfgpred (ir_node *node, int pos) { return _get_irn_n(node, pos); } +/* Get the predecessor block. + * + * Returns the block corresonding to the predecessor pos. + * + * There are several ambiguities we resolve with this function: + * - The direct predecessor can be a Proj, which is not pinned. + * We walk from the predecessor to the next pinned node + * (skip_Proj) and return the block that node is in. + * - If we encounter the Bad node, this function does not return + * Start, but the Bad node. + */ +static INLINE ir_node * +_get_Block_cfgpred_block(ir_node *node, int pos) { + ir_node *res = skip_Proj(get_Block_cfgpred(node, pos)); + if (!is_Bad(res)) + res = get_nodes_block(res); + return res; +} + static INLINE unsigned long _get_Block_block_visited (ir_node *node) { assert (node->op == op_Block); @@ -675,6 +694,7 @@ static INLINE type *_get_irn_type(ir_node *node) { #define is_Block(node) _is_Block(node) #define get_Block_n_cfgpreds(node) _get_Block_n_cfgpreds(node) #define get_Block_cfgpred(node, pos) _get_Block_cfgpred(node, pos) +#define get_Block_cfgpred_block(node, pos) _get_Block_cfgpred_block(node, pos) #define get_Block_block_visited(node) _get_Block_block_visited(node) #define set_Block_block_visited(node, visit) _set_Block_block_visited(node, visit) #define mark_Block_block_visited(node) _mark_Block_block_visited(node) -- 2.20.1