analysis of address_tkane for union types is not that easy - be conservative
authorMatthias Braun <matze@braunis.de>
Sun, 8 Mar 2009 17:09:11 +0000 (17:09 +0000)
committerMatthias Braun <matze@braunis.de>
Sun, 8 Mar 2009 17:09:11 +0000 (17:09 +0000)
[r25640]

ir/ana/irmemory.c
ir/opt/scalar_replace.c

index db0aa7c..66ccccb 100644 (file)
@@ -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;
index 5e7a00e..276baf3 100644 (file)
@@ -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);