static void build_single_def_use_links (void) { /* We use the multiple definitions problem to compute our restricted use-def chains. */ df_set_flags (DF_EQ_NOTES); df_md_add_problem (); df_note_add_problem (); df_analyze (); df_maybe_reorganize_use_refs (DF_REF_ORDER_BY_INSN_WITH_NOTES); use_def_ref.create (DF_USES_TABLE_SIZE ()); use_def_ref.safe_grow_cleared (DF_USES_TABLE_SIZE ()); reg_defs.create (max_reg_num ()); reg_defs.safe_grow_cleared (max_reg_num ()); reg_defs_stack.create (n_basic_blocks_for_fn (cfun) * 10); local_md = BITMAP_ALLOC (NULL); local_lr = BITMAP_ALLOC (NULL); /* Walk the dominator tree looking for single reaching definitions dominating the uses. This is similar to how SSA form is built. */ single_def_use_dom_walker (CDI_DOMINATORS) .walk (cfun->cfg->x_entry_block_ptr); BITMAP_FREE (local_lr); BITMAP_FREE (local_md); reg_defs.release (); reg_defs_stack.release (); }
static void rtl_seqabstr (void) { int iter; df_set_flags (DF_LR_RUN_DCE); df_analyze (); /* Create a hash list for COLLECT_PATTERN_SEQS. */ hash_buckets = htab_create (HASH_INIT, htab_hash_bucket , htab_eq_bucket , htab_del_bucket); fill_hash_bucket (); /* Compute the common cost of abstraction. */ compute_init_costs (); /* Build an initial set of pattern sequences from the current function. */ collect_pattern_seqs (); dump_pattern_seqs (); /* Iterate until there are no sequences to abstract. */ for (iter = 1;; iter++) { /* Recompute gain for sequences if necessary and select sequence with biggest gain. */ recompute_gain (); if (!pattern_seqs) break; dump_best_pattern_seq (iter); /* Update the cached info of the other sequences and force gain recomputation where needed. */ update_pattern_seqs (); /* Turn best sequences into pseudo-functions and -calls. */ abstract_best_seq (); } /* Cleanup hash tables. */ htab_delete (hash_buckets); }