IA32_AM_CAND_BOTH = 3
} ia32_am_cand_t;
-#undef is_NoMem
-#define is_NoMem(irn) (get_irn_op(irn) == op_NoMem)
-
typedef int is_op_func_t(const ir_node *n);
typedef ir_node *load_func_t(dbg_info *db, ir_graph *irg, ir_node *block, ir_node *base, ir_node *index, ir_node *mem);
* @return the created ia32 Const node
*/
static ir_node *gen_Const(ia32_transform_env_t *env) {
- ir_node *cnst, *load;
+ ir_node *cnst, *load;
symconst_symbol sym;
- ir_graph *irg = env->irg;
- ir_node *block = env->block;
- ir_node *node = env->irn;
- dbg_info *dbg = env->dbg;
- ir_mode *mode = env->mode;
+ ir_graph *irg = env->irg;
+ ir_node *block = env->block;
+ ir_node *node = env->irn;
+ dbg_info *dbg = env->dbg;
+ ir_mode *mode = env->mode;
+ ir_node *start_block = get_irg_start_block(irg);
if (mode_is_float(mode)) {
FP_USED(env->cg);
env->irn = cnst;
env->mode = mode_P;
cnst = gen_SymConst(env);
- add_irn_dep(cnst, be_abi_get_start_barrier(env->cg->birg->abi));
+
+ if (start_block == block)
+ add_irn_dep(cnst, be_abi_get_start_barrier(env->cg->birg->abi));
+
set_Load_ptr(get_Proj_pred(load), cnst);
cnst = load;
}
else {
cnst = new_rd_ia32_Const(dbg, irg, block, get_irn_mode(node));
- add_irn_dep(cnst, be_abi_get_start_barrier(env->cg->birg->abi));
+
+ if (start_block == block)
+ add_irn_dep(cnst, be_abi_get_start_barrier(env->cg->birg->abi));
+
set_ia32_Const_attr(cnst, node);
}
int n;
n = ia32_get_irn_n_edges(in);
is_cand = (n == 1) ? 1 : is_cand; /* load with more than one user: no AM */
+#else
+ is_cand = 1;
#endif
load = get_Proj_pred(in);
offs_cnst = get_ia32_cnst(irn);
dolea = 1;
}
- else if (is_ia32_ImmSymConst(irn)) {
+ else if (isadd && is_ia32_ImmSymConst(irn)) {
DBG((mod, LEVEL_1, "\tfound op with imm symconst"));
have_am_sc = 1;
}
}
+ /* we have to be the only user of the load */
+ if(get_irn_n_edges(left) > 1) {
+ store = NULL;
+ }
+ }
+ if (store) {
/* skip the Proj for easier access */
load = get_Proj_pred(left);
set_irn_n(irn, 2, ia32_get_admissible_noreg(cg, irn, 2));
}
- /* this is only needed for Compares, but currently ALL nodes
- * have this attribute :-) */
- set_ia32_pncode(irn, get_inversed_pnc(get_ia32_pncode(irn)));
-
DBG_OPT_AM_S(load, irn);
/* If Load has a memory Proj, connect it to the op */