From: edwin Date: Sat, 16 Dec 2006 22:53:24 +0000 (+0000) Subject: * src/vm/jit/jit.c (jit_compile_intern): Perform inlining if X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=63429f68692b49b4c18e739e96918bc010c33ca5;hp=f0ad12004dde3d67f79c4f8a22b2820d17fcb3a8;p=cacao.git * src/vm/jit/jit.c (jit_compile_intern): Perform inlining if 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. --- diff --git a/src/vm/jit/i386/codegen.h b/src/vm/jit/i386/codegen.h index e83f37df2..35101a9f6 100644 --- a/src/vm/jit/i386/codegen.h +++ b/src/vm/jit/i386/codegen.h @@ -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 $ */ @@ -312,6 +312,7 @@ #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)) diff --git a/src/vm/jit/inline/inline.c b/src/vm/jit/inline/inline.c index 2d0eddb7e..eeecd3e2b 100644 --- a/src/vm/jit/inline/inline.c +++ b/src/vm/jit/inline/inline.c @@ -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"); diff --git a/src/vm/jit/jit.c b/src/vm/jit/jit.c index fec1c93fd..de63b8746 100644 --- a/src/vm/jit/jit.c +++ b/src/vm/jit/jit.c @@ -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. */ diff --git a/src/vm/jit/jit.h b/src/vm/jit/jit.h index fe43f2e2c..de45e2d22 100644 --- a/src/vm/jit/jit.h +++ b/src/vm/jit/jit.h @@ -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) diff --git a/src/vm/jit/replace.h b/src/vm/jit/replace.h index 04284fc41..3f35448c9 100644 --- a/src/vm/jit/replace.h +++ b/src/vm/jit/replace.h @@ -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)