From c279966c1378ebe3cee97c6e4171755bc4d8b1df Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Fri, 6 Oct 2006 10:41:49 +0000 Subject: [PATCH] fixed flags --- ir/be/ia32/bearch_ia32.c | 20 +++++++++++--------- ir/be/ia32/ia32_new_nodes.c | 3 +-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 5a3dfe128..882e3a44d 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -265,17 +265,19 @@ static arch_irn_class_t ia32_classify(const void *self, const ir_node *irn) { } static arch_irn_flags_t ia32_get_flags(const void *self, const ir_node *irn) { - arch_irn_flags_t flags = arch_irn_flags_none; + arch_irn_flags_t flags; + ir_node *pred = is_Proj(irn) ? get_Proj_pred(irn) : NULL; - if (is_Proj(irn) && is_ia32_irn(get_Proj_pred(irn))) { - flags |= get_ia32_out_flags(irn, get_Proj_proj(irn)); - } - - irn = skip_Proj(irn); - if (is_ia32_irn(irn)) - flags |= get_ia32_flags(irn); - else if (is_Unknown(irn)) + if (is_Unknown(irn)) flags = arch_irn_flags_ignore; + else { + /* pred is only set, if we have a Proj */ + flags = pred && is_ia32_irn(pred) ? get_ia32_out_flags(pred, get_Proj_proj(irn)) : arch_irn_flags_none; + + irn = skip_Proj(irn); + if (is_ia32_irn(irn)) + flags |= get_ia32_flags(irn); + } return flags; } diff --git a/ir/be/ia32/ia32_new_nodes.c b/ir/be/ia32/ia32_new_nodes.c index 009ebefc3..8da3718c7 100644 --- a/ir/be/ia32/ia32_new_nodes.c +++ b/ir/be/ia32/ia32_new_nodes.c @@ -1089,8 +1089,7 @@ void set_ia32_out_flags(ir_node *node, arch_irn_flags_t flags, int pos) { */ arch_irn_flags_t get_ia32_out_flags(const ir_node *node, int pos) { ia32_attr_t *attr = get_ia32_attr(node); - assert(pos < (int) attr->data.n_res && "Invalid OUT position."); - return attr->out_flags[pos]; + return pos < (int)attr->data.n_res ? attr->out_flags[pos] : arch_irn_flags_none; } #ifndef NDEBUG -- 2.20.1