* @file
* @brief modifies schedule so flags dependencies are respected.
* @author Matthias Braun, Christoph Mallon
* @file
* @brief modifies schedule so flags dependencies are respected.
* @author Matthias Braun, Christoph Mallon
foreach_out_edge(node, edge) {
ir_node *out = get_edge_src_irn(edge);
if (is_Proj(out)) {
foreach_out_edge(node, edge) {
ir_node *out = get_edge_src_irn(edge);
if (is_Proj(out)) {
assert(get_irn_n_edges_kind(out, EDGE_KIND_DEP) == 0);
foreach_out_edge(out, edge2) {
ir_node *out2 = get_edge_src_irn(edge2);
assert(get_irn_n_edges_kind(out, EDGE_KIND_DEP) == 0);
foreach_out_edge(out, edge2) {
ir_node *out2 = get_edge_src_irn(edge2);
foreach_out_edge(out2, edge3) {
ir_node *out3 = get_edge_src_irn(edge3);
/* Phi or End represents a usage at block end. */
foreach_out_edge(out2, edge3) {
ir_node *out3 = get_edge_src_irn(edge3);
/* Phi or End represents a usage at block end. */
if (get_irn_mode(copy) == mode_T) {
ir_mode *mode = flag_class->mode;
value = new_rd_Proj(NULL, copy, mode, pn);
if (get_irn_mode(copy) == mode_T) {
ir_mode *mode = flag_class->mode;
value = new_rd_Proj(NULL, copy, mode, pn);
sched_foreach_reverse(block, node) {
int i, arity;
ir_node *new_flags_needed = NULL;
ir_node *test;
sched_foreach_reverse(block, node) {
int i, arity;
ir_node *new_flags_needed = NULL;
ir_node *test;
/* test whether the current node needs flags */
arity = get_irn_arity(node);
for (i = 0; i < arity; ++i) {
/* test whether the current node needs flags */
arity = get_irn_arity(node);
for (i = 0; i < arity; ++i) {
- const arch_register_class_t *cls = arch_get_irn_reg_class(node, i);
- if (cls == flag_class) {
+ const arch_register_req_t *req
+ = arch_get_irn_register_req_in(node, i);
+ if (req->cls == flag_class) {
assert(new_flags_needed == NULL);
new_flags_needed = get_irn_n(node, i);
}
assert(new_flags_needed == NULL);
new_flags_needed = get_irn_n(node, i);
}
- rematerialize_or_move(flags_needed, node, flag_consumers, pn);
+ rematerialize_or_move(flags_needed, place, flag_consumers, pn);