From 66e45353636477105f2c047feb636678bfd368c9 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Mon, 18 Oct 2004 10:00:18 +0000 Subject: [PATCH] Added get_irn_pinned() function [r4136] --- ir/ir/irnode.c | 10 +++++++++ ir/ir/irnode.h | 5 +++++ ir/ir/irnode_t.h | 53 +++++++++++++++++++++++++++--------------------- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index d91b3564f..cf06d5eee 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -359,6 +359,16 @@ op_pin_state return (__get_op_pinned (get_irn_op (node))); } +void set_irn_pinned(ir_node *node, op_pin_state state) { + /* due to optimization an opt may be turned into a Tuple */ + if (get_irn_op(node) == op_Tuple) + return; + + assert(node && get_op_pinned(get_irn_op(node)) == op_pin_state_exc_pinned); + assert(state == op_pin_state_pinned || state == op_pin_state_floats); + + node->attr.except.pin_state = state; +} #ifdef DO_HEAPANALYSIS /* Access the abstract interpretation information of a node. diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index 54bf91ebc..ed1d7c74f 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -187,6 +187,11 @@ ir_graph *get_irn_irg (ir_node *node); of node cast to long. */ long get_irn_node_nr (const ir_node *node); +/** Returns the pinned state of a node. */ +op_pin_state get_irn_pinned (const ir_node *node); + +/** Set pin state for nodes with op pin state op_pin_state_exc_pinned */ +void set_irn_pinned(ir_node *node, op_pin_state state); /** * irnode constructor. diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 569178f93..0ba1c2955 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -78,7 +78,7 @@ typedef struct { typedef struct { cond_kind kind; /**< flavor of Cond */ long default_proj; /**< for optimization: biggest Proj number, i.e. the one - used for default. */ + used for default. */ } cond_attr; /** Const attributes */ @@ -98,21 +98,27 @@ typedef struct { entity *ent; /**< entity to select */ } sel_attr; +/** Exception attributes */ typedef struct { - type *cld_tp; /**< type of called procedure */ + op_pin_state pin_state; /**< the pin state for operations that might generate a exception: + If it's know that no exception will be generated, could be set to + op_pin_state_floats. */ #if PRECISE_EXC_CONTEXT - struct ir_node **frag_arr; /**< For Phi node construction in case of exceptions */ + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ #endif - entity ** callee_arr; /**< result of callee analysis */ +} except_attr; + +typedef struct { + except_attr exc; /**< the exception attribute. MUST be the first one. */ + type *cld_tp; /**< type of called procedure */ + entity ** callee_arr; /**< result of callee analysis */ } call_attr; /** Alloc attributes */ typedef struct { - type *type; /**< Type of the allocated object. */ - where_alloc where; /**< stack, heap or other managed part of memory */ -#if PRECISE_EXC_CONTEXT - struct ir_node **frag_arr; /**< For Phi node construction in case of exceptions */ -#endif + except_attr exc; /**< the exception attribute. MUST be the first one. */ + type *type; /**< Type of the allocated object. */ + where_alloc where; /**< stack, heap or other managed part of memory */ } alloc_attr; /** InstOf attributes */ @@ -153,26 +159,17 @@ typedef struct { /** Load attributes */ typedef struct { - ir_mode *load_mode; /**< the mode of this Load operation */ + except_attr exc; /**< the exception attribute. MUST be the first one. */ + ir_mode *load_mode; /**< the mode of this Load operation */ ent_volatility volatility; /**< the volatility of a Load/Store operation */ -#if PRECISE_EXC_CONTEXT - struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ -#endif } load_attr; /** Store attributes */ typedef struct { + except_attr exc; /**< the exception attribute. MUST be the first one. */ ent_volatility volatility; /**< the volatility of a Store operation */ -#if PRECISE_EXC_CONTEXT - struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ -#endif } store_attr; -/** Exception attributes */ -typedef struct { - struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ -} except_attr; - typedef pn_Cmp confirm_attr; /** Attribute to hold compare operation */ /** Some irnodes just have one attribute, these are stored here, @@ -205,9 +202,7 @@ typedef union { confirm_attr confirm_cmp; /**< For Confirm: compare operation */ filter_attr filter; /**< For Filter */ end_attr end; /**< For EndReg, EndExcept */ -#if PRECISE_EXC_CONTEXT except_attr except; /**< For Phi node construction in case of exceptions */ -#endif } attr; @@ -482,6 +477,18 @@ __get_irn_link(const ir_node *node) { return node->link; } +/** + * Returns the pinned state of a node. + * Intern version of libFirm. + */ +static INLINE op_pin_state +__get_irn_pinned(const ir_node *node) { + op_pin_state state = __get_op_pinned(__get_irn_op(node)); + if (state == op_pin_state_exc_pinned) + return get_opt_fragile_ops() ? node->attr.except.pin_state : op_pin_state_pinned; + return state; +} + /* this section MUST contain all inline functions */ #define is_ir_node(thing) __is_ir_node(thing) #define get_irn_intra_arity(node) __get_irn_intra_arity(node) -- 2.20.1