* @author Beyhan Veliev, Michael Beck
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
#include <string.h>
for (i = 0; i < n; ++i) {
ir_node *idx = get_Sel_index(sel, i);
- if (get_irn_op(idx) != op_Const)
+ if (!is_Const(idx))
return 0;
}
return 1;
*/
int is_address_taken(ir_node *sel)
{
- int i;
- ir_mode *emode, *mode;
- ir_node *value;
+ int i, input_nr, k;
+ ir_mode *emode, *mode;
+ ir_node *value;
ir_entity *ent;
if (! is_const_sel(sel))
switch (get_irn_opcode(succ)) {
case iro_Load:
+ /* do not remove volatile variables */
+ if (get_Load_volatility(succ) == volatility_is_volatile)
+ return 1;
/* check if this load is not a hidden conversion */
mode = get_Load_mode(succ);
ent = get_Sel_entity(sel);
emode = get_type_mode(get_entity_type(ent));
if (! check_load_store_mode(mode, emode))
return 1;
- /* do not remove volatile variables */
- if (get_Load_volatility(succ) == volatility_is_volatile)
- return 1;
break;
case iro_Store:
value = get_Store_value(succ);
if (value == sel)
return 1;
+ /* do not remove volatile variables */
+ if (get_Store_volatility(succ) == volatility_is_volatile)
+ return 1;
/* check if this Store is not a hidden conversion */
mode = get_irn_mode(value);
ent = get_Sel_entity(sel);
emode = get_type_mode(get_entity_type(ent));
if (! check_load_store_mode(mode, emode))
return 1;
- /* do not remove volatile variables */
- if (get_Store_volatility(succ) == volatility_is_volatile)
- return 1;
break;
case iro_Sel: {
*/
return 1;
+ case iro_Id: {
+ int res = is_address_taken(succ);
+ if (res)
+ return 1;
+ break;
+ }
+
+ case iro_Tuple:
+ /* Non-optimized Tuple, happens in inlining */
+ for (input_nr = get_Tuple_n_preds(succ) - 1; input_nr >= 0; --input_nr) {
+ ir_node *pred = get_Tuple_pred(succ, input_nr);
+
+ if (pred == sel) {
+ /* we found one input */
+ for (k = get_irn_n_outs(succ) - 1; k >= 0; --k) {
+ ir_node *proj = get_irn_out(succ, k);
+
+ if (is_Proj(proj) && get_Proj_proj(proj) == input_nr) {
+ int res = is_address_taken(proj);
+ if (res)
+ return 1;
+ }
+ }
+ }
+ }
+ break;
+
default:
/* another op, the address is taken */
return 1;
* visited more than once causing a ring here, so we use the
* node flag to mark linked nodes
*/
- if (irn_visited(sel))
+ if (irn_visited_else_mark(sel))
return;
/* we know we are at a leave, because this function is only
*/
set_irn_link(sel, get_entity_link(ent));
set_entity_link(ent, sel);
-
- mark_irn_visited(sel);
}
}
if (! is_Sel(pred)) {
/* we found the root */
-
- res = xmalloc(sizeof(*res) + (len - 1) * sizeof(res->path));
+ res = XMALLOCF(path_t, path, len);
res->path_len = len;
} else
res = find_path(pred, len);
*/
static void topologic_walker(ir_node *node, void *ctx) {
env_t *env = ctx;
- ir_op *op = get_irn_op(node);
ir_node *adr, *block, *mem, *val;
ir_mode *mode;
unsigned vnum;
- if (op == op_Load) {
+ if (is_Load(node)) {
/* a load, check if we can resolve it */
adr = get_Load_ptr(node);
set_Tuple_pred(node, pn_Load_res, val);
set_Tuple_pred(node, pn_Load_X_regular, new_Jmp());
set_Tuple_pred(node, pn_Load_X_except, new_Bad());
- } else if (op == op_Store) {
+ } else if (is_Store(node)) {
DB((dbg, SET_LEVEL_3, " checking %+F for replacement ", node));
/* a Store always can be replaced */