int _tmain(int argc, _TCHAR* argv[]) { while (1) { _tprintf(_T("Enter linklist:")); char ll[256] = { 0 }; scanf_s("%s", ll, (int)_countof(ll)); DataNode *dn(buildFromString(ll)); DataNode *ln((DataNode *)unloop(dn)); _tprintf(_T("loop node: %c\n"), ln ? ln->data : ' '); printDataNode(dn); dn->remove(); dn = NULL; } return 0; }
static void unloop_loops (bitmap loop_closed_ssa_invalidated, bool *irred_invalidated) { while (loops_to_unloop.length ()) { struct loop *loop = loops_to_unloop.pop (); int n_unroll = loops_to_unloop_nunroll.pop (); basic_block latch = loop->latch; edge latch_edge = loop_latch_edge (loop); int flags = latch_edge->flags; location_t locus = latch_edge->goto_locus; gcall *stmt; gimple_stmt_iterator gsi; remove_exits_and_undefined_stmts (loop, n_unroll); /* Unloop destroys the latch edge. */ unloop (loop, irred_invalidated, loop_closed_ssa_invalidated); /* Create new basic block for the latch edge destination and wire it in. */ stmt = gimple_build_call (builtin_decl_implicit (BUILT_IN_UNREACHABLE), 0); latch_edge = make_edge (latch, create_basic_block (NULL, NULL, latch), flags); latch_edge->probability = 0; latch_edge->count = 0; latch_edge->flags |= flags; latch_edge->goto_locus = locus; latch_edge->dest->loop_father = current_loops->tree_root; latch_edge->dest->count = 0; latch_edge->dest->frequency = 0; set_immediate_dominator (CDI_DOMINATORS, latch_edge->dest, latch_edge->src); gsi = gsi_start_bb (latch_edge->dest); gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); } loops_to_unloop.release (); loops_to_unloop_nunroll.release (); /* Remove edges in peeled copies. */ unsigned i; edge e; FOR_EACH_VEC_ELT (edges_to_remove, i, e) { bool ok = remove_path (e); gcc_assert (ok); }
int optimize(ins_t *code) { int changed; // keep optimizing until there's nothing left do { changed = 0; changed |= fold(code); changed |= condense(code); changed |= unloop(code); changed |= dce(code); changed |= peep(code); } while (changed); peepfinal(code); int opt_size; for (opt_size = 0; code[opt_size].op != OP_EOF; ++opt_size) {} return opt_size; }