* src/vm/jit/replace.c: Handle countdown traps. Request optimization
authoredwin <none@none>
Sun, 4 Mar 2007 20:10:18 +0000 (20:10 +0000)
committeredwin <none@none>
Sun, 4 Mar 2007 20:10:18 +0000 (20:10 +0000)
of hot methods and their callers.

* src/vm/jit/jit.c (jit_compile): Set JITDATA_FLAG_COUNTDOWN for
inlining.
(jit_recompile): Set JITDATA_FLAG_INLINE for inlining.

src/vm/jit/jit.c
src/vm/jit/replace.c

index ef18e1646bee50e07819af4c8cac27931b3196b6..03392eea2046344b1f7e13428c16afd1901f36dd 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jit.c 7275 2007-02-02 00:20:56Z twisti $
+   $Id: jit.c 7451 2007-03-04 20:10:18Z edwin $
 
 */
 
@@ -1093,6 +1093,11 @@ u1 *jit_compile(methodinfo *m)
        if (opt_verbosecall)
                jd->flags |= JITDATA_FLAG_VERBOSECALL;
 
+#if defined(ENABLE_REPLACEMENT) && defined(ENABLE_INLINING)
+       if (opt_inlining)
+               jd->flags |= JITDATA_FLAG_COUNTDOWN;
+#endif
+
 #if defined(ENABLE_JIT)
 # if defined(ENABLE_INTRP)
        if (!opt_intrp)
@@ -1218,6 +1223,11 @@ u1 *jit_recompile(methodinfo *m)
        if (opt_verbosecall)
                jd->flags |= JITDATA_FLAG_VERBOSECALL;
 
+#if defined(ENABLE_INLINING)
+       if (opt_inlining)
+               jd->flags |= JITDATA_FLAG_INLINE;
+#endif
+
 #if defined(ENABLE_JIT)
 # if defined(ENABLE_INTRP)
        if (!opt_intrp)
index 4b1d9578df9bc4116b120f164a20e68f423a2f51..e16217b887445b1bb739f371df3ae0df2ef01a2a 100644 (file)
@@ -608,6 +608,9 @@ bool replace_create_replacement_points(jitdata *jd)
                        replace_create_replacement_point(jd, iinfo, rp++,
                                        bptr->type, bptr->iinstr, &ra,
                                        bptr->javalocals, bptr->invars + i, bptr->indepth - i, 0);
+
+                       if (JITDATA_HAS_FLAG_COUNTDOWN(jd))
+                               rp[-1].flags |= RPLPOINT_FLAG_COUNTDOWN;
                }
 
                /* iterate over the instructions */
@@ -845,6 +848,23 @@ void replace_deactivate_replacement_points(codeinfo *code)
        s4        count;
        u1       *savedmcode;
 
+       if (code->savedmcode == NULL) {
+               /* disarm countdown points by patching the branches */
+
+               i = code->rplpointcount;
+               rp = code->rplpoints;
+               for (; i--; rp++) {
+                       if ((rp->flags & (RPLPOINT_FLAG_ACTIVE | RPLPOINT_FLAG_COUNTDOWN))
+                                       == RPLPOINT_FLAG_COUNTDOWN)
+                       {
+#if 0
+                               *(s4*) (rp->pc + 9) = 0; /* XXX machine dependent! */
+#endif
+                       }
+               }
+               return;
+       }
+
        assert(code->savedmcode != NULL);
        savedmcode = code->savedmcode;
 
@@ -1654,13 +1674,20 @@ struct replace_patch_data_t {
        u1         *entrypoint;
 };
 
+#define CODEINFO_OF_CODE(entrypoint) \
+       (*(codeinfo **)((u1*)(entrypoint) + CodeinfoPointer))
+
+#define METHOD_OF_CODE(entrypoint) \
+       (CODEINFO_OF_CODE(entrypoint)->m)
+
 void replace_patch_callback(classinfo *c, struct replace_patch_data_t *pd)
 {
        vftbl_t *vftbl = c->vftbl;
 
        if (vftbl != NULL
                && vftbl->vftbllength > pd->m->vftblindex
-               && vftbl->table[pd->m->vftblindex] == (methodptr) pd->oldentrypoint)
+               && vftbl->table[pd->m->vftblindex] != &asm_abstractmethoderror
+               && METHOD_OF_CODE(vftbl->table[pd->m->vftblindex]) == pd->m)
        {
                replace_patch_class(c->vftbl, pd->m, pd->oldentrypoint, pd->entrypoint);
        }
@@ -1676,6 +1703,9 @@ void replace_patch_class_hierarchy(methodinfo *m,
        pd.oldentrypoint = oldentrypoint;
        pd.entrypoint = entrypoint;
 
+       DOLOG_SHORT( printf("patching class hierarchy: ");
+                            method_println(m); );
+
        classcache_foreach_loaded_class(
                        (classcache_foreach_functionptr_t) &replace_patch_callback,
                        (void*) &pd);
@@ -2401,6 +2431,12 @@ static bool replace_map_source_state(sourcestate_t *ss)
 #if defined(REPLACE_STATISTICS)
                                oldcode = frame->method->code;
 #endif
+                               /* request optimization of hot methods and their callers */
+
+                               if (frame->method->hitcountdown < 0
+                                       || (frame->down && frame->down->method->hitcountdown < 0))
+                                       jit_request_optimization(frame->method);
+
                                code = jit_get_current_code(frame->method);
 
                                if (code == NULL)
@@ -2850,6 +2886,8 @@ void replace_replacement_point_println(rplpoint *rp, int depth)
                        replace_type_str[rp->type]);
        if (rp->flags & RPLPOINT_FLAG_NOTRAP)
                printf(" NOTRAP");
+       if (rp->flags & RPLPOINT_FLAG_COUNTDOWN)
+               printf(" COUNTDOWN");
        if (rp->flags & RPLPOINT_FLAG_ACTIVE)
                printf(" ACTIVE");
        printf(" parent:%p\n", (void*)rp->parent);