From: Matthias Braun Date: Sun, 8 Mar 2009 17:09:11 +0000 (+0000) Subject: analysis of address_tkane for union types is not that easy - be conservative X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;ds=sidebyside;h=41fac672b8f412b67e502dff0f9b03af6ceaef73;hp=901bb930a86871ff22dd4aa1c34424a3083ef5fa;p=libfirm analysis of address_tkane for union types is not that easy - be conservative [r25640] --- diff --git a/ir/ana/irmemory.c b/ir/ana/irmemory.c index db0aa7c87..66ccccbde 100644 --- a/ir/ana/irmemory.c +++ b/ir/ana/irmemory.c @@ -850,7 +850,16 @@ static ir_entity_usage determine_entity_usage(const ir_node *irn, ir_entity *ent case iro_Add: case iro_Sub: + /* Check the successor of irn. */ + res |= determine_entity_usage(succ, entity); + break; case iro_Sel: { + ir_entity *entity = get_Sel_entity(succ); + /* this analyis can't handle unions correctly */ + if (is_Union_type(get_entity_owner(entity))) { + red |= ir_usage_unknown; + break; + } /* Check the successor of irn. */ res |= determine_entity_usage(succ, entity); break; diff --git a/ir/opt/scalar_replace.c b/ir/opt/scalar_replace.c index 5e7a00e95..276baf3b5 100644 --- a/ir/opt/scalar_replace.c +++ b/ir/opt/scalar_replace.c @@ -211,9 +211,13 @@ int is_address_taken(ir_node *sel) break; case iro_Sel: { + ir_entity* entity = get_Sel_entity(succ); + /* we can't handle unions correctly yet -> address taken */ + if (is_Union_type(get_entity_owner(entity))) + return 1; + /* Check the Sel successor of Sel */ int res = is_address_taken(succ); - if (res) return 1; break; @@ -682,7 +686,7 @@ int scalar_replacement_opt(ir_graph *irg) { /* Call algorithm that computes the out edges */ assure_irg_outs(irg); - /* we use the link firld to store the VNUM */ + /* we use the link field to store the VNUM */ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); irp_reserve_resources(irp, IR_RESOURCE_ENTITY_LINK);