ir_graph *create_irg_copy(ir_graph *irg) { ir_graph *res = alloc_graph(); res->irg_pinned_state = irg->irg_pinned_state; /* clone the frame type here for safety */ irp_reserve_resources(irp, IRP_RESOURCE_ENTITY_LINK); res->frame_type = clone_frame_type(irg->frame_type); ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); /* copy all nodes from the graph irg to the new graph res */ irg_walk_anchors(irg, copy_all_nodes, rewire, res); /* copy the Anchor node */ res->anchor = get_new_node(irg->anchor); /* -- The end block -- */ set_irg_end_block (res, get_new_node(get_irg_end_block(irg))); set_irg_end (res, get_new_node(get_irg_end(irg))); /* -- The start block -- */ set_irg_start_block(res, get_new_node(get_irg_start_block(irg))); set_irg_no_mem (res, get_new_node(get_irg_no_mem(irg))); set_irg_start (res, get_new_node(get_irg_start(irg))); /* Proj results of start node */ set_irg_initial_mem(res, get_new_node(get_irg_initial_mem(irg))); ir_free_resources(irg, IR_RESOURCE_IRN_LINK); irp_free_resources(irp, IRP_RESOURCE_ENTITY_LINK); return res; }
static ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) { ir_graph *const res = alloc_graph(); /* Inform statistics here, as blocks will be already built on this graph. */ hook_new_graph(res, ent); /* graphs are in construction mode by default */ add_irg_constraints(res, IR_GRAPH_CONSTRAINT_CONSTRUCTION); irg_set_nloc(res, n_loc); res->irg_pinned_state = op_pin_state_pinned; res->callee_info_state = irg_callee_info_none; res->mem_disambig_opt = aa_opt_inherited; /*-- Type information for the procedure of the graph --*/ res->ent = ent; if (ent) set_entity_irg(ent, res); /*-- a class type so that it can contain "inner" methods as in Pascal. --*/ res->frame_type = new_type_frame(); /* the Anchor node must be created first */ res->anchor = new_r_Anchor(res); /*-- Nodes needed in every graph --*/ set_irg_end_block(res, new_r_immBlock(res)); set_irg_end(res, new_r_End(res, 0, NULL)); ir_node *const start_block = new_r_Block_noopt(res, 0, NULL); set_irg_start_block(res, start_block); set_irg_no_mem(res, new_r_NoMem(res)); res->index = get_irp_new_irg_idx(); #ifdef DEBUG_libfirm res->graph_nr = get_irp_new_node_nr(); #endif set_r_cur_block(res, start_block); return res; }
int main(int argc, char** argv) { int result; struct stat sb; char* file_name; char name[100] = "permutation"; int len = strlen(name); uint32* histogram =NULL; uint32 gs, hgs; // Handle arguments convert_card_permutation(args.u, args.i); // LAMb: calculate hi/low from args! file_name = handle_arguments(argc, argv, &args); int size = args.s; uint32* permutation; uint32* graph = alloc_graph(size); gs = GRAPH_SIZE(size); hgs = gs + 1; if (args.i || args.a) { histogram = (uint32*) calloc(hgs, sizeof(uint32)); } if (args.p) { permutation = alloc_permutation(size, false); str_to_permutation(args.p, permutation, false); if (args._2) { uint32* p2 = alloc_permutation(size, false); str_to_permutation(args._2, p2, false); apply_permutation(p2, permutation); free(p2); } map_perm_to_graph(permutation, graph); if (args.d) { graph_to_dot(graph, permutation, name, args.c, args.e); } if (histogram) { count_edges(graph, histogram, size); } } else if (args.l <= 0) { if (size > 7) { error("Can not generate more then 7! files."); } permutation = alloc_permutation(size, true); uint32 numPerms = factorial(size); for (int i=0; i < numPerms; i++) { map_perm_to_graph(permutation, graph); if (args.d) { graph_to_dot(graph, permutation, make_name(name, i), args.c, args.e); } if (histogram) { count_edges(graph, histogram, size); } name[len] = '\0'; lex_permute(permutation+1, size); } } else { permutation = alloc_permutation(size, true); uint32 numPerms = factorial(size); for (int i=0; i < numPerms; i++) { if (i == args.l) { map_perm_to_graph(permutation, graph); if (args.d) { graph_to_dot(graph, permutation, make_name(name, i), args.c, args.e); } name[len] = '\0'; break; } lex_permute(permutation+1, size); } } if (args.i) { for (int i=0; i < hgs; i++) { printf("%i\t", i); } printf("\n"); for (int i=0; i < hgs; i++) { printf("%i\t", histogram[i]); } printf("\n"); } if (args.a) { uint64 sum =0, count =0; for (int i=0; i < hgs; i++) { sum += histogram[i] * i; count += histogram[i]; } double d = sum / (double) count; printf("average: %llu, %llu, %f\n", sum, count, d); } if (histogram) free(histogram); free(permutation); free(graph); exit(result); }