* src/vm/jit/jit.c (jit_compile_intern): Perform inlining if
authoredwin <none@none>
Sat, 16 Dec 2006 22:53:24 +0000 (22:53 +0000)
committeredwin <none@none>
Sat, 16 Dec 2006 22:53:24 +0000 (22:53 +0000)
JITDATA_FLAG_INLINE is set.

* src/vm/jit/inline/inline.c: Put the result of inlining into
the passed jitdata, instead of using a new one. Do not translate
returnAddresses in javalocals. It makes no sense.

* src/vm/jit/i386/codegen.h (M_BS): New macro.

* src/vm/jit/replace.h (RPLPOINT_FLAG_COUNTDOWN): New constant.
(Preparation for count-down replacement).

* src/vm/jit/jit.h (JITDATA_FLAG_COUNTDOWN): New flag.
(JITDATA_HAS_FLAG_COUNTDOWN): New macro.

src/vm/jit/i386/codegen.h
src/vm/jit/inline/inline.c
src/vm/jit/jit.c
src/vm/jit/jit.h
src/vm/jit/replace.h

index e83f37df2cf87b3f66499ec64b22d7e135ef9613..35101a9f6f20803d31f87d0660e0399f4dc39abc 100644 (file)
@@ -27,7 +27,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.h 6129 2006-12-06 10:49:47Z twisti $
+   $Id: codegen.h 6211 2006-12-16 22:53:24Z edwin $
 
 */
 
 #define M_BAE(a)                emit_jcc(cd, CC_AE, (a))
 #define M_BA(a)                 emit_jcc(cd, CC_A, (a))
 #define M_BNS(a)                emit_jcc(cd, CC_NS, (a))
+#define M_BS(a)                 emit_jcc(cd, CC_S, (a))
 
 #define M_JMP(a)                emit_jmp_reg(cd, (a))
 #define M_JMP_IMM(a)            emit_jmp_imm(cd, (a))
index 2d0eddb7ec5fd2d02a400060881b80710f5a8935..eeecd3e2bc8e70cf19b46759f4532938137abb41 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: inline.c 6207 2006-12-16 21:11:04Z edwin $
+   $Id: inline.c 6211 2006-12-16 22:53:24Z edwin $
 
 */
 
@@ -689,10 +689,12 @@ static s4 *translate_javalocals(inline_node *iln, s4 *javalocals)
                        j = inline_translate_variable(iln->ctx->resultjd, iln->jd, iln->varmap, j);
                jl[i] = j;
 
+#if 0
                if (j < UNUSED) {
                        /* an encoded returnAddress value - must be relocated */
                        inline_add_blocknr_reference(iln, &(jl[i]));
                }
+#endif
        }
 
        return jl;
