More missing config.h
[libfirm] / ir / be / ia32 / ia32_optimize.c
index 3b0dcc2..992cf47 100644 (file)
@@ -44,9 +44,6 @@ typedef enum {
        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);
 
@@ -186,13 +183,14 @@ static entity *get_entity_for_tv(ia32_code_gen_t *cg, ir_node *cnst)
  * @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);
@@ -213,13 +211,19 @@ static ir_node *gen_Const(ia32_transform_env_t *env) {
                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);
        }
 
@@ -847,6 +851,8 @@ static ia32_am_cand_t is_am_candidate(ia32_code_gen_t *cg, heights_t *h, const i
                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);
@@ -1135,7 +1141,7 @@ static ir_node *fold_addr(ia32_code_gen_t *cg, ir_node *irn, ir_node *noreg) {
                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;
@@ -1620,6 +1626,12 @@ static void optimize_am(ir_node *irn, void *env) {
                                        }
                                }
 
+                               /* 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);
 
@@ -1750,10 +1762,6 @@ static void optimize_am(ir_node *irn, void *env) {
                                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 */