/** * Place operands of node into an address mode. * * @param addr the address mode data so far * @param node the node * @param flags the flags * * @return the folded node */ static ir_node *eat_immediates(x86_address_t *addr, ir_node *node, x86_create_am_flags_t flags, bool basereg_usable) { if (!(flags & x86_create_am_force) && x86_is_non_address_mode_node(node) && (!(flags & x86_create_am_double_use) || get_irn_n_edges(node) > 2)) return node; if (is_Add(node)) { ir_node *left = get_Add_left(node); ir_node *right = get_Add_right(node); if (eat_immediate(addr, left, basereg_usable)) return eat_immediates(addr, right, x86_create_am_normal, basereg_usable); if (eat_immediate(addr, right, basereg_usable)) return eat_immediates(addr, left, x86_create_am_normal, basereg_usable); } else if (is_Member(node)) { assert(addr->imm.entity == NULL); addr->imm.entity = get_Member_entity(node); addr->imm.kind = X86_IMM_FRAMEENT; ir_node *ptr = get_Member_ptr(node); assert(is_Start(get_Proj_pred(ptr))); return ptr; } return node; }
/** * Pre-Walker: Copies blocks and nodes from the original method graph * to the copied graph. * * @param n A node from the original method graph. * @param env The copied graph. */ static void copy_all_nodes(ir_node *node, void *env) { ir_graph *irg = (ir_graph*)env; ir_node *new_node = irn_copy_into_irg(node, irg); set_irn_link(node, new_node); /* fix access to entities on the stack frame */ if (is_Member(new_node)) { ir_entity *ent = get_Member_entity(new_node); ir_type *tp = get_entity_owner(ent); if (is_frame_type(tp)) { /* replace by the copied entity */ ent = (ir_entity*)get_entity_link(ent); assert(is_entity(ent)); assert(get_entity_owner(ent) == get_irg_frame_type(irg)); set_Member_entity(new_node, ent); } } }