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.
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))
Changes:
- $Id: inline.c 6207 2006-12-16 21:11:04Z edwin $
+ $Id: inline.c 6211 2006-12-16 22:53:24Z edwin $
*/
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;
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:
/* 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;
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);
&& 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++;
/* 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); );
DOLOG( printf("==== TEST INLINE =============================================================\n"); );
if (iln->children)
- test_inlining(iln, jd, resultjd);
+ test_inlining(iln, jd);
}
DOLOG( printf("-------- DONE -----------------------------------------------------------\n");
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 $
*/
#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. */
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 $
*/
#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
#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)
#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)