diff mbox

[RFC,v0,7/8] Spill globals early if their next use is at the BB end.

Message ID 1306161654-4388-8-git-send-email-batuzovk@ispras.ru
State New
Headers show

Commit Message

Kirill Batuzov May 23, 2011, 2:40 p.m. UTC
Spill globals early if their next use is at the BB end.  They'll be spilled
anyway in this case.

Signed-off-by: Kirill Batuzov <batuzovk@ispras.ru>
---
 tcg/tcg.c |   13 +++++++++----
 1 files changed, 9 insertions(+), 4 deletions(-)
diff mbox

Patch

diff --git a/tcg/tcg.c b/tcg/tcg.c
index ad5bd71..022eef9 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1179,11 +1179,16 @@  static inline void tcg_la_func_end(TCGContext *s, uint8_t *dead_temps)
 /* liveness analysis: end of basic block: globals are live, temps are
    dead, local temps are live. */
 static inline void tcg_la_bb_end(TCGContext *s, uint8_t *dead_temps,
-                                 int *temp_next_use)
+                                 int *temp_next_use, int op_index)
 {
     int i;
     TCGTemp *ts;
 
+#ifdef USE_ADVANCED_REGALLOC
+    for (i = 0; i < s->nb_globals; i++) {
+        temp_next_use[i] = op_index;
+    }
+#endif
     memset(dead_temps, 0, s->nb_globals);
     ts = &s->temps[s->nb_globals];
     for(i = s->nb_globals; i < s->nb_temps; i++) {
@@ -1328,7 +1333,7 @@  static void tcg_liveness_analysis(TCGContext *s)
             args--;
             next_use_ptr--;
             /* mark end of basic block */
-            tcg_la_bb_end(s, dead_temps, temp_next_use);
+            tcg_la_bb_end(s, dead_temps, temp_next_use, op_index);
             break;
         case INDEX_op_debug_insn_start:
             args -= def->nb_args;
@@ -1394,7 +1399,7 @@  static void tcg_liveness_analysis(TCGContext *s)
 
                 /* if end of basic block, update */
                 if (def->flags & TCG_OPF_BB_END) {
-                    tcg_la_bb_end(s, dead_temps, temp_next_use);
+                    tcg_la_bb_end(s, dead_temps, temp_next_use, op_index);
                 } else if (def->flags & TCG_OPF_CALL_CLOBBER) {
                     /* globals are live */
                     memset(dead_temps, 0, s->nb_globals);
@@ -2203,7 +2208,7 @@  static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
 #ifdef USE_ADVANCED_REGALLOC
             if (args[0] < s->nb_globals) {
                 if (tcg_op_defs[gen_opc_buf[param_next_use_ptr[0]]].flags
-                        & TCG_OPF_CALL_CLOBBER) {
+                        & (TCG_OPF_CALL_CLOBBER | TCG_OPF_BB_END)) {
                     tcg_reg_free(s, s->temps[args[0]].reg);
                 }
             }