#include "irgwalk.h"
#include "irprintf_t.h"
#include "irgopt.h"
+#include "irbitset.h"
#include "be.h"
#include "beabi.h"
*/
be_node_set_reg_class(low_call, be_pos_Call_ptr, sp->reg_class);
+ DBG((env->dbg, LEVEL_3, "\tcreated backend call %+F\n", low_call));
+
/* Set the register classes and constraints of the Call parameters. */
for(i = 0; i < n_low_args; ++i) {
int index = low_args[i];
* but is restricted to the given block.
* @return 1 if tgt was reachable from curr, 0 if not.
*/
-static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl, unsigned long visited_nr)
+static int check_dependence(ir_node *curr, ir_node *tgt, ir_node *bl)
{
int n, i;
- if(get_irn_visited(curr) >= visited_nr)
- return 0;
-
- set_irn_visited(curr, visited_nr);
- if(get_nodes_block(curr) != bl)
+ if (get_nodes_block(curr) != bl)
return 0;
- if(curr == tgt)
+ if (curr == tgt)
return 1;
- for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
- if(check_dependence(get_irn_n(curr, i), tgt, bl, visited_nr))
- return 1;
+ /* Phi functions stop the recursion inside a basic block */
+ if (! is_Phi(curr)) {
+ for(i = 0, n = get_irn_arity(curr); i < n; ++i) {
+ if(check_dependence(get_irn_n(curr, i), tgt, bl, visited_nr))
+ return 1;
+ }
}
return 0;
{
ir_node *bl = get_nodes_block(n1);
ir_graph *irg = get_irn_irg(bl);
- long vis_nr = get_irg_visited(irg) + 1;
assert(bl == get_nodes_block(n2));
- set_irg_visited(irg, vis_nr);
- return check_dependence(n1, n2, bl, vis_nr);
+ return check_dependence(n1, n2, bl);
}
static int cmp_call_dependecy(const void *c1, const void *c2)
1 if second is "smaller" that first
-1 if first is "smaller" that second
*/
- return n1 == n2 ? 0 : (dependent_on(n1, n2) ? -1 : 1);
+ if (dependent_on(n1, n2))
+ return -1;
+
+ if (dependent_on(n2, n1))
+ return 1;
+
+ return 0;
}
/**
for(i = n - 1; i >= 0; --i) {
ir_node *irn = nodes[i];
+ DBG((env->dbg, LEVEL_3, "\tprocessing call %+F\n", irn));
switch(get_irn_opcode(irn)) {
case iro_Call:
curr_sp = adjust_call(env, irn, curr_sp);