mark stores in int->float, float->int and float->float convs as spills
[libfirm] / ir / be / sparc / sparc_stackframe.c
index b14a17c..fdadc75 100644 (file)
@@ -24,6 +24,8 @@
  */
 #include "config.h"
 
+#include "beirg.h"
+#include "error.h"
 #include "firm_types.h"
 #include "irnode_t.h"
 #include "bearch_sparc_t.h"
@@ -50,9 +52,6 @@ static void set_irn_sp_bias(ir_node *node, int new_bias)
 static void process_bias(ir_node *block, bool sp_relative, int bias,
                          int free_bytes)
 {
-       const ir_edge_t *edge;
-       ir_node         *irn;
-
        mark_Block_block_visited(block);
 
        /* process schedule */
@@ -68,6 +67,14 @@ static void process_bias(ir_node *block, bool sp_relative, int bias,
                        arch_set_frame_offset(irn, offset);
                }
 
+               /* The additional alignment bytes cannot be used
+                * anymore after alloca. */
+               if (is_sparc_SubSP(irn)) {
+                       free_bytes = 0;
+               } else if (is_sparc_AddSP(irn)) {
+                       assert(free_bytes == 0);
+               }
+
                irn_bias = arch_get_sp_bias(irn);
                if (irn_bias == 0) {
                        /* do nothing */