#include "irgwalk.h"
#include "irgmod.h"
#include "irnode_t.h"
+#include "irtools.h"
-#define SET_VNUM(node, vnum) set_irn_link(node, (void *)vnum)
-#define GET_VNUM(node) (unsigned)get_irn_link(node)
+#define SET_VNUM(node, vnum) set_irn_link(node, INT_TO_PTR(vnum))
+#define GET_VNUM(node) (unsigned)PTR_TO_INT(get_irn_link(node))
/**
* A path element entry: it is either an entity
typedef struct _scalars_t {
entity *ent; /**< A entity for scalar replacement. */
- type *ent_owner; /**< The owner of this entity. */
+ ir_type *ent_owner; /**< The owner of this entity. */
} scalars_t;
unsigned i;
for (i = 0; i < path->path_len; ++i)
- hash ^= (unsigned)path->path[i].ent;
+ hash ^= (unsigned)PTR_TO_INT(path->path[i].ent);
return hash >> 4;
}
return 1;
}
-/**
+/*
* Returns non-zero, if the address of an entity
* represented by a Sel node (or it's successor Sels) is taken.
- *
- * @param sel the Sel node
*/
-static int is_address_taken(ir_node *sel)
+int is_address_taken(ir_node *sel)
{
- int i, n;
+ int i;
if (! is_const_sel(sel))
return 1;
- n = get_irn_n_outs(sel);
- for (i = 0; i < n; ++i) {
+ for (i = get_irn_n_outs(sel) - 1; i >= 0; --i) {
ir_node *succ = get_irn_out(sel, i);
switch (get_irn_opcode(succ)) {
for (i = 0; i < n; ++i) {
ir_node *succ = get_irn_out(sel, i);
- if (get_irn_op(succ) == op_Sel) {
+ if (is_Sel(succ)) {
link_all_leave_sels(ent, succ);
flag = 0;
}
for (i = 0; i < n; ++i) {
ir_node *succ = get_irn_out(irg_frame, i);
- if (get_irn_op(succ) == op_Sel) {
+ if (is_Sel(succ)) {
entity *ent = get_Sel_entity(succ);
set_entity_link(ent, NULL);
}
for (i = 0; i < n; ++i) {
ir_node *succ = get_irn_out(irg_frame, i);
- if (get_irn_op(succ) == op_Sel) {
+ if (is_Sel(succ)) {
entity *ent = get_Sel_entity(succ);
- type *ent_type;
+ ir_type *ent_type;
if (get_entity_link(ent) == ADDRESS_TAKEN)
continue;
n = get_Sel_n_indexs(sel);
len += n + 1;
- if (get_irn_op(pred) != op_Sel) {
+ if (! is_Sel(pred)) {
/* we found the root */
res = xmalloc(sizeof(*res) + (len - 1) * sizeof(res->path));
else
printf("[%ld]", get_tarval_long(key->path[i].tv));
}
- printf(" = %u (%s)\n", (int)get_irn_link(sel), get_mode_name((*modes)[key->vnum]));
+ printf(" = %u (%s)\n", PTR_TO_INT(get_irn_link(sel)), get_mode_name((*modes)[key->vnum]));
}
#endif /* DEBUG_libfirm */
}
/* a load, check if we can resolve it */
adr = get_Load_ptr(node);
- if (get_irn_op(adr) != op_Sel)
+ if (! is_Sel(adr))
return;
if (! pset_find_ptr(env->sels, adr))
/* a Store always can be replaced */
adr = get_Store_ptr(node);
- if (get_irn_op(adr) != op_Sel)
+ if (! is_Sel(adr))
return;
if (! pset_find_ptr(env->sels, adr))
ir_mode **modes;
set *set_ent;
pset *sels;
- type *ent_type;
+ ir_type *ent_type;
ir_graph *rem;
if (! get_opt_scalar_replacement())
for (i = 0 ; i < get_irn_n_outs(irg_frame); i++) {
ir_node *succ = get_irn_out(irg_frame, i);
- if (get_irn_op(succ) == op_Sel) {
+ if (is_Sel(succ)) {
entity *ent = get_Sel_entity(succ);
if (get_entity_link(ent) == NULL || get_entity_link(ent) == ADDRESS_TAKEN)