guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 412/437: Add extra argument to jit_update to prevent rec


From: Andy Wingo
Subject: [Guile-commits] 412/437: Add extra argument to jit_update to prevent recursion on branches
Date: Mon, 2 Jul 2018 05:15:06 -0400 (EDT)

wingo pushed a commit to branch lightning
in repository guile.

commit 59f32e85c3c9df698d244f41ff56d3b3e4ecb0d8
Author: pcpa <address@hidden>
Date:   Wed Jan 31 17:09:29 2018 -0500

    Add extra argument to jit_update to prevent recursion on branches
    
        * lib/lightning.c: Avoid deep recursions when computing live
        register ranges.
---
 ChangeLog       |  5 +++++
 lib/lightning.c | 24 +++++++++++++++---------
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index eea7ae0..ef5af55 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2018-01-31 Paulo Andrade <address@hidden>
 
+       * lib/lightning.c: Avoid deep recursions when computing live
+       register ranges.
+
+2018-01-31 Paulo Andrade <address@hidden>
+
        * lib/jit_mips-cpu.c: Correct frame size and varargs
        initialization for the n32 abi.
        * lib/jit_mips.c, lib/jit_mips-fpu.c: Correct 32 bit abis
diff --git a/lib/lightning.c b/lib/lightning.c
index 57f5623..166aebf 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -91,10 +91,10 @@ _jit_dataset(jit_state_t *_jit);
 static void
 _jit_setup(jit_state_t *_jit, jit_block_t *block);
 
-#define jit_update(node, live, mask)   _jit_update(_jit, node, live, mask)
+#define jit_update(node, live, mask, r)        _jit_update(_jit, node, live, 
mask, r)
 static void
 _jit_update(jit_state_t *_jit, jit_node_t *node,
-           jit_regset_t *live, jit_regset_t *mask);
+           jit_regset_t *live, jit_regset_t *mask, jit_bool_t recurse);
 
 #define thread_jumps()                 _thread_jumps(_jit)
 static void
@@ -1574,7 +1574,7 @@ _jit_optimize(jit_state_t *_jit)
            continue;
        if (block->label->code != jit_code_epilog) {
            jit_regset_set(&_jitc->regmask, &block->regmask);
-           jit_update(block->label->next, &block->reglive, &_jitc->regmask);
+           jit_update(block->label->next, &block->reglive, &_jitc->regmask, 1);
        }
     }
     /* do a second pass from start to properly handle some conditions
@@ -1587,7 +1587,7 @@ _jit_optimize(jit_state_t *_jit)
            continue;
        if (block->label->code != jit_code_epilog) {
            jit_regset_set(&_jitc->regmask, &block->setmask);
-           jit_update(block->label->next, &block->reglive, &_jitc->regmask);
+           jit_update(block->label->next, &block->reglive, &_jitc->regmask, 1);
        }
     }
 
@@ -1767,7 +1767,7 @@ _jit_reglive(jit_state_t *_jit, jit_node_t *node)
            }
            if (jit_regset_set_p(&_jitc->regmask)) {
                bmp_zero();
-               jit_update(node->next, &_jitc->reglive, &_jitc->regmask);
+               jit_update(node->next, &_jitc->reglive, &_jitc->regmask, 1);
                if (jit_regset_set_p(&_jitc->regmask)) {
                    /* any unresolved live state is considered as live */
                    jit_regset_ior(&_jitc->reglive,
@@ -2193,7 +2193,7 @@ _jit_setup(jit_state_t *_jit, jit_block_t *block)
  */
 static void
 _jit_update(jit_state_t *_jit, jit_node_t *node,
-           jit_regset_t *live, jit_regset_t *mask)
+           jit_regset_t *live, jit_regset_t *mask, jit_bool_t recurse)
 {
     jit_int32_t                 spec;
     jit_int32_t                 regno;
@@ -2313,8 +2313,14 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
                        if (jit_regset_set_p(mask) == 0)
                            return;
                        /* restore mask if branch is conditional */
-                       jit_regset_set(&zmask, mask);
-                       jit_update(block->label->next, live, &zmask);
+                       if (recurse) {
+                           jit_regset_set(&zmask, mask);
+                           jit_update(block->label->next, live, &zmask, 0);
+                       }
+                       else {
+                           node = block->label->next;
+                           goto restart;
+                       }
                        jit_regset_xor(&ztmp, &zmask, mask);
                        /* remove known live registers from mask */
                        if (jit_regset_set_p(&ztmp)) {
@@ -3124,7 +3130,7 @@ _spill_reglive_p(jit_state_t *_jit, jit_node_t *node, 
jit_int32_t regno)
     if (!jit_regset_tstbit(&_jitc->reglive, regno)) {
        bmp_zero();
        jit_regset_setbit(&_jitc->regmask, regno);
-       jit_update(node->next, &_jitc->reglive, &_jitc->regmask);
+       jit_update(node->next, &_jitc->reglive, &_jitc->regmask, 1);
        if (!jit_regset_tstbit(&_jitc->reglive, regno) &&
            register_change_p(node->next, node->link, regno) != jit_reg_change)
            return (0);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]