r->req.type = arch_register_req_type_normal;
}
+void be_node_set_req_type(ir_node *irn, int pos, arch_register_req_type_t type)
+{
+ be_req_t *r = get_req(irn, pos);
+ r->req.type = type;
+}
+
void be_set_IncSP_offset(ir_node *irn, unsigned offset)
{
be_stack_attr_t *a = get_irn_attr(irn);
* pointer is set up. This is done by setting insert to the end of the block
* which is its default initialization (see above).
*/
- if(bl != get_irg_start_block(irg)) {
- insert = sched_next(irn);
- while((is_Phi(insert) || is_Proj(insert)) && !sched_is_end(insert))
- insert = sched_next(insert);
- }
+
+ insert = sched_next(irn);
+ if(bl == get_irg_start_block(irg) && insert != bl && sched_get_time_step(frame) >= sched_get_time_step(insert))
+ insert = sched_next(frame);
+
+ while((is_Phi(insert) || is_Proj(insert)) && !sched_is_end(insert))
+ insert = sched_next(insert);
sched_add_before(insert, spill);
return spill;
}
-ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *reloader, ir_mode *mode, ir_node *spill)
+ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *insert, ir_mode *mode, ir_node *spill)
{
ir_node *reload;
- ir_node *bl = is_Block(reloader) ? reloader : get_nodes_block(reloader);
+ ir_node *bl = is_Block(insert) ? insert : get_nodes_block(insert);
ir_graph *irg = get_irn_irg(bl);
ir_node *frame = get_irg_frame(irg);
const arch_register_class_t *cls_frame = arch_get_irn_reg_class(arch_env, frame, -1);
reload = be_new_Reload(cls, cls_frame, irg, bl, frame, spill, mode);
- sched_add_before(reloader, reload);
+ if(is_Block(insert)) {
+ insert = sched_skip(insert, 0, sched_skip_cf_predicator, (void *) arch_env);
+ sched_add_after(insert, reload);
+ }
+
+ else
+ sched_add_before(insert, reload);
+
return reload;
}