remove the deprecated and unused construct of a value_res_base entities in method...
[libfirm] / ir / be / sparc / sparc_transform.c
index 2b28fb9..62fd6b7 100644 (file)
@@ -26,6 +26,7 @@
 #include "config.h"
 
 #include <stdint.h>
+#include <stdbool.h>
 
 #include "irnode_t.h"
 #include "irgraph_t.h"
@@ -70,9 +71,14 @@ static ir_mode               *mode_fp2;
 //static ir_mode               *mode_fp4;
 static pmap                  *node_to_stack;
 
-static inline int mode_needs_gp_reg(ir_mode *mode)
+static inline bool mode_needs_gp_reg(ir_mode *mode)
 {
-       return mode_is_int(mode) || mode_is_reference(mode);
+       if (mode_is_int(mode) || mode_is_reference(mode)) {
+               /* we should only see 32bit code */
+               assert(get_mode_size_bits(mode) <= 32);
+               return true;
+       }
+       return false;
 }
 
 /**
@@ -239,6 +245,9 @@ static ir_node *gen_helper_binop_args(ir_node *node,
        }
        mode1 = get_irn_mode(op1);
        mode2 = get_irn_mode(op2);
+       /* we shouldn't see 64bit code */
+       assert(get_mode_size_bits(mode1) <= 32);
+       assert(get_mode_size_bits(mode2) <= 32);
 
        if (is_imm_encodeable(op2)) {
                ir_node *new_op1   = be_transform_node(op1);
@@ -511,6 +520,10 @@ static ir_node *gen_Load(ir_node *node)
        ir_node  *new_load = NULL;
        address_t address;
 
+       if (get_Load_unaligned(node) == align_non_aligned) {
+               panic("sparc: transformation of unaligned Loads not implemented yet");
+       }
+
        if (mode_is_float(mode)) {
                match_address(ptr, &address, false);
                new_load = create_ldf(dbgi, block, address.ptr, new_mem, mode,
@@ -551,12 +564,17 @@ static ir_node *gen_Store(ir_node *node)
        ir_node  *new_store = NULL;
        address_t address;
 
+       if (get_Store_unaligned(node) == align_non_aligned) {
+               panic("sparc: transformation of unaligned Stores not implemented yet");
+       }
+
        if (mode_is_float(mode)) {
                /* TODO: variants with reg+reg address mode */
                match_address(ptr, &address, false);
                new_store = create_stf(dbgi, block, new_val, address.ptr, new_mem,
                                       mode, address.entity, address.offset, false);
        } else {
+               assert(get_mode_size_bits(mode) <= 32);
                match_address(ptr, &address, true);
                if (address.ptr2 != NULL) {
                        assert(address.entity == NULL && address.offset == 0);
@@ -1271,7 +1289,7 @@ static void create_stacklayout(ir_graph *irg)
 }
 
 /**
- * transform the start node to the prolog code + initial barrier
+ * transform the start node to the prolog code
  */
 static ir_node *gen_Start(ir_node *node)
 {
@@ -1326,6 +1344,7 @@ static ir_node *gen_Start(ir_node *node)
                arch_irn_add_flags(save, arch_irn_flags_prolog);
                arch_set_irn_register(save, sp_reg);
                sp = save;
+               keep_alive(save);
        }
 
        sp = be_new_IncSP(sp_reg, new_block, sp, BE_STACK_FRAME_SIZE_EXPAND, 0);
@@ -1407,7 +1426,8 @@ static ir_node *gen_Return(ir_node *node)
 
        /* we need a restore instruction */
        if (!cconv->omit_fp) {
-               ir_node *restore = new_bd_sparc_RestoreZero(NULL, block);
+               ir_node *fp      = be_prolog_get_reg_value(abihelper, fp_reg);
+               ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, fp);
                arch_irn_add_flags(restore, arch_irn_flags_epilog);
                arch_set_irn_register(restore, sp_reg);
                be_epilog_set_reg_value(abihelper, sp_reg, restore);
@@ -1949,7 +1969,6 @@ static ir_node *gen_Proj_Call(ir_node *node)
        case pn_Call_X_regular:
        case pn_Call_X_except:
        case pn_Call_T_result:
-       case pn_Call_P_value_res_base:
        case pn_Call_max:
                break;
        }
@@ -2085,27 +2104,6 @@ static void sparc_register_transformers(void)
        be_set_transform_function(op_sparc_Save,   be_duplicate_node);
 }
 
-/* hack to avoid unused fp proj at start barrier */
-static void assure_fp_keep(void)
-{
-       unsigned         n_users = 0;
-       const ir_edge_t *edge;
-       ir_node         *fp_proj = be_prolog_get_reg_value(abihelper, fp_reg);
-
-       foreach_out_edge(fp_proj, edge) {
-               ir_node *succ = get_edge_src_irn(edge);
-               if (is_End(succ) || is_Anchor(succ))
-                       continue;
-               ++n_users;
-       }
-
-       if (n_users == 0) {
-               ir_node *block = get_nodes_block(fp_proj);
-               ir_node *in[1] = { fp_proj };
-               be_new_Keep(block, 1, in);
-       }
-}
-
 /**
  * Transform a Firm graph into a SPARC graph.
  */
@@ -2129,8 +2127,6 @@ void sparc_transform_graph(ir_graph *irg)
        create_stacklayout(irg);
 
        be_transform_graph(irg, NULL);
-       if (!cconv->omit_fp)
-               assure_fp_keep();
 
        be_abihelper_finish(abihelper);
        sparc_free_calling_convention(cconv);