67 #if defined(ENABLE_DISASSEMBLER)
72 #if defined(ENABLE_SSA)
75 #elif defined(ENABLE_LSRA)
80 using namespace cacao;
91 #if defined(ENABLE_VERIFIER)
92 #define SBRSTART typeinfo.elementclass.any
95 STAT_REGISTER_VAR(
int,count_basic_blocks,0,
"basic blocks",
"Number of compiled basic blocks")
106 STAT_REGISTER_VAR(
int,count_dup_instruction,0,"dup instruction","Number of DUP Pseudocommands")
107 STAT_REGISTER_VAR(
int,count_pcmd_mem,0,"pcmd mem","Number of Mem Pseudocommands")
108 STAT_REGISTER_VAR(
int,count_pcmd_met,0,"pcmd met","Number of Method Pseudocommands")
109 STAT_REGISTER_VAR(
int,count_pcmd_table,0,"pcmd table","Number of Table Pseudocommands")
113 STAT_REGISTER_VAR(
int,count_upper_bound_new_stack,0,"upper bound new stack","Upper bound of
max stack elements")
116 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_load,0,"pcmd load","Number of Const Pseudocommands (load)",const_pcmd_stat)
121 STAT_REGISTER_GROUP(constalu_pcmd_stat,
"const alu pcmd",
"Number of ConstAlu Pseudocommands")
122 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_const_alu,0,"count_pcmd_const_alu","Number of ConstAlu Pseudocommands",constalu_pcmd_stat)
123 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_const_bra,0,"count_pcmd_const_bra","Number of ConstAlu Pseudocommands (cmp)",constalu_pcmd_stat)
124 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_const_store,0,"count_pcmd_const_store","Number of ConstAlu Pseudocommands (store)",constalu_pcmd_stat)
127 STAT_REGISTER_VAR(
int,count_pcmd_store,0,
"count_pcmd_store",
"Number of Store Pseudocommands")
131 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_bra,0,"count_pcmd_bra","Number of Branch Pseudocommands",branch_pcmd_stat)
132 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_return,0,"count_pcmd_return","Number of Branch Pseudocommands (rets)",branch_pcmd_stat)
133 STAT_REGISTER_GROUP_VAR(
int,count_pcmd_returnx,0,"count_pcmd_returnx","Number of Branch Pseudocommands (Xrets)",branch_pcmd_stat)
135 STAT_REGISTER_DIST(
unsigned int,
unsigned int,count_block_stack,0,9,1,0,"stack
size dist","Distribution of stack sizes at
block boundary")
137 STAT_REGISTER_DIST(
unsigned int,
unsigned int,count_store_length,0,19,1,0,"store creator chains","Distribution of store creator chains")
138 STAT_REGISTER_DIST(
unsigned int,
unsigned int,count_analyse_iterations,1,4,1,0,"analysis iter.","Distribution of analysis iterations")
140 #if defined(ENABLE_STATISTICS)
141 static const unsigned int count_method_bb_distribution_range[] = {5,10,15,20,30,40,50,75};
142 static const unsigned int count_block_size_distribution_range[] = {0,1,2,3,4,5,6,7,8,9,12,14,16,18,20,25,30};
145 STAT_REGISTER_DIST_RANGE(
unsigned int,
unsigned int,count_method_bb_distribution,count_method_bb_distribution_range,8,0,
"method bb dist.",
"Distribution of basic blocks per method")
146 STAT_REGISTER_DIST_RANGE(
unsigned int,
unsigned int,count_block_size_distribution,count_block_size_distribution_range,17,0,"bb
size dist.","Distribution of basic
block sizes")
202 #if defined(ENABLE_VERIFIER)
203 # define CHECK_BASIC_TYPE(expected,actual) \
205 if ((actual) != (expected)) { \
206 return throw_stack_type_error((Type) (expected)); \
210 # define CHECK_BASIC_TYPE(expected,actual)
219 #if defined(ENABLE_VERIFIER)
220 # define REQUIRE(num) \
222 if (stackdepth < (num)) \
223 return throw_stack_underflow(); \
237 #if defined(ENABLE_VERIFIER)
238 # define CHECKOVERFLOW \
240 if (stackdepth > m->maxstack) \
241 if ((iptr->opc != ICMD_ACONST) || INSTRUCTION_MUST_CHECK(iptr)) \
242 return throw_stack_overflow(); \
245 # define CHECKOVERFLOW
251 #define GET_NEW_INDEX(sd, new_varindex) \
253 assert((sd).vartop < (sd).varcount); \
254 (new_varindex) = ((sd).vartop)++; \
259 #define RELEASE_INDEX(sd, varindex)
261 #define GET_NEW_VAR(sd, newvarindex, newtype) \
263 GET_NEW_INDEX((sd), (newvarindex)); \
264 (sd).var[newvarindex].type = (newtype); \
270 #define IS_INOUT(sp) \
271 (sd.var[(sp)->varnum].flags & INOUT)
273 #define IS_PREALLOC(sp) \
274 (sd.var[(sp)->varnum].flags & PREALLOC)
276 #define IS_TEMPVAR(sp) \
277 ( ((sp)->varnum >= sd.localcount) \
278 && !(sd.var[(sp)->varnum].flags & (INOUT | PREALLOC)) )
281 #define IS_LOCALVAR_SD(sd, sp) \
282 ((sp)->varnum < (sd).localcount)
284 #define IS_LOCALVAR(sp) \
285 IS_LOCALVAR_SD(sd, (sp))
290 #define SET_TEMPVAR(sp) \
292 if (IS_LOCALVAR((sp))) { \
293 stack_change_to_tempvar(&sd, (sp), iptr); \
295 sd.var[(sp)->varnum].flags &= ~(INOUT | PREALLOC); \
298 #define SET_PREALLOC(sp) \
300 assert(!IS_LOCALVAR((sp))); \
301 sd.var[(sp)->varnum].flags |= PREALLOC; \
308 (iptr->s1.varindex = -1)
310 #define USE_S1(type1) \
313 CHECK_BASIC_TYPE(type1, curstack->type); \
314 iptr->s1.varindex = curstack->varnum; \
320 iptr->s1.varindex = curstack->varnum; \
323 #define USE_S1_S2(type1, type2) \
326 CHECK_BASIC_TYPE(type1, curstack->prev->type); \
327 CHECK_BASIC_TYPE(type2, curstack->type); \
328 iptr->sx.s23.s2.varindex = curstack->varnum; \
329 iptr->s1.varindex = curstack->prev->varnum; \
332 #define USE_S1_S2_ANY_ANY \
335 iptr->sx.s23.s2.varindex = curstack->varnum; \
336 iptr->s1.varindex = curstack->prev->varnum; \
339 #define USE_S1_S2_S3(type1, type2, type3) \
342 CHECK_BASIC_TYPE(type1, curstack->prev->prev->type); \
343 CHECK_BASIC_TYPE(type2, curstack->prev->type); \
344 CHECK_BASIC_TYPE(type3, curstack->type); \
345 iptr->sx.s23.s3.varindex = curstack->varnum; \
346 iptr->sx.s23.s2.varindex = curstack->prev->varnum; \
347 iptr->s1.varindex = curstack->prev->prev->varnum; \
353 if (curstack->varkind == UNDEFVAR) \
354 curstack->varkind = TEMPVAR; \
355 curstack = curstack->prev; \
358 #define POP_S1(type1) \
361 if (curstack->varkind == UNDEFVAR) \
362 curstack->varkind = TEMPVAR; \
363 curstack = curstack->prev; \
369 if (curstack->varkind == UNDEFVAR) \
370 curstack->varkind = TEMPVAR; \
371 curstack = curstack->prev; \
374 #define POP_S1_S2(type1, type2) \
376 USE_S1_S2(type1, type2); \
377 if (curstack->varkind == UNDEFVAR) \
378 curstack->varkind = TEMPVAR; \
379 if (curstack->prev->varkind == UNDEFVAR) \
380 curstack->prev->varkind = TEMPVAR; \
381 curstack = curstack->prev->prev; \
384 #define POP_S1_S2_ANY_ANY \
387 if (curstack->varkind == UNDEFVAR) \
388 curstack->varkind = TEMPVAR; \
389 if (curstack->prev->varkind == UNDEFVAR) \
390 curstack->prev->varkind = TEMPVAR; \
391 curstack = curstack->prev->prev; \
394 #define POP_S1_S2_S3(type1, type2, type3) \
396 USE_S1_S2_S3(type1, type2, type3); \
397 if (curstack->varkind == UNDEFVAR) \
398 curstack->varkind = TEMPVAR; \
399 if (curstack->prev->varkind == UNDEFVAR) \
400 curstack->prev->varkind = TEMPVAR; \
401 if (curstack->prev->prev->varkind == UNDEFVAR) \
402 curstack->prev->prev->varkind = TEMPVAR; \
403 curstack = curstack->prev->prev->prev; \
413 (iptr->dst.varindex = -1)
415 #define DST(typed, index) \
417 NEWSTACKn((typed),(index)); \
418 curstack->creator = iptr; \
419 iptr->dst.varindex = (index); \
422 #define DST_LOCALVAR(typed, index) \
424 NEWSTACK((typed), LOCALVAR, (index)); \
425 curstack->creator = iptr; \
426 iptr->dst.varindex = (index); \
432 #if defined(ENABLE_VERIFIER)
433 #define COPY_VAL_AND_TYPE_VAR(sv, dv) \
435 if (((dv)->type = (sv)->type) == TYPE_RET) { \
436 (dv)->vv = (sv)->vv; \
437 (dv)->SBRSTART = (sv)->SBRSTART; \
441 #define COPY_VAL_AND_TYPE_VAR(sv, dv) \
443 (dv)->type = (sv)->type; \
444 if (((dv)->type = (sv)->type) == TYPE_RET) { \
445 (dv)->vv = (sv)->vv; \
450 #define COPY_VAL_AND_TYPE(sd, sindex, dindex) \
451 COPY_VAL_AND_TYPE_VAR((sd).var + (sindex), (sd).var + (dindex))
456 #define OP0_1(typed) \
459 GET_NEW_VAR(sd, new_index, (typed)); \
460 DST((typed), new_index); \
471 #define OP1_BRANCH(type1) \
477 #define OP1_1(type1, typed) \
480 GET_NEW_VAR(sd, new_index, (typed)); \
481 DST(typed, new_index); \
484 #define OP2_1(type1, type2, typed) \
486 POP_S1_S2(type1, type2); \
487 GET_NEW_VAR(sd, new_index, ((Type) (typed))); \
488 DST(((Type) (typed)), new_index); \
503 #define OP1_0(type1) \
510 #define OP2_0(type1, type2) \
512 POP_S1_S2(type1, type2); \
517 #define OP2_BRANCH(type1, type2) \
519 POP_S1_S2(type1, type2); \
523 #define OP2_0_ANY_ANY \
530 #define OP3_0(type1, type2, type3) \
532 POP_S1_S2_S3(type1, type2, type3); \
537 #define LOAD(type1, index) \
539 DST_LOCALVAR(type1, index); \
543 #define STORE(type1, index) \
553 #define DUP_SLOT(sp) \
555 GET_NEW_VAR(sd, new_index, (sp)->type); \
556 COPY_VAL_AND_TYPE(sd, (sp)->varnum, new_index); \
557 NEWSTACK((sp)->type, TEMPVAR, new_index); \
561 #define MOVE_UP(sp) \
563 iptr->opc = ICMD_MOVE; \
564 iptr->s1.varindex = (sp)->varnum; \
566 curstack->creator = iptr; \
567 iptr->dst.varindex = curstack->varnum; \
572 #define COPY_UP(sp) \
575 iptr->opc = ICMD_COPY; \
576 iptr->s1.varindex = (sp)->varnum; \
578 curstack->creator = iptr; \
579 iptr->dst.varindex = curstack->varnum; \
583 #define COPY_DOWN(s, d) \
586 iptr->opc = ICMD_COPY; \
587 iptr->s1.varindex = (s)->varnum; \
588 iptr->dst.varindex = (d)->varnum; \
589 (d)->creator = iptr; \
592 #define MOVE_TO_TEMP(sp) \
594 GET_NEW_INDEX(sd, new_index); \
595 iptr->opc = ICMD_MOVE; \
596 iptr->s1.varindex = (sp)->varnum; \
597 iptr->dst.varindex = new_index; \
598 COPY_VAL_AND_TYPE(sd, (sp)->varnum, new_index); \
599 (sp)->varnum = new_index; \
600 (sp)->varkind = TEMPVAR; \
605 #define BRANCH_TARGET(bt, tempbptr) \
607 tempbptr = (bt).block; \
608 tempbptr = stack_mark_reached(&sd, tempbptr, curstack, \
610 if (tempbptr == NULL) \
612 (bt).block = tempbptr; \
615 #define BRANCH(tempbptr) \
616 BRANCH_TARGET(iptr->dst, tempbptr)
623 #define NEWSTACK(s,v,n) \
625 sd.new_elem->prev = curstack; \
626 sd.new_elem->type = (s); \
627 sd.new_elem->flags = 0; \
628 sd.new_elem->varkind = (v); \
629 sd.new_elem->varnum = (n); \
630 curstack = sd.new_elem; \
631 sd.var[(n)].type = (s); \
632 sd.var[(n)].flags = 0; \
640 #define NEWSTACKn(s,n) NEWSTACK(s,UNDEFVAR,n)
641 #define NEWSTACK0(s) NEWSTACK(s,UNDEFVAR,0)
649 #if defined(STACK_VERBOSE)
653 static void stack_verbose_block_enter(
stackdata_t *sd,
bool reanalyse);
654 static void stack_verbose_block_exit(
stackdata_t *sd,
bool superblockend);
655 static void stack_verbose_show_state(
stackdata_t *sd, instruction *iptr,
721 #if defined(STACK_VERBOSE)
722 printf(
"APPENDING BLOCK L%0d\n", b->
nr);
774 #if defined(STACK_VERBOSE)
775 printf(
"cloning block L%03d ------> L%03d\n", b->
nr, clone->
nr);
827 #if defined(ENABLE_VERIFIER)
845 #if defined(ENABLE_VERIFIER)
851 && (sv->SBRSTART != dv->SBRSTART))
853 #if defined(STACK_VERBOSE)
854 printf(
"JSR MISMATCH: setting variable %d to VOID\n", i);
891 assert(sd->
vartop + stackdepth <= sd->varcount);
897 index = (sd->
vartop += stackdepth);
900 for (sp = curstack; i--; sp = sp->
prev) {
930 assert(sd->
vartop + n <= sd->varcount);
940 for (i=0; i<n; ++
i, ++dv) {
979 #if defined(STACK_VERBOSE)
980 printf(
"stack_check_invars(L%03d)\n", b->
nr);
988 #if defined(STACK_VERBOSE)
989 printf(
"original is L%03d\n", orig->
nr);
994 #if defined(ENABLE_VERIFIER)
995 if (i != stackdepth) {
1004 #if defined(STACK_VERBOSE)
1005 printf(
"checking against ");
1006 stack_verbose_show_block(sd, b);
printf(
"\n");
1014 #if defined(ENABLE_VERIFIER)
1022 #if defined(ENABLE_VERIFIER)
1023 if (dv->SBRSTART != sv->SBRSTART) {
1041 #
if defined(ENABLE_VERIFIER)
1042 (sv->SBRSTART == dv->SBRSTART) &&
1058 #if defined(STACK_VERBOSE)
1059 printf(
"------> using L%03d\n", b->
nr);
1097 #if defined(STACK_VERBOSE)
1098 printf(
"stack_check_invars_from_outvars(L%03d)\n", b->
nr);
1106 #if defined(STACK_VERBOSE)
1107 printf(
"original is L%03d\n", orig->
nr);
1113 #if defined(ENABLE_VERIFIER)
1123 #if defined(STACK_VERBOSE)
1124 printf(
"checking against ");
1125 stack_verbose_show_block(sd, b);
printf(
"\n");
1131 for (i=0; i<n; ++
i, ++dv) {
1134 #if defined(ENABLE_VERIFIER)
1142 #if defined(ENABLE_VERIFIER)
1143 if (sv->SBRSTART != dv->SBRSTART) {
1161 #
if defined(ENABLE_VERIFIER)
1162 (sv->SBRSTART == dv->SBRSTART) &&
1179 #if defined(STACK_VERBOSE)
1180 printf(
"------> using L%03d\n", b->
nr);
1257 #if defined(STACK_VERBOSE)
1258 printf(
"stack_mark_reached(L%03d from L%03d)\n", b->
nr, sd->
bptr->
nr);
1269 #if defined(STACK_VERBOSE)
1270 printf(
"reached L%03d for the first time\n", b->
nr);
1307 #if defined(STACK_VERBOSE)
1308 printf(
"stack_mark_reached_from_outvars(L%03d from L%03d)\n", b->
nr, sd->
bptr->
nr);
1319 #if defined(STACK_VERBOSE)
1320 printf(
"reached L%03d for the first time\n", b->
nr);
1365 #if defined(STACK_VERBOSE)
1366 printf(
"NEXT IS NON-CONSEQUITIVE L%03d\n", tbptr->
nr);
1372 #if defined(STACK_VERBOSE)
1402 #if defined(STACK_VERBOSE)
1403 printf(
"reaching exception handlers...\n");
1443 #define RELOCATE(index) \
1445 if ((index) >= blockvarstart) \
1446 (index) += blockvarshift; \
1447 else if ((index) >= invarstart) \
1448 (index) += invarshift; \
1466 bool cloneinstructions;
1469 #if defined(STACK_VERBOSE)
1470 stack_verbose_block_enter(sd,
true);
1477 assert(orig != NULL);
1481 cloneinstructions =
true;
1485 iptr =
DMNEW(instruction, len + 1);
1505 invarstart = orig->
invars[0];
1506 invarshift = b->
invars[0] - invarstart;
1509 invarstart = INT_MAX;
1513 blockvarshift = sd->
vartop - blockvarstart;
1547 cloneinstructions =
false;
1551 blockvarstart = sd->
vartop;
1559 for (; ex != NULL; ex = ex->
down) {
1562 if ((ex->
start == b) && (ex->
end == b)) {
1569 #if defined(STACK_VERBOSE)
1570 printf(
"invarstart = %d, blockvarstart = %d\n", invarstart, blockvarstart);
1571 printf(
"invarshift = %d, blockvarshift = %d\n", invarshift, blockvarshift);
1590 superblockend =
false;
1592 for (len = b->
icount; len--; iptr++) {
1593 #if defined(STACK_VERBOSE)
1598 switch (iptr->
opc) {
1602 #if defined(ENABLE_VERIFIER)
1610 superblockend =
true;
1616 superblockend =
true;
1620 superblockend =
true;
1633 superblockend =
true;
1695 i = iptr->
sx.
s23.s3.javaindex;
1697 iptr->
sx.
s23.s2.retaddrnr =
1718 superblockend =
true;
1752 i = iptr->
sx.
s23.s3.tablehigh - iptr->
sx.
s23.s2.tablelow + 1 + 1;
1754 if (cloneinstructions) {
1768 superblockend =
true;
1772 i = iptr->
sx.
s23.s2.lookupcount;
1773 if (cloneinstructions) {
1787 superblockend =
true;
1956 if (cloneinstructions) {
1959 iptr->
sx.
s23.s2.args = argp;
1962 argp = iptr->
sx.
s23.s2.args;
1980 #if defined(ENABLE_COMPILER2)
1982 s4 *stackvar = iptr->stack_after;
1983 for (
s4 i = 0; i < iptr->stackdepth_after; i++) {
1990 #if defined(STACK_VERBOSE)
2002 #if defined(STACK_VERBOSE)
2003 stack_verbose_block_exit(sd, superblockend);
2035 instruction *ilimit)
2069 assert(ilimit <= sd->bptr->iinstr + sd->
bptr->
icount);
2076 for (depth = 0; sp != NULL; sp = sp->
prev)
2081 for (; iptr < ilimit; ++iptr) {
2082 switch (iptr->
opc) {
2089 if (iptr->
sx.
s23.s2.args[i] == oldindex) {
2090 iptr->
sx.
s23.s2.args[
i] = newindex;
2192 #if defined(ENABLE_STATISTICS)
2193 int iteration_count;
2197 #if defined(STACK_VERBOSE)
2228 #if defined(ENABLE_STATISTICS)
2229 iteration_count = 0;
2236 while (tbptr->
next) {
2238 tbptr = tbptr->
next;
2275 #if defined(ENABLE_STATISTICS)
2282 superblockend =
true;
2305 superblockend =
true;
2321 superblockend =
true;
2358 if ((ex->start <= original) && (ex->end > original)) {
2390 superblockend =
false;
2408 #
if defined(STACK_VERBOSE)
2409 stack_verbose_block_enter(&sd,
false);
2419 while (--len >= 0) {
2421 #if defined(STACK_VERBOSE)
2422 stack_verbose_show_state(&sd, iptr, curstack);
2433 if ((bte != NULL) && (bte->
opcode == opcode)) {
2436 iptr->
sx.
s23.s3.bte = bte;
2466 #if defined(ENABLE_VERIFIER)
2476 superblockend =
true;
2483 superblockend =
true;
2502 switch (iptr[1].opc) {
2515 goto icmd_iconst_tail;
2516 #if SUPPORT_CONST_MUL
2519 goto icmd_iconst_tail;
2522 if (iptr->
sx.
val.
i == 0x00000002)
2524 else if (iptr->
sx.
val.
i == 0x00000004)
2526 else if (iptr->
sx.
val.
i == 0x00000008)
2528 else if (iptr->
sx.
val.
i == 0x00000010)
2530 else if (iptr->
sx.
val.
i == 0x00000020)
2532 else if (iptr->
sx.
val.
i == 0x00000040)
2534 else if (iptr->
sx.
val.
i == 0x00000080)
2536 else if (iptr->
sx.
val.
i == 0x00000100)
2538 else if (iptr->
sx.
val.
i == 0x00000200)
2540 else if (iptr->
sx.
val.
i == 0x00000400)
2542 else if (iptr->
sx.
val.
i == 0x00000800)
2544 else if (iptr->
sx.
val.
i == 0x00001000)
2546 else if (iptr->
sx.
val.
i == 0x00002000)
2548 else if (iptr->
sx.
val.
i == 0x00004000)
2550 else if (iptr->
sx.
val.
i == 0x00008000)
2552 else if (iptr->
sx.
val.
i == 0x00010000)
2554 else if (iptr->
sx.
val.
i == 0x00020000)
2556 else if (iptr->
sx.
val.
i == 0x00040000)
2558 else if (iptr->
sx.
val.
i == 0x00080000)
2560 else if (iptr->
sx.
val.
i == 0x00100000)
2562 else if (iptr->
sx.
val.
i == 0x00200000)
2564 else if (iptr->
sx.
val.
i == 0x00400000)
2566 else if (iptr->
sx.
val.
i == 0x00800000)
2568 else if (iptr->
sx.
val.
i == 0x01000000)
2570 else if (iptr->
sx.
val.
i == 0x02000000)
2572 else if (iptr->
sx.
val.
i == 0x04000000)
2574 else if (iptr->
sx.
val.
i == 0x08000000)
2576 else if (iptr->
sx.
val.
i == 0x10000000)
2578 else if (iptr->
sx.
val.
i == 0x20000000)
2580 else if (iptr->
sx.
val.
i == 0x40000000)
2582 else if (iptr->
sx.
val.
u == 0x80000000)
2588 goto icmd_iconst_tail;
2591 if (iptr->
sx.
val.
i == 0x00000002)
2593 else if (iptr->
sx.
val.
i == 0x00000004)
2595 else if (iptr->
sx.
val.
i == 0x00000008)
2597 else if (iptr->
sx.
val.
i == 0x00000010)
2599 else if (iptr->
sx.
val.
i == 0x00000020)
2601 else if (iptr->
sx.
val.
i == 0x00000040)
2603 else if (iptr->
sx.
val.
i == 0x00000080)
2605 else if (iptr->
sx.
val.
i == 0x00000100)
2607 else if (iptr->
sx.
val.
i == 0x00000200)
2609 else if (iptr->
sx.
val.
i == 0x00000400)
2611 else if (iptr->
sx.
val.
i == 0x00000800)
2613 else if (iptr->
sx.
val.
i == 0x00001000)
2615 else if (iptr->
sx.
val.
i == 0x00002000)
2617 else if (iptr->
sx.
val.
i == 0x00004000)
2619 else if (iptr->
sx.
val.
i == 0x00008000)
2621 else if (iptr->
sx.
val.
i == 0x00010000)
2623 else if (iptr->
sx.
val.
i == 0x00020000)
2625 else if (iptr->
sx.
val.
i == 0x00040000)
2627 else if (iptr->
sx.
val.
i == 0x00080000)
2629 else if (iptr->
sx.
val.
i == 0x00100000)
2631 else if (iptr->
sx.
val.
i == 0x00200000)
2633 else if (iptr->
sx.
val.
i == 0x00400000)
2635 else if (iptr->
sx.
val.
i == 0x00800000)
2637 else if (iptr->
sx.
val.
i == 0x01000000)
2639 else if (iptr->
sx.
val.
i == 0x02000000)
2641 else if (iptr->
sx.
val.
i == 0x04000000)
2643 else if (iptr->
sx.
val.
i == 0x08000000)
2645 else if (iptr->
sx.
val.
i == 0x10000000)
2647 else if (iptr->
sx.
val.
i == 0x20000000)
2649 else if (iptr->
sx.
val.
i == 0x40000000)
2651 else if (iptr->
sx.
val.
u == 0x80000000)
2657 goto icmd_iconst_tail;
2661 if ((iptr->
sx.
val.
i == 0x00000002) ||
2662 (iptr->
sx.
val.
i == 0x00000004) ||
2663 (iptr->
sx.
val.
i == 0x00000008) ||
2664 (iptr->
sx.
val.
i == 0x00000010) ||
2665 (iptr->
sx.
val.
i == 0x00000020) ||
2666 (iptr->
sx.
val.
i == 0x00000040) ||
2667 (iptr->
sx.
val.
i == 0x00000080) ||
2668 (iptr->
sx.
val.
i == 0x00000100) ||
2669 (iptr->
sx.
val.
i == 0x00000200) ||
2670 (iptr->
sx.
val.
i == 0x00000400) ||
2671 (iptr->
sx.
val.
i == 0x00000800) ||
2672 (iptr->
sx.
val.
i == 0x00001000) ||
2673 (iptr->
sx.
val.
i == 0x00002000) ||
2674 (iptr->
sx.
val.
i == 0x00004000) ||
2675 (iptr->
sx.
val.
i == 0x00008000) ||
2676 (iptr->
sx.
val.
i == 0x00010000) ||
2677 (iptr->
sx.
val.
i == 0x00020000) ||
2678 (iptr->
sx.
val.
i == 0x00040000) ||
2679 (iptr->
sx.
val.
i == 0x00080000) ||
2680 (iptr->
sx.
val.
i == 0x00100000) ||
2681 (iptr->
sx.
val.
i == 0x00200000) ||
2682 (iptr->
sx.
val.
i == 0x00400000) ||
2683 (iptr->
sx.
val.
i == 0x00800000) ||
2684 (iptr->
sx.
val.
i == 0x01000000) ||
2685 (iptr->
sx.
val.
i == 0x02000000) ||
2686 (iptr->
sx.
val.
i == 0x04000000) ||
2687 (iptr->
sx.
val.
i == 0x08000000) ||
2688 (iptr->
sx.
val.
i == 0x10000000) ||
2689 (iptr->
sx.
val.
i == 0x20000000) ||
2690 (iptr->
sx.
val.
i == 0x40000000) ||
2691 (iptr->
sx.
val.
u == 0x80000000))
2695 goto icmd_iconst_tail;
2698 #if SUPPORT_CONST_LOGICAL
2701 goto icmd_iconst_tail;
2705 goto icmd_iconst_tail;
2709 goto icmd_iconst_tail;
2714 goto icmd_iconst_tail;
2718 goto icmd_iconst_tail;
2722 goto icmd_iconst_tail;
2723 #if SUPPORT_LONG_SHIFT
2726 goto icmd_lconst_tail;
2730 goto icmd_lconst_tail;
2734 goto icmd_lconst_tail;
2750 goto icmd_if_icmp_tail;
2754 goto icmd_if_icmp_tail;
2758 goto icmd_if_icmp_tail;
2762 goto icmd_if_icmp_tail;
2766 goto icmd_if_icmp_tail;
2768 #if SUPPORT_CONST_STORE
2773 # if SUPPORT_CONST_STORE_ZERO_ONLY
2777 switch (iptr[1].opc) {
2809 # if SUPPORT_CONST_STORE_ZERO_ONLY
2827 fmiref = iptr->
sx.
s23.s3.uf->fieldref;
2830 fmiref = iptr[1].
sx.
s23.s3.fmiref;
2831 iptr->
sx.
s23.s3.fmiref = fmiref;
2834 #if defined(ENABLE_VERIFIER)
2836 switch (iptr[0].opc) {
2839 return throw_stack_type_error(expectedtype);
2843 return throw_stack_type_error(expectedtype);
2847 return throw_stack_type_error(expectedtype);
2855 switch (iptr[1].opc) {
2895 switch (iptr[1].opc) {
2896 #if SUPPORT_LONG_ADD
2910 goto icmd_lconst_tail;
2913 #if SUPPORT_LONG_MUL && SUPPORT_CONST_MUL
2916 goto icmd_lconst_tail;
2918 # if SUPPORT_LONG_SHIFT
2920 if (iptr->
sx.
val.
l == 0x00000002)
2922 else if (iptr->
sx.
val.
l == 0x00000004)
2924 else if (iptr->
sx.
val.
l == 0x00000008)
2926 else if (iptr->
sx.
val.
l == 0x00000010)
2928 else if (iptr->
sx.
val.
l == 0x00000020)
2930 else if (iptr->
sx.
val.
l == 0x00000040)
2932 else if (iptr->
sx.
val.
l == 0x00000080)
2934 else if (iptr->
sx.
val.
l == 0x00000100)
2936 else if (iptr->
sx.
val.
l == 0x00000200)
2938 else if (iptr->
sx.
val.
l == 0x00000400)
2940 else if (iptr->
sx.
val.
l == 0x00000800)
2942 else if (iptr->
sx.
val.
l == 0x00001000)
2944 else if (iptr->
sx.
val.
l == 0x00002000)
2946 else if (iptr->
sx.
val.
l == 0x00004000)
2948 else if (iptr->
sx.
val.
l == 0x00008000)
2950 else if (iptr->
sx.
val.
l == 0x00010000)
2952 else if (iptr->
sx.
val.
l == 0x00020000)
2954 else if (iptr->
sx.
val.
l == 0x00040000)
2956 else if (iptr->
sx.
val.
l == 0x00080000)
2958 else if (iptr->
sx.
val.
l == 0x00100000)
2960 else if (iptr->
sx.
val.
l == 0x00200000)
2962 else if (iptr->
sx.
val.
l == 0x00400000)
2964 else if (iptr->
sx.
val.
l == 0x00800000)
2966 else if (iptr->
sx.
val.
l == 0x01000000)
2968 else if (iptr->
sx.
val.
l == 0x02000000)
2970 else if (iptr->
sx.
val.
l == 0x04000000)
2972 else if (iptr->
sx.
val.
l == 0x08000000)
2974 else if (iptr->
sx.
val.
l == 0x10000000)
2976 else if (iptr->
sx.
val.
l == 0x20000000)
2978 else if (iptr->
sx.
val.
l == 0x40000000)
2980 else if (iptr->
sx.
val.
l == 0x80000000)
2986 goto icmd_lconst_tail;
2989 #if SUPPORT_LONG_DIV_POW2
2991 if (iptr->
sx.
val.
l == 0x00000002)
2993 else if (iptr->
sx.
val.
l == 0x00000004)
2995 else if (iptr->
sx.
val.
l == 0x00000008)
2997 else if (iptr->
sx.
val.
l == 0x00000010)
2999 else if (iptr->
sx.
val.
l == 0x00000020)
3001 else if (iptr->
sx.
val.
l == 0x00000040)
3003 else if (iptr->
sx.
val.
l == 0x00000080)
3005 else if (iptr->
sx.
val.
l == 0x00000100)
3007 else if (iptr->
sx.
val.
l == 0x00000200)
3009 else if (iptr->
sx.
val.
l == 0x00000400)
3011 else if (iptr->
sx.
val.
l == 0x00000800)
3013 else if (iptr->
sx.
val.
l == 0x00001000)
3015 else if (iptr->
sx.
val.
l == 0x00002000)
3017 else if (iptr->
sx.
val.
l == 0x00004000)
3019 else if (iptr->
sx.
val.
l == 0x00008000)
3021 else if (iptr->
sx.
val.
l == 0x00010000)
3023 else if (iptr->
sx.
val.
l == 0x00020000)
3025 else if (iptr->
sx.
val.
l == 0x00040000)
3027 else if (iptr->
sx.
val.
l == 0x00080000)
3029 else if (iptr->
sx.
val.
l == 0x00100000)
3031 else if (iptr->
sx.
val.
l == 0x00200000)
3033 else if (iptr->
sx.
val.
l == 0x00400000)
3035 else if (iptr->
sx.
val.
l == 0x00800000)
3037 else if (iptr->
sx.
val.
l == 0x01000000)
3039 else if (iptr->
sx.
val.
l == 0x02000000)
3041 else if (iptr->
sx.
val.
l == 0x04000000)
3043 else if (iptr->
sx.
val.
l == 0x08000000)
3045 else if (iptr->
sx.
val.
l == 0x10000000)
3047 else if (iptr->
sx.
val.
l == 0x20000000)
3049 else if (iptr->
sx.
val.
l == 0x40000000)
3051 else if (iptr->
sx.
val.
l == 0x80000000)
3057 goto icmd_lconst_tail;
3060 #if SUPPORT_LONG_REM_POW2
3062 if ((iptr->
sx.
val.
l == 0x00000002) ||
3063 (iptr->
sx.
val.
l == 0x00000004) ||
3064 (iptr->
sx.
val.
l == 0x00000008) ||
3065 (iptr->
sx.
val.
l == 0x00000010) ||
3066 (iptr->
sx.
val.
l == 0x00000020) ||
3067 (iptr->
sx.
val.
l == 0x00000040) ||
3068 (iptr->
sx.
val.
l == 0x00000080) ||
3069 (iptr->
sx.
val.
l == 0x00000100) ||
3070 (iptr->
sx.
val.
l == 0x00000200) ||
3071 (iptr->
sx.
val.
l == 0x00000400) ||
3072 (iptr->
sx.
val.
l == 0x00000800) ||
3073 (iptr->
sx.
val.
l == 0x00001000) ||
3074 (iptr->
sx.
val.
l == 0x00002000) ||
3075 (iptr->
sx.
val.
l == 0x00004000) ||
3076 (iptr->
sx.
val.
l == 0x00008000) ||
3077 (iptr->
sx.
val.
l == 0x00010000) ||
3078 (iptr->
sx.
val.
l == 0x00020000) ||
3079 (iptr->
sx.
val.
l == 0x00040000) ||
3080 (iptr->
sx.
val.
l == 0x00080000) ||
3081 (iptr->
sx.
val.
l == 0x00100000) ||
3082 (iptr->
sx.
val.
l == 0x00200000) ||
3083 (iptr->
sx.
val.
l == 0x00400000) ||
3084 (iptr->
sx.
val.
l == 0x00800000) ||
3085 (iptr->
sx.
val.
l == 0x01000000) ||
3086 (iptr->
sx.
val.
l == 0x02000000) ||
3087 (iptr->
sx.
val.
l == 0x04000000) ||
3088 (iptr->
sx.
val.
l == 0x08000000) ||
3089 (iptr->
sx.
val.
l == 0x10000000) ||
3090 (iptr->
sx.
val.
l == 0x20000000) ||
3091 (iptr->
sx.
val.
l == 0x40000000) ||
3092 (iptr->
sx.
val.
l == 0x80000000))
3096 goto icmd_lconst_tail;
3101 #if SUPPORT_CONST_LOGICAL
3105 goto icmd_lconst_tail;
3109 goto icmd_lconst_tail;
3113 goto icmd_lconst_tail;
3117 if ((len <= 1) || (iptr[2].sx.
val.
i != 0))
3122 switch (iptr[2].opc) {
3127 icmd_lconst_lcmp_tail:
3141 goto icmd_lconst_lcmp_tail;
3145 goto icmd_lconst_lcmp_tail;
3149 goto icmd_lconst_lcmp_tail;
3153 goto icmd_lconst_lcmp_tail;
3157 goto icmd_lconst_lcmp_tail;
3164 #if SUPPORT_CONST_STORE
3166 # if SUPPORT_CONST_STORE_ZERO_ONLY
3170 #if SIZEOF_VOID_P == 4
3172 if (iptr->
sx.
val.
l < -0x80000000L || iptr->
sx.
val.
l >= 0x80000000L)
3188 # if SUPPORT_CONST_STORE_ZERO_ONLY
3192 #if SIZEOF_VOID_P == 4
3194 if (iptr->
sx.
val.
l < -0x80000000L || iptr->
sx.
val.
l >= 0x80000000L)
3236 #if SUPPORT_CONST_STORE
3243 switch (iptr[1].opc) {
3252 iptr->
sx.
s23.s3.constval = 0;
3263 # if SUPPORT_CONST_STORE_ZERO_ONLY
3300 #if defined(ENABLE_VERIFIER)
3306 LOAD(type, varindex);
3340 last_store_boundary[javaindex] = sd.
new_elem;
3346 for (
int i = stackdepth - 1; copy;
i--, copy = copy->
prev) {
3375 iptr->
sx.
s23.s3.javaindex = javaindex;
3379 iptr->
sx.
s23.s2.retaddrnr =
3395 if (javaindex > 0) {
3405 STATISTICS(count_store_depth[stackdepth-1]++);
3410 copy = curstack->
prev;
3411 for (
int i = stackdepth - 2; copy;
i--, copy = copy->
prev) {
3430 if (curstack < last_store_boundary[javaindex])
3431 goto assume_conflict;
3435 if (curstack < coalescing_boundary)
3436 goto assume_conflict;
3441 while (--copy > curstack) {
3443 goto assume_conflict;
3458 curstack->
varnum = varindex;
3473 last_store_boundary[javaindex] = sd.
new_elem;
3542 #ifdef ENABLE_VERIFIER
3546 return throw_stack_category_error();
3565 superblockend =
true;
3574 curstack = NULL; stackdepth = 0;
3575 superblockend =
true;
3618 superblockend =
true;
3631 int i = iptr->
sx.
s23.s3.tablehigh
3632 - iptr->
sx.
s23.s2.tablelow + 1;
3638 superblockend =
true;
3652 int i = iptr->
sx.
s23.s2.lookupcount;
3658 superblockend =
true;
3705 #ifdef ENABLE_VERIFIER
3709 return throw_stack_category_error();
3723 #ifdef ENABLE_VERIFIER
3727 return throw_stack_category_error();
3736 coalescing_boundary = sd.
new_elem - 1;
3749 #ifdef ENABLE_VERIFIER
3752 return throw_stack_category_error();
3755 src1 = curstack->
prev;
3768 #ifdef ENABLE_VERIFIER
3773 return throw_stack_category_error();
3778 src1 = curstack->
prev;
3788 DUP_SLOT(src2); dst1 = curstack; stackdepth++;
3802 #ifdef ENABLE_VERIFIER
3805 return throw_stack_category_error();
3813 #ifdef ENABLE_VERIFIER
3818 return throw_stack_category_error();
3824 src2 = curstack->
prev;
3837 DUP_SLOT(src2); dst1 = curstack; stackdepth++;
3838 DUP_SLOT(src3); dst2 = curstack; stackdepth++;
3844 COPY_DOWN(curstack, dst2); iptr++; len--;
3857 #ifdef ENABLE_VERIFIER
3860 return throw_stack_category_error();
3868 #ifdef ENABLE_VERIFIER
3873 return throw_stack_category_error();
3878 src2 = curstack->
prev;
3891 DUP_SLOT(src3); dst1 = curstack; stackdepth++;
3914 #ifdef ENABLE_VERIFIER
3918 return throw_stack_category_error();
3931 #ifdef ENABLE_VERIFIER
3934 return throw_stack_category_error();
3942 #ifdef ENABLE_VERIFIER
3947 return throw_stack_category_error();
3953 src3 = curstack->
prev;
3969 DUP_SLOT(src3); dst1 = curstack; stackdepth++;
3970 DUP_SLOT(src4); dst2 = curstack; stackdepth++;
3977 COPY_DOWN(curstack, dst2); iptr++; len--;
3987 #ifdef ENABLE_VERIFIER
3992 return throw_stack_category_error();
3996 src1 = curstack->
prev;
4017 #if !SUPPORT_DIVISION
4018 bte = iptr->
sx.
s23.s3.bte;
4054 #if !(SUPPORT_DIVISION && SUPPORT_LONG_DIV)
4055 bte = iptr->
sx.
s23.s3.bte;
4113 if ((len == 0) || (iptr[1].sx.
val.
i != 0))
4116 switch (iptr[1].opc) {
4130 goto icmd_lcmp_if_tail;
4133 goto icmd_lcmp_if_tail;
4136 goto icmd_lcmp_if_tail;
4139 goto icmd_lcmp_if_tail;
4142 goto icmd_lcmp_if_tail;
4152 iptr->
sx.
s23.s3.bte = bte;
4308 tbptr = iptr->
sx.
s23.s3.jsrtarget.block;
4313 #if defined(ENABLE_VERIFIER)
4314 sd.
var[curstack->
varnum].SBRSTART = (
void*) tbptr;
4321 iptr->
sx.
s23.s3.jsrtarget.block = tbptr;
4327 superblockend =
true;
4377 for (
int i = paramcount - 1;
i >= 0;
i--) {
4378 iptr->
sx.
s23.s2.args[
i] = copy->varnum;
4384 #if defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
4407 #if defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
4415 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
4435 for (
int i = paramcount; copy;
i++) {
4436 iptr->
sx.
s23.s2.args[
i] = copy->varnum;
4472 #if defined(SPECIALMEMUSE)
4473 # if defined(__DARWIN__)
4481 # if defined(__I386__)
4484 # elif defined(__MIPS__) && SIZEOF_VOID_P == 4
4495 iptr->
sx.
s23.s2.args[
i] = copy->varnum;
4502 #if defined(SPECIALMEMUSE)
4503 # if defined(__DARWIN__)
4508 LA_SIZE_IN_POINTERS + 3;
4511 # if defined(__I386__)
4513 # elif defined(__MIPS__) && SIZEOF_VOID_P == 4
4549 #if defined(ENABLE_COMPILER2)
4552 assert(stackdepth >= 0);
4553 assert((stackdepth == 0) == (curstack == NULL));
4555 iptr->stack_after =
DMNEW(
s4, stackdepth);
4556 iptr->stackdepth_after = stackdepth;
4559 for (
int i = stackdepth - 1; current_elem;
i--) {
4560 iptr->stack_after[
i] = current_elem->
varnum;
4561 current_elem = current_elem->
prev;
4571 #if defined(STACK_VERBOSE)
4572 stack_verbose_show_state(&sd, NULL, curstack);
4580 int i = stackdepth - 1;
4581 for (copy = curstack; copy; i--, copy = copy->
prev) {
4592 v = sd.
var + copy->varnum;
4634 #if defined(STACK_VERBOSE)
4635 stack_verbose_block_exit(&sd, superblockend);
4646 }
while (sd.
repeat && !deadcode);
4677 if (ex->start == ex->end) {
4678 assert(ex->end->next);
4679 ex->end = ex->end->next;
4696 STATISTICS(count_analyse_iterations[iteration_count]++);
4698 #if defined(ENABLE_STATISTICS)
4727 s4 javaindex = iptr->
sx.
s23.s3.javaindex;
4730 assert(javaindex >= 0);
4732 javalocals[javaindex] = iptr->
sx.
s23.s2.retaddrnr;
4734 javalocals[javaindex] = varindex;
4747 #if defined(STACK_VERBOSE)
4753 #if defined(ENABLE_VERIFIER)
4762 assert(index >= 0 && index < sd->vartop);
4763 stack_verbose_show_varinfo(sd, sd->
var + index);
4776 stack_verbose_show_variable(sd, bptr->
invars[i]);
4788 stack_verbose_show_varinfo(sd, bptr->
inlocals + i);
4798 stack_verbose_show_variable(sd, bptr->
outvars[i]);
4819 static void stack_verbose_block_enter(
stackdata_t *sd,
bool reanalyse)
4823 printf(
"======================================== STACK %sANALYSE BLOCK ",
4824 (reanalyse) ? ((sd->
bptr->
iinstr == NULL) ?
"CLONE-" :
"RE-") :
"");
4825 stack_verbose_show_block(sd, sd->
bptr);
4839 static void stack_verbose_block_exit(
stackdata_t *sd,
bool superblockend)
4841 printf(
"%s ", (superblockend) ?
"SUPERBLOCKEND" :
"END");
4842 stack_verbose_show_block(sd, sd->
bptr);
4858 for(i = 0, sp = curstack;
sp; sp = sp->
prev)
4863 for(sp = curstack;
sp; sp = sp->
prev)
void exceptions_throw_verifyerror(methodinfo *m, const char *message,...)
static void stack_create_locals(stackdata_t *sd, basicblock *b)
#define BUILTIN_FAST_canstore
void show_javalocals_array(jitdata *jd, s4 *vars, int n, int stage)
void md_return_alloc(jitdata *jd, stackelement_t *stackslot)
#define COPY_VAL_AND_TYPE(sd, sindex, dindex)
static bool instruction_has_side_effects(const instruction *iptr)
bool builtintable_replace_function(void *iptr_)
#define STATISTICS(x)
Wrapper for statistics only code.
#define DST(typed, index)
bool throw_stack_category_error()
#define LOAD(type1, index)
exception_entry * exceptiontable
exception_entry * extableend
bool throw_stack_overflow()
#define OP2_1(type1, type2, typed)
exception_entry ** handlers
#define DMREALLOC(ptr, type, num1, num2)
static basicblock * stack_mark_reached(stackdata_t *sd, basicblock *b, stackelement_t *curstack, int stackdepth)
#define OP1_BRANCH(type1)
static bool stack_reach_next_block(stackdata_t *sd)
#define RELEASE_INDEX(sd, varindex)
bool throw_stack_underflow()
static void stack_change_to_tempvar(stackdata_t *sd, stackelement_t *sp, instruction *ilimit)
#define JITDATA_HAS_FLAG_DEOPTIMIZE(jd)
#define BBFLAG_REPLACEMENT
#define STAT_REGISTER_DIST_RANGE(counttype, indextype, var, range, range_size, init, name, description)
Define a distribution table (range).
static void code_unflag_leafmethod(codeinfo *code)
#define GET_NEW_VAR(sd, newvarindex, newtype)
static basicblock * stack_check_invars(stackdata_t *sd, basicblock *b, stackelement_t *curstack, int stackdepth)
JNIEnv jthread jobject jclass jlong size
#define BUILTIN_arraycheckcast
static void stack_merge_locals(stackdata_t *sd, basicblock *b)
#define MCOPY(dest, src, type, num)
#define IS_2_WORD_TYPE(a)
#define COPY_VAL_AND_TYPE_VAR(sv, dv)
static bool stack_reach_handlers(stackdata_t *sd)
jlong jlong jlong jlong jint depth
builtintable_entry * builtintable_get_internal(functionptr fp)
bool stack_reanalyse_block(stackdata_t *sd)
static basicblock * stack_check_invars_from_outvars(stackdata_t *sd, basicblock *b)
JNIEnv jthread jmethodID method
stackelement_t * new_elem
bool stack_analyse(jitdata *jd)
alloc::list< PassInfo::IDTy >::type & stack
This file contains the statistics framework.
#define INSTRUCTION_GET_FIELDREF(iptr, fref)
#define STAT_REGISTER_GROUP_VAR(type, var, init, name, description, group)
Register an statistics variable and add it to a group.
#define IS_FLT_DBL_TYPE(a)
#define MZERO(ptr, type, num)
Type
Types used internally by JITTED code.
void exceptions_throw_internalerror(const char *message,...)
static basicblock * stack_mark_reached_from_outvars(stackdata_t *sd, basicblock *b)
classref_or_classinfo catchtype
#define OP3_0(type1, type2, type3)
bool throw_stack_type_error(Type expectedtype)
#define STAT_REGISTER_GROUP(var, name, description)
Register a statistics group.
#define VERIFIER_EXTRA_LOCALS
#define OP2_0(type1, type2)
Fieldref, Methodref and InterfaceMethodref.
static void stack_grow_variable_array(stackdata_t *sd, s4 num)
union instruction::@12 sx
#define OP2_BRANCH(type1, type2)
#define STAT_REGISTER_DIST(counttype, indextype, var, start, end, step, init, name, description)
Define a distribution table (steps).
static stackelement_t * stack_create_instack(stackdata_t *sd)
static void stack_append_block(stackdata_t *sd, basicblock *b)
#define PACK_REGS(low, high)
void stack_javalocals_store(instruction *iptr, s4 *javalocals)
basicblock * last_real_block
#define INSTRUCTION_GET_METHODDESC(iptr, md)
#define OP1_1(type1, typed)
This is a generic accessor class for Java arrays (of unspecified type), which can be used to safely o...
void show_icmd(jitdata *jd, instruction *iptr, bool deadcode, int stage)
static void stack_create_invars(stackdata_t *sd, basicblock *b, stackelement_t *curstack, int stackdepth)
static void check(jitdata *jd, basicblock *bptr)
#define CFG_UNKNOWN_PREDECESSORS
#define BRANCH_TARGET(bt, tempbptr)
interface_info * interface_map
static basicblock * stack_clone_block(stackdata_t *sd, basicblock *b)
struct instruction::@12::@13 s23
#define STORE(type1, index)
#define JAVALOCAL_FROM_RETADDR(nr)
const parseddesc_t parseddesc
block_count * blocks[HASH_SIZE]
void exceptions_throw_verifyerror_for_stack(methodinfo *m, int type)
static void stack_create_invars_from_outvars(stackdata_t *sd, basicblock *b)
#define STAT_REGISTER_VAR(type, var, init, name, description)
Register an external statistics variable.
builtintable_entry * builtintable_get_automatic(s4 opcode)
static void stack_init_javalocals(stackdata_t *sd)
#define LA_SIZE_IN_POINTERS
const char show_jit_type_letters[]