@@ -1224,8 +1226,10 @@ clone_call:
 
        switch (n_iptr->opc) {
                case ICMD_ASTORE:
+#if 0
                        if (n_iptr->flags.bits & INS_FLAG_RETADDR)
                                inline_add_blocknr_reference(iln, &(n_iptr->sx.s23.s2.retaddrnr));
+#endif
                        /* FALLTHROUGH! */
                case ICMD_ISTORE:
                case ICMD_LSTORE:
@@ -1818,8 +1822,7 @@ static void inline_write_exception_handlers(inline_node *master, inline_node *il
 
 /* second pass driver *********************************************************/
 
-static bool test_inlining(inline_node *iln, jitdata *jd,
-               jitdata **resultjd)
+static bool test_inlining(inline_node *iln, jitdata *jd)
 {
        instruction *n_ins;
        basicblock *n_bb;
@@ -1838,9 +1841,7 @@ static bool test_inlining(inline_node *iln, jitdata *jd,
 
        DOLOG( dump_inline_tree(iln, 0); );
 
-       assert(iln && jd && resultjd);
-
-       *resultjd = jd;
+       assert(iln && jd);
 
        n_ins = DMNEW(instruction, iln->cumul_instructioncount);
        MZERO(n_ins, instruction, iln->cumul_instructioncount);
@@ -1986,7 +1987,11 @@ static bool test_inlining(inline_node *iln, jitdata *jd,
                           && debug_compile_inlined_code_counter <= inline_debug_end_counter)
 #endif /* NDEBUG */
           {
-                       *resultjd = n_jd;
+                       /* install the inlined result */
+
+                       *jd->code = *n_jd->code;
+                       n_jd->code = jd->code;
+                       *jd = *n_jd;
 
 #if !defined(NDEBUG)
                        inline_count_methods++;
@@ -2534,15 +2539,13 @@ static void inline_post_process(jitdata *jd)
 
 /* main driver function *******************************************************/
 
-bool inline_inline(jitdata *jd, jitdata **resultjd)
+bool inline_inline(jitdata *jd)
 {
        inline_node *iln;
        methodinfo *m;
 
        m = jd->m;
 
-       *resultjd = jd;
-
        DOLOG( printf("==== INLINE ==================================================================\n");
                   show_method(jd, SHOW_STACK); );
 
@@ -2572,7 +2575,7 @@ bool inline_inline(jitdata *jd, jitdata **resultjd)
                DOLOG( printf("==== TEST INLINE =============================================================\n"); );
 
                if (iln->children)
-                       test_inlining(iln, jd, resultjd);
+                       test_inlining(iln, jd);
        }
 
        DOLOG( printf("-------- DONE -----------------------------------------------------------\n");
index fec1c93fdf786a4782d695776b09b1b254a2971c..de63b8746a7fce9757226b8803049c8cd75d9d35 100644 (file)
@@ -31,7 +31,7 @@
             Christian Thalinger
             Christian Ullrich
 
-   $Id: jit.c 6145 2006-12-07 23:32:43Z edwin $
+   $Id: jit.c 6211 2006-12-16 22:53:24Z edwin $
 
 */
 
@@ -1388,6 +1388,15 @@ static u1 *jit_compile_intern(jitdata *jd)
 #endif
                RT_TIMING_GET_TIME(time_ifconv);
 
+               /* inlining */
+
+#if defined(ENABLE_INLINING)
+               if (JITDATA_HAS_FLAG_INLINE(jd)) {
+                       if (!inline_inline(jd))
+                               return NULL;
+               }
+#endif
+
                /* Basic block reordering.  I think this should be done after
                   if-conversion, as we could lose the ability to do the
                   if-conversion. */
index fe43f2e2c140fba00756975c9954f503b11a7904..de45e2d222e0dfd9bc6412fc91291e66660c45c5 100644 (file)
@@ -29,7 +29,7 @@
             Christian Thalinger
             Edwin Steiner
 
-   $Id: jit.h 6157 2006-12-08 00:39:25Z edwin $
+   $Id: jit.h 6211 2006-12-16 22:53:24Z edwin $
 
 */
 
@@ -160,6 +160,8 @@ struct jitdata {
 #define JITDATA_FLAG_REORDER             0x00000010
 #define JITDATA_FLAG_INLINE              0x00000020
 
+#define JITDATA_FLAG_COUNTDOWN           0x00000100
+
 #define JITDATA_FLAG_SHOWINTERMEDIATE    0x20000000
 #define JITDATA_FLAG_SHOWDISASSEMBLE     0x40000000
 #define JITDATA_FLAG_VERBOSECALL         0x80000000
@@ -183,6 +185,9 @@ struct jitdata {
 #define JITDATA_HAS_FLAG_INLINE(jd) \
     ((jd)->flags & JITDATA_FLAG_INLINE)
 
+#define JITDATA_HAS_FLAG_COUNTDOWN(jd) \
+    ((jd)->flags & JITDATA_FLAG_COUNTDOWN)
+
 #define JITDATA_HAS_FLAG_SHOWINTERMEDIATE(jd) \
     ((jd)->flags & JITDATA_FLAG_SHOWINTERMEDIATE)
 
index 04284fc41950ee4f0076c71a043d5fba32b8def4..3f35448c987753827481215f7ae1818348eb3ac3 100644 (file)
@@ -100,8 +100,9 @@ struct rplalloc {
 #define RPLPOINT_TYPE_RETURN  5
 #define RPLPOINT_TYPE_BODY    6
 
-#define RPLPOINT_FLAG_NOTRAP  0x01  /* rplpoint cannot be trapped */
-#define RPLPOINT_FLAG_ACTIVE  0x08  /* trap is active             */
+#define RPLPOINT_FLAG_NOTRAP     0x01  /* rplpoint cannot be trapped */
+#define RPLPOINT_FLAG_COUNTDOWN  0x02  /* count down hits            */
+#define RPLPOINT_FLAG_ACTIVE     0x08  /* trap is active             */
 
 
 #if !defined(NDEBUG)