to_spill, before, allow_remat ? "" : " not"));
}
+ir_node *be_get_end_of_block_insertion_point(const ir_node *block)
+{
+ ir_node *last = sched_last(block);
+
+ /* we might have projs and keepanys behind the jump... */
+ while(is_Proj(last) || be_is_Keep(last)) {
+ last = sched_prev(last);
+ assert(!sched_is_end(last));
+ }
+
+ if(!is_cfop(last)) {
+ last = sched_next(last);
+ /* last node must be a cfop, only exception is the start block */
+ assert(last == get_irg_start_block(get_irn_irg(block)));
+ }
+
+ /* add the reload before the (cond-)jump */
+ return last;
+}
+
/**
* Returns the point at which you can insert a node that should be executed
* before block @p block when coming from pred @p pos.
static
ir_node *get_block_insertion_point(ir_node *block, int pos)
{
- ir_node *predblock, *last;
+ ir_node *predblock;
/* simply add the reload to the beginning of the block if we only have 1
* predecessor. We don't need to check for phis as there can't be any in a
/* We have to reload the value in pred-block */
predblock = get_Block_cfgpred_block(block, pos);
- last = sched_last(predblock);
-
- /* we might have projs and keepanys behind the jump... */
- while(is_Proj(last) || be_is_Keep(last)) {
- last = sched_prev(last);
- assert(!sched_is_end(last));
- }
-
- if(!is_cfop(last)) {
- last = sched_next(last);
- /* last node must be a cfop, only exception is the start block */
- assert(last == get_irg_start_block(get_irn_irg(block)));
- }
+ return be_get_end_of_block_insertion_point(predblock);
+}
- /* add the reload before the (cond-)jump */
- return last;
+void be_add_reload_at_end(spill_env_t *env, ir_node *to_spill, ir_node *block,
+ const arch_register_class_t *reload_cls,
+ int allow_remat)
+{
+ ir_node *before = be_get_end_of_block_insertion_point(block);
+ be_add_reload(env, to_spill, before, reload_cls, allow_remat);
}
void be_add_reload_on_edge(spill_env_t *env, ir_node *to_spill, ir_node *block,
DBG((dbg, LEVEL_1, "Insert remat %+F of %+F before reloader %+F\n", res, spilled, reloader));
-#ifdef SCHEDULE_PROJS
- /* insert in schedule */
- sched_reset(res);
- sched_add_before(reloader, res);
-#ifdef FIRM_STATISTICS
- if (! is_Proj(res))
- env->remat_count++;
-#endif
-#else
if (! is_Proj(res)) {
/* insert in schedule */
sched_reset(res);
env->remat_count++;
#endif
}
-#endif /* SCHEDULE_PROJS */
return res;
}
remat_cost_delta = remat_cost - env->reload_cost;
rld->remat_cost_delta = remat_cost_delta;
- block = get_nodes_block(reloader);
+ block = is_Block(reloader) ? reloader : get_nodes_block(reloader);
freq = get_block_execfreq(exec_freq, block);
all_remat_costs += remat_cost_delta * freq;
DBG((dbg, LEVEL_2, "\tremat costs delta before %+F: "