new attributes added
[libfirm] / ir / be / ia32 / ia32_optimize.c
index 1be2582..7c225f4 100644 (file)
@@ -37,12 +37,11 @@ static ident *unique_id(const char *tag)
  * @return the created ia32 Const node
  */
 static ir_node *gen_SymConst(ia32_transform_env_t *env) {
-       ir_node           *cnst;
-       firm_dbg_module_t *mod   = env->mod;
-       dbg_info          *dbg   = env->dbg;
-       ir_mode           *mode  = env->mode;
-       ir_graph          *irg   = env->irg;
-       ir_node           *block = env->block;
+       ir_node  *cnst;
+       dbg_info *dbg   = env->dbg;
+       ir_mode  *mode  = env->mode;
+       ir_graph *irg   = env->irg;
+       ir_node  *block = env->block;
 
        if (mode_is_float(mode)) {
                cnst = new_rd_ia32_fConst(dbg, irg, block, mode);
@@ -70,12 +69,12 @@ static ir_node *gen_Const(ia32_transform_env_t *env) {
        entity  *ent;
        ir_type *tp;
        symconst_symbol sym;
-       firm_dbg_module_t *mod   = env->mod;
-       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_graph *irg   = env->irg;
+       ir_node  *block = env->block;
+       ir_node  *node  = env->irn;
+       ir_graph *rem;
 
        if (mode_is_float(mode)) {
                tp  = get_Const_type(node);
@@ -90,7 +89,12 @@ static ir_node *gen_Const(ia32_transform_env_t *env) {
                set_entity_variability(ent, variability_constant);
                set_entity_allocation(ent, allocation_static);
 
-               set_atomic_ent_value(ent, node);
+                /* we create a new entity here: It's initialization must resist on the
+                   const code irg */
+               rem = current_ir_graph;
+               current_ir_graph = get_const_code_irg();
+               set_atomic_ent_value(ent, copy_const_value(NULL, node));
+               current_ir_graph = rem;
 
                sym.entity_p = ent;
 
@@ -132,7 +136,7 @@ void ia32_place_consts(ir_node *irn, void *env) {
        tenv.mod      = firm_dbg_register("ir.be.ia32.optimize");
 
        /* Loop over all predecessors and check for Sym/Const nodes */
-       for (i = 0; i < get_irn_arity(irn); i++) {
+       for (i = get_irn_arity(irn) - 1; i >= 0; --i) {
                pred      = get_irn_n(irn, i);
                cnst      = NULL;
                opc       = get_irn_opcode(pred);