projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
optimize_one_return() now did not build Phi(a,...,a) if a is an Unknown.
[libfirm]
/
ir
/
opt
/
scalar_replace.c
diff --git
a/ir/opt/scalar_replace.c
b/ir/opt/scalar_replace.c
index
fb24faf
..
881d199
100644
(file)
--- a/
ir/opt/scalar_replace.c
+++ b/
ir/opt/scalar_replace.c
@@
-37,9
+37,10
@@
#include "irgwalk.h"
#include "irgmod.h"
#include "irnode_t.h"
#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
/**
* A path element entry: it is either an entity
@@
-63,7
+64,7
@@
typedef struct _path_t {
typedef struct _scalars_t {
entity *ent; /**< A entity for scalar replacement. */
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;
} scalars_t;
@@
-103,7
+104,7
@@
static unsigned path_hash(const path_t *path)
unsigned i;
for (i = 0; i < path->path_len; ++i)
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 hash >> 4;
}
@@
-125,21
+126,18
@@
static int is_const_sel(ir_node *sel) {
return 1;
}
return 1;
}
-/*
*
+/*
* Returns non-zero, if the address of an entity
* represented by a Sel node (or it's successor Sels) is taken.
* 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;
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)) {
ir_node *succ = get_irn_out(sel, i);
switch (get_irn_opcode(succ)) {
@@
-191,7
+189,7
@@
static void link_all_leave_sels(entity *ent, ir_node *sel)
for (i = 0; i < n; ++i) {
ir_node *succ = get_irn_out(sel, i);
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;
}
link_all_leave_sels(ent, succ);
flag = 0;
}
@@
-254,7
+252,7
@@
static int find_possible_replacements(ir_graph *irg)
for (i = 0; i < n; ++i) {
ir_node *succ = get_irn_out(irg_frame, i);
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);
}
entity *ent = get_Sel_entity(succ);
set_entity_link(ent, NULL);
}
@@
-268,9
+266,9
@@
static int find_possible_replacements(ir_graph *irg)
for (i = 0; i < n; ++i) {
ir_node *succ = get_irn_out(irg_frame, i);
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);
entity *ent = get_Sel_entity(succ);
- type *ent_type;
+
ir_
type *ent_type;
if (get_entity_link(ent) == ADDRESS_TAKEN)
continue;
if (get_entity_link(ent) == ADDRESS_TAKEN)
continue;
@@
-313,7
+311,7
@@
static path_t *find_path(ir_node *sel, unsigned len)
n = get_Sel_n_indexs(sel);
len += n + 1;
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));
/* we found the root */
res = xmalloc(sizeof(*res) + (len - 1) * sizeof(res->path));
@@
-388,7
+386,7
@@
static unsigned allocate_value_numbers(pset *sels, entity *ent, unsigned vnum, i
else
printf("[%ld]", get_tarval_long(key->path[i].tv));
}
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 */
}
}
#endif /* DEBUG_libfirm */
}
@@
-436,7
+434,7
@@
static void handle_first(ir_node *node, void *ctx)
/* a load, check if we can resolve it */
adr = get_Load_ptr(node);
/* 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))
return;
if (! pset_find_ptr(env->sels, adr))
@@
-472,7
+470,7
@@
static void handle_first(ir_node *node, void *ctx)
/* a Store always can be replaced */
adr = get_Store_ptr(node);
/* 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))
return;
if (! pset_find_ptr(env->sels, adr))
@@
-676,7
+674,7
@@
void scalar_replacement_opt(ir_graph *irg)
ir_mode **modes;
set *set_ent;
pset *sels;
ir_mode **modes;
set *set_ent;
pset *sels;
-
type
*ent_type;
+
ir_type
*ent_type;
ir_graph *rem;
if (! get_opt_scalar_replacement())
ir_graph *rem;
if (! get_opt_scalar_replacement())
@@
-705,7
+703,7
@@
void scalar_replacement_opt(ir_graph *irg)
for (i = 0 ; i < get_irn_n_outs(irg_frame); i++) {
ir_node *succ = get_irn_out(irg_frame, i);
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)
entity *ent = get_Sel_entity(succ);
if (get_entity_link(ent) == NULL || get_entity_link(ent) == ADDRESS_TAKEN